Priceless
[컴퓨터] Computer Systems: A Programmer's Perspective 챕터1 정리 본문
Computer Systems: A Programmer's Perspective
위 책의 내용을 정리하였습니다
Chapter 1: A Tour of Computer Systems
아래 코드를 기준으로 설명
// hello.c
#include <stdio.h>
int main()
{
printf("hello, world\n");
}
1-1. Information Is Bits + Context
프로그램은 소스 프로그램(소스 파일)로 이루어져 있다
소스 프로그램은 bit(0과 1)의 연속이며, 8bit를 1byte로 정한다
ASCII code(아스키코드)를 사용하여 문자를 정수로 변한다
아래는 hello.c를 아스키코드로 변환한 결과이다

이러한 코드를 해석하기 위해서는 context가 필요하다
context를 통해 이 코드가 어떻게 동작하는지 정해진다
1-2. Programs Are Translated by Other Programs into Different Forms
사람이 이해할 수 있는 C언어 프로그램은 컴퓨터가 바로 이해할 수 없다
C언어 프로그램을 실행하기 위해서는 기계 언어의 low level의 언어로 번역되어야 실행할 수 있다
Unix 시스템에서 컴파일러 드라이버를 통해 소스 파일로부터 객체 파일로 변환한다
gcc 컴파일러 드라이버는 hello.c를 읽고 실행 가능한 파일인 hello로 translation한다
gcc -o hello hello.c
translation 과정은 아래와 같다

- pre-processing(전처리): # 문자로 시작하는 directives를 호출하여 원래의 C 프로그램을 수정한다(#include, #define 등)
그 결과로 소스 코드인 c 확장자 파일로부터 전처리된 코드인 i 확장자의 파일로 translation 한다
(hello.c -> hello.i)
#include: 헤더 파일 호출
#define: 매크로, 전역 변수 설정
- Compilation(컴파일, 편집): 전처리된 i 확장자 파일을 어셈블리어 코드로 작성된 s확장자 파일로 translation한다
(hello.i -> hello.s)
- Assembly(어셈블리): 어셈블리어의 s 확장자 파일을 binary 타입으로 저장한다
어셈블리 코드인 s 파일을 컴파일하여 객체 파일 o확장자 파일을 생성한다
(hello.s -> hello.o)
- Linking(링킹, 연결): 컴파일을 통해 생성된 객체 파일인 o 확장자 파일(ex. printf.o)을 한 개 이상 사용하기 위해 linking 작업을 거치고, 메모리에 로드된 후 최종 executable 파일을 생성한다
(hello.o -> hello(.exe))
1-3. It Pays to Understand How Compilation Systems Work
Overview about following chapter
이후 챕터에 대한 개요
1-4. Processors Read and Internpret Instructions Stored in Memory
shell은 프롬프트를 출력하고, 명령어를 입력 받는다
이후 명령을 수행하고 프로그램을 종료한다
1-4-1. Hardware Organization of a System

위 사진은 인텔의 Pentium 프로세서의 시스템 구성을 나타낸다
다른 프로세서 또한 비슷한 원리도 동작한다
Bus(버스): 시스템 전체에 걸쳐 byte를 전달하는 배선
혈관과 같은 기능이다
I/O Device(입출력장치): 시스템을 외부 장치와 연결시키는 장치
키보드와 마우스, 스피커 등 외부 장치를 연결할 수 있다
Main Memory(메인 메모리): 프로세서가 프로그램을 실행하는 동안 다루는 데이터를 보관하는 임시 저장 장치
byte를 저장하는 곳마다 고유 주소를 가지고 있다
Processor(프로세서): 메인 메모리에 저장된 명령어를 실행하는 장치
프로그램 카운터라는 저장 장치를 통해 메인 메모리의 주소를 저장한다
CPU(Central Processing Unit) 라고 한다
레지스터 파일, ALU 등 다양한 장치의 집합체이다
아래의 기능들을 수행한다
- Load: 메인 메모리의 데이터를 레지스터에 복사하여 이전 내용을 덮어 쓴다
- Store: 레지스터의 데이터를 메인 메모리에 복사하여 이전 내용을 덮어 쓴다
- Operate: ALU에 레지스터의 데이터를 복사하고 연산을 수행한 후, 수행 결과를 레지스터에 덮어쓴다
- Jump: instruction에서 데이터를 추출하고, 데이터를 프로그램 카운터에 덮어쓴다
1-4-2. Running the hello program
'hello' 라는 문자를 입력하면 문제를 레지스터로 읽은 다음 메모리에 저장
이후 객체 파일 코드와 데이터를 디스크에서 메인 메모리로 복사
객체 파일 코드와 데이터가 메모리에 로드되면 프로세서는 기계어 명령어를 실행

1-5. Caches Matter

메모리 간의 이동 속도를 줄이기 위해 캐시를 사용
L2 캐시가 L1 캐시보다 5배 정도 오래 걸린다
캐시에 원하는 데이터가 없으면 Cache miss 발생
Cache miss 가 자주 발생한다는 것은 최적화가 잘 되지 않았다는 뜻
1-6. Storage Devices Form a Hierachy

1-7. The Operating System Manages the Hardware

Context switch를 통해 현재 사용 중인 프로세스 전환

페이지 단위로 관리, 스왑

1-8. Systems Communicate with Other Systems Using Networks

1-9. Important Themes

1-10. Summary
'CS' 카테고리의 다른 글
[컴퓨터] Computer Systems: A Programmer's Perspective 챕터3 정리 (0) | 2023.11.07 |
---|---|
[컴퓨터] Computer Systems: A Programmer's Perspective 챕터4 정리 (0) | 2023.10.26 |
[컴퓨터] Computer Systems: A Programmer's Perspective 챕터2 정리 (1) | 2023.10.05 |