컴퓨터에서 자원은 CPU를 사용하는 경우와 RAM을 사용하는 경우가 있다. 또한 HDD같은 2차 메모리에서도 사용을 한다. 여기서 RAM + HDD를 Virtual Memory형태로 관리를 한다.
즉, 자원이라고 하면
- CPU
- (user mode application process) Virtual Memory이다.
그래서 자원이라고 하는 것을 운영체제마다 다르겠지만 기본적으로 프로세스한테 준다. 윈도우 OS기준으로는 스레드 기준으로 CPU를 준다. 또한 Virtual Memory같은 것은 process단위로 주어진다. 또한 OS입장에서 프로세스를 관리를 해야하는데 그것을 위해 등장하는게 바로 PCB이다. PCB한테 운영체제가 어떤 관리에 필요한 정보를 잔뜩 담아두고 그 정보를 가지고 프로세스를 관리를 한다.
프로세스는 스레드안에 소속이 된다. 이 스레드들은 프로세스에게 주어진 가상메모리 공간에 자유자재로 접근이 가능하다.
CPU는 연산하는 장치이고 연산하는 주체가 Core인데 Core가 8개를지닌 CPU가 있다고 가정을 해보자. 만약 2000개의 연산할 거리가 있는데 이 2000개가 8개의 Core한테 연산해달라고 하면 병목현상이 발생할 것이다. 그래서 OS는 2000개의 연산할거리들을 줄을 세워 관리한다.
아무튼 CPU라는 자원을 2000개의 스레드가 점유할려고 하면 이 CPU 자원을 시분할해서 사용한다. 여기서 시분할이랑 동시성개념처럼 번갈아가면 자원을 점유한다는 말이다. 그런데 우리는 이것을 못느끼는 이유가 사용속도가 1ns정도로 엄청 빠르기 때문에 우리가 느끼지 못하는 것뿐이다.
그러면 PCB에는 어떤 정보가 들어가 있을까?
첫째로 PID라고 들어가 있는데 이는 프로세스 ID값이고 이 ID값은 양의 정수로 32bit체제로 들어가 있다.
두번째로 메모리 관련정보가 들어가 있는데 Virtual Memory 시스템 속에는 Stack 영역(지역변수, 매개변수등 저장), heap 영역(malloc같은 걸로 할당받은 메모리 저장), Code가 저장되는 영역이 있는데 이 Code안에 text section (함수 포인터같은 걸로 명령 접근)이 존재하는데 여기에는 기계어가 저장되어 있다. 이 기계어도 Virtual Memory안에 있으니 순차적으로 저장되어 있는데 명령을 실행할 때 이 명령들의 메모리 주소가 있는데 이렇게 실행된 기계어의 명령들의 메모리 주소를 PCB에 담는다. 또한 static 영역이 존재하는데 이 영역에는 Read전용과 Read/Write용도가 있는데 이는 각각 상수, 전역변수를 저장을 한다.
MS Word같은 프로그램을 하드에 설치하고 설치된 프로그램을 RAM 메모리에 올리는데 이것을 인스턴스화라고 하고 쉽게 말하면 실행한다라고 불린다. 인스턴스화가 되면서 PCB도 생성하고 가상메모리도 할당받고 이때부터 프로그램이라고 부르지 않고 프로세스라고 부른다.
프로세스에는 4가지 상태가 존재하는데 이 상태들은 전이된다.
각 상태들은 말 그대로이며 OS입장에서 프로세스를 관리할때 쓰레드들(ready 상태)을 자료구조 Queue에 넣어서 줄을 세우는데 Queue의 앞에 있는 쓰레드부터 꺼내서 디스패치해서 연산을 한다. 이때 코어가 8개이면 8개를 한번에 꺼낸다. 실행은 프로세스 위주로 설명을 하는데 이것은 Linux, Unix중심이고 Window는 쓰레드 중심으로 설명을 한다.
또한 입출력 요청을 프로세스가 했을 때 응답이 올때까지 Lock이 걸렸다(대기상태)는 것은 blocking I/O 아니면 non-blocking I/O이다. 즉, 비동기 입출력을 할 때 중요한 것은 입출력을 요청한 요청자의 상태가 어떻게 가느냐에 따라 중요하다. 요청하고 실행상태면 non-blocking I/O, 대기상태면 blocking I/O이다.