no image
9. Advanced lock; Locks and Condition variables
기존 lock은 OS 스케쥴러가 lock으로 인해 무슨 일이 발생하는 지 몰랐다. 이제는 OS 스케쥴러가 이 lock 활동을 직접 관리하여 ready 상태의 thread를 run한다. 구현은 간단하게도 ready queue에서 lock으로 인해 동작 못하는 thread는 제거하는 방식이다. (park(), unpark()) Lock: Block when waiting Lock에 lock과 guard, 그리고 queue가 있다. Guard는 queue를 위한 lock이라고 보면 된다. Acquire lock 과정은 다음과 같다. guard 사용중: spin wait guard 작업 없음: guard 얻음 lock 잡혀있음 queue에 thread 넣고 guard 내리기 park() lock 없음 lock ..
2023.12.10
no image
8. Locks
6장 thread에서 이어지는 내용이다. Lock Goal 이미 한번 봤던 내용이지만, lock의 구현 목표는 다음과 같다. Correctness Fairness Performance Mutual exclusion Deadlock-free Starvation-free wait for same amount of time CPU is always used Locking linked lists Linked list에 node를 추가하려고 할 때, race condition에 빠질 수 있다. 이를 위해 lock을 구현해야 한다. 그러기 위해 우선 linked list에 lock을 추가한다. Head 부분의 구조체에 mutex를 추가한다. 그리고 linked list 초기화할 때, lock을 NULL로 설정해 준..
2023.12.09
no image
7. Stack
OS마다 구현은 다르겠지만, 본 포스팅에서는 IA32로 stack에 대해 설명한다. IA32에서 사용하는 register는 다음과 같다. %eax 등은 data를 저장하는 데 사용된다. %esp나 %ebp는 stack의 위치를 나타낸다. %eip는 PC라고 생각하면 된다. IA32 stack Stack은 lower address로 grow한다. %ebp가 제일 큰 주소를 가지고 %esp가 감소하는 식으로 stack에 정보를 저장한다. (아래로 큰다. Heap은 위로 큰다.) Push %esp의 주소가 -4되면서 data가 저장된다. 명령어는 pushl이다 Pop %esp의 주소가 +4되면서 가장 밑에 있던 data가 pop된다. Procedure control flow 스택에는 function call과..
2023.12.08
no image
6. Threads
코어 수는 증가하는 반면, CPU의 속도는 증가하기 어렵게 되자 concurrency를 위한 수단이 필요해졌다. 많은 코어를 사용할 수 있는 어플리케이션이 필요해진 것이다. 처음에는 그 만큼 프로세스 수를 늘렸다. 쉽고, 보안성도 확실했기 때문이다. 그러나 프로세스 간의 통신은 큰 overhead이며 context switching 비용도 만만치 않다. 이런 배경에서 등장한 것이 thread이다. 프로세스와 비슷하지만, 같은 프로세스에서 나온 thread는 address space를 공유한다. 매우 큰 일을 나눠서 해결하며 shared address space를 통해 communication을 하기 때문에 비용이 적게 든다는 장점이 있다. 이와 같은 장점으로 인해 multi-threaded program..
2023.12.08
no image
5. Virtual Memory
OS의 목표 중 하나는 physical memory가 부족할 때, 프로세스가 최대한 동작하게 만드는 것이다. 가령 user의 code 영역은 프로세스마다 physical memory에 저장할 필요가 없을 것이다. Virtual memory는 physical memory가 훨씬 더 많은 것처럼 환상을 주는 OS의 핵심 스킬이다. Locality of reference 프로세스 내부에서 얼마나 연속적이거나 근처에서 참조하는지 나타내는 지표를 locality라고 한다. 크게 2가지의 locality가 있다. Spatial: 참조한 address 근처 address를 참조 Temporal: 참조한 address 다시 참조 프로세스는 code의 10%에 90%의 시간을 쓸만큼, locality를 고려해 code를..
2023.12.08
no image
4. Paging
Physical memory에 virtual memory를 할당시켜 보려는 노력을 계속했었는데, contiguous한 성질 때문에, fragmentation이라는 한계에 부딛히게 된다. 이를 해결하고자 도입한 것이 paging이다. 아이디어는 간단하다. 메모리를 fixed-sized page로 잘게 나눠버리는 것이다. (보통 4KB) Translation (VA->PA) 방법은 기존과 동일하다. Logical address에서 일정 top bit로 table에 저장되어 있는 내용을 참고해 physical frame number를 찾고, offset만큼 이동해 데이터를 참조하게 된다. 실제 동작은 다음처럼 진행된다. Page Table Mapping 정보가 저장된 table이다. 프로세스마다 1개씩 가지게..
2023.12.05
no image
3. Memory Virtualization
하나의 프로그램만 돌린다면 메모리 가상화는 필요없다. 여러 프로그램을 동시에 돌리기 위해서 우리는 메모리 가상화를 사용한다. 멀티프로그래밍의 목표는 다음과 같다. Transparency: 프로세스는 메모리가 공유되고 있다는 것을 몰라야 함, 항상 사용 가능해야 함 Protection: OS나 다른 프로세스의 메모리 침범할 수 없음 Efficiency: 메모리 낭비가 없어야 함 Sharing: 주소 공간 공유할 수 있음 Memory address space OS가 프로세스에게 private한 address space를 줘야 하는데, 한 가지 문제가 있다. 메모리 공간이 다이나믹하다는 것이다. 실제로 메모리는 다음의 구조를 가진다. Code 영역은 static하다. 반면에, Stack이나 Heap은 dyna..
2023.12.01
no image
2. CPU Virtualization
CPU virtualization에는 크게 2가지 개념이 중요하다. 1번 포스트에서 다루었던, context switch랑 scheduler(스케쥴러)이다. Context switch는 방법론적인거고 scheduler는 정책적인 내용이다. 간단하게 자주 사용하는 용어부터 알아본다. Workload: 해야되는 프로세스(어플리케이션)의 양 Scheduler: ready process를 실행할 타이밍 결정하는 방법 Metric: 평가방법 스케쥴링의 목표(=평가 요소)는 다음과 같다. Turnaround time completion_time - arrival_time (minimize) Response time initial_schedule_time - arrival_time (minimize) Throughp..
2023.11.27
no image
1. Introduction
Operating system OS의 역할 중 중요한 3가지는 다음과 같다. Virtualization Concurrency Persistence Virtualization Process 프로세스는 execution stream with states이다. State에는 코드에 영향을 줄 수 있는 모든 자원이 포함된다. 가령 레지스터나 힙, 스택, 열린 파일 등이 있다. 프로그램 vs 프로세스 프로그램과 프로세스는 다른 개념이다. 프로그램은 정적인 코드와 데이터이며, 프로세스는 이런 프로그램의 dynamic instance이다. 쓰레드 vs 프로세스 쓰레드와 프로세스는 비슷한 개념이다. 쉽게 설명하자면, 쓰레드는 lightweight process이며, 하나의 프로세스는 여러개의 쓰레드를 사용할 수 있다...
2023.11.21