원래 1챕터가 이렇게 양이 많았나...? 글 하나로 줄일 수 있을 줄 알았는데 생각보다 나눠 적어야 할 것 같습니다.. 뒷 챕터는 두배 세배는 되는 애들도 있는데.. 앞길이 좀 막막 하네요... 이거 매번 서문엔 가볍게 얘기를 적고 스타트하려 했는데, 이거 적을 거리 생각하는 것도 일이네요.. 아, 본 글 작성하던 중에 하나 생겼습니다. 12월에 최애 라이브가 또 또 또 잡혔습니다. 1년에 네번이나 한다고..? 한번밖에 못 뛴 애도 두눈 시퍼렇게 뜨고 지켜보고 있는 상황에서? 11월 공연은 보러가는데.. 아마 거기서 칼을 맞든, 돌을 맞든 그냥 업이구나.. 하고 받아들여야할 것 같습니다. 11월에 한국인 폭행 뉴스가 뜨거든 혐한 이슈가 아니라, 적폐 캐릭 러버인거 티내다 당했겠거니... 원인제공 했겠구나 생각해주십쇼.. 물론 행복합니다 우리 애 한번 더 뛴다~ ㅎㅎ
1. 프로세서는 메모리에 저장된 인스트럭션을 읽고 해석한다.
이전 글에서, 컴파일 시스템의 일련 과정을 거치면, 실행가능한 목적프로그램(=실행파일)이 생성된다고 이야기했습니다. 이 실행파일은 디스크라는 저장공간에 저장되며, 우리가 이를 실행할 수 있도록 해줍니다. 그럼, 이전엔 생성 과정을 이야기했으니, 이젠 실행 과정에 대해 알아야겠죠? 그 과정을 설명드리겠습니다.
아래 그림은 우리의 컴퓨터가 파일을 실행시킬 때, 이를 위해 동작하는 과정을 축약시켜 나타낸 그림입니다. 하나 하나 나눠 설명드리겠습니다.

버스(Buses)
시스탬 내, 전기적 배선군을 말합니다. 버스라는 단어 그대로, 각 구성요소들 간 신호로 소통이 가능하도록, 바이트 정보를 전송하는 역할을 맞습니다. 일반적으론, 워드(word)라고 정의된 4바이트 또는 8바이트의 정해진 고정 단위로 바이트를 전송합니다. 이후 설명하는 모든 동작에선, 이 버스를 통한 운반이 기반으로 깔려있습니다. 32개의 비트, 또는 64개의 비트가, 파란색 버스를 타고 사이좋게 출근하는 모습(...)을 상상하시면 좋을 것 같습니다.
입출력 장치
시스템의 외부 상호작용을 담당합니다. 이렇게 타자를 치고 있으면 디스플레이에 제가 친 타자의 내용이 노출됩니다. 물론 이 동작들은 버스를 통해서 운반되겠지만, 입력을 인식하거나 출력하는건 이 입출력 장치가 담당합니다. 단순히 scan과 print만 담당하는 것이 아닙니다. 디스크에 파일을 저장하는 행위도, 입력에 해당됩니다. 따라서 위 예제에선, 마우스와 키보드, 디스플레이와 디스크가 입출력 장치에 해당합니다. 입출력 장치는 컨트롤러와 어뎁터를 통해 입출력 버스와 연결하여 송수신이 이루어집니다.
메인 메모리
"프로세서가 실행되는 동안" 데이터와 프로그램을 모두 저장하는 임시 저장장치입니다. 즉, 저장 값이 필요없어진 순간, 이를 지운다는 뜻이 됩니다. 영원하지 않습니다. 물리적으로 설명하면, 이 메인 메모리는 DRAM(Dynamic Random Access Memory)칩들로 이루어져 있습니다. 논리적으로 설명하면, 이 메모리는 연속적인 바이트의 배열로 정의됩니다. 0부터 시작해서 고유의 주소(인덱스)를 부여 받는데, 집주소의 개념보단, 도서관의 도서 분류 코드 개념으로 생각해두시면 좋습니다. 한참 뒤에 나오겠지만, 저장되는 값들의 역할에 따라 그룹으로 주소를 배정하기에, 역할마다 주소단위가 존재합니다.
프로세서
주처리장치(CPU)또는, 메인 메모리에 저장된 요소를 요구된 연산 등을 거쳐 해독(실행)하는 엔진입니다. 쉽게 말하자면, 우리가 요구한 계산이나 함수 동작이 여기서 이루어집니다. 프로세서의 중심에는 워드크기의 저장장치(레지스터)인 프로그램 카운터(PC)가 존재합니다. 조금 헷갈릴 만하게 적혀있는데, 프로세서 내에는 레지스터가 존재하고, 프로세서 중앙에는 PC 역할의 레지스터가 위치한다는 의미입니다. 이 PC는, 현재 실행되고 있는 위치에서 다음 실행시켜야 할 요소가 존재하는 위치를 가리킵니다. 스위치를 껐다 켰다만 할 줄 아는 컴퓨터가 동작을 이어가기 위해 메모리의 어떤 주소를 봐야 하는지, 그 위치를 지정해주는 부품이라 생각해주시면 됩니다.
이 일련의 과정은 연산 처리기인, ALU(수식/논리 처리기)를 통해 동작하며, 레지스터 파일이라는 레지스터 집합을 통해 연산 중간 중간 값을 임시 저장합니다. 네, 메모리와 역할이 같습니다. 하지만 그림으로 보시더라도 굉장히 가깝게 위치해 있는걸 확인할 수 있습니다. 값을 가져오는데 비용이 압도적으로 낮습니다. 물론 이 레지스터는 한 워드 크기만 저장되므로, 각 레지스터는 하나의 변수까지만 저장이 가능합니다.
ALU에 대한 명령은 메인메모리에서 레지스터로 값을 복사해오는 적재(load), 그 반대인 저장(save), 두 레지스터 값을 ALU로 복사해와 연산 후, 결과를 다시 레지스터에 덮어쓰는 작업(Operate), 다음 작업 위치를 임의로 지정하는 점프(jump)가 존재합니다. 특히 '복사한다'는 점을 기억해야합니다. 되도록 값은 유지되며, 작업과 같이 어쩔 수 없이 덮어쓸 때만, 원래 값을 희생시킵니다.
그럼 hello 프로그램으로 예를 들어볼까요?
우선 이 프로그램을 실행시키기 위해, 쉘에 ./hello 를 입력합니다.
'입력'이니 입출력장치를 통해, 입력된 정보가 I/O 버스를 타고 CPU로 전달됩니다. 그리고 저희가 적은 명령어 자체인 hello 문자열을 읽은 뒤, 메인 메모리에 저장합니다.
엔터를 누른 시점에서, 해당 명령어가 완성된 것으로 판단, 저장된 명령어를 실행합니다. 쉘은 내부 시스템 명령어가 아닌 명령어에 대해선, 이를 실행파일로 인식합니다. 따라서 디스크에서 동명의 실행파일을 탐색합니다. 마찬가지로 이 또한 입/출력 과정이기에, 디스크에서 I/O 버스를 타고 메모리에 실행파일이 저장됩니다. 이 과정에선 CPU를 거치지 않는데, 이를 직접 메모리 접근(DMA)이라 부릅니다. 이후에 나올 내용이고, CPU 자원을 절약하기 위한 기법이라 생각해주시면 되겠습니다.
다음은 메모리에 저장된 실행파일을 CPU로 적재시켜, hello 실행파일을 연산합니다.
printf 를 명령했으니, 해당 명령대로, "hello, world!" 문자열을 생성한 뒤, 이를 출력 디스플레이로 I/O 버스를 통해 전달합니다.
그러고 우리는 해당 출력을 볼 수 있습니다.
2. 캐시가 중요하다 + 저장장치들은 계층 구조를 이룬다.
위에서 이야기 하였듯이, 메인메모리와, 레지스터는 값을 임시로 저장한다는 그 역할 자체는 동일합니다. 근데 왜 이렇게 따로 저장해두었을까요. 그 이유는 속도에 있습니다. 레지스터는 당장 사용할 하나의 값을 저장할 수 있고, 이 집합인 레지스터 파일은 몇백 바이트까지 저장할 수 있습니다. 그리고 이를 불러오는 속도는 메인 메모리에 비하여 100배 가까이 빠릅니다. 하지만 메인 메모리는 10억여 바이트를 저장할 수 있습니다. 실제로 우리가 변수를 선언할 때, 레지스터에 우선 저장하고, 이를 넘어서면 메인 메모리로 보냅니다. 그럼 레지스터를 애초에 메인메모리만하게 만들면 안될까 싶지만, 물리학적 법칙 상, 크기가 커지면 속도가 느려집니다. 따라서 그 타협안으로 지금의 시스템이 구축되었다 생각해주시면 되겠습니다.
레지스터와 메인 메모리 그 사이의 역할도 있습니다. L1 캐시와 L2 캐시는 프로세서 내에 존재하면서 각각 수천 바이트 / 수백 킬로바이트~ 메가바이트까지도 저장이 가능합니다. L1 캐시는 레지스터와 근접하게, L2 캐시는 L1 보단 5배 가량 낮은 속도를 보입니다. 심지어는 L3 캐시도 구현되어 있는 시스템도 존재합니다. 이들은 SRAM 기술로 구축되었습니다.

이 캐시는 "자주 액세스할 가능성이 높은 데이터"를 자동으로 저장합니다. 예측하여 저장한 값이 재사용 될 때마다, 비용적 이득을 보는 구조입니다. 그리고 이 예측 근거는 '지역성'에 있는데, 특이한 경우가 아닌 이상, 보통은 지엽적인, 연속된 코드나 데이터에 액세스 한다는 프로그램의 경향에 입각한 것입니다.
값을 저장한다는, 저장장치라는 측면에서는 그 요소들을 다음과 같이 피라미드 형식으로 나열 가능합니다. 상위 층일수록 속도가 빠른 대신, 저장 가능한 양이 적습니다. 반대로 하위 층일수록 속도는 느리나, 많은 양을 저장할 수 있습니다. L0은 레지스터를 뜻합니다. 우리는 해당 피라미드에 근거하여, 어떤 방식으로 캐시를 구축할지, 어떤 값이 저장되게 할지, 또는 데이터를 불러오는 양을 조절해서 하위 계층에 대한 접근을 얼마나 최소화 할지, 이러한 시간적 비용을 단축시킬 고민을 할 수 있습니다.

'CS' 카테고리의 다른 글
| [CSAPP] 3챕터 - 프로그램의 기계수준 표현(2) - 레지스터의 종류 (2) | 2025.08.10 |
|---|---|
| [CSAPP] 3챕터 - 프로그램의 기계수준 표현(1) - 인스트럭션 셋 아키텍처(ISA) (5) | 2025.07.30 |
| [CSAPP] 1챕터 - 컴퓨터 시스템에게로 떠나는 여행 (3) - 운영체제 (5) | 2025.07.29 |
| [CSAPP] 1챕터 - 컴퓨터 시스템에게로 떠나는 여행 (1) - 프로그램 번역 과정 (3) | 2025.07.28 |
| PintOS 1주차 : alarm 테스트 공략 (0) | 2025.05.12 |