컴퓨터 과학 (Computer Science)/컴퓨터 시스템 (CS:APP)
1장: 컴퓨터 시스템으로의 여행
redsiwon
2023. 6. 19. 11:50
Computer Systems: A Programmer's Perspective, 3/E (CS:APP3e) 를 읽고 정리한 글입니다.
(+) 표시는 책 내용 요약에 덧붙여 제 생각을 정리한 내용입니다. 틀린 내용이 있을 수 있습니다.
1.1 정보는 비트와 컨텍스트로 이루어진다
- 모든 시스템 내부의 정보는 결국 비트들로 구성된다.
- 다만 맥락에 따라 파일, 프로그램, 패킷 등으로 구분될 뿐이다.
- (+) 맥락은 목적과 그에 맞는 약속이라고 볼 수 있을 것 같다. 예를 들어 아스키 코드는 영문 텍스트를 표현하고자 하는 ‘목적’에 따라 1개의 바이트로 1개의 문자를 표시하는 ‘약속’이다. 목적이 조금 더 구체화될수록 해당 목적에 맞는 약속이 생겨난다. 계속해서 텍스트 표현에 대하여 예를 들면 아스키 코드 뿐만 아니라 웹에서 활용되는 UTF-8를 비롯하여 수많은 인코딩 방식이 존재한다.
1.2 프로그램은 다른 프로그램에 의해 다른 형태로 번역된다
- 소스코드(.c, text) → 전처리기 → 수정된 소스코드(.i, text)
- C 언어로 작성된 소스코드는 #으로 시작하는 전처리 지시자들을 읽어서 적절한 작업을 수행하여, 수정된 소스파일을 생성한다.
- 수정된 소스코드(.i, text) → 컴파일러 → 어셈블리 코드 (.s, text)
- 전처리기에 의해 수정된 소스코드는 컴파일러에 의해 보다 더 저수준의 언어인 어셈블리어로 번역된다. (어셈블리어는 기계어와 1:1로 매칭될 수 있는 저수준의 언어다.)
- 어셈블리 코드(.s, text) → 어셈블러 → 재배치 가능 목적 프로그램(.o, binary)
- 어셈블러에 의해 어셈블리 코드는 비트들로 이루어진 기계어로 번역된다. 기계어는 0과 1만으로 이루어진 비트열로서 CPU에서 동작 가능하다.
- 재배치가능(relocatable) 목적 프로그램(.o, binary) + 외부 재배치가능 목적 프로그램 → 링커 → 실행가능한 목적 프로그램(binary)
- 작성한 코드에서 라이브러리를 사용한다면 이미 컴파일되어있는 라이브러리를 함께 주입, 연결시켜야 하나의 프로그램으로 실행할 수 있다. 링커가 이 역할을 해준다. 이렇게 만들어진 프로그램은 메모리에 로드하며 CPU에 의해 실행될 수 있다.
1.3 컴파일 시스템이 어떻게 동작하는 이해하는 것은 중요하다
프로그램 성능 최적화하기 — 컴파일러가 고수준 언어를 어떻게 기계어로 번역하는가?
- switch vs if-else
- loop — while vs for
- 함수 호출의 오버헤드
링크 에러 이해하기
- 변수 또는 함수 이름 충돌 문제
- 정적 변수 vs 전역 변수
- 정적 라이브러리 vs 동적 라이브러리
보안 약점 피하기
- 스택(stack) 및 버퍼 오버플로우(buffer overflow)
1.4 프로세서는 메모리에 저장된 인스터력션을 읽고 해석한다
1.4.1 시스템의 하드웨어 조직
- 버스(Bus)
- 시스템 내부의 전선 배선들의 집합으로서, 모든 데이터 송수신의 통로이다.
- 입출력(I/O) 장치
- 시스템과 외부세계를 연결해주는 장치다.
- 컨트롤러 또는 어댑터가 입출력 버스와 입출력 장치 사이의 데이터 송수신을 담당한다.
- 메인 메모리
- 물리적으로는 DRAM(Dynamic Random Access Memory)으로 구성된 휘발성 메모리다. — 전원 공급이 끊어지면 데이터가 모두 휘발(삭제)된다.
- 논리적으로는 연속된 바이트의 배열로, 각각의 바이트가 고유한 주소(배열 인덱스)를 가져서 임의로 접근할 수 있다.
- 프로그램에 관련된 데이터 및 CPU에서 실행할 명령어(instruction)를 저장한다. 명령어 및 데이터들은 크기가 다양하다.
- 프로세서(Processor, CPU)
- 메인 메모리에 저장된 명령어를 읽고 실행한다.
- ALU(연산장치)와 레지스터(연산에 필요한 데이터 저장), PC(Program Counter)로 이루어져 있다.
- PC는 연산을 수행할 명령어가 저장되어 있는 메인 메모리의 주소를 저장한다. CPU는 PC의 설정값에 따라 명령어를 읽어와서 명령어에 따라 연산을 수행하고, 다음 실행할 명령어의 주소로 PC를 갱신한다.
계속 업데이트될 예정...