1. 메모리 한계
* RAM의 한계
- 컴퓨터는 RAM이라는 저장장치를 갖고 있다. 우리가 작성한 코드도 RAM에 저장되고 실행된다.
- RAM은 당연히 유한한 크기만 저장할 수 있다. 필자의 RAM은 현재 12GB이므로 이 이상은 실행되지 못할 것이다.
- 많은 이용자들이 이미 겪어 봤겠지만 한 컴퓨터로 동영상을 보면서 게임을 하는 등의 무거운 프로그램 여러개를 돌리면 흔히 말하는 렉이 걸리는 것을 알 수 있다. 이러한 것이 주로 RAM에서 오는 문제이다.
* 부동 소수점 부정확성
- 1을 10으로 나누면 0.1이라는 것은 모두가 알 것이다.
- 이 때 소수점이 아무리 길더라도 0.1 뒤는 0이 반복됨을 알 수 있다.
- 이를 코드로 작성해보자.
#include <cs50.h>
#include <stdio.h>
int main(void)
{
// 사용자에게 x 값 받기
float x = get_float("x: ");
// 사용자에게 y 값 받기
float y = get_float("y: ");
// 나눗셈 후 출력
printf("x / y = %.50f\n", x / y);
}
// x:1
// y:10
// x / y = 0.10000000149011611938476562500000000000000000000000
- 소숫점 아래 50자리까지 표현시키기 위해서 %.50f 를 사용하였다.
- 결과를 보면 0이 이어지지 않음을 알 수 있다. 이는 float값에 저장 가능한 비트 수가 한정되어 있기 때문이다.
* 정수 오버플로우
- 위와 달리 정수가 무한정 커진다면 어떨까. 1부터 1초단위로 2배씩 시켜보자.
#include <stdio.h>
#include <unistd.h>
int main(void)
{
for (int i = 1; ; i *= 2)
{
printf("%i\n", i);
sleep(1);
}
}
//...
//1073741824
//overflow.c:6:25: runtime error: signed integer overflow: 1073741824 * 2 cannot be represented in type 'int'
//-2147483648
//0
//0
//...
- 위를보면 어느순간부터 0이 반복됨을 알 수 있다. int에서는 32개의 비트가 전부이므로 약 10억을 넘기자 넘어갈 자리가 없이 뒷부분이 모두 0으로 바뀌면서 일어난 현상이다.
2. 실생활에서의 오버플로우
* Y2K (2000년) 문제
- 1990년대 말에 2000년이 되면 세상의 종말이 올 것이다라는 소문이 돌았다는 것은 다들 알고 있을 것이다. 이러한 소문은 1999년에서 2000년이 되면서 모든 전자장치에 문제가 생길것이고 이것이 지구의 종말을 초래할 것이라는 것이었다.
- 위의 소문이 생긴이유가 바로 오버플로우 때문이다. 프로그래밍에서는 연도를 마지막 두자리수로 저장했는데 예를 들면 1994년은 94로 적었다는 것이다. 여기서 문제가 생기는데 만약 2000년으로 넘어가면 메모리는 00으로 받아들이고 이는 1900년으로 인식될 것이다.
- 문제를 미연에 막기 위해서 전 세계는 큰 돈을 들여서 프로그래머들에게 더 많은 메모리를 활용하도록 하였고, 결국 해결되었다.
* 보잉 787 문제
- 보잉787 비행기에서 있었던 문제는 비교적 최근인 2015년에 있었던 일이다.
- 보잉787 비행기는 구동 후 248일이 지나면 모든 전력을 잃는 문제가 있었다. 왜냐하면 강제로 안전 모드로 진입했기 때문이다.
- 왜 이런 문제가 발생했을까. 248일을 1/100초로 계산해보면 약 2의 32제곱이 나온다. 즉 보잉을 설계할 때 사용한 변수보다 너무 커져서 문제가 생긴것이다.
- 결국 주기적으로 재가동을 하는 방식을 사용했다.
* 온라인게임 문제
- 메이플스토리라는 게임을 한번쯤은 들어보았을 것이다. 10년이 넘도록 인기를 유지하고 있는 2D 게임이다. 다들 알다시피 10년이 넘어가면서 게임은 매우 무거워졌다. 어마어마한 데이터들이 게임 클라이언트에 들어가있는 것이다.
- 이 게임을 해본사람이라면 알겠지만 아무리 좋은 컴퓨터를 사용해도 렉이 걸린다. 이 원인 중 하나가 바로 이 게임이 32비트체제이기 때문이다.
- 온라인 게임의 특성상 많은 사람들이 만나게 되고, 그 사람들이 아이템을 사용하거나 게임스킬은 쓰는 등의 활동만 해도 어마어마한 비트를 사용할 것이다. 그러나 메이플스토리라는 게임의 클라이언트는 32비트의 한계때문에 RAM을 4GB밖에 쓰지 못한다. 즉 사용자가 아무리 좋은 RAM을 사용하더라도 렉을 피할 수는 없는 것이다.
- 다행히도 메이플스토리측은 현재 64비트체제의 클라이언트를 테스트 중이며, 올해 상반기에 출시 계획이라고 한다.
참고
이 글은 하버드 대학교 David Malan 교수의 CS50 강의를 수강 후 정리하며 쓴 글입니다. 코드는 C언어로 작성되었으며, 개발환경은 CS50 Sandbox에 최적화되어 있습니다. 일부 라이브러리는 다른 환경에서 별도의 설정이 필요할 수 있습니다.
CS50 공식사이트
부스트코스
CS50 Sandbox
'Computer Science > Computer Organization' 카테고리의 다른 글
<메모리> 메모리와 포인터 (0) | 2021.02.17 |
---|---|
<컴퓨터 구조> 컴파일링과 디버깅 (0) | 2021.01.27 |
<컴퓨팅 사고> 알고리즘 (0) | 2021.01.19 |
<컴퓨터 구조> 정보의 표현 (0) | 2021.01.18 |
<컴퓨터 구조> 컴퓨터 과학과 2진법 (0) | 2021.01.17 |