본 내용은 [Operating Systems : Three Easy Pieces]를 참고하였습니다.
여기 하나의 복숭아가 있다고 해보자.
나는 이 복숭아를 A, B, C 세 명에게 공유를 해주려고 한다.
문제는, 내가 이 복숭아를 세 명의 사람에게 공유하면, 자기 뿐만 아니라 또 다른 사람이 같은 복숭아를 공유한다는 사실에 A, B, C 각자는 불쾌해할 수도 있다.
요지는, 그들이 "각각 자신만의 복숭아를 지급받았다고 생각하도록 해야한다는 것"이다.
여기서의 복숭아가 바로 CPU(혹은 메모리)이고, A, B, C는 프로세스가 된다.
즉, CPU또는 메모리를 프로세스 A, B, C가 각자가 혼자 소유하고 사용하고 있다고 여기도록 하는 것이다.
그렇다면, 실제로는 모두가 이 복숭아를 공유하고 있는데, 어떻게 각자가 혼자서 이 복숭아를 독점하고 있다고 환상을 심어줄 수 있을까?
A, B, C는 모두 하루종일 복숭아를 먹지는 않을 것이므로 복숭아를 먹지 않을 때 이를 내가 뺏았다가 복숭아가 필요한 다른 사람에게 내가 제공하면 된다.
Process
process를 실행한다는 말은 무엇일까?
실제로 프로세스는 Fetch, Decode, Execute, Update PC의 반복으로 실행된다.
Multiple Process
실제로 우리는 하나의 프로세스만 사용하는 것이 아니라 여러개의 프로세스를 사용하는데, CPU는 어떻게 이 과정을 수행할까?
위의 그림과 같이, CPU는 프로세스 A를 조금 수행하다가, B의 코드로 점프하고, C로 점프하고, 이 과정을 반복할 수 있는데, 실제로 이는 우리가 다룰 내용인 가상화(Virtualization)이 아니다.
Virtualizating the CPU
위의 그림처럼, 실제로 운영체제의 Code가 존재하는데, OS가 필요에 따라 Code A를 실행하도록 CPU를 넘겨줬다가, 다시 가져오고, B를 사용할 수 있도록 넘겨줬다가 다시 가져오는 과정이 일어나는데, 이것이 바로 CPU의 가상화 개념이다.
Process Creation
프로세스의 생성 과정을 살펴보자.
1. disk에 저장되어 있던 program code를 memory에 load한다. 이 때 적재되는 곳은 프로세스의 address space이다.
2. 프로그램의 run-time stack 이 할당된다. 이 때 stack은 지역변수, 함수의 인자 또는 return address 등을 저장할 때 사용된다.
3. 프로그램의 힙구역이 생성된다. 동적할당 요청에 의해서 생성이 되며, 이때 malloc(), free() 함수가 사용된다.
4. OS는 추가 초기화 작업을 시행한다. 예를 들어, I/O를 설정 등이 있다.
5. 프로그램을 main() 함수라고 불리는 곳에서부터 시작한다.
fork() 함수란?
fork 함수란 수행중인 process 를 복제하는 것이다.
따라서 parent와 child 라는 개념이 등장하는데, 어떤 한 프로세스 A가 실행중에 fork() 함수를 발생시키면, 프로세스 A가 수행중이던 그 상태(즉, 가지고 있던 정보를 그대로 복제)를 child 프로세스가 물려받게 된다.
위의 예에서, 이 프로그램을 실행하던 Process A 가 있다고 했을 때, fork 함수를 발생시키면 그 위치까지의 Process A의 정보를 Process B (child) 가 물려받게 되고, Process B는 따라서 fork()를 발생시킨 그 다음 문장부터 실행되게 된다.
Process A는 fork를 하고 나서 pid 에 child process의 pid 값을 갖게 되고(fork 가 성공하면 생성된 자식 프로세스의 pid가 반환되고, child process 는 0을 반환받는다), 따라서 if 문에서 else문이 먼저 실해오디고, 그 후, A 프로세스가 끝난 후, child process인 B가 수행되고, if에 걸친 문장들을 수행하게 된다.
따라서 하나의 process 는 또 다른 process를 만들어낼 수 있으므로 계층구조(hierarchy)가 생길 수 있는데, Unix에서는 이를 "process group" 이라고 한다.
Process States
프로세스는 3가지 상태 중 하나일 수 있다.
- Running : 프로세스가 프로세서에서 실행되고 있는 상태
- Ready : 프로세스가 실행이 될 준비가 끝났지만, 아직 OS가 이 프로세스를 실행하지 않는 상태이다.
- Blocked : 일반적으로 I/O 요청이 필요할 때의 상태이다. 예를 들어 프로세스가 우리의 키보드 입력을 기다린다고 하면, 프로세스는 아무것도 할 수 없는 상태이기 때문에, blocked 상태가 되고, 다른 프로세스가 실행할 수 있게 한다. 만약 입력이 끝나면, ready 상태가 되어 OS 의 선택을 기다린다.
Context Switching
Context Switching 이란 process 사이의 cpu switching 이 일어나는 것이다.
이 때, 새로운 프로세스가 동작하도록 모든 환경을 맞춰줘야하므로 overhead가 발생하고, 이 overhead는 hardware의 도움을 받아야 overhead를 크게 줄일 수 있다.
/ /문제제기 및 피드백 언제든지 감사히 받겠습니다.
'Computer Science > Operating System' 카테고리의 다른 글
[운영체제] Thread(쓰레드) (0) | 2022.05.15 |
---|---|
[운영체제] Swapping (0) | 2022.05.08 |
[운영체제] Project #1 (3) | 2022.04.24 |
[운영체제] Smaller Tables -Page Directory (0) | 2022.04.24 |
[운영체제] 제한적 직접 실행(Limited Direct Execution) (0) | 2022.04.23 |