1 A Tour of Computer Systems

개요

이 책을 통해 배우는 내용

#include <stdio.h>

int main(){
    printf("hello, world\n");

    return 0;
}

1.1 정보는 Bits + Context

ASCII text representation of hello.c

1.2 프로그램은 다른 프로그램에 의해 다른 형식으로 번역된다

main:
  subq  $8, %rsp
  movl  $.LC0, %edi
  call  puts
  movl  $0, %eax
  addq  $8, %rsp
  ret
hello.c
-> 전처리 -> # 지시에 따라 수정된 hello.i
-> 컴파일 -> 어셈블리어로 번역된 hello.s
-> 에셈블러 -> 재배치 가능 파일 hello.o
-> Linker -> prinf.o와 hello.o 연결
-> 실행 가능한 hello 파일

1.3 컴파일 시스템 동작 방식을 이해하는 것이 좋다

1.3.1 프로그램 성능 최적화

1.3.3 보안상의 구멍 피하기

1.4 메모리에 저장된 명령들을 읽고 해석하는 프로세서

1.4.1 시스템의 하드웨어 구성

F1.4

Buses

I/O 장치

Main Memory

Processor

1.4.2 hello 프로그램 실행하기

F1.5

  1. 쉘 프로그램은 사용자의 명령어 입력을 대기
  2. ./hello 명령어 입력
  3. 쉘 프로그램은 ., /, h, e 등을 각각 읽어서 레지스터에 기입하고 주기억장치에 저장
  4. enter 입력함으로써 쉘 프로그램은 명령어 입력이 끝났음을 감지

F1.6

  1. 쉘 프로그램은 direct memory access(DMA) 기술 사용하여 프로세서를 거치지 않고 디스크의 데이터를 직접 주기억장치로 전달
    1. 인련의 명령어를 실행하여 디스크의 hello 오브젝트 파일의 코드와 hello, world\n 문자열 포함하는 데이터 → 주기적장치로 복사
    2. 실행 가능한 hello 파일 로드

F1.7

  1. hello 오브젝트 파일의 코드와 데이터가 주기억장치에 로드되면
    1. 프로세서가 hello 프로그램의 main 루틴(routine)의 기계어 명령어들을 실행
    2. 기계어 명령어들은 주기억장치의 hello, world\n 문자열 bytes → register file 로 복사 → 디스플레이 장치로 복사

1.5 Cache Matter

F1.8

1.6 계층 구조 형성하는 저장 장치

F1.9

1.7 OS는 하드웨어를 관리한다

F1.10

F1.11

1.7.1 프로세스

a. context

b. context switching 방식

c. helloshell 예제

d. kernel

F1.12

1.7.2 Thread

1.7.3 가상 메모리

F1.13

가상 주소 공간의 영역

Program code and data
Heap
Shared libraries
Stack
Kernel virtual memory

1.7.4 파일

1.8 시스템은 네트워크 사용한 단른 시스템과 통신한다

F1.14

1.8.1 네트워크 통한 hello 실행

F1.15

step1

step2

step3

step4

1.9 중요한 테마

1.9.1 암달의 법칙

개요

수식

$S(=speed up) = T_{old} / T_{new}$

$T_{new}\newline$ $= (1 - a)T_{old} + (a \times T_{old})/k\newline$ $= T_{old}[(1 - a) + a/k]$

$S = T_{old}/T_{new} = \frac{1}{(1-a) + a/k}$

여기서 $k = \infty$로 가정한다면, $a/k$ 부분은 무시할만큼 적은 시작이 되고, $S_{\infin} = \frac{1}{(1-a)}$를 얻을 수 있다. 만약 시스템의 60%를 거의 시간이 필요 없을 정도로 속도를 향상 시킨다면, 순 속도 향상은 1 / 0.4 = 2.5배가 된다

예제

$S = 1 / [(1 - 0.6) + 0.6/3] = \frac{10}{6} = 1.67$

예제 1.1 트럭 운전사로 Boise, Idaho에서 Minneapolis, Minnesota로 감자를 운반하기 위해 총 2,500 키로미터를 이동한다고 해보자. 평균 100 km/hr로 운전한다고 했을 때, 총 25시간이 소요된다 A. 뉴스에서 막 Montana가 막 속도 제한을 없앴다는 소식을 들었다. Montana 지역은 1,500 km를 차지하는 구간이다. 트럭은 150 km/hr로 이동할 수 있다. 속도 향상(speedup)은 얼마인가?

B. 새로운 turbocharger를 살 수 있다. 종류가 다양한데, 더 빠른 것은 더 비싸다. 이동의 전체 속도가 1.67배 향상되려면 얼마나 빨리 Montana를 통과해야 하는가?

예제1.2 자동차 제조사는 고객에게 나음 출시되는 새로운 엔진은 4배의 성능 향상을 보여줄 것이라고 고객에게 약속을 했다. 당신은 이 약속을 이행(deliverying on)하는 업무를 맡게 됐다(왓더…). 당신은 엔진의 오직 90%만 개선할 수 있다고 정했다. 엔진의 목표 전체 성능 향상에 달성하려면, 얼만큼 향상시킬 필요가 있는가?(즉 k값은?)

$1 / [(1 - 0.9) + 0.9/k] = 4\newline$ → $0.1 + 0.9/k = 1/4\newline$ → $0.4 + 3.6/k = 1\newline$ → $3.6/k = 0.6\newline$ → $k = 3.6/0.6\newline$ → $k = 6$

1.9.2. 동시성과 병행

동시성(concurrency)

병행(parallelism)

쓰레드 레벨의 동시성
uniprocessor system
multiprocessor system

F1.16

multi-core processor

F1.17

hyperthreading
명령어 레벨의 동시성
pipelining
superscalar processors
SIMD(Single-Instruction, Multiple-Data) Parallelism

1.9.3. 컴퓨터 시스템에서 추상화의 중요성

프로세서의 측면에서

F1.18

OS의 측면에서

1.10 요약