Process는 무엇일까?
프로세스는 OS가 제공하는 추상적인 개념으로, 실행중인 프로그램을 말한다.
프로세스와 프로그램을 혼동할 수 있지만 프로그램은 그 자체적으로 생명이 없는 것이다.
즉, 디스크에 들어있는 명령어 덩어리에 불과하다. 이를 가져다가 변환하고 실행하는 것은 os가 하는일이다.
os가 이런 프로세스를 관리해주기 때문에 우리는 프로그램을 실행할 때 cpu가 사용가능한지 고려하지 않고,
그냥 프로그램을 실행할 수 있는것이다.
그렇다면 물리적인 cpu가 몇개 없음에도 불구하고 어떻게 OS는 무한대의 CPU를 가진 것같은 착각을 줄 수 있는것일까?
이는 OS가 CPU를 virtualization, 가상화하기 때문이다.
이전 복숭아의 예시와 같이, 한 프로세스를 실행하고 멈추고 다른 프로세스를 실행하면서 사용자에게 동시에 실행되고 있는것같은 착각을 준다 →이러한 기술을 CPU의 time sharing이라고 한다.
(OS가 자원을 공유하기 위한 기술로, 잠깐동안 한 개체에 자원을 허용하고 또 잠깐동안 또 다른 개체에 자원을 허용하는 것을 말한다.)
Process API
위와 같은 process를 다루기 위해서 OS는 process에 관련된 인터페이스를 갖고 있다.
‣ Create : 새로운 process를 생성하기 위한 method
‣ Destory : process를 강제로 종료하기 위한 method
‣ Wait : process가 멈출때까지 기다리기 위한 method
‣ Miscellneous Control : process를 중지하고, 다시 실행시키는 method들
‣ Status : process와 관련된 정보를 제공하는 method
Process 생성 과정
프로세스가 대략 무엇인지는 알았다. 그럼 어떻게 프로그램이 프로세스로 바뀔까? 어떻게 OS가 프로그램을 실행할까?
프로그램을 실행하기 위해서는 첫번째로, OS가 디스크에 있는 프로그램의 코드와 데이터들을 메모리로 불러와야 한다.
다음으로 프로그램의 stack과 heap을 위해 메모리를 할당해야한다.
그후 I/O와 관련된 다른 초기화 작업들을 한다.
이렇게 코드와 데이터를 메모리로 로딩하고 스택을 생성하고 I/O와 관련된 작업을 처리하고 나서야 OS는 프로그램을 실행하기 위한 작업을 한다.
Process State
아주 간단하게 생략되었지만 프로세스의 생성 과정은 위와 같다. 이제 프로세스의 상태에 대해서 알아보자.
프로세스는 다음과 같은 상태를 가지고 있다.
‣ Running : 프로세서에서 실행되고 있는 프로세스
‣ Ready : 실행할 준비가 되어 있지만 아직 OS에게 실행되도록 선택받지 못한 프로세스
‣ Block : 프로세스가 실행되다가 I/O요청과 같은 이벤트 발생으로 block된 프로세스
4.2와 같이 프로세스는 상황에 따라 여러 상태로 전이된다.
실제로 프로세스의 상태가 어떻게 변해가는지 예를 살펴보자.
두 프로세스가 있다. 프로세스0이 먼저 실행되고 있고 프로세스1은 준비가 되어 있는 상태이다.
Time3에서 프로세스0에 I/O이벤트가 발생하고 Blocked된다. OS는 준비되어 있는 프로세스1 을 실행한다.
프로세스1이 실행 되고 그사이 프로세스0은 I/O이벤트를 다 마치고 준비된 상태가 된다.
프로세스1이 실행을 다 마치고 준비된 프로세스0이 실행된다.
이와 같이 프로세스의 상태는 계속해서 변화하며 이에 따라 OS가 프로세스의 상태를 알고 다음 실행을 결정한다.
이 예시에서 OS가 결정한것은 매우매우 많지만 간단하게 뽑아본다면
1. 프로세스0에 I/O이벤트가 발생했을 때, 다음에 실행할 프로세스를 프로세스0으로 결정한 것.
2. 프로세스0의 I/O이벤트가 마무리 되었을 때, 프로세스1에서 프로세스0으로 switch하지 않고 프로세스1을 계속 수행한 것.
이다.
이러한 결정들이 어떻게 결정되냐고? OS scheduler에 따라 결정되어지고 후에 자세히 배우게 된다.
Data Structure
OS도 프로그램이다. 따라서 프로세스를 관리하기 위해 각 프로세스의 정보를 알기 위한 데이터 구조들을 가지고 있다.
중요한 데이터 구조로는
‣ process list
현재 실행중인 프로그램들을 추적하기 위한 데이터 구조를 갖고 있다.
‣ Process Control Block(PCB)
각 프로세스마다 관련된 정보를 저장하기 위한 데이터 구조를 갖고 보통 PCB블럭이라고 한다.
아래의 4.5사진을 보면 OS가 프로세스의 어떤 정보를 가졌는지 대략적으로 알 수 있다.
proc_state 열거체를 보면 위에서 설명한 프로세스의 상태값들을 확인할 수 있다.
proc구조체를 보면 각 프로세스에 대한 정보(프로세스 아이디, 프로세스 상태, 부모 프로세스 등등)들을 확인할 수 있다.
OS는 이런 구조로 PCB나 process list를 관리하고 있다.
CPU를 Virtualization을 구현하기 위해서는 크게 두가지 기술이 필요하다.
‣ low-level machinery mechanism
time sharing을 위한 context switch 같은 기술/프로토콜 등
‣ high-level in-telligence
OS가 결정을 내리기 위한 알고리즘, 즉 정책들.
예를 들어, 다음에 어떤 프로그램을 실행할지를 결정하기 위한 scheduling policy와 같은 것.
이 두 기술로, low-level mechanism을 통해 프로세스들을 구현하고 high-level policies를 통해 프로세스들을 지능적으로 스케줄링함으로써 OS는 CPU를 가상화 할 수 있다.
'운영체제 > Operating Systems in Three Easy Pieces' 카테고리의 다른 글
5. Virtualization) CPU Scheduling (0) | 2023.07.05 |
---|---|
4. Virtualization) Direct Execution (0) | 2023.06.29 |
3. Virtualization) Processes API (0) | 2023.06.26 |
1. Virtualization) dialogue (0) | 2023.06.19 |
Operating Systems in Three EasyPieces 책을 통해 운영체제를 공부하며 (0) | 2023.06.19 |