본문 바로가기

Computer Science/Computer Organization

<컴퓨터 구조> 하드웨어의 한계

 

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

Introduction to the intellectual enterprises of computer science and the art of programming. This course teaches students how to think algorithmically and solve problems efficiently. Topics include abstraction, algorithms, data structures, encapsulation, r

cs50.harvard.edu

 

부스트코스

 

다 함께 배우고 성장하는 부스트코스

부스트코스(boostcourse)는 모두 함께 배우고 성장하는 비영리 SW 온라인 플랫폼입니다.

www.boostcourse.org

 

CS50 Sandbox

 

CS50 Sandbox

Temporary programming environments for students and teachers.

sandbox.cs50.io