본문 바로가기

System Programming/CSAPP Book

(7)
Ch 9-1. Virtual Memory: Advantages, Page Table, Page Fault, Address Translation, TLB Physical Address vs Virtual Address 컴퓨터 시스템의 메인 메모리(일반적으로 DRAM)는 byte 단위로 접근 가능한 하나의 연속적인 배열의 형태를 갖는다. 메인 메모리의 각 byte는 고유의 주소를 가지는데, 이를 physical address라고 한다. 예전의 컴퓨터 시스템은 CPU에서 physical address를 이용해 메모리에 접근했으며, 오늘날에도 MCU(마이크로컨트롤러)와 같은 임베디드 시스템에서는 physical address를 이용하기도 한다. 하지만, 최근 컴퓨터 시스템은 모두 CPU에서 virtual address를 사용하여 메모리에 접근하고, CPU chip에 함께 존재하는 Memory Management Unit(이하 MMU)라는 하드웨어에서 virtu..
Ch 6-2. Locality (2): Matrix Multiplication with Various Computation Order Matrix Multiplication Matrix multiplication(이하 MM)은 3중 for loop으로 구현 가능하다. 사람이 일반적으로 이해하기에 가장 직관적인 연산 순서는 하나의 output element 씩 계산하고, output element를 row->column 순으로 반복하는 방식이다. 이를 pseudocode로 나타내면 아래와 같다. void MM(int** A, int** B, int** C){ for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { for (int k = 0; k < N; k++) { C[i][j] += A[i][k] * B[k][j]; } } } } Consider all permutation of co..
Ch 6-1. Locality (1): Reference to 2D Array Data Principle of Locality Locality를 이해하는 것은 프로그램 내에서 메모리를 효율적으로 접근하는 데에 있어서 중요하며, 이는 같은 동작을 하는 프로그램이더라도 메모리 접근에 걸리는 실행 시간 측면에서 성능 차이를 가져올 수 있는 요소이다. Locality란 크게 다음의 2가지를 말한다. 첫째는 temporal locality로, 한 번 참조된 메모리 영역은 이후에 여러 번 다시 참조될 가능성이 높다는 것이다. 둘째는 spatial locality로, 한 번 참조된 메모리 영역과 인접한 영역을 다시 참조할 가능성이 높다는 것이다. Memory hierarchy 상의 logic(예를 들어 cache의 set 개념이나 replacing policy 등)을 설계하는 사람들은 프로그램의 loc..
Ch 8-4. Process Control with C Program(2): waitpid, execve, A Simple Shell Program 이번 포스팅에서는 지난 번에 이어 C 프로그램에서 system call 함수를 호출하여 process level에서 조작하는 예시를 다룬다. Wait Child Process: waitpid() fork() 함수로 새로운 child process를 생성할 수 있고, waitpid() 함수는 child process가 종료될 때까지 기다린다. Argument와 return 값에 대한 자세한 것은 아래 reference를 참고하면 알 수 있는데, 포스팅에서는 이 중 몇 가지만 정리해볼 것이다. 링크: https://www.ibm.com/docs/en/zos/2.4.0?topic=functions-waitpid-wait-specific-child-process-end waitpid() — Wait for a ..
Ch 8-3. Process Control with C Program: getpid, exit, fork Process Control c 프로그램에서 라이브러리에 있는 system call 함수를 사용하면 process level에 대한 조작을 할 수 있다. 예를 들어, process의 ID를 확인하고, 새로운 process를 만들거나, 돌아가는 process를 종료시키는 등인데, 여기서는 그 예시를 코드와 함께 몇 가지 살펴보기로 한다. Process ID getpid(), getppid() 함수는 각각 calling process의 Process ID (이하 PID), calling process를 만들었던 parent process의 PID를 return한다. 다음과 같은 예시 코드를 작성하였다. #include #include #include int main(){ printf("PID of calle..
Ch 8-2. Process, Private Address Space, Context Switch Process: Illusion of Exclusive Use of the Program Operating system kernel에 있어 중요한 개념 중 하나는 process이다. Process의 개념을 통해 application programmer의 입장에서 프로그램을 돌릴 때, 현재 돌아가고 있는 프로그램이 컴퓨터 시스템과 각종 컴퓨팅 자원을 독점적으로(exclusively) 사용하는 듯한 착각(illusion)을 제공할 수 있다. 예를 들어, c 프로그램을 작성하고, 이를 gcc 컴파일러를 이용해 컴파일하여 executable object file을 얻은 상황을 가정하자. 이제, shell에 executable file의 이름을 입력함으로써 프로그램의 실행을 명령할 수 있다. 이 때, shell은..
Ch 8-1. Control Flow, Exception Handling, Exception의 종류 Exceptional Control Flow (ECF) 프로세서가 돌아가고 있는 동안, PC(=Program Counter)는 항상 메모리에 저장되어 있는 명령어를 가리키고 있다. (가리키고 있다는 것은 해당 명령어가 저장되어 있는 주소 값을 가지고 있다는 의미이다.) 하나의 명령어가 실행되면 다음 명령어를 실행하기 위해 PC 값이 다음 주소를 가리킬텐데, 이러한 transition을 'control transfer'이라고 한다. Control transfer은 연이은(=adjacent) 메모리 주소의 sequence로 이루어지기도 하지만, jump, call, return 명령어와 같이 not adjacent한 메모리 주소로 transition 하기도 한다. 이러한 transfer은 모두 프로그램 내에..