[sw정글 4주차] ❌클릭금지❌–CSAPP 1장 정리–❌클릭금지❌
카테고리: swjungle survive
📚SW정글 4.8주차
클릭금지임에도 불구하고 클릭을 하다니… 이 포스팅은 CSAPP 1장을 원서로 읽고 요약한 내용을 담고 있습니다.
노션에서 정리한 내용을 가공하였으며, 따라서 템플릿 특성상 저의 노션에서 보시는게 더 편하실 수도 있습니다.
📕CSAPP 1장
- 1.2 Programs Are Translated by Other Programs into Different Forms
- 컴파일러가 assembly language가 포함된 파일들로 바꾸어준다. 그럼 Assembler는 relocatable object를 뱉아내 주는데, 이는 재배치가 가능한, 즉 메모리의 address가 아직 정해지지 않았다는 뜻이다.
- 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라고 표현)
- 더 무서운건 ㅋㅋ 런타임에 나타나지 않는 에러이다. ㄷ ㄷ
- 보안 취약점 해결
- CWE-119 오류
- https://cwe.mitre.org/data/definitions/119.html
- 메모리 버퍼의 한계 내에서 이뤄지는 운영에 제대로 된 제한을 걸지 못해서 생기는 문제이다. buffer overflow vulbnerabilities
- https://ko.wikipedia.org/wiki/버퍼_오버플로
- 메모리의 데이터 컨트롤 과정을 고려하는 프로그래머들이 극극소수이다
- CWE-119 오류
- 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
- 일반적인 하드웨어 구조
- 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로 복사
- Load
- Load, Store, Operate, Jump
- 프로세서? 간단하다고 말했지만, 요즘은 엄청 복잡함
- 그래서… 4장에서는 프로세서의 실 implementation에 대해, 5장에서는 프로그램 성능 최적화 할 수 있는 최신 프로세서 작동방식 설명 예정(두둥!!)
- Buses
- 1.4.2 Running the hello Program
- ./hello 프로그램을 쉘에서 실행시키면?
- 위의 사진처럼, 메인메모리에서 CPU내부의 레지스터파일로 ‘Load’ 시킴
- DMA(Direct memory Acces)라는 기술을 통해, 프로세스를 거치지 않고 메모리에 엑세스 할 수 있다. (아래그림 참조)
-
이렇게, 코드랑 hello 오브젝트 파일내의 데이터들이 메모리에 load되고나면, 프로세서는 hello프로그램의 코드들을 실행시키기 시작함. 이 경우, “hello, world\n”를메모리에서 레지스터로, 레지스터에서 디스플레이로 옮기는 일들을 하게 된다. (아래 그림 참조)
- 1.5 Caches Matter
- 프로그래머가 느끼기에 “real work”를 해야하는데, 이처럼 정보들을 옮기는 과정에서 시간이 많이걸린다고 느낄 수 있다.
- 대용량 장치는 느리고, 저용량장치는 빠를 수 밖에 없다. 그리고 빠른 장치는 만들때 비싸다.
- 디스크 드라이브의 어떤 장치가 1000배 더 크다면, 아마 프로세서보다 10,000,000배 느릴 것이다.
-
프로세서-디스크 속도차이가 이렇게 너무 많이나니까, 캐쉬를 디자인하게 되었다.
- 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를 가지고 있다.
-
프로그래머는 캐쉬에 대한 지식을 활용해서 performance를 올릴 수 있어야 한다. 챕터6장에서 이에 대해 배운다.
-
- 1.7 The Operating System Manages the Hardware
- 우리가 hello program 돌릴 때, 키보드, 디스플레이, 디스크, 메인메모리.. 등등으로 직접적인 접근을 하는것이 아니다.
-
OS를 통해 접근하는 것이다
- OS는 두가지 목적을 가지고 있다.
- 어플리케이션 돌릴 때, 잘못된 사용으로 하드웨어를 망가뜨리지 않기 위해
- low-level에서 아주 복잡하게 돌아가는, 작동 방식들은 단순화 시키기 위함이다.
- 1.7.1 Processes
- process는 OS가 프로그램을 돌리기 위해 추상회 해주는 것
- 멀티 프로세스는 동시에 여러 프로그램 돌려줌
- 유니프로세스는 코드를 싱글프로세스에서 돌림(1개만 작동)
-
OS가 새로운 프로세스를 동작시키려고 할 때, context switch를 수행한다.
- 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
-
가상화이다. 메인메모리를 쓰고있다는 착각을 줄 수 있는
-
- 프로세스는, 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
- 프로그램들이 여기를 직접적으로 쓰진 못함
- 커너
- Program code and data
- 1.7.4 Files
- 파일은 바이트의 연속, 그 이상도 그 이하도 아님
- 그냥 프로그래머들은 파일, 별생각없이 스윽~ 쓰면 됨
- 1.8 Systems Communicate with Other Systems Using Networks
- 이 책에서는 하드웨어와 소프트웨어의 분리된 집단으로 고려함
-
하지만, 실제로는, 네트워크로 하드웨어↔ 소프트웨어가 연결되어있다.
- 정보를 복사해 오는것이 중요하다
- CPU가 로컬 디스크에서 정보를 복사 해 오듯
- 외부 네트워크에서 정보를 가져오는것(copy)이 중요하다
-
WWW, FTP(File Transfer Protocol), telnet 등이 바로 네트워크를 통해 정보를 긁어오는 기능(copy)을 가능하게 해 주는 것이다.
- 위 그림처럼 하는 통신 방식이 일반적인 웹 통신방식
- 1.9 Important Themes
- 1.9.1 Amdahl’s Law
- 암달의 법칙: 암달의 저주로도 불림
- 컴퓨터 시스템 일부를 개선할 때, 전체적으로 얼마만큼의 최대성능 향상이 있는지 계산하는데 사용된다. 진 암달의 이름에서 따왔따리
-
전체의 P%중 S배의 성능이 향상되었으면,
-
어떤 작업의 40%에 해당하는 부분속도를 2배 늘리면
- 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 등 아래와 같은 형태
- chip이 4개의 cpu코어를 가지고 있을 때,
- L1과 L2 캐쉬를 각각 가지고 있는다
- 그리고 L1은 다시 두 부분으로 쪼개진다 한놈은 instruction을, 한놈은 데이터를 들고있는다
- 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같은 컴파일러 사용
- Thread-Level Concurrency
- 1.9.3 The Importance of Abstractions in Computer Systems
-
API가 abstraction의 가장 좋은 예시
-
파일도 좋은 추상화, 프로세서에서의 추상화도 있고, OS레벨의 추상화도 있음(위의 그림 참조)
-
- 1.9.1 Amdahl’s Law
- 1.10 Summary
- 하드웨어와 소프트웨어로 구성된 시스템이 우리의 응용프로그램을 잘 돌릴 수 있도록 도와준다
- ASCII text로 시작해, 컴파일러와 링커가 binary-executable로 만들어 주는 과정 까지 보았다
- 메모리 hierachy가 있었으며, OS의 커널, 파일과 같은 추상화 등을 살펴보았음
- 마지막으로, 네트워크를 통해 다른곳과 소통, 시스템관점으로 보았을 때 이는 그저 다른 I/O디바이스와 소통하는것과 같음
😵배우면서 깨달은 내용을 정리해 보았습니다. 틀린 것 같은 개념을 아래 댓글에 달아주시면 감사합니다😵
🌜 Thank you for reading it. Please leave your comments below😄
댓글 남기기