Computer System: A Programmer's Perspective(CS:APP) Chapter 1 정리

최준영·2021년 11월 10일
0

✋ 단순 내용 요약은 지양하며, 꼼꼼히 읽고 난 후 현재 수준에서 머릿속에 남겨가면 좋을만한 내용들만 엄선해서 남긴다.

1.1 Information is Bits + Context

  • CSAPP을 읽으면서 컴퓨터 시스템에 대한 공부를 통해 다음과 같은 것들을 얻을 수 있다.

    컴퓨터가 숫자를 기계 내에서 표시하는 방법 때문에 발생할 수 있는 숫자 관련 문제를 해결
    -p.32

    더 많은 코어가 단일 칩에 올라가고 있는 시대에 그 중요성이 점점 높아지고 있는 동시성( concurrency)의 장점과 한계에 대해 배움
    -p.32

1.2 Programs are translated by other programs into different forms

다음의 순서로 프로그램들이 컴퓨터 시스템이 이해할 수 있는 형식으로 변환된다.

  • Source Programs -> Assembly Language Programs -> Executable Object Programs

    1. Source programs written in different high-level programming languages are translated by compilers for each programming language into assembly language programs.
      • Assembly language programs are simply machine language instructions in a textual form.
    2. Assembly language programs are translated by assembler and linker into executable object programs, also known as 'executable'.
      • Executable object programs are machine language instructions.
      • These are binary files whereas other programs above are text files.
  • 바로 위의 내용은 1.2단원 단순 요약인데도 불구하고 정리한 이유는, assembly language가 유용한 이유에 대해 이해하기 위한 문맥 제공용

    • Assembly language provides a common output language for different compilers for different high-level programming languages.
    • 각 언어별 컴파일러 만드는 사람들에게 유용하겠다 생각. Assembly language가 없으면 컴파일러 만드는 사람들이 각 상위 programming language에서 바로 binary machine-language isntructions으로 변환하는 기능을 만들어야 하는데 비효율적.

1.3 It pays to understand how compilation systems work

Compilation systems에 대해 알아두면 좋은 점에 대한 간략한 소개와 이와 연결되는 여러 챕터들에 대해 설명해주지만, 크게 와닿는 내용이 없었음.

1.4 Processors read and interpret instructions stored in memory

  1. Word size라는 것은 버스를 한 번에 통과하는 바이트의 크기(예: x86-64에서는 8bytes=64bits)
  2. Register는 Processor에 있는 word-size storage device
  3. Processor에 대해 이야기할 때 Instruction Set Architecture와 Microarchitecture가 다르다는 것은 이해하기
    • Instruction Set Architecture에는 instruction이 수행해야 하는 operation에 대해서 기술되어 있고, 이걸 논리적으로 구현한 게 CPU이다. 실제 물리적으로 CPU가 어떻게 구현되어야 하는지에 관해서는 Microarchitecture에서 다룬다.
  4. 한 개의 instruction을 수행하기 위해서 CPU는 PC가 가리키고 있는 main memory 주소로부터 instruction을 register로 불러오고, instruction에 있는 bits를 읽고 해석해서, instruction set architecture에서 정의하고 있는 특정한 operation을 수행한 후, PC가 가리켜야 하는 다음 instruction의 주소로 PC를 업데이트 해준다.

1.5 Caches matter

Cache memories와 locality를 적절히 사용함으로써 메모리를 대용량으로 쓰면서도 속도도 빠르게 이용할 수 있다.

  • Main memory의 경우 register보다 용량이 크지만 cpu가 main memory로부터 instruction이나 data를 읽어들이는 속도가 register로부터보다 느리다.
  • 이때 프로그램의 locality 특성을 이용해서, 자주 쓰이는 instruction과 data를 caches에 넣어두면 main memory보다 입출력 속도가 빠르면서도 register보다 큰 용량을 활용할 수 있게 된다.

1.6 Storage devices form a hierarchy

크게 임팩트 있는 내용 없음

1.7 The Operating system Manages the Hardware

Operating system의 큰 기능 두 가지는 1) application programs가 hardware를 오사용(misuse)하는 것을 막기, 2) 복잡하고 서로 다른 수많은 종류의 hardware에 대한 통일된 작동법(mechanism)을 application programs에 제공하는 것이다.

위 두 가지 목적을 달성하기 위해 OS는 process, virtual memory, file이라는 abstractions를 제공한다. File은 I/O devices에 대한 abstraction, virtual memory는 main memory와 I/O devices에 대한 abstraction, process는 processor, main memory, I/O devices에 대한 abstraction이다.

1.7.1 Processes

Process는 I/O devices, main memory, processor에 대한 abstraction이자, running program에 대한 abstraction이다. 사실 앞 말만 들었을 때 process가 뭔지에 대해서 확 와닿지 않는다. 그래서 내가 책을 읽고 느낌 온 것을 토대로 process가 어떤 것인지 정리해보겠다.
Process란 program의 컴퓨터 시스템에서 실행중인 독립된 객체(running instance)이다. 프로그램은 실행되기 전까지는 HDD나 SSD같은 영구 저장장치에서 잠 자고 있는 instruction과 데이터가 모여 있는 파일이다. 이 프로그램을 실행시키게 되면 이 프로그램에 저장되어 있는 instruction과 data를 바탕으로 컴퓨터 시스템에서 '살아있는' 객체가 생성된다. 보다 구체적으로, instruction을 수행하고 data를 처리하기 위해 processor와 main memory, 그리고 I/O devices 간의 지속적인 협업이 이루어져야 한다. 동시에 다른 program의 running instance와 processor, main memory, I/O devices를 같이 사용하는 데 있어 간섭이 이루어지지 않게 잘 관리가 되어야 한다. 이렇게 program 실행에 따른 하드웨어의 협업 관리와 간섭 관리를 운영체제가 추상화한 것이 process이다. 우리는 실행 중인 program을 단순히 process라는 이름 하나로 퉁쳐서 보고 있지만, 실상은 이 프로그램이 실행되기 위해서 하드웨어 단에서 무수히 많은 일들이 이루어지고 있어야 하는 것이다.

Process 개념은 컴퓨터 시스템 이용자로 하여금 복수개의 프로세스를 한 개의 코어에서 동시에(concurrently) 실행시키는 것을 가능하게 해준다. 만약 process abstraction과 implementation이 없는데 서로 다른 프로그램들을 하나의 컴퓨터 시스템에서 무지성으로 실행시시키는 상황을 상상하자. 서로의 main memory 공간을 침범하거나, 하나의 프로그램의 instruction만 processor를 독점해서 실행되거나, 다른 프로그램이 관리하는 file에 이상한 데이터를 입력하거나 기존에 있던 데이터를 의도치 않게 통째로 삭제하는 에러들이 발생할 수 있다. Process들이 사실은 하나의 processor(unicore processor 가정), 하나의 main memory, 하나의 I/O device를 공유하지만, 서로의 instruction과 data를 침범하지 않고 마치 서로 다른 컴퓨터 시스템에서 독립적으로 동시에 작동하듯이 쓸 수 있게 해주는 것이 바로 process 개념이 가지는 힘이다.
이때 동시에라는 말은 시간 상 병렬적으로라는 의미가 아니라 서로 다른 프로그램들의 instructions을 번갈아가면서(interweave) 굉장히 매우 매우 빠르게 실행시켜 인간의 눈에는 마치 시간 상 병렬적으로 실행되는 것처럼이라는 의미를 내포한다.

1.7.2 Threads

Process의 execution unit. 네트워크 서버에서의 concurrency 이슈 때문에 thread의 개념이 더욱 중요해지고 있다고 하지만 크게 감흥을 받는 부분은 없었다.

1.7.3 Virtual Memory

Virtual memory의 역할은 Process로 하여금 main memory 전체를 독점적으로 사용하고 있다고 믿게 하는 것이다. Process는 virtual memory가 제공하는 virtual memory address space 덕분에 다른 프로그램들에 할당된 physical memory address space를 침범한다는 걱정 없이 main memory를 사용할 수 있게 된다. 이때 프로세스는 virtual physical memory address space와 유사한 virtual memory address space 전체를 안심하고 사용할 수 있다. 이때 전체라고 적었지만, 사실은 virtual memory address space에도 user code에게는 보이지 않지만 process들을 관리하기 위한 kernel의 code와 data가 보관되어 있고 이곳은 process도 건들일 수 없다.

1.7.4 Files

File은 byte 나열 그 이상도, 그 이하도 아니다. 그런데 재밌는 사실은 하드 디스크, 키보드, 마우스, 모니터 등 모든 I/O devices들이 Unix 운영체제 상에서 파일 형태로 존재한다는 것이다. 따라서 UNIX 운영체제를 쓰는 그 어떤 컴퓨터 시스템, 그리고 그 컴퓨터 시스템에 존재하는 어떤 I/O device든 파일 형태로 만날 수 있고, 우리가 익숙한 파일 다루는 방식으로 이들 device들을 컨트롤 할 수 있다. 만약 하드 디스크에 읽기/쓰기 작업을 한다면, 하드 디스크를 추상화 한 파일을 읽고 쓰는 것과 같은 방식으로 작업하면 된다.

1.8 Computer systems communicate with other systems using networks

Network도 또 하나의 I/O 장치이다.

1.9 Important Themes

1.9.1 Amdahl's law

지금 내 수준에서 보면 그냥 간단한 내용: 작은 부분 개선해도 전체 관점에서 향상이 미미하니, 큰 부분 개선해라.

1.9.1 Concurrency and Parallelism

  • Concurrency: 여러 작업(multiple)을 동시(simultaneous)에 수행한다는 컴퓨터 시스템 개념
  • Parallelism: Concurrency를 활용해서 컴퓨터 시스템을 더 빠르게 만드는 것

Thread-level concurrency

Multicore-processorhyperthreading 기술 이전에는 multiple tasks를 수행할 때 time-sharing 기술을 이용해 concurrency 흉내만 냈음. 마치 한 사람의 저글러가 여러 공을 저글링하는 것처럼.
Thread-level concurrency는 여러 process를 동시에 작업하는 것을 넘어선다. 한 process를 수행해내는 데 있어 필요한 여러 작업 내용들을 동시에 수행해도 지장 없는 단위인 thread(control flow)로 쪼개고 그 thread를 동시에 작업하는 것이다.
예를 들어, hyperthreaded 기술이 적용된 multiprocessor 시스템에서 processor가 매 clock cycle 단위마다 어떤 thread를 작업할지 결정하게 되는 것이다. 이게 의미 있는 상황을 생각해보자. 예를 들어, processor가 thread를 작업하면서 data를 lower level cache에서 higher level cache로 load해야 하는 상황이라고 하자. 사실 인간의 관점에서는 정말 짧은 시간 안에 이루어지지만 processor의 입장에서는 하품이 나올 수 있다. 이때 processor를 놀릴 게 아니라, 다른 thread를 작업하게 하면 된다. hyperthreaded 기술이 있기 전에는 보통 20,000 clock cycles는 지나야 processor가 다른 thread를 작업할 수 있지만, 그 기술이 생기고 나서는 매 clock cycle마다 어떤 thread를 작업해야 processor를 최대로 사용할 수 있을지 결정하고 실행할 수 있게 된 것이다.

Instruction-level parallelism

더 낮은 abstraction layer인 instruction 단위에서도 동시에 여러 instruction을 수행할 수 있다는 내용인데 크게 와닿지 않음.

Single Instruction, Multiple-Data(SIMD) Parallelism

거의 이해 안 되는 내용

1.9.3 The importance of abstractions in computer systems

복잡도 관리를 위한 abstraction의 중요성

profile
Trying to be useful.

0개의 댓글