[sw정글 4주차] ❌클릭금지❌–CSAPP 1장 정리–❌클릭금지❌

Date:     Updated:

카테고리:

태그:

📚SW정글 4.8주차

클릭금지임에도 불구하고 클릭을 하다니… 이 포스팅은 CSAPP 1장을 원서로 읽고 요약한 내용을 담고 있습니다.

노션에서 정리한 내용을 가공하였으며, 따라서 템플릿 특성상 저의 노션에서 보시는게 더 편하실 수도 있습니다.

📕CSAPP 1장

front

  • 1.2 Programs Are Translated by Other Programs into Different Forms
  • 컴파일러가 assembly language가 포함된 파일들로 바꾸어준다. 그럼 Assembler는 relocatable object를 뱉아내 주는데, 이는 재배치가 가능한, 즉 메모리의 address가 아직 정해지지 않았다는 뜻이다.

Untitled

  • Linker에서
    • printf 라는 C 함수는 printf.o라는 오브젝트 파일에 따로 resides in 되어있다.
  • 1.3 It Pays to Understand How Compilation Systems Work
    • we do not need to know the inner workings of the compiler in order to write efficient code. However,in order to make good coding decisions in our C programs,
    • 프로그램 성능 개선
      • for문이 빠를까 while문이 빠를까? if-else랑 switch는?
      • 챕터3, X86-64알려줌, 어떻게 컴파일러가 C를 instruction set으로 변환하는지 알려줌
      • 챕터5, 컴파일러가 더 일을 잘할 수 있게 만들어주는 간단한 C코드
      • 챕터6, 메모리시스템 구조 알 수 있음
    • Link-time error 이해
      • 가장 당황스러운 프로그래밍 에러중 하나는 link-time error(some-of the most perflexing error라고 표현)
      • 더 무서운건 ㅋㅋ 런타임에 나타나지 않는 에러이다. ㄷ ㄷ
    • 보안 취약점 해결
  • 1.4 Processors Read and Interpret Instructions Stored in Memory
    • executable object file인 hello는 disk에 저장되어있다. 이걸 Unix에서 실행시키려면, shell이라는 응용프로그램에서 타이핑을 통해 실행 가능
    • 첫 단어가 shell command가 아니라면? ⇒ 실행시킬 수 있는 파일로 인식
    • loads and run hello program을 하고, 끝날때 까지 기다린다.

    • 1.4.1 Hardware Oraganization of a System

      Untitled

      • 일반적인 하드웨어 구조
      • Buses, I/O Devices, Main Memory, Processor
        • Buses
          • 시스템을 통해 실행시키는 것은 Buses라는 electrical conduit들을 통해, 필요한 정보들을 carry on 해나가는 과정이다.
          • 버스는 고정된 bytes 단위로 설계되어있다. 이는 word size이며, 요즘은 대부분 8bytes(64bits)이다.
          • 앞으로 word라고 설명하면 ⇒ bytes 단위를 말하는 것임
        • I/O Devices
          • 모니터, 키보드, 마우스… 뭐 다 아는 입출력장치
        • Main Memory
          • Physically, DRAM(Dynamic Random Access Memory)칩들의 집합
          • Logically, 개별 고유주소가 있는 linear array of bytes
          • short 타입은 2bytes, int는 4bytes 등 자료구조마다 차지하는 메모리 양이 다름
        • Processor
          • = CPU
          • 프로세서의 중심에는, word-size-storage device혹은 register라고 부르는PC(Program Counter)가 있다.
            • PC는 메인메모리의 instruction 들의 주소를 가르키고 있다.
            • PC는 명령어를 해석하고 작업 수행, 수행완료시 다음음 지시어를 가르키도록 업에이트
            • 명령어는 몇가지 없음
              • Load, Store, Operate, Jump
                • Load
                  • 메인메모리에서 레지스터로 복사
                • Store
                  • 레지스터에서 메인메모리로 복사
                • Operate
                  • 레지스터 값을 ALU로 복사, 그리고 이 때 (수학적)연산을 함
                • Jump
                  • instruction set을 PC로 복사
            • 프로세서? 간단하다고 말했지만, 요즘은 엄청 복잡함
            • 그래서… 4장에서는 프로세서의 실 implementation에 대해, 5장에서는 프로그램 성능 최적화 할 수 있는 최신 프로세서 작동방식 설명 예정(두둥!!)
    • 1.4.2 Running the hello Program
      • ./hello 프로그램을 쉘에서 실행시키면?

      Untitled

      • 위의 사진처럼, 메인메모리에서 CPU내부의 레지스터파일로 ‘Load’ 시킴
      • DMA(Direct memory Acces)라는 기술을 통해, 프로세스를 거치지 않고 메모리에 엑세스 할 수 있다. (아래그림 참조)

      Untitled

      • 이렇게, 코드랑 hello 오브젝트 파일내의 데이터들이 메모리에 load되고나면, 프로세서는 hello프로그램의 코드들을 실행시키기 시작함. 이 경우, “hello, world\n”를메모리에서 레지스터로, 레지스터에서 디스플레이로 옮기는 일들을 하게 된다. (아래 그림 참조)

        Untitled

  • 1.5 Caches Matter
    • 프로그래머가 느끼기에 “real work”를 해야하는데, 이처럼 정보들을 옮기는 과정에서 시간이 많이걸린다고 느낄 수 있다.
    • 대용량 장치는 느리고, 저용량장치는 빠를 수 밖에 없다. 그리고 빠른 장치는 만들때 비싸다.
    • 디스크 드라이브의 어떤 장치가 1000배 더 크다면, 아마 프로세서보다 10,000,000배 느릴 것이다.
    • 프로세서-디스크 속도차이가 이렇게 너무 많이나니까, 캐쉬를 디자인하게 되었다.

      Untitled

    • L1캐쉬는 10000 bytes holding가능하고, 레지스터만큼 빠르다
    • L2캐쉬는 100000 bytes holding 가능하고, 5배 더 느리다
    • L1, L2캐쉬는 SRAM(Static Random Access Memory)에 박혀있다.
    • 이렇게 캐쉬들이 있어주기에, 프로그램 실행시 locality를 가져갈 수 있으므로 빠르게 작동한다.
  • 1.6 Storage Devices Form a Hierarchy
    • 메모리는 아래 그림과 같은 Hierarchy를 가지고 있다.

      Untitled

    • 프로그래머는 캐쉬에 대한 지식을 활용해서 performance를 올릴 수 있어야 한다. 챕터6장에서 이에 대해 배운다.

  • 1.7 The Operating System Manages the Hardware
    • 우리가 hello program 돌릴 때, 키보드, 디스플레이, 디스크, 메인메모리.. 등등으로 직접적인 접근을 하는것이 아니다.
    • OS를 통해 접근하는 것이다

      Untitled

    • OS는 두가지 목적을 가지고 있다.
      • 어플리케이션 돌릴 때, 잘못된 사용으로 하드웨어를 망가뜨리지 않기 위해
      • low-level에서 아주 복잡하게 돌아가는, 작동 방식들은 단순화 시키기 위함이다.
    • 1.7.1 Processes
      • process는 OS가 프로그램을 돌리기 위해 추상회 해주는 것
      • 멀티 프로세스는 동시에 여러 프로그램 돌려줌
      • 유니프로세스는 코드를 싱글프로세스에서 돌림(1개만 작동)
      • OS가 새로운 프로세스를 동작시키려고 할 때, context switch를 수행한다.

        Untitled

      • processA, 쉘: 새로운 입력을 기다린다.
      • system call을 통해 processA의 context가 전달이 되고, processB(hello program)이 실행된다.
      • 커널
        • 프로세스에서 다른 프로세스로 갈 때 커널을 통해 관리된다.
        • 커널은 OS의 일부이며 항상 메모리안에 있다.
        • 파일을 읽고, 쓰는 등 어플리케이션이 OS로부터 뭔가 필요한 기능들이 있는데, system call을 통해 수행되고, 이는 커널을 통해 전달됨
        • 커널은 분리된 process가 아님!!
        • 커널은, 시스템이 프로세스들을 관리하기 위한 코드들의 모음으로 보면 된다.
    • 1.7.2 Threads
      • 프로세스가 single control flow라고 생각할 것
      • a process는, 쓰레드라는 multiple execution유닛으로 구성 가능
      • multiple process보다 multiple threads가 더 낫다
        • threads가 processes보다 낫기 때문
      • multi-threading은 프로그램 더 빠르게 돌릴 수 있도록 해준다
    • 1.7.3 Virtual Memory
      • 가상화이다. 메인메모리를 쓰고있다는 착각을 줄 수 있는

        Untitled

    • 프로세스는, virtual address space라는 방법으로 메모리를 본다(위의 사진)
    • 위쪽에는 OS의 코드와 데이터를, 아래쪽에는 유저가 정의한 프로세스의 코드와 데이터를 가지고 있음
      • Program code and data
        • code와 data 영역은, executable한 object file로부터 바로 만들어진다
      • Heap
        • 프로그램이 돌아가기 시작하면 바로 고정이 된는 code와 data영역과는 다르게, heap은 동적으로 바뀜
        • malloc이나 free와 같은 C standard library들을 call 하면서 동적으로 바뀜
      • Shared libraries
        • virtual address space의 가운데부분에서, C-standard library, math library 등이 있음
      • Stack
        • 최상단에, user stack존재, 컴파일러가 function call을 사용하기 위해 존재하는 부분. 우리가 function call 할때마다 여기를 쓴다
      • Kernel virtual memory
        • 프로그램들이 여기를 직접적으로 쓰진 못함
        • 커너
    • 1.7.4 Files
      • 파일은 바이트의 연속, 그 이상도 그 이하도 아님
      • 그냥 프로그래머들은 파일, 별생각없이 스윽~ 쓰면 됨
  • 1.8 Systems Communicate with Other Systems Using Networks
    • 이 책에서는 하드웨어와 소프트웨어의 분리된 집단으로 고려함
    • 하지만, 실제로는, 네트워크로 하드웨어↔ 소프트웨어가 연결되어있다.

      Untitled

    • 정보를 복사해 오는것이 중요하다
      • CPU가 로컬 디스크에서 정보를 복사 해 오듯
      • 외부 네트워크에서 정보를 가져오는것(copy)이 중요하다
      • WWW, FTP(File Transfer Protocol), telnet 등이 바로 네트워크를 통해 정보를 긁어오는 기능(copy)을 가능하게 해 주는 것이다.

        Untitled

      • 위 그림처럼 하는 통신 방식이 일반적인 웹 통신방식
  • 1.9 Important Themes
    • 1.9.1 Amdahl’s Law
      • 암달의 법칙: 암달의 저주로도 불림
      • 컴퓨터 시스템 일부를 개선할 때, 전체적으로 얼마만큼의 최대성능 향상이 있는지 계산하는데 사용된다. 진 암달의 이름에서 따왔따리
      • 전체의 P%중 S배의 성능이 향상되었으면,

        Untitled

      • 어떤 작업의 40%에 해당하는 부분속도를 2배 늘리면

        Untitled

    • 1.9.2 Concurrency and Parallelism
      • Concurrency
        • 프로세서한테 여러개의 일을 동시에 시키는 뜻으로 general 하게 쓰인다
      • Parellelism
        • concurrency가 시스템을 더 빠르게 동작하게 한다는 뜻으로 쓰임
        • 컴퓨터 시스템에서의 multiple-levels of abstraction을 하는데 사용됨
      • Multiple-levels of abstracion
        • Thread-Level Concurrency
          • 저글링하면서 공 여러개 던지는것과 같은 원리
          • 웹페이지를 많은 사용자에게 쏴주는 일, 여러명에게 music streaming쏴주는 일들 등
          • 원래의 uniprocessor system에서는 다른일 하려면, 이거하다가 저거하다가 해야했음
          • multiprocessor system에서 multi-core, hyperthreading 등 아래와 같은 형태

            Untitled

          • chip이 4개의 cpu코어를 가지고 있을 때,
            • L1과 L2 캐쉬를 각각 가지고 있는다
            • 그리고 L1은 다시 두 부분으로 쪼개진다 한놈은 instruction을, 한놈은 데이터를 들고있는다

            Untitled

            • L3 등 high level cache에 대해서는 다른 코어들과 공유한다
            • 그리고 이 공유되는 캐쉬들은 메인메모리와 interfacing 가능
          • Hyperthreading
            • simultaneous multi-threading이라고도 함
            • 원래 threads 바꾸려면 20,000싸이클 필요
            • Hyperthread에서는 cycle단위로 어디서 실행될지 결정해버림
            • intel-i7경우, 4개의 코어가 각각 2개의 쓰레드를 실행시킬 수 있음, 즉 8개의 threads가 parallel하게 작동 가능
          • multiprocessing이 시스템 퍼포먼스를 올리는 두가지 방법
            • multi-task시, concurrency를 자주 건들일 필요가 없다
            • 멀티쓰레드로 표현되어있는 프로그램은 parallel하게 실행시켜서 빠르게 돌릴 수 있다
        • Instruction-Level Parallelism
          • 명령어 여러개를 한번에 돌릴 수 있음
        • Single-Instruction, Multiple-Data (SIMD) Parallelism
          • 가장 낮은 레벨, float8개를 한방에 집어넣을 수 있음
          • C프로그램 돌릴 때, 어떤 컴파일러들은 SIMD를 지 마음대로 추출할 때가 있음
          • 가장 안정적인 방법은, vector 데이터타입과 호환가능한 GCC같은 컴파일러 사용
    • 1.9.3 The Importance of Abstractions in Computer Systems
      • API가 abstraction의 가장 좋은 예시

        Untitled

      • 파일도 좋은 추상화, 프로세서에서의 추상화도 있고, OS레벨의 추상화도 있음(위의 그림 참조)

  • 1.10 Summary
    • 하드웨어와 소프트웨어로 구성된 시스템이 우리의 응용프로그램을 잘 돌릴 수 있도록 도와준다
    • ASCII text로 시작해, 컴파일러와 링커가 binary-executable로 만들어 주는 과정 까지 보았다
    • 메모리 hierachy가 있었으며, OS의 커널, 파일과 같은 추상화 등을 살펴보았음
    • 마지막으로, 네트워크를 통해 다른곳과 소통, 시스템관점으로 보았을 때 이는 그저 다른 I/O디바이스와 소통하는것과 같음


😵배우면서 깨달은 내용을 정리해 보았습니다. 틀린 것 같은 개념을 아래 댓글에 달아주시면 감사합니다😵

🌜 Thank you for reading it. Please leave your comments below😄

맨 위로 이동하기

swjungle survive 카테고리 내 다른 글 보러가기

댓글 남기기