일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- samsung research
- BOJ
- 삼성기출
- 시뮬레이션
- segmentation
- 컴공복전
- pwnable.kr
- 백준
- BFS
- 데드락
- Memory Management
- 프로세스
- 운영체제
- 김건우
- 알고리즘
- Deadlock
- ascii_easy
- higunnew
- exec
- fork
- 가상메모리
- 구현
- Brute Force
- dfs
- 동기화문제
- 스케줄링
- paging
- 완전탐색
- 삼성리서치
- 백트래킹
- Today
- Total
목록Operating System (23)
gunnew의 잡설
공유데이터 접근 문제는 High-level Language에서 한 문장에 해당하는 instruction이 Low-level에서 기계어로서 CPU에서 실행될 때 atomic하게 한 번에 처리될 수 없기 때문에 발생하는 문제이다. 이 문제 해결되기 위해서는 다음 조건들을 모두 충족해야 한다. 1. Mutual Exclusion (상호 배제) : 동시에 critical section을 수행하면 안된다. 2. Progress (진행) : 아무도 critical section에 없을 때, 해당 section에 들어가고자 하는 프로세스가 있으면 허락해 주어야 한다. 3. Bounded Waiting (유한 대기 시간) : 기다리는 시간이 유한해야 한다. 즉, starvation problem을 방지해야 한다. Al..
프로세스 동기화를 설명하기에 앞서 컴퓨터 내부에서 연산이 이루어지면서 데이터에 접근하는 것이 어떻게 일어나는지 살펴보자. 다음 그림은 데이터의 접근이 일어나는 양상을 그림으로 나타낸 것이다. Race Condition(경쟁 상태에서 발생하는 문제, Concurrent access) 연산을 할 때는 항상 무언가를 읽어 들이고 그 결과를 내보내는 작업이 필요하다. 이때 같은 데이터를 한 곳이 아니라 여러 곳에서 읽어서 연산을 할 때 문제가 발생할 수 있다. 즉, 연산 주체가 둘 이상일 때 하나의 데이터를 가지고 접근하는 경우 문제가 발생할 수 있다. 다음 예시를 살펴보자. 여기서는 본래 count를 하나 증가시키고 나서 count를 감소시켜 값의 변화를 없게 하려고 한다. 그런데 만약 count의 값을 왼쪽..
Multi-level Queue 지금까지는 하나의 큐에 줄을 서는 것에 대해 이야기 했지만, 이번에 소개할 스케줄링 방법은 여러 큐를 통해 스케줄링하는 것이다. 이때 큐를 여러 갈래로 분류하는데 첫 번째로 Foreground queue이고 두 번째로 Background queue가 있다. Foreground queue에는 Interactive한 job들이 줄을 서고 Background queue에는 batch job – no human interaction job들이 줄을 선다. Multi-level Queue 스케줄링에서는 큐 내부에 프로세스 우선순위가 아니라 큐의 우선순위를 결정한다. 즉, ‘큐에 대한 스케줄링’이 필요하다는 것을 의미한다. 1. 첫 번째 방법으로 Foreground queue의 우선..
이번 강에서는 CPU 스케줄링 알고리즘에 대해 설명한다. 이를 설명하기에 앞서 스케줄링의 성능의 기준을 알아보자. CPU utilization (CPU 이용률)은 전체 시간 중에서 CPU가 놀지 않고 일한 시간의 비율을 의미한다. Throughput (처리량)은 단위 시간당 CPU의 처리량을 의미한다. CPU가 얼마나 많은 일을 했는가를 나타낸다. Turnaround time (소요 시간) 부터는 모두 시간과 관련된 것이다. Waiting time (대기 시간) Response time (응답 시간) 이 다섯 가지 기준을 쉬운 예시를 통해 살펴보자. 우리가 건물주가 되어 중국집을 차려서 중국집 주방장(CPU)을 고용한다고 가정하자. 우리로서는 주방장이 최대한 많은 시간 동안 일을 하는 것이 좋을 것이다...
CPU 스케줄링을 설명하기에 앞서 그 배경에 대해 잠깐 설명하자. 프로그램이 실행이 되면 어떤 프로그램이든 간에 다음과 같은 과정을 따라 수행이 된다. “load store”, “add store”와 같은 것들은 CPU에서의 instruction 즉, 기계어이다. 그리고 중간중간 I/O를 위한 작업이 있다. 그러니까 프로그램의 일반적인 구성상 CPU를 썼다가 I/O를 했다가 하며 반복적으로 번갈아 가며 수행될 것이다. 여기서 일련의 CPU instruction을 수행하는 단계를 CPU burst라고 하고 I/O를 수행하는 단계를 I/O burst라고 한다. 다음은 일반적인 job들의 CPU-burst time의 분포를 그린 것이다. CPU burst와 I/O burst의 수행 횟수를 비교해봤더니 I/O ..
프로세스 간 협력 원칙적으로 프로세스는 매우 독립적이다. 자식이 하나 생성되더라도 부모가 자식 프로세스를 먹여 살리는 것이 아니라 일단 생성만 되면 나머지 일은 자식 프로세스가 알아서 실행한다. 그러나 경우에 따라서는 프로세스가 협력을 해야만 효율적으로 실행되는 경우도 있을 것이다. 따라서 프로세스 간 협력 메커니즘이 존재한다. 그것을 IPC(Interprocess Communication)이라 한다. IPC에는 크게 두 가지 방법이 있다. 첫 번째는 message passing, 두 번째는 shared memory이다. Message passing 먼저 message passing은 프로세스 A가 프로세스 B와 서로 메시지를 주고받으며 실행되는 것이다. 그러나 프로세스는 원래 서로 독립적이기 때문에 자..
프로세스 복제, 프로세스 생성에 대해 다시 한번 상기해보자. 프로세스 복제는 프로세스의 문맥(Context)을 모두 복사하는 것이다. 부모 프로세스의 주소 공간 code, data, stack 영역을 그대로 복사하며 프로세스의 CPU 문맥 (Program Counter)를 복사하는 작업을 하는 것이다. 이렇게 일단 프로세스가 만들어지면, 부모 프로세스와 자식 프로세스는 서로 독립적인 프로세스가 되기 때문에 자원을 공유하려고 하지 않는 것이 원칙이다. 그러나 지난 번에도 언급했듯이 프로세스 문맥을 복사하는 것은 큰 overhead가 발생한다. 게다가 프로세스를 말 그대로 '복사'하는 것인데 똑같은 내용이 메모리에 또 올라간다면 너무나 큰 낭비가 아니겠는가? 따라서 리눅스와 같은 운영체제들은 부모 프로세스와..
프로세스는 어떻게 관리될까? 프로세스는 어떻게 만들어지고 어떻게 종료될까? 이번 강에서는 프로세스의 관리에 대해 설명한다. 프로세스 생성(Process Creation) 사람은 어떻게 태어나는가? 부모에 의해서 태어난다. 프로세스도 마찬가지이다. 부모 프로세스(Parent process)가 자식 프로세스(Children process)를 생성한다. 하지만 사람과는 다르게 프로세스가 자식을 생성할 때는 복제 생성을 하며 트리 계층 구조로 프로세스의 hierarchy가 만들어진다. 프로세스는 자원을 필요로 한다. 이 자원은 운영체제로부터 할당 받거나 부모 프로세스와 공유하게 된다. 하지만 부모로부터 자식이 생성되었다고 하더라도 각 프로세스는 서로 다른 프로세스이기 때문에 공유하지 않는 것이 일반적이며, 서로..
드디어 스레드(Thread)와 프로세스(Process)의 차이를 구분할 수 있다! 운영체제 학습자의 숙원을 조금은 해소할 수 있게 된다. 결론부터 말하자면 스레드는 프로세스 내부에서의 CPU 수행 단위를 뜻한다. 이 말은 도대체 무슨 말일까? 이를 이해하기 위해서는 프로세스가 어떻게 관리되는지 상기할 필요가 있다. 프로그램을 실행하게 되면 프로세스가 생성된다. 프로세스가 생성되면 별도의 주소 공간이 할당되며 그 주소 공간에는 code, data, stack 영역이 만들어지고, OS kernel이 PCB(Process Control Block)를 만들어 해당 프로세스의 정보들을 저장한다. (PCB는 지난 3강에 걸쳐 설명하였다.) 만약 내가 거의 같은 일 혹은 비슷한 일들을 하는 프로그램을 여러 개 실행하..
문맥 교환 (Context Switch) CPU는 매우 빠르기 때문에 짧은 간격으로 여기 저기 프로세스를 돌아다니며 소유권을 점유당한다. 이 때 뺏겼다가 다시 얻었을 때는 뺏겼던 시점의 문맥을 기억했다가 계속 이어서 해주는 메커니즘이 필요하게 된다. 그 때 문맥 교환이 필요한데 이때 CPU에 존재하던 해당 프로세스의 정보들, 해당 프로세스의 PCB에 저장하며, PC와 memory map도 저장한다. 여기서 주의할 것은 프로세스의 문맥은 프로세스 A(현재 프로세스)의 PCB, 즉, 메모리에서 커널이 관리하는 데이터 영역에 저장하게 된다. 운영체제가 PCB로 프로세스를 관리하니까 당연히 PCB에 그 정보를 저장할 것이다. 아무튼 이 문맥 교환은 두 가지 양상이 존재한다. 첫 번째, 일반적으로 문맥 교환은 사..