Skip to main content

CPU 작동원리

  • 컴퓨터에 있는 기억장치는 하드 드라이브, , 캐시 메모리, 레지스터가 존재
  • CPU의 속도에 비해서 하드디스크는 너무 느리기 때문에 CPU는 하드디스크와 소통하지 않으며 RAM과 소통
  • 프로그램을 실행하면 그 데이터는 램으로 이동하고 CPU는 램에서 그 데이터를 가져옵니다.
  • 하지만 램도 CPU에 비하면 많이 느리기 때문에 CPU 내부나 근처에 캐시메모리를 만들어 그곳에 데이터를 저장

레지스터 (Register)

  • 프로세서에 위치한 고속 메모리로 컴퓨터에서 제일 빠른 메모리로 사용되며 프로세서가 즉시 액세스할 수 있는 매우 작은 데이터나 중간 처리 결과 등, 극히 소량의 정보를 저장하는 공간

캐시 (Cache)

  • 레지스터 다음으로 빠른 메모리이며 CPU 내부에 존재하여 용량은 비교적 작지만 가장 자주 사용하는 데이터를 복사해 가지고 있어 CPU의 메모리 접근시간을 줄여 속도를 향상시킨다.
  • 캐시메모리는 램에 비하면 용량이 작아 중요하다고 판단되는 데이터만 저장해서 사용
  • 캐시 메모리는 Level1부터 Level3까지 단계를 나누어 사용하고 Level1 캐시는 cpu가 가장 먼저 접근하는 메모리로 속도가 가장 빠르지만 용량이 작으며 Level3는 용량이 큰 대신 속도가 느리며 Level3는 마지막 레벨을 의미하는 LLC(Last Level Cache)라고 부릅니다.
  • CPU는 Level1 캐시에 데이터를 요청하고 여기에 없으면 Level2 캐시에 데이터를 읽습니다 여기에도 없으면 Level3 캐시에 데이터를 요청하고 여기에도 없으면 RAM에 있는 데이터를 읽게 됩니다.
  • 프로세서가 메인 메모리를 읽거나 쓰고자 할 때는 먼저 그 주소에 해당하는 데이터가 캐시에 존재하는지를 확인하고 만약 그 주소의 데이터가 캐시에 있으면 데이터를 캐시에서 직접 읽고 그렇지 않으면 메인 메모리에 직접 접근

OS_cpu11

L1과 L2는 코어 내부에 위치하며 L3는 코어 외부에 위치하게 되고 멀티 코어의 경우 각 코어가 L3 캐시를 공유할 수 있다.

램 (RAM)

  • CPU 프로세서가 데이터를 쓰고 지울 수 있는 메모리 기억장치로 컴퓨터에 전원이 공급되는 동안, CPU는 연산을 하고 동작에 필요한 모든 내용을 이 기억장치에 저장한다. 하지만 전원이 차단되면 그동안 저장되었던 데이터가 모두 지워지는 휘발성 메모리이다.

하드 드라이브

  • CPU에서 직접 접근이 불가능한 메모리로 접근하려면 디바이스 드라이버와 시스템 콜을 통하여 기억장치의 특정 위치의 내용을 주기억장치로 로드(Load)한 뒤에 읽어야 한다.

CPU 레지스터 구성

  • 프로그램 카운터: 다음에 수행할 메모리의 주소를 저장
  • 메모리 주소 레지스터: 프로그램 카운터에서 수행할 주소를 넘겨 받은 다음에 그 주소를 찾아가 데이터를 가져옴
  • 메모리 버퍼 레지스터: 메모리 주소 레지스터가 가져온 데이터나 명령들을 일시적으로 저장, 명령은 명령어 레지스터로 이동, 연산에 사용될 데이터는 누산기 레지스터로 이동
  • 명령어 레지스터: 명령에 관한 데이터가 저장
  • 누산기 레지스터: 연산의 결과 값이나 중간 값을 일시적으로 저장, 최종 결과는 메모리 버퍼 레지스터를 통해 메모리로 전송
  • 제어장치: 명령어 레지스터에 있는 명령을 받아 해석하고 해석된 명령을 각 시스템이 수행하도록 지시
  • ALU: 전달받은 모든 데이터들을 산술연산(덧셈과 같은 숫자 계산) 또는 논리연산(대수비교, 저장) 수행

CPU 동작원리

CPU는 인출, 해석, 실행, 쓰기 과정을 통해 연산을 진행하며 LOAD 명령어는 메모리 상에서 초록색, ADD 명령어는 메모리 상에서 빨간색, STORE 명령어는 메모리 상에서 노란색으로 표시했습니다.

OS_cpu1

우리가 사용하는 프로그램은 C언어 또는 Python같은 고급 프로그래밍 언어로 코딩되며 코딩된 언어는 컴파일러를 통해 CPU가 실행할 수 있는 어셈블리 언어로 바뀌고 어셈블리 언어는 다시 어셈블러를 통해 0과 1로 이루어진 기계어로 바뀝니다. 기계어에서 앞부분의 6비트는 어셈블리 언어에서 명령어를 나타내고 뒤의 10비트는 어셈블리 언어에서 데이터를 나타냅니다.

OS_cpu2

따라서 한 줄은 총 16비트이며 램은 8비트씩 저장되기 때문에 위와 같이 8비트로 분할되어 두 줄로 저장되게 됩니다. 두 줄은 곧 프로세서가 한번에 처리할 수 있는 하나의 언어가 되며 32비트는 4줄, 64비트는 8줄이 됩니다.

인출

메모리의 데이터를 CPU로 가져오는 과정

OS_cpu3

  1. 프로그램 카운터 레지스터에 가져와야 할 메모리 주소가 존재
  2. 이 주소는 메모리 주소 레지스터로 전달
  3. 메모리 주소 레지스터는 100번지에 있는 데이터를 가져와 메모리 버퍼 레지스터에 저장

해석

명령어 레지스터에 저장된 명령은 제어장치로 이동되어 해석

OS_cpu4

  1. 메모리 버퍼 레지스터는 메모리 10번지에 있는 데이터를 가져오는 명령이기 때문에 명령어 레지스터로 이동
  2. 프로그램 카운터에 2가 더해짐, 다음에 수행할 메모리는 전 주소보다 두 칸 아래에 있기 때문에 2가 더해짐, (32비트 프로세서는 메모리 4칸을 한 번에 처리할 수 있어 4가 더해짐)
  3. 명령어 레지스터에 저장된 명령은 제어장치로 이동해 해석됨

OS_cpu5

  1. 제어장치의 명령은 10번지 주소에 있는 데이터를 읽어오라는 명령이기 때문에 메모리 주소 레지스터에 10이 입력
  2. 10번지에 있는 데이터를 읽어옴
  3. 10번지에서 읽어온 데이터를 메모리 버퍼 레지스터에 저장
  4. 10번지에 저장된 값은 명령어가 아닌 데이터이기 때문에 누산기 레지스터에 저장

OS_cpu6

  1. 다음 줄을 처리하기 위해 프로그램 카운터에 저장된 주소를 메모리 주소 레지스터로 가져옴
  2. 메모리 주소 레지스터는 이 주소에 있는 정보를 읽어와 메모리 버퍼 레지스터에 저장
  3. 이것은 11번지 주소 값을 더하라는 명령이기 때문에 명령어 레지스터로 이동
  4. 프로그램 카운터에 다시 2가 더해지고 명령어는 제어장치로 이동되어 해석

OS_cpu7

  1. 더하기 명령을 실행하기 위해서 누산기 레지스터에 저장된 데이터는 산술 논리장치로 전달
  2. 제어장치의 명령을 통해 다음 메모리 주소 레지스터에 11번지의 주소가 입력
  3. 메모리 주소 레지스터가 11번지에 있는 데이터를 읽어와 메모리 버퍼 레지스터에 입력

실행

산술 논리장치에서 계산되는 과정

OS_cpu8

  1. 이 값은 명령어가 아닌 데이터로 역시 누산기 레지스터에 입력
  2. 그 값은 산술 논리장치에서 처리되고 결과값은 다시 누산기 레지스터에 저장

OS_cpu9

  1. 마지막 명령을 처리하기 위해서 다시 프로그램 카운터에 있는 주소를 읽어옴
  2. 메모리 주소 레지스터에 있는 주소를 찾아와 데이터를 가져와 메모리 버퍼 레지스터에 입력
  3. 이 명령은 데이터를 저장하라는 명령이기 때문에 명령어 레지스터로 이동 후 프로그램 카운터가 2 증가
  4. 저장하라는 명령어가 제어장치에서 해석
  5. 12번지 메모리에 계산된 값을 저장하기 위해서 메모리 주소 레지스터에 12를 저장

저장 및 쓰기

메모리에 데이터를 저장

OS_cpu10

  1. 누산기 레지스터에 저장된 값은 메모리 버퍼 레지스터를 통해 12번지 메모리에 저장

참고 자료