[프로그래머가 되자] 컴퓨터 동작 원리

bae.200.ok
5 min readMay 29, 2022

안녕하세요. 배민혁 입니다.

개인적인 지향점은 코딩하는 행위의 코더가 아니라, 컴퓨터를 이해하고 소통하는 프로그래머 입니다. 여전히 부족하지만 그간 애플리케이션 레벨에 집중을 많이했는데, 컴퓨터를 이해해보려는 시간을 꾸준히 가져보려고 합니다.

그 첫번째로 컴퓨터가 어떻게 동작하는지 알아보겠습니다.

1 폰 노이만 컴퓨터 구조

컴퓨터를 이해하기 위해서 빠질 수 없는 내용입니다. 폰 노이만의 아이디어는 CPU, 메모리, 프로그램을 갖는 구조입니다.

(앞으로 메모리는 폰 노이만 구조의 메모리, 램은 현대 컴퓨터 구조의 메모리로 이해해주세요)

  • CPU
    > 구성: 제어 장치(Controle Unit), 산술논리 연산장치(Arithmic and Logic Unit)
    > 제어장치: 컴퓨터가 명령어를 읽고 해석하며 데이터 처리를 위한 명령을 수행하는 과정 전반에서 각 부분들의 동작을 제어하는 장치. 즉, 중앙처리 장치와 다른 장치들 사이의 데이터 흐름을 제어한다.
    > 산술논리 연산장치: 논리연산을 계산하는 디지털 회로
  • Memory
    > 주요역할은 저장 공간으로, CPU가 처리할 데이터와 프그램 코드가 저장되는 부분.
    > CPU의 처리가 빠른 것에 비해, 다른 장치들에서 CPU까지의 전달 속도가 매우 느리다. 그렇기에 폰 노이만 구조의 CPU와 메모리 사이에 병목현상이 발생한다.

1.1 폰 노이만 병목현상

위에서 가볍게 언급했듯이 폰 노이만 구조에는 병목현상이 존재합니다.

  • CPU의 처리속도는 다른 장치의 처리속도보다 매우, 월등히 빠르다. 그렇기 때문에 병목현상이 발생한다.
  • 여기서 CPU의 성능은 프로그램 로드 속도와 프로그램이 얼마나 원활하게 실행될 수 있는지에 영향을 끼친다.
  • CPU의 성능을 측정하는 대표적인 지표는 클럭속도이다. 단일 클럭이라면 클럭수가 높을수록 성능이 좋다고 할 수 있다.
  • 만약 3.2Ghz의 클럭을 가진 CPU라고 하면 전기신호인 purse를 1초에 32억개를 만들어내는 것이다. 즉, 1초에 400MByte를 처리한다.
퍼포먼스 비교: 메모리 > 디스크 > 네트워크(네트워크는 메모리 연산에 비해 100만배 정도 느리다)

병목현상의 주요 원인은 CPU와 다른 장치들 사이의 처리 속도입니다. 현대에는 추가적인 구성(램, 캐시메모리, 레지스터, …)으로 이를 보완하고 있습니다.

비유하자면 다음과 같이 비유할 수 있습니다

  • CPU(강남 지점)에 가까울 수록 비용이 높고, 해당 장치에 할당된 용량이 작습니다.
  • 그렇지만 가깝기 때문에, CPU(강남 지점)에 필요한 정보(제품)를 빠르게 전달할 수 있습니다.

필요한 정보를 가까운 곳에서부터 찾고, 없으면 멀리까지 찾게 됩니다. CPU로부터 멀리있다면 필요한 정보가 CPU에 공급되기까지 시간이 오래걸립니다.

  • cache hit: 데이터를 요청했을 때에 존재하는 경우를 캐시 히트라고 한다. 해당 데이터를 전달한다.
  • cahce miss: 데이터를 요청했을 때에 존재하지 않는 경우를 캐시 미스라고 한다. 다음 저장장치에서 요청한 데이터를 찾도록 한다.

2 프로그램이 실행되는 원리

  • 개발자가 작성한 코드는 컴파일의 과정을 거쳐 실행 파일을 만들어낸다.
  • 실행파일 전체가 디스크에 저장된다.
  • 컴퓨터 사용자의 Input에 의해 실행파일 중 일부가 메모리에 올라간다. 실행파일들이 실행되어 메모리에 존재할 때 프로세스라고 한다.
  • CPU는 메모리에서 프로그램을 실행하기위한 정보들을 가져와 실행한다.
  • CPU가 실행한 결과로 Input에 대한 Output을 만들어낸다.

위의 설명에는 많은 내용들이 생략되어져 있습니다. 자세한 이야기는 다음 글들을 통해 이어가겠습니다.

2.1 RAM관리가 중요한 이유

위에서 말한 병목현상 때문에 CPU에서 가장 멀리 있는 디스크에서 필요한 정보를 가져오게되면 속도가 매우 느립니다. 그렇기 때문에 램이라는 중간 저장장치가 필요하게되었습니다.

램을 디스크만큼 큰 용량을 가지도록 만들면 좋겠지만, 여러 제약사항이 있기에 제한된 용량만을 가질 수 있습니다. 그렇기때문에 소프트웨어 개발자에게 메모리 관리는 중요한 미션입니다.

물론, 하드웨어가 발달하고 현대적인 언어가 이를 쉽게 만들어주고 있습니다.(ex. 가비지 컬렉터)그렇다고 하더라고 서비스에 문제가 발생하는 경우 메모리 관리가 잘 되지않아 발생하는 경우가 있습니다. 그렇기에 여전히 램(메모리) 관리는 소프트웨어 개발자에게 중요한 미션입니다.

3 마무리: 소프트웨어 개발자가 컴퓨터 동작원리와 구조를 알아야하는 이유

소프트웨어 개발자가 컴퓨터 동작원리와 구조를 알아야하는 이유가 많이 있겠지만, 핵심은 “컴퓨터 동작에서 오는 병목현상을 이해하는 것”이라고 생각합니다.

더 나아가서, 소프트웨어 개발자는 이를 알고 이해함으로 현실(서비스)의 시스템에 적용하는 역할을 해야 하는 것 같습니다.

이 글을 작성하기 위해 컴퓨터의 동작원리를 공부하게된 이유는 모니터링 지표를 이해하는데 답답함을 느꼈기 때문입니다. 지금까지는 공부해서 얻었다기보다는 주워담은 지식을 통해서, 혹은 현상과 해결방법을 기록한 자료들을 통해서 문제를 해결했습니다.

부끄러운 코더의 표본입니다. 그간 코더로서의 생활은 끊어내고 프로그래머가 되기 위해서 더욱 힘써보겠습니다. 이를 위해 더 근본적인 내용들을 공유하겠습니다.

--

--