1. A Tour of Computer Systems
- parent: 0121 CSAPP Third Edition Bryant, Randal E. O'Hallaron, David.
- p.73 ~ p.131 | 60 pages
1.1 Information is bits + context#
The only thing that distinguishes different data objects is the context in which we view them.
서로 다른 데이터임을 구별할 수 있는 유일한 방법은 그것을 바라보는 문맥 뿐이다.
1.2 Programs are translated by other programs into different forms#
- 전처리기
- 헤더파일 포함, 각종 매크로 치환 후 텍스트 파일 출력
- 컴파일러
- C 코드를 CPU 아키텍처와 맞는 명령어셋의 어셈블리 언어로 출력. (텍스트 파일)
- 어셈블러
- 어셈블리 언어를 기계어로 변환하고 목적파일로 출력 (이진파일)
- 링커
- 이진파일로부터 실행 가능한 파일을 만들기 위해 relocatable object들의 주소를 정확한 위치로 할당시킨다.
- relocatable object란?: 정적 라이브러리나 동적 라이브러리들이 정의한 변수, 함수등을 가리키는 포인터. 테이블의 형태로 존재하고 링킹작업 전에는 말 그대로 비어있다.
- 이진파일로부터 실행 가능한 파일을 만들기 위해 relocatable object들의 주소를 정확한 위치로 할당시킨다.
추가
- 로더
- 실행파일을 메모리에 올리고 PC(Program Counter)를 설정하는 프로그램. COW (Copy On Write) 메모리 주소 참조, 동적 라이브러리 로드도 담당한다.
1.3 It pays to understand how compilation system work#
컴파일이 진행되는 방법을 알면 코드를 최적화 시킬 수 있고, 보안취약점으로부터 안전한 코드를 작성할 수 있으며, 링크 타임 에러를 해결할 수 있게 된다.
1.4 Processors read and interpret instructions stored in memory#
셸의 역할: 사용자의 명령을 입력으로 받아 다양한 일을 수행하는 프로그램. 실행 가능한 프로그램을 실행시켜 새 프로세스로 만들어주는 역할을 담당한다.
시스템을 구성하는 하드웨어 컴포넌트 - Buses buses and hierarchical buses {os} - I/O Devices - Main Memory - Processor
Thus, we can distinguish the processor's instruction set architecture, describing the effect of each machine-code instruction, FROM its microarchitecture, describing how the processor is actually implemented.
따라서, 우리는 프로세서의 설계도인 마이크로아키텍쳐와 각각의 기계어가 의미하는 바를 설명하는 명령어 셋 아키텍처 간의 차이를 구별할 수 있습니다.
DMA
Directed Memory Access라고, 우리가 영속저장장치에 저장된 실행 가능한 파일을 실행시킬 때 CPU를 거치지 않고 바로 메모리에 직빵으로 올려버리는 방법이 있다. 그것은 Direct Memory Access Controller라고 불리우는 별도의 칩이 있기에 가능하다.
1.5 Caches matter#
저장장치는 크기가 클수록 느리고, 멀수록 느리다. CPU가 데이터를 처리하는 속도의 증가량보다 메모리가 데이터를 처리하는 속도의 증가량이 느리기 때문에 이 차이는 시대가 지날수록 커진다. 따라서 메인 메모리와 CPU 사이에 캐시를 다단계로 갖추어 중요하고 자주 접근할 데이터들을 빠르게 접근할 수 있도록 만들었다.
localities - 공간적 지역성 - 한 메모리를 참조하게 되면 그 주변도 같이 참조할 가능성이 높다. - 시간적 지역성 - 한 메모리를 참조하게 되면 다시 참조될 가능성이 높다.
1.6 Storage devices form a hierarchy#
register > L1 cache > L2 cache > L3 cache > main memory > disk storage > network
1.7 The operating system manages the hardware#
프로그램이 실행될 때 우리는 하드웨어를 독점적으로 사용하고 있다는 착각을 하게 만든다. 그 기저엔 운영체제가 깔려있고, 운영체제는 레이어로 구현되어있다. 하드웨어를 다루는 작업 (printf
, scanf
등등)을 수행할 때에도 하드웨어를 컨트롤 하는 레이어의 인터페이스를 사용하는 수밖에 없다. 레이어 간의 추상화 덕분에 보안상의 이점도 가져가고, 인지부하도 줄일 수 있게 되었다.
다양한 추상화들 - ISA(Instruction Set Architecture)는 기계의 동작을 추상화했다. - 프로세스는 프로세서를 추상화했다. context switching 덕분에, 프로세서의 개수에 제약을 받지 않고 원하는 만큼의 프로세스를 실행할 수 있게 되었다. - 파일은 디스크 IO 디바이스를 추상화했다. - 가상메모리는 디스크와 메인 메모리를 추상화했다. - 가상 운영체제는 위의 모든 것을 추상화했다. (개쩌는데?) 😮
프로세스
syscall
은 커널 코드와 유저 코드를 분리하는 인터페이스이다
스레드
하나의 프로세스 안에서도 여러개의 실행흐름이 존재할 수 있다.
가상 메모리
- [?] ~~왜 스택이 위에서 아래로 자라고 힙이 아래에서 위로 자라지? brk
는 어디에 붙어있더라? ~~
- 04. process {SP} 에서 볼 수 있듯이, 스택은 높은 주소에서부터 시작해 아래로 향하고, 힙은 낮은 주소에서부터 시작해 올라간다. brk
는 힙의 경계에 붙어있다.
- [?] Memory-mapped region for shared libraries는 어디에 끼어있는거지?
- Program Code, Data (text 영역)
- Heap 영역
- Shared Libraries영역이 가상메모리의 중간에 존재한다고? 들어본 적이 없는데?
- Stack 영역은 모든 함수와 지역변수들이 쌓이는 공간이다.
- 커널 가상 메모리 영역은 커널코드를 직접 손대는 것으로부터 방지하기 위해 마련된 공간이다.
Files
유닉스 시스템에서 모든 것은 파일이다. IO기기나 네트워크도 파일이라는거.
1.8 Systems communicate with other systems using networks#
WWW, FTP, SSH 등 다양한 애플리케이션들이 네트워크 어댑터를 사용하여 통신한다.
1.9 Important themes#
- Amdahl's Law(암달의 저주)
- 병목현상으로 인해 한 컴포넌트의 성능향상이 실제로 유의미한 변화를 주기 어렵다. \(T_{old}\) 시간이 걸리던 한 시스템 중 일부를 개선하여 \(k\) 배 성능향상을 이뤄냈다고 해보자. 만약 이 컴포넌트 실행시간이 전체 시스템의 \(\alpha\) 만큼의 비중을 가지고 있다면 전체 시스템 성능향상 \(T_{new}\)은 어느정도일까?
-
- 그래서 전체 시스템의 60퍼센트의 실행시간을 차지하는 한 컴포넌트를 3배 빠르게 만들었을 때 전체 시스템의 속도는 이전에 비해 1/(0.4 + 0.6 / 3) = 1.6667 배 빨라지게 된다.
-
Concurrency and Parallelism
- Thread Level Parallelism: 멀티 프로세서로 인해 컴퓨터는 동시에 수행할 수 있는 작업의 양이 늘어났다. 하이퍼스레딩 기술을 사용하여 코어 하나당 두개의 스레드를 동시에 실행하는 것을 보장한다.
- Instruction Level Parallelism: Superscala Processors라고 불리우는 파이프라이닝을 통해서 클록 사이클 수회를 차지하는 명령어를 계단 형태로 배치하여 한 사이클 당 하나의 명령어가 실행 완료가 되게 구성할 수 있다.
- [!] Single Instruction Multiple data (SIMD): 한 번에 8개의 실수연산을 수행하도록 하드웨어가 구성되어있어 보다 빠르게 행렬연산을 수행할 수 있다. GCC 컴파일러는 C 코드로부터 SIMD 명령어를 식별해 낼 수 있다.
-
Layer and Abstractions
소프트웨어 공학의 역사는 추상화 수준을 높히는 방향으로 진행되어왔다. | 20230522 김충환 회고강사특강#협력을 통한 추상화
- API (Application Programming Interface): 프로그래머들이 기능을 제공하기 위해 묶어놓은 함수나 클래스의 집합