CSAPP 제1장 요약: 컴퓨터 시스템으로의 여행
1.1 정보는 비트(Bits)와 문맥(Context)이다
시스템 내의 모든 정보(디스크 파일, 메모리 프로그램, 데이터 등)는 결국 0과 1로 이루어진 비트(bit)의 연속으로 표현된다. hello.c와 같은 텍스트 파일은 각 문자가 아스키(ASCII) 표준에 따라 고유한 정수 값으로 변환된 바이트(byte) 시퀀스로 저장된다.
핵심은 동일한 비트 시퀀스라도 문맥(context)에 따라 완전히 다른 의미로 해석될 수 있다는 점이다. 예를 들어, 특정 바이트 시퀀스는 문맥에 따라 정수, 부동소수점 수, 문자열, 또는 기계어 명령으로 해석될 수 있다.
1.2 & 1.3 컴파일 시스템: 프로그램 번역 과정
hello.c와 같은 고급 C 프로그램은 사람이 읽을 수는 있지만, 시스템이 직접 실행할 수는 없다. 따라서 저수준의 **기계어 명령(machine-language instructions)**으로 번역되어야 한다. 이 번역 과정은 **컴파일 시스템(compilation system)**이 담당하며, 아래 네 단계를 거친다.
- 전처리 (Preprocessing): 전처리기(cpp)가 소스 코드의
#include,#define과 같은 지시자를 처리한다. 그 결과물로.i확장자를 가진 또 다른 C 소스 파일이 생성된다. - 컴파일 (Compilation): 컴파일러(cc1)가 전처리된
.i파일을 어셈블리어 프로그램(.s파일)으로 번역한다. - 어셈블리 (Assembly): 어셈블러(as)가
.s파일을 기계어 명령으로 번역하고, 이를 재배치 가능 목적 파일(relocatable object file) 형식(.o파일)으로 묶는다. - 링크 (Linking): 링커(ld)가
printf와 같은 라이브러리 함수를 포함한 여러 목적 파일을 하나로 병합하여 최종적으로 **실행 가능 목적 파일(executable object file)**을 생성한다.
프로그래머가 이 컴파일 과정을 이해하면 성능 최적화, 링크 타임 에러 해결, 보안 취약점 회피에 큰 도움을 얻을 수 있다.
1.4 ~ 1.6 하드웨어 조직과 메모리 계층
실행 파일이 실행될 때 시스템의 핵심 하드웨어 구성 요소들이 협력한다.
- 버스 (Buses): 구성 요소 간에 데이터를 전달하는 전기적 통로.
- I/O 장치 (I/O Devices): 시스템과 외부 세계를 연결하는 장치 (키보드, 디스플레이, 디스크 등).
- 주 메모리 (Main Memory): 프로그램 실행 중에 프로그램과 데이터를 일시적으로 저장하는 DRAM.
- 프로세서 (Processor, CPU): 주 메모리에 저장된 명령어를 해석하고 실행하는 엔진.
프로세서와 메모리, 디스크 사이에는 엄청난 속도 차이가 존재한다. 이 간극을 메우기 위해 시스템 설계자들은 메모리 계층(Memory Hierarchy) 구조를 도입했다.
- 캐시 메모리 (Cache Memories): 더 크고 느린 저장 장치에 대한 캐시(임시 저장소) 역할을 하는 작고 빠른 SRAM 저장 장치이다.
- 메모리 계층의 원리: 상위 계층의 저장 장치는 하위 계층의 저장 장치에 대한 캐시 역할을 한다. (레지스터 → L1 캐시 → L2 캐시 → L3 캐시 → 주 메모리 → 디스크)
- 지역성 (Locality): 메모리 계층 구조가 효과적으로 동작하는 이유는 프로그램이 지역성을 갖기 때문이다. 프로그램은 최근에 참조한 데이터나 그 주변 데이터를 다시 참조하는 경향(시간적/공간적 지역성)이 있다. 이를 통해 시스템은 저렴한 대용량 저장 장치를 사용하면서도 빠른 속도로 데이터에 접근할 수 있다.
1.7 운영체제(OS)의 역할
응용 프로그램은 하드웨어를 직접 제어하지 않고, 항상 운영체제를 거쳐야 한다. OS는 다음 두 가지 주요 목적을 가진다.
- 응용 프로그램으로부터 하드웨어를 보호한다.
- 응용 프로그램에 간단하고 일관된 방식의 하드웨어 조작 방법을 제공한다.
이를 위해 OS는 다음과 같은 핵심 **추상화(Abstractions)**를 제공한다.
- 프로세스 (Process): 실행 중인 프로그램에 대한 추상화이다. 각 프로세스는 **문맥 전환(context switch)**을 통해 CPU를 독점적으로 사용하는 것처럼 보이는 착각을 제공받는다.
- 가상 메모리 (Virtual Memory): 주 메모리와 디스크에 대한 추상화이다. 각 프로세스는 메모리 전체를 독점적으로 사용하는 것처럼 보이는 자신만의 **가상 주소 공간(virtual address space)**을 갖는다.
- 파일 (File): I/O 장치에 대한 추상화이다. 모든 I/O 장치는 파일이라는 동일한 방식으로 접근된다.
1.8 & 1.9 시스템 간 통신과 중요 주제
현대 시스템은 네트워크를 통해 다른 시스템과 연결되며, 시스템 관점에서 네트워크는 또 다른 I/O 장치로 볼 수 있다.
마지막으로, 이 장은 컴퓨터 시스템 전체를 관통하는 세 가지 중요 주제를 강조하며 마무리된다.
- 암달의 법칙 (Amdahl's Law): 시스템의 한 부분을 개선했을 때 전체 성능에 미치는 영향은 그 부분이 차지하는 비중과 개선된 정도에 따라 제한된다는 원리이다.
- 동시성과 병렬성 (Concurrency and Parallelism): 동시성은 여러 작업이 동시에 진행되는 개념이며, 병렬성은 동시성을 활용하여 시스템을 더 빠르게 만드는 것을 의미한다.
- 추상화의 중요성: 명령어 집합 구조(ISA), 파일, 가상 메모리, 프로세스와 같은 추상화는 컴퓨터 시스템의 복잡성을 관리하는 가장 중요한 도구 중 하나이다.