- 개인적으로 공부하면서 지속적으로 정보를 추가, 수정, 삭제합니다.
- 정확하지 않은 부분 피드백 주시면 감사합니다.
- 본 포스팅은 컴퓨터 시스템 (줄여서 CSAPP) 교재를 강의와 함께 노트한 것입니다.
- 노란색 하이라이트는 블로그 주인의 생각 + 이해가 더 필요한 부분을 개인적으로 표시한 것입니다.
참고: https://github.com/AllenZYoung/CSAPP/blob/master/Notes and Summaries/Ch1/Ch1.md
Computer System A Programmers Perspective (3rd), Randal E. Bryan, David R. O’Hallaron, 김형신 번역, 피어슨에듀케이션코리아, 2016
Chapter 1: A tour of Computer Systems
1.1 정보는 비트와 맥락
다음 포스팅의 1.1 - 1.2 항목 참고! ☞ 컴퓨터 과학, 자료구조, 알고리즘 with C언어
1.2 프로그램은 다른 프로그램에 의해 번역된다
이 부분은 CS50 강의를 들으면서 동일한 내용을 노트
- 컴파일링의 4단계
- 전처리(precomplie)
- 실질적인 컴파일을 하기 전에, 추가된 라이브러리 파일을 확인하고 실제로 그 파일에 들어가 해당하는 소스코드를 복사해옴
- 컴파일링(compile)
- C코드를 어셈블리어라는 저수준 프로그래밍 언어로 컴파일. 컴퓨터가 이해할 수 있는 언어와 최대한 가까운 프로그램으로 만듦
- 어셈블리어는 C보다 연산의 종류가 훨씬 적지만, 여러 연산들이 함께 사용되면 C에서 할 수 있는 모든 것들을 수행 가능
- 컴파일이라는 용어는 이 단계를 얘기하기도, 전체 컴파일링 4단계를 통칭하여 부르기도 함
- 어셈블링(assemble)
- 어셈블리 코드를 오브젝트 코드로 변환.
- CPU가 프로그램을 어떻게 수행해야 하는지 알 수 있는 명령어 형태인 연속된 0과 1들로 바꿔주는 작업.
- 이 변환작업은 어셈블러라는 프로그램이 수행.
- 소스 코드에서 오브젝트 코드로 컴파일 되어야 할 파일이 딱 한 개라면, 컴파일 작업은 여기서 끝나지만, 그렇지 않은 경우에는 링크라 불리는 단계가 추가.
- 링킹(link)
- 만약 프로그램이 (math.h나 cs50.h와 같은 라이브러리를 포함해) 여러 개의 파일로 이루어져 있어 하나의 오브젝트 파일로 합쳐져야 하는 경우 필요한 단계.
- 링커는 여러 개의 다른 오브젝트 코드 파일을 실행 가능한 하나의 오브젝트 코드 파일 합침.
- 예를 들어, 컴파일을 하는 동안에 CS50 라이브러리를 링크하면 오브젝트 코드는 GetInt()나 GetString() 같은 함수를 어떻게 실행할 지 알 수 있게 됨.
- 전처리(precomplie)
1.4 하드웨어 체계
1. 버스 Buses
- words라고 불리는 고정된 바이트 덩어리를 이동시킴
- word에 담기는 바이트의 수는 시스템마다 다름 (a fundamental system parameter)
- 대부분의 기계는 오늘날 4바이트(32비트) or 8바이트(64비트)의 word size를 가짐
2. 프로세서 Processor
- The central processing unit (CPU)
- 메인 메모리에 저장된 지시를 번역하고 수행하는 엔진
- 프로세서의 코어에는 program counter (PC)라고 불리는 word size의 저장 공간(register)이 있음
- PC는 메인 메모리에 기계어로 된 지시가 담긴 곳을 가리키게 됨
3. 메인 메모리 Main Memory
- 메인 메모리는 프로세서가 프로그램을 실행하는 동안 조작하는 프로그램과 데이터를 담는 저장 공간
- dynamic random access memory (DRAM) 칩의 집합으로 구성 됨
1.5 캐시의 중요성
- 저장용량과 속도는 반비례 (아래 1.6의 그림 참고 )
- 따라서 메모리와 프로세서의 속도와 성능에 갭이 생김
- 캐시는 프로세서가 필요로 하고 자주 접근할 거 같은 데이터를 임시로 담는 공간 → 속도에 도움이 됨
- 캐시는 CPU칩 안에 있음
- 작고 빠른 저장 공간(ex. 캐시)을 프로세서와 크고 느린 공간(ex. 메인 메모리) 사이에 넣는 것
1.6 저장 기기의 계층 구조
- 한 레벨에서의 저장 공간은 다음 낮은 레벨의 저장 공간을 위한 캐시 역할을 함! (ex: register 파일은 L1 캐시를 위한 캐시 공간)
1.7 운영체제는the operating system 하드웨어를 관리한다
1. 운영체제란?
- 응용 프로그램과 하드웨어 사이에 위치한 소프트웨어
- 운영체제의 두 가지 목적
- 제멋대로 동작하는 응용 프로그램으로부터 하드웨어의 오사용을 막기 위함
- 복잡하고 각기 다른 저수준의 하드웨어 기기들을 조작하도록 단순하고 균일화된(uniform) 작동 원리를 응용 프로그램에 제공하는 것
- 위와 같은 목적을 달성하기 위해 운영체제는 프로세스, 가상 메모리, 파일을 이용함
2. 프로세스Processes
- 프로세스란 하나의 실행중인 프로그램에 대한 운영체제의 추상화
- 다양한 프로세스는 하나의 시스템에서 동시에 실행될 수 있으며, 운영체제는 각각의 프로그램이 시스템에서 유일하게 실행중인 것 같이 보이게 함 (appears to have exclusively use of the hardwares, 하드웨어를 그 프로그램만이 사용할 수 있는 것처럼 보이게 함)
- 컴퓨터 과학에서 가장 중요하고 성공적인 아이디어 중 하나
- 문맥 전환 Context switching
- 싱글 CPU가 여러 프로세스 사이를 왔다갔다하면서 여러 프로세스를 동시에 처리하는 것처럼 보이게 하는 것
- context
- 운영체제가 프로세스를 실행하기 위해 필요로 하는 모든 상태 정보를 저장한 것
- 현재의 PC(Program Counter) 밸류, register file, 메인 메모리의 내용
- 현재의 context를 저장 → 새로운 프로세스의 context 불러오기 → 새로운 프로세스에게 control 넘겨주기(a system call)
- kernel
- 한 프로세스에서 다른 프로세스로의 전환을 관리하는 운영체제
- 운영체제 코드의 일부분으로, 항상 메모리에 상주한다
- 커널은 분리된 process가 아니라, 다른 모든 프로세스들을 관리하기 위해 시스템이 사용하는 코드와 자료 구조의 집합
- 프로세스 추상화를 달성하려면 "저수준의 하드웨어 + 운영체제 소프트웨어"간의 긴밀한 협업이 필요함
3. 쓰레드 Threads
- 프로세스는 threads라고 불리는 다수의 실행 유닛으로 구성됨
- 각각은 프로세스의 맥락 안에서 실행되며, 같은 코드와 전역 데이터를 공유함
- 다음과 같은 이유로 중요성이 증가하고 있음
- 네트워크 서버에서의 동시성에 대한 요구
- 다양한 프로세스 사이에서 데이터를 공유하는 것보다 쓰레드 사이에서 공유하는 것이 더 쉬움
- 전형적으로 프로세스보다 더 효율적
4. 가상 메모리 Virtual memory
- 각각의 프로세스에게 실제 물리 메모리가 아닌 통일된 가상의 주소 공간을 보이게 하는 것
- 가상 주소 공간 virtual address space
- 가장 위의 구역은 운영체제를 위한 코드와 데이터 공간으로 모든 프로세스에 공통적
- 그 아래 부분은 유저의 프로세스에 의해 정의된 코드와 데이터를 담는 공간으로, 아래에서부터 위로 증가함
- Program code and data: 실행 파일의 내용으로부터 초기화되는 공간. 일단 프로세스가 시작되면 크기가 고정 됨.
- Heap: 프로그램 코드와 달리,
malloc
이나free
같은 라이브러리 호출로 동적으로 크기가 늘어나고 줄어듦. - Shared libraries: 중간 부분의 구역. C 표준 라이브러리, math 라이브러리 같은 것들을 위한 코드와 데이터를 저장.
- Stack: 함수 호출을 위해 컴파일러가 사용하는 공간. Heap처럼 프로그램의 실행 동안 동적으로 늘어나고 줄어듦.
- Kernel virtual memory: 가상 주소 공간의 제일 윗부분. 응용 프로그램은 이 구역을 읽거나 쓰거나, 직접적으로 커널 코드에 정의된 함수를 호출할 수 없음. 그 대신 커널을 호출하여 이러한 연산을 하도록 함.
5. Files
- A sequence of bytes.
- 디스크, 키보드, 모니터, 네트워크 등 모든 I/O 기기들은 파일 형태로 관리됨
- 시스템의 모든 입력과 출력은 파일을 읽고 쓰는 것으로 수행되며, Unix I/O라고 불리는 시스템 호출 집합(a set of system calls)을 이용
- 다양한 입출력 기기들에게 단일한 view를 제공한다는 점에서 강력함
1.8 시스템은 네트워크를 이용하여 다른 시스템과 소통한다
- 네트워크란 또 하나의 I/O 기기
- 인터넷과 같은 글로벌 인터넷의 등장과 함께, 한 기기에서 다른 기기로 네트워크를 통해 정보를 복사하는 것은 가장 중요한 컴퓨터 시스템의 사용
ex) 이메일, instant messaging, WWW(world wide web), FTP 등
1.9 중요한 주제들
1. a system is more than just hardware
- 응용 프로그램을 최종적으로 실행하기 위해 하드웨어와 시스템 소프트웨어의 cooperation이 필수적임
2. Amdahl’s Law
- 시스템의 한 부분의 성능을 증가시키는 것의 유효성에 대한 관찰
- 우리가 시스템의 한 부분의 속도를 증가시킬 때, 전체 시스템의 성능에 미치는 효과는 얼마나 이 부분이 중요한지와, 얼마나 속도를 증가시켰는지에 달려있다.
- 무한대로 속도를 올려도 전체 시스템의 속도 증가는 미미할 수 있음 → 전체 시스템에서 매우 큰 부분의 속도를 증가시켜야 함
3. Concurrency and Parellelism
- 컴퓨터 역사에서 “더 많은 일을”, "더 빠르게 수행하기"에 대한 요구가 발전의 가장 큰 추진력임 → 프로세서가 더 많은 일을 동시에 하도록 하기
- 동시성 concurrency: 다양한, 동시적인 작업을 수행하는 것
- parellelism: 시스템이 더 빨리 작동하게 하기 위해 동시성을 이용하는 것
- Thread-Level Concurrency
- uniprocessor system
- multiprocessor system
- multi-core processor
- hyperthreading (simultaneous multi-threading)
- Instruction-Level Parellelism: 다수의 명령을 동시에 실행
- superscalar processors
- Single-Instruction, Multiple-Data (SIMD) Parelleism: 하나의 명령이 다수의 연산을 동시에(in parellel) 실행할 수 있도록 하는 특별한 하드웨어
4. 컴퓨터 시스템에서 추상화의 중요성
- instruction set architecture
- 파일
- 프로세스
- 가상 메모리 virtual memory
- 가상 머신 virtual machine
'컴퓨터 시스템' 카테고리의 다른 글
컴퓨터 시스템 정리 (CSAPP) Chapter 11 네트워크 프로그래밍 (0) | 2022.12.10 |
---|---|
컴퓨터 시스템 정리 (CSAPP) Chapter 9 가상메모리 (0) | 2022.12.03 |
컴퓨터 시스템 정리 (CSAPP) Chapter 6 (0) | 2022.12.03 |
컴퓨터 시스템 정리 (CSAPP) Chapter 3 Machine-Level Reperesentation of Programs (0) | 2022.11.30 |