-
프로그램이 실행되는 과정 (CPU와 Register, RAM의 작동방식)Study/컴퓨터 구조 & 운영체제 2022. 9. 12. 18:44
알아두어야 할 것
CPU
- 명령어를 읽고, 연산을 하는 장치
- 명령어를 읽고, 연산한 결과를 어딘가에 저장해야 함
- CPU는 연산 특화 장치이기 때문에 저장할 공간이 매우 부족하다
- 그래서 CPU 내부에 Register라는 저장 공간을 만듬
- 64bit CPU 중 x86-64 Architecture는 8개의 레지스터, ARM64는 31개의 레지스터를 사용함
- 각 레지스터는 64bit (8byte)의 정보를 담을 수 있다.
RAM
- CPU의 레지스터만으로는 데이터를 감당할 수 없으므로, 휘발성 메모리 RAM을 저장장치로 이용함
- CPU는 RAM에 명령어들을 저장해놓고 연산을 수행할 때 램에서 읽어들여와서 사용한다.
- CPU에서 RAM에 접근하는 속도는 생각보다 느린 편
Cache
- RAM에 대한 CPU의 접근 시간 문제 때문에 만들어진 장치
- 직접적인 연산을 수행하지는 않지만, 빠르게 데이터를 레지스터에 불러올 수 있다.
- L1, L2, L3 Cache가 있고, 순서대로 빠르다.
- L1 Cache는 크기가 가장 작지만 (256kb), 레지스터와 인접해 있어 매우 빠르다.
- CPU는 곧 쓸 것이라고 예상되는 데이터를 미리 Cache에 로딩해 놓고, RAM에 쓸 때도 바로 Cache에 써놨다가 나중에 적는 방식으로 작동한다.
- CPU가 Cache에 적재할 데이터를 선택하는 알고리즘이 있고, 이 알고리즘이 맞는 확률을 캐시 적중률 이라고 한다.
- CPU가 요청할 데이터가 Cache에 없는 경우를 Cache Miss 라고 한다.
프로그램을 실행하는 과정
1. OS가 HDD/SDD등 저장장치로부터 프로그램을 읽어들여 RAM에 올린다.
2. OS가 CPU의 RIP 레지스터에 프로그램의 시작점의 명령어가 있는 RAM 내부 주소를 전달한다.
3. CPU는 해당 시작점에 있는 명령어를 처리하고, RIP에 저장된 주소에 있는 명령어를 처리하는 과정을 반복한다.CPU 명령어가 작동하는 과정
예를 들어 RAM의 0x1234라는 주소에 3이라는 값을 1바이트만큼 쓰는 명령어가 있다고 해 보자.
그러면 다음과 같이 명령어를 작성해야 한다.
1. CPU의 레지스터에 접근할 주소값 0x1234를 저장한다
2. 레지스터에 있는 주소값에 3이라는 값을 1byte만큼 저장한다.
어셈블리로 보면 다음과 같다.
move eax, 4660 // 0x1234의 십진수 표기 move BYTE PTR[rax], 3 // eax와 rax는 같은 레지스터임
레지스터에 주소값을 저장하고, RAM으로 쓰는 이유는 CPU에서 레지스터를 거치지 않고 바로 쓰는 것을 허용하지 않기 때문이다.
참고로, 64bit 시스템 CPU 레지스터가 8byte인 이유는, 64bit시스템에서 주소값이 8byte이기 때문이다.
가상 메모리 vs 물리 메모리
가상 메모리를 사용하는 이유?
컴퓨터에서는 하나의 프로그램만을 사용하지 않는다.
그러나 프로그램을 구성하는 명령어는 특정 RAM공간에 데이터를 읽거나 쓰는데, 그 공간이 해당 프로그램의 것이라는 것을 어떻게 보장할 수 없지 않을까?
이러한 문제가 발생하지 않는 이유는 CPU가 메모리를 관리하기 위해 가상 메모리 매커니즘을 사용하기 떄문이다.
가상 메모리란?
위에서 0x1234라는 메모리 공간에 3이라는 데이터를 쓰는 명령어를 내렸지만, 실제로 CPU가 0x1234에 데이터를 저장하지는 않는다.
0x1234라는 주소값은, 어떠한 1대1 변환으로 물리 메모리의 실제 주소값으로 변환된다. (물론 0x1234 그대로일수도 있음)
어쨌든, CPU가 참조하는 0x1234의 메모리 주소 값은 가상 메모리(virtual memory)의 주소이고, 실제로 참조할 메모리의 주소값을 물리 메모리(physical memory)라고 한다.
페이징
주소값 1:1 변환 방식을 페이징(Paging)이라고 하고, 변환이 되는 최소의 메모리 단위를 페이지(Page)라고 한다. (보통 1kb)
어떻게 변환할지를 기록한 테이블을 페이지 테이블(Page Table)이라고 하고, 이는 프로그램마다 하나씩 가지고 있다. (이를 통해 다른 프로그램에서 같은 가상 메모리 주소값을 사용한다고 해도, 두 프로그램간 데이터 영역을 침범하지 않는다.)
페이징 기법으로 물리 메모리보다 전체 프로그램들이 필요로 하는 메모리가 많은 경우도 처리 가능한데, 안 쓰는 페이지를 하드디스크에 기록해놓는 방식을 사용한다.
'Study > 컴퓨터 구조 & 운영체제' 카테고리의 다른 글
[운영체제] 가상 메모리(Virtual Memory)와 페이징, 세그멘테이션 (0) 2022.10.11 ASCII와 Unicode, UTF-8 (0) 2022.09.21 [뇌자극 시스템 프로그래밍] 01. 컴퓨터 구조에 대한 간략한 이해 (0) 2022.09.17