프로세스
프로세스란 메모리나 CPU 상에 올라와서 동작하고 있는 살아움직이는 객체이다.
프로세스와 조금 헷갈리는 개념으로는 프로그램이 있는데, 프로그램은 디스크 상에 존재하는 lifeless한 객체이다. 즉, 프로그램은 생명이 없는 객체이고 이러한 프로그램을 실행시키면 메모리와 CPU로 올라오게 되는데, 이렇게 메모리와 CPU로 올라와있는 객체를 프로세스라고 하는 것이다.
프로세스의 메모리 Layout

메모리나 CPU 상에 올라와 있는 프로세스는 크게 Code, Data, Heap, Stack 4가지 영역으로 구성된 메모리 Layout을 가진다.
각 영역을 살펴보자면 Code 영역은 실제 프로그램의 코드가 들어가는 영역으로, 프로그래밍을 한 순서에 따라 낮은 주소에서 높은 주소로 올라간다.
Data 영역은 전역 변수들이 들어가는 영역으로, 초기화되어 있는 영역(Initialized data)과 초기화되어 있지 않은 영역(Uninitialized data)으로 나뉘어져 있다.
Heap 영역은 동적으로 할당되는 영역으로, 메모리를 동적으로 할당할 때마다 아래에서 위로 자란다는 특징이 있다.
Stack 영역은 지역 변수, 매개 변수, 복귀 주소(return address)가 들어가는 영역으로, 함수가 호출될 때마다 위에서 아래로 자란다는 특징이 있다.
프로세스의 메모리 Layout에서 Code 영역과 Data 영역은 정적이다. 동적으로 확장되지 않고, 한 번 크기가 결정되면 그 크기를 계속 유지한다. 반면, Heap 영역과 Stack 영역은 동적이다. 메모리를 동적으로 할당받거나, 함수를 호출할 때마다 그 크기가 바뀔 수 있다.
프로세스의 상태
앞서 프로세스가 무엇인지와 프로세스가 메모리 상에서 어떻게 존재하는지에 대해 알아보았다. 이번에는 이러한 프로세스는 어떠한 상태를 가질 수 있는지에 대해 알아보도록 하자.

프로세스의 상태에는 위 그림에서 볼 수 있듯이 5가지가 있다.
1. new 상태는 created 상태라고도 불리며, 새로 생성된 상태를 의미한다.
2. ready 상태는 수행될 수 있는 상태를 의미한다.
3. running 상태는 수행되고 있는 상태를 의미한다.
4. waiting 상태는 blocked 상태라고도 불리며, 어떤 사건(ex. 디스크 I/O 작업)이 발생하기를 기다리면서 대기하고 있는 상태를 의미한다.
5. terminated 상태는 종료된 상태를 의미한다.
그리고 이러한 상태들은 각각 다른 상태로 전이를 하게 되는데, 위 그림에서 admitted, dispatch, interrupt, wait 등이 이러한 상태 전이에 해당된다.
admitted
admitted는 new 상태에서 ready 상태로 전이하는 것이다. 어떤 프로세스가 만들어지면 해당 프로세스가 메모리로 올라와야 하는데, 이렇게 올라와지는 것을 admitted 되었다고 한다. new 상태와 ready 상태의 가장 큰 차이점은 ready 상태는 수행이 될 수 있는 상태 즉, 메모리에 자신의 address space가 다 구성이 되어 있는 상태라는 점이다.
dispatch(schedule)
dispatch는 ready 상태에서 running 상태로 전이하는 것이다. ready 상태와 running 상태의 차이점은 똑같은 프로세스인데, running 상태는 CPU를 가지고 있다는 것이다. 즉 실제 CPU에서 동작하고 있는 반면, ready 상태는 CPU를 할당 받기 위해 기다리고 있는 상태이다.
interrupt(preemptive)
interrupt는 running 상태에서 ready 상태로 전이하는 것으로, running 상태의 프로세스에게 할당된 time quantum만큼의 시간이 지나면 해당 프로세스를 다시 ready 상태로 선점시킨다.
wait(sleep)
wait는 running 상태에서 어떤 사건의 발생을 기다리는 waiting 상태로 전이하는 것이다. 예를 들어 디스크에서 무언가를 읽어올 때까지 기다리겠다라고 하면, 해당 사건이 발생할 때가지 프로세스가 waiting 상태로 들어가게 된다.
I/O or event completion(wakeup)
wakeup은 waiting 상태에서 ready 상태로 전이하는 것으로, waiting 하고 있던 사건이 발생하면 해당 사건을 기다리고 있던 프로세스가 깨어나서 ready 상태로 들어가게 된다.
exit
exit은 running 상태에서 terminated 상태로 전이하는 것으로, running 상태의 프로세스가 자신의 할 일을 다 끝내면 terminated 상태로 들어가게 된다.
추가적으로 프로세스가 디스크와 메모리 사이를 왔다갔다 하는 suspend와 resume에 대해 알아보도록 하자.
메모리는 제한되어 있는 자원이기 때문에 프로세스들이 계속 메모리로 올라가다 보면 용량이 부족해질 때가 있다. 이렇게 용량이 부족해지면 OS가 ready 상태 혹은 wait 상태에 있는 프로세스들 중에 잘 수행되지 않는 일부를 선택해서 디스크의 Swap 공간으로 내린다.
이렇게 내리는 작업을 suspend라고 하고, 이렇게 suspend된 프로세스는 메모리가 한가해지면 다시 메모리로 올릴 수 있게 되는데, 이 올리는 작업을 resume라고 한다.
프로세스의 상태와 전이 예시
프로세스의 상태와 전이가 어떻게 이루어지는지 예시를 통해 좀 더 구체적으로 알아보도록 하자.
CPU 작업만을 하는 경우

Process0과 Process1이 0이라는 시간에 만들어졌다고 가정하고 위 그림을 보도록 하자.
0이라는 시간에는 Process0과 Process1이 모두 Ready 상태일 것이다. 그리고 이 중 1이라는 시간에 Process0이 스케줄링(dispatch) 되어 Ready 상태 -> Running 상태로 전이되었고, 4라는 시간만큼 수행된다.
4라는 시간이 지난 뒤에는 Process0이 자신의 할 일을 모두 마치고 수행이 종료되어 Running 상태 -> Terminated 상태로 전이된다.
이제 CPU에는 더 이상 Running 상태의 프로세스가 없기 때문에 Ready 상태에 있던 Process1이 dispatch 되어 Ready 상태 -> Running 상태로 전이된다. 그리고 4라는 시간만큼 수행되다가 자신의 할 일을 모두 마쳐 Running 상태 -> Terminated 상태로 전이된다.
CPU와 I/O 작업을 하는 경우

이번에도 Process0과 Process1이 0이라는 시간에 만들어졌다고 가정해보도록 하자.
그럼 0이라는 시간에는 Process0과 Process1이 모두 Ready 상태일 것이고, 1이라는 시간에 Process0이 dispatch 되어 Ready 상태 -> Running 상태로 전이된 것을 알 수 있다.
Process0이 쭉 수행되다가 3이라는 시간에 I/O 작업을 시작하였고, Process0은 I/O 작업이 완료될 때까지 즉, 어떤 사건의 발생을 기다리면서 Running 상태 -> Blocked(Wait) 상태로 전이된다.
이로 인해 CPU에는 더 이상 Running 상태의 프로세스가 없기 때문에 Ready 상태에 있는 Process1이 dispatch 되어 Running 상태로 전이된다.
이렇게 Process1이 스케줄링되어 쭉 수행되고, 7이라는 시간에 Process0이 기다리던 I/O 작업이 완료되어 Blocked(Wait) 상태에 있던 Process0이 Ready 상태로 전이되는 것을 알 수 있다.
그리고 8이라는 시간에 Process1의 수행이 끝나 Running 상태 -> Terminated 상태로 전이되고, 다시 CPU에는 Running 상태의 프로세스가 없기 때문에 Ready 상태에 있던 Process0이 dispatch되어 Ready 상태에서 -> Running 상태로 전이된다.
이렇게 스케줄링된 Process0은 자신의 남은 작업을 수행하다가 10이라는 시간에 수행을 마치고 Running 상태 -> Terminated 상태로 전이된다.
'Computer Science' 카테고리의 다른 글
IP 주소 체계 알아보기 (0) | 2022.04.03 |
---|---|
데이터베이스 인덱스 (0) | 2022.02.12 |
데이터베이스 트랜잭션 (0) | 2022.02.05 |