1. 정보는 비트와 컨텍스트로 이루어진다

    1. 컴퓨터 시스템 = 하드웨어와 시스템 소프트웨어의 조합
    2. 소스 프로그램은 0 또는 1로 표시되는 비트들의 연속이며, 바이트라는 8비트 단위로 구서
    3. 대부분의 컴퓨터 시스템은 ASCII 표준을 사용

    <aside>

    C Lang은 벨 연구소의 Dennis Ritchie에 의해 개발됨

    당시 그는 C는 “변덕스럽고, 오류투성이고, 엄청난 성공”이라고 표현했음

  2. 프로그램은 다른 프로그램에 의해 다른 형태로 번역된다.

    1. C Lang으로 작성된 프로그램은 high-level 언어에 속함
      1. 하지만, low-level 기계어로의 번역이 필요함

      2. 이럴 때 사용되는 것이 Compiler (e.g., gcc)

        gcc -o hello hello.c
        
      3. 일반적으로 아래 사진과 같은 단계로 번역이 이루어짐

        hello.c 가 번역이 이루어지는 과정, (출처 : CSAPP Fig. 1.3)

        hello.c 가 번역이 이루어지는 과정, (출처 : CSAPP Fig. 1.3)

        1. Preprocessing
          1. #으로 시작하는 (e.g., #include <stdio.h>) 헤더를 전처리기에게 시스템 헤더파일인 stdio.h를 프로그램 문장에 삽입하라고 지시한 이후, .i 로 끝나는 C 프로그램 생성
        2. Compile
          1. 컴파일러는 hello.ihello.s로 번역하는데, 이 과정에서 어셈블리어 프로그램이 저장
          2. 참고로 어떠한 컴파일러를 사용하더라도 어셈블리어는 동일한 결과를 가져옴
        3. Assembly
          1. 어셈블러가 hello.s를 기계어 인스트럭션으로 번역, relocatable object program 으로 만들어 hello.o라는 목적 파일에 결과를 저장
          2. hello.omain함수의 명령을 인코딩하기 위한 17바이트를 포함
        4. Linking
          1. 쉽게 본다면, hello.oprintf.o(hello.c에 들어있는 printf 함수의 이미 컴파일된 파일)를 결합하는 과정을 수행
          2. 이 결과가 우리가 아는 실행 파일(=목적 파일)로 메모리에 적재되어 실행됨
  3. 컴파일 시스템이 어떻게 동작하는지 이해하는 것은 중요하다.

    1. 프로그램 성능 최적화하기
      1. 효율적인 코드 작성을 위한 컴파일러의 내부 동작 파악 필요
        1. 최소한, 컴파일러가 어떻게 C 문장들을 기계어 코드로 번역하는지는 알아야함
    2. 링크 에러 이해하기
      1. 개발자에게는 가장 당혹스러운 프로그래밍 에러
    3. 보안 약점 피하기
      1. Buffer Overflow는 역사가 긴 인터넷 / 네트워크 상의 보안 약점.
        1. 그렇다면 파훼법은?
  4. 프로세서는 메모리에 저장된 인스트럭션을 읽고 해석한다.

    1. 쉘은 커맨드라인 인터프리터로 프롬프트를 출력하고 명령어 라인을 입력받아 그 명령을 실행

    2. 시스템의 하드웨어 조직

      전형적인 시스템의 하드웨어 구성, (출처 : CSAPP Fig. 1.4)

      전형적인 시스템의 하드웨어 구성, (출처 : CSAPP Fig. 1.4)

    3. Buses

      1. 시스템 내를 관통하는 전기적 배선군
        1. 컴포넌트들 간에 바이트 정보들(Word)을 전송
        2. 한개의 워드는 4bytes / 8bytes 의 크기를 갖는다
    4. I/O Devices

      1. 시스템과 외부세계와의 연결을 담당
        1. 사진의 경우 Mouse / Driver / Display / Disk
    5. Main Memory

      1. 프로세서가 프로그램을 실행하는 동안 데이터와 프로그램을 모두 저장하는 임시 저장 장치
      2. DRAM = Dynamic Random Access Memory
      3. 이러한 메모리들은 연속적인 Bytes의 배열
        1. 0부터 시작해서 고유의 주소를 갖게 됨
    6. Processor

      1. CPU(Central Processing Unit) 또는 프로세서는 메인 메모리에 저장된 인스트럭션들을 해독하는 엔진

      2. 프로세서의 중심에는 워드 크기의 저장장치(or Register)인 프로그램 카운터(PC)가 있음

      3. PC가 가르키는 곳의 instruction을 반복적으로 실행

      4. PC값이 다음 instruction의 위치를 가르키도록 업데이트

        이러한 단순한 동작이 메인 메모리, 레지스터, Arithmetic/Logic Unit(ALU) 주위를 순환

      5. 아래는 instruction의 요청에 의해 CPU가 실행하는 단순한 작업의 예시

        1. Load : 메인 메모리에서 레지스터에 한 바이트 또는 워드를 이전 값에 덮어쓰는 방식으로 복사
        2. Store : 레지스터에서 메인 메모리로 한 바이트 또는 워드를 이전 값을 덮어쓰는 방식으로 복사
        3. Operate : 두 레지스터의 값을 ALU로 복사, 두 개의 워드로 수식 연산을 수행, 결과를 덮어쓰기 방식으로 레지스터에 저장
        4. Jump : Instruction 자신으로부터 한개의 워드를 추출, PC에 덮어쓰기
  5. 캐시가 중요하다

    1. 사용자의 Input에서 Display의 Output까지 많은 이동들이 존재
      1. 또한, 더 큰 저장 장치는 더 작은 저장 장치보다 느린 속도를 가짐

        1. e.g., 하드 디스크는 메인 메모리보다 데이터를 읽는데 천만배 오래걸림
        2. 프로세서는 메모리보다 100배 더 빨리 읽을 수 있음
      2. 이러한 프로세서 - 메모리 간의 속도 격차를 줄이기 위해 Cache memory 가 등장

        1. 임시 저장의 용도
        2. L1 Cache : 수천 바이트만 저장 가능, 프로세서 칩 내에 있음, SRAM
        3. L2 Cache : 수백 KiB ~ 수 MiB 저장 가능, 프로세서와 전용 버스를 통해 연결 SRAM

        캐시 메모리에 대한 그림, (출처 : CSAPP Fig. 1.8)

        캐시 메모리에 대한 그림, (출처 : CSAPP Fig. 1.8)

  6. 저장 장치들은 계층 구조를 이룬다.

    메모리 계층 구조, (출처 : CSAPP Fig. 1.9)

    메모리 계층 구조, (출처 : CSAPP Fig. 1.9)

  7. 운영체제는 하드웨어를 관리한다.

    1. 유저는 프로그램을 실행할 때, 직접 메모리 혹은 디스크에 접근하지 않음

      1. Operating System이 역할을 대체
    2. OS의 목적

      1. 제멋대로 동작하는 응용프로그램들이 하드웨어의 오사용을 막기 위해
      2. 단순하고 균일한 매커니즘을 사용하여 Low-Level 하드웨어 장치들을 조작할 수 있도록 하기 위해
    3. Process

      1. 실행 중인 프로그램에 대한 OS의 추상화
      2. 다수의 프로세스들은 동일한 시스템에서 동시에 실행될 수 있음
      3. OS는 Context Switching 을 사용하여 이러한 교차 실행을 수행

      프로세스의 컨텍스트 스위칭, (출처 : CSAPP Fig. 1.12)

      프로세스의 컨텍스트 스위칭, (출처 : CSAPP Fig. 1.12)

    4. Threads

    5. Virtual Memory

    6. Files

  8. 시스템은 네트워크를 사용하여 다른 시스템과 통신한다.

  9. 중요한 주제들