CSAPP(1) - A Tour of Computer Systems

업데이트:

In a sense, the goal of this book is to help you understand what happens and why when you run hello on your system

1. Information Is Bits + Context

  • hello 프로그램은 소스 프로그램이다
  • 소스 프로그램은 0과 1로 된 비트의 시퀀스이다.
  • 그것은 bytes라고 불리는 8비트 청크로 조직된다.
  • 각 바이트는 프로그램의 텍스트 문자를 표현한다.
  • 대부분의 컴퓨터 시스템은 텍스트 문자를 ASCII 표준으로 표현한다.
  • ASCII문자는 유니크한 바이트 크기의 정수값으로 표현된다.
  • ASCII문자로만 이루어진 파일을 텍스트 파일이라 한다.
  • 나머지 파일들은 바이너리 파일이라 한다.

가장 기본적인 아이디어 : 시스템의 모든 정보는 비트로 표현된다. 다른 데이터 개체를 구분하는 유일한 것은 우리가 그것(비트)를 보는 Context이다.

2. Programs Are Translated by Other Programs into Differrent Forms

  • 전처리기는 C 프로그램을 수정.(ex. 매크로)
  • 컴파일러는 어셈블리어로 변환
    • 어셈블리어는 여러 고수준 언어(C, Fortran)와 컴파일러가 동일한 어셈블리어를 출력하기에 유용하다.
  • 어셈블러는 실행 프로그램으로 변환
  • 링커는 표준 C 라이브러리의 실행 파일과 이전 단계의 실행 파일을 머지한다.

3. It Pays to Understand How Compilation Systems Work

컴파일링 시스템을 이해함으로써

  • 프로그램 성능을 최적화할수 있고
  • 링크 타임 에러를 이해할 수 있고
  • 보안 허점을 막을 수 있다.

4. Processors Read and Interpret Instructions Stored in Memory

4.1. Hardware Organization of a System

Bus

  • 컴포넌트 사이에 바이트를 전달하는 배관
  • word 라는 고정된 바이트 청크를 전달하기 위해 설계됨
    • word는 대부분 32비트 혹은 64비트

I/O Device

  • 각 입출력 장치는 입출력 버스와 연결됨.
  • controller와 adapter는 입출력 버스와 입출력 장치를 연결하는 역할

Main memory

  • 임시 저장장치
  • 프로세서가 프로그램을 처리하는 동안 프로그램과 데이터를 저장함
  • 물리적으로 DRAM의 집합으로 구성됨
  • 논리적으로 바이트의 선형 배열로 구성됨

Processor

  • 메인 메모리에 저장된 명령을 실행함
  • 핵심은 program counter라 불리는 워드 크기 저장장치(register)
    • pc는 메인 메모리의 기계어 명령의 주소를 가지고 있음
  • 프로세서는 반복해서 pc에 있는 명령을 실행하고 pc를 다음 명령으로 갱신한다.
  • register file은 워드 크기 레지스터 집합으로 이루어진 작은 저장 장치
  • ALU(산술 논리 장치)는 새 데이터와 주소를 계산
  • CPU가 명령어에 의해 수행하는 작업들
    • Load : 메인 메모리의 바이트나 워드를 레지스터로 복사. 이전의 레지스터 값을 덮어쓴다.
    • Store : 레지스터의 바이트나 워드를 메인 메모리로 복사. 이전의 값을 덮어쓴다.
    • Operate : 두 레지스터에 있는 값을 ALU로 복사. 산술 연산을 수행하고 결과를 레지스터로 저장. 이전의 레지스터 값을 덮어쓴다.
    • Jump : 명령어에서 워드를 추출해서 PC에 복사한다. 이전의 PC값을 덮어쓴다.

4.2. Running the hello Program

5. Caches Matter

위 예시의 주요 교훈은 시스템이 데이터를 옮기는 데 많은 시간을 쓴다는 것이다. hello 프로그램의 기계어 명령은 디스크에 있다가 메인 메모리로 복사되었다가, 프로세서로 간다.

이러한 복사는 “찐 일” 을 느리게 한다. 따라서 시스템 설계자에게는 복사 연산을 가능한 빠르게 하는 것이 주요 목표다.

물리적인 법칙에 의해 큰 저장 장치는 작은 저장 장치보다 느리고, 싸다. 이런 차이를 극복하기 위해 캐시 메모리가 등장

  • L1, L2 캐시는 static ramdom access memory(SRAM) 라는 하드웨어로 구현
  • 캐싱의 기본 아이디어는 지역성
    • 지역성 : 인접한 공간의 데이터에 자주 접근하는 경향

6. Storage Devices Form a Hierarchy

7. The Operating System Manages the Hardware

hello 프로그램이 메시지를 출력할 때 프로그램은 디스플레이, 디스크, 메인 메모리에 직접 접근하지 않는다. 운영 체제가 제공하는 서비스에 의존한다.

응용 프로그램이 하드웨어를 조작하기 위한 모든 시도는 운영 체제를 통해야 한다.

운영 체제의 추상화

  • 하드웨어를 응용 어플리케이션으로부터 보호
  • 다른 하트웨어에 대해 간결하고 통일된 매커니즘 제공

7.1. Process

  • 프로세스는 운영체제의 프로그램을 실행하는 추상화이다.
  • 여러 프로세스는 동일한 시스템에서 동시에 실행될 수 있다.
  • 운영체제는 프로그램이 시스템에서 유일하게 동작하는 것저럼 보이게 한다.
  • 운영체제는 context switching을 통해 단일 CPU가 여러 프로세스를 동시에 실행하는 것처럼 보이게 한다
    • context는 PC, register file, main memory 상태를 포함한다.
    • context switching 시에는 현재 프로세스의 context를 저장하고 새 프로세스의 context를 불러온 뒤 제어권을 넘긴다
  • os의 kernel에서 context switch를 담당한다.
    • 커널은 메모리에 상주하는 os 코드의 일부다
    • 응용 프로그램은 os가 제공하는 연산이 필요할 때 system call 명령을 수행한다.
    • system call을 하면 os에게 제어권을 넘긴다.
    • 커널은 별도 프로세스가 아니고 코드와 프로세스들을 관리하기 위한 자료구조의 집합이다.

      system call은 언제나 context switch 하는가? -> 아니다. 자바의 System.currentTimeMillis() 같은 경우는 gettimeofday system call 하나, 제어권을 넘기지 않는다. 블락 필요없기 때문으로 추측한다.

7.2. Threads

모던 시스템에서 프로세스는 여러 실행 단위인 thread로 구성된다.

  • 각 스레드는 프로세스에서 다른 context를 가지고 동일한 코드와 전역 데이터를 공유한다.
  • 네트워크 서버에서 동시성 요구사항이 증가하며 중요해졌다.
  • 멀티 프로세싱보다 멀티 스레딩이 데이터를 공유하기 쉽기에 효율적이다.

7.3. Virtual Memory

가상 메모리는 각 프로세스가 독점적으로 메인 메모리를 사용하는 것처럼 보이게 하는 추상화이다.

  • 각 프로세스는 메모리에 대해 동일한 뷰를 갖는다. 이걸 virtual address space라 한다.

  • 가상 메모리의 상위 지역일수록 프로세스에서 공통으로 사용하는 os의 코드와 데이터를 가진다.
  • 하위 지역은 유저 프로세스의 코드와 데이터를 가진다.
  • 그림에서 주소는 아래에서 위로 증가한다.

각 프로세스의 가상 주소 공간은 특정 목적에 맞는 구역으로 구성된다. 아래 주소부터 위로 다음 영역으로 구성된다.

  • Program code and data : 모든 프로세스에서 코드는 동일한 고정 주소에서 시작한다. 그 위 주소에 전역 C 변수와 연관된 데이터 구역이 있다. 코드와 데이터 영역은 실행 파일에 의해 직접 초기화된다.
  • Heap : 그 위 주소에 런타임 heap이 있다. 코드와 데이터 영역과 다르게 힙은 런타임에 동적으로 확장되고 축소된다.
  • 중간쯤에 공유 라이브러리를 위한 코드와 데이터가 있다. 동적으로 링킹된다.
  • Stack : 유저 가장 주소 공간의 가장 위에는 user stack이 있다. 컴파일러는 함수 호출을 위해 사용한다. 힙과 같이 런타임에 동적으로 확장되고 축소된다. 함수를 호출하면 확장되고 반환하면 축소된다.
  • Kernel virtual memory : 주소 공간의 가장 위에는 커널이 점유한다. 응용 프로그램은 이 영역에 접근이 불가능하다. 시스템 콜을 통해서만 접근 가능

가상 메모리가 작동하려면 프로세서에서 생성된 모든 주소의 하드웨어 변환을 포함하여 하드웨어와 운영 체제 소프트웨어 간의 정교한 상호 작용이 필요하다.

7.4. Files

  • 파일은 바이트의 시퀀스다.
  • 모든 입출력 장치(디스크, 키보드, 디스플레이, 네트워크)는 파일로 모델링되어 있다.
  • 모든 입력과 출력은 Unix I/O로 알려진 시스템 콜의 집합을 통해 파일 읽기와 쓰기로 수행된다.
  • 응용 애플리케이션은 다양한 입출력 장치를 동일한 뷰로 사용할 수 있다.

8. Systems Communicate with Other Systems Using Networks

모던 시스템은 다른 시스템과 네트워크로 연결되어 있다.

  • 개별 시스템 관점에서 네트워크는 하나의 입출력 장치로 보인다.

9. Important Themes

시스템은 겹겹이 얽힌 하드웨어와 소프트웨어의 집합이고 어플리케이션의 궁극적인 목표를 위해 협력해야 한다.

9.1. Amdahl’s Law

시스템 한 부분의 속도를 올릴 때, 전체 시스템의 성능에 미치는 영향은 해당 부분이 얼마나 중요하고 속도가 얼마나 빨라졌는지에 따라 달라진다.

  • $T_{old}$ 의 시간을 요구하는 시스템이 있을 때,
  • 특정 부분이 이 시간의 비율 $\alpha$ 만큼 필요하고
  • 성능을 $k$만큼 향상시킨다고 가정하자.
  • 그러면 원래 $\alpha T_{old}$만큼의 시간이 걸렸던 게
  • $(\alpha T_{old})/k$ 만큼 필요해진다.
  • 그리고 전체 시간은 요렇게 된다.

$ \begin{align} T_{new} &= (1 - \alpha)T_{old} + (\alpha T_{old})/k
&= T_{old}[(1-\alpha) + \alpha/k]
\end{align} $

  • speedup $S = T_{old}/T_{new}$는 요렇게 된다.

$ \begin{align} S = \frac{1}{(1-\alpha) + \alpha/k}
\end{align} $

to significantly speed up the entire system, we must improve the speed of a very large fraction of the overall system.

출처

  • https://csapp.cs.cmu.edu/
  • 책 “Computer Systems : A Programmer’s Perspective”

태그:

카테고리:

업데이트:

댓글남기기