프로세스란?
프로그램이 실행 상태에 있는 것을 말합니다.
운영체제의 기능 중에 프로세스 관리 기능이 있었죠.
그러니까 프로세스 관리 기능은 프로그램을 실행시키고, 실행을 제어하는 모든 일을 말하는 것입니다.
프로세스가 정확히 무엇인지 예를 들어서 살펴보겠습니다.
중요한 날들을 기록해놓은 days.txt라는 텍스트 파일이 있고, 한글 파일(hwp.exe)이 있다고 할 때,
days.txt와 한글 파일은 프로세스일까요?
-> 둘 다 아닙니다.
텍스트 파일은 단순히 내용을 저장한 파일일 뿐이고, 실행할 수 있는 형태가 아니므로 프로그램이 아닙니다.
한글 파일(hwp.exe)는 실행시킬 수 있는 프로그램인 것은 맞지만, 아직 실행을 시키지 않았기 때문에 그냥 실행가능한 프로그램이 됩니다.
프로세스의 생성
프로세스는 사람과 프로세스에 의해서 만들어질 수 있습니다.
위의 예에서 봤듯이 사람은 명령어를 통해 프로그램을 실행시킬 수 있습니다.
사람 외에는 프로세스가 프로세스를 생성할 수 있는데요.
이런 경우에 프로세스를 생성한 프로세스는 부모 프로세스, 생성된 프로세스는 자식 프로세스라고 합니다.
사람이 프로그램을 실행시키면 운영체제가 프로그램에 해당하는 프로세스를 만들게 됩니다.
다음으로는 프로세스가 어떤 형태로 만들어지게 되는지 알아보도록 하겠습니다.
프로세스의 3가지 구성 요소
위 그림처럼 프로세스는 실행할 Instruction들이 모인 code(text) 부분, Instruction을 실행하는데 필요한 data, 마지막으로 스택과 레지스터에 들어있는 값들과 같이 운영체제가 프로세스를 실행하기 위해 필요한 자원들이 모인 execution context로 구성됩니다.
✅ 정리
프로세스 : 실행 상태의 프로그램
프로세스의 생성
1. 사용자의 명령
2. 부모 프로세스의 자식 프로세스 생성
프로세스의 구성
1. code(text)
2. data
3. execution context
프로세스의 상태
프로그램은 일련의 Instruction(명령어)들로 구성이 되기 때문에 프로세스는 프로그램을 구성하고 있는 Instruction을 실행하는 것이라고 볼 수 있습니다.
프로세스에서 이 Instruction들이 차례로 실행되면서 그때그때 다른 모습을 보이게 되는데, 그것들을 프로세스의 상태라고 합니다.
위 그림에서 메모리의 0~5000번지에 들어가 있는 것이 운영체제인데 운영체제 중 Dispatcher라는 부분이 있는 것을 볼 수 있습니다.
Dispatcher는 커널 함수로, 실행될 프로세스에게 CPU를 배정하고, 프로세스가 실행되도록 준비하는 일을 합니다.
위 그림처럼 메모리의 5000번지 부터 5012번지까지는 프로세스 A의 코드가, 8000번지부터 8005번지까지는 프로세스 B의 코드가, 12000번지부터 12011번지까지는 프로세스 C의 코드가 들어가 있다고 할 때 프로세스의 실행 과정에 대해 알아보겠습니다.
위 그림처럼 프로세스의 실행이 이루어지게 되는데요.
먼저 메모리의 5000번지에 들어가있는 프로세스 A를 5005번지에 들어있는 Instruction까지 실행합니다.
그리고 Time out이 됐죠.
Timesharing에서는 Time out이 되면 다른 프로세스가 실행하도록 CPU를 다른 프로세스에게 넘겨줘야 합니다.
13번줄을 보면 프로세스 B가 다음으로 실행되는 것을 확인할 수 있습니다.
그런데 프로세스 B의 실행으로 넘어가기 전에 메모리의 100번지부터 105번지까지의 코드가 실행된 것을 볼 수 있습니다.
이 코드는 바로 위에서 봤던 Dispatcher의 코드입니다.
코드가 실행되는 동안 Dispatcher는 다음으로 실행할 프로세스에게 CPU를 넘겨주게 됩니다.
그렇기 때문에 계속해서 Dispatcher의 코드와 프로세스의 코드가 번갈아 실행되게 됩니다.
그런데 16번 줄에서 프로세스 B가 입출력을 하느라 실행이 멈춘 이후로는 프로세스 A와 C만 이어서 실행이 됩니다.
그 이유는 프로세스 B는 입출력이 아직 진행중이기 때문에 CPU를 줘도 실행을 할 수 없는 상태이기 때문입니다.
나중에 자세히 알아보겠지만 프로세스 B처럼 CPU를 줘도 실행하지 못하는 상태를 Block 상태라고 합니다.
정리해보자면 파란색 부분에서 Dispatcher가 다음에 실행할 프로세서에게 CPU를 할당해주고, 흰색부분에서는 Dispatcher가 결정한 프로세서가 실행됩니다.
여기서 중요한 점은 운영체제는 Dispatcher 코드가 실행될 때(파란색 부분)만 실행된다는 것입니다.
즉, CPU가 사용자 프로그램을 실행할 때(흰색 부분) 운영체제는 실행되지 않습니다.
이제 프로세스의 상태에 대해 정의해보도록 하겠습니다.
이번 글에서는 간단하게 Not Running 상태와 Running 상태 이 두 가지에 대해서만 알아볼 것입니다.
프로세스가 생성이 되면 프로세스의 세계로 들어오고, 종료되면 프로세스의 세계에서 나가게 됩니다.
프로세스는 생성이되고 나서부터 종료되기까지 여러 상태를 왔다갔다 하다가 종료가 되면 나가게 되는 것입니다.
프로세스가 그렇게 여러 상태로 변화하는 모습을 그린 것이 바로 State-Transition-Diagram이라고 합니다.
State-Transition-Diagram에서 상태(state)는 원이나 타원으로 표시하고, Transition은 화살표로 표시합니다.
여기서 Transition은 상태가 바뀐다, 옮겨간다는 뜻입니다.
위의 그림이 바로 State-Transition-Diagram입니다.
프로세스가 생성되어 프로세스의 세계로 들어오는 것을 Enter라고 하고, 프로세스가 종료되어 나가게 되는 것을 Exit이라고 합니다.
Running 상태와 Not Running 상태는 말 그대로 프로세스가 실행중인 상태와 실행중이지 않은 상태를 각각 나타냅니다.
Dispatch가 일어나면 Not Running 상태에서 Running 상태로 바뀌게 되고,
Pause가 일어나면 Running 상태로 바뀌게 됩니다.
프로세스는 생성되었다고 해서 바로 실행이 되는 것이 아닙니다.
Dispatch가 일어나야지만 프로세스가 Not Running 상태에서 Running 상태로 가게 됩니다.
즉, 프로세스에게 CPU가 주어지기(Running 상태) 전까지는 Not Running 상태에서 기다리게 되는 것이죠.
그렇게 프로세스는 종료되기 전까지 Dispatch되어 Running상태가 되어 실행을 했다가 다시 Pause가 일어나 Not Running상태에서 대기했다가를 반복하게 됩니다.
그런데 실행을 대기하는 프로세스는 하나가 아니기 때문에 메모리 안의 Queue라는 공간에서 Dispatch될 때까지 대기하게 되는 것입니다.
즉, Queue 안에 있는 프로세스는 Not Running 상태인 것이죠.
프로세스가 생성되는 이유
1. 운영체제가 서비스 프로세스를 만든다.
운영 체제의 기능 중 핵심 기능이 아닌 것들을 별도의 프로그램으로 만들어 놓고, 부팅할 때 실행을 시킵니다.
이런 프로세스를 데몬 프로세스라고 합니다. 컴퓨터 안에서 보이지 않는 상태로 실행되기 때문입니다.
2. 이미 존재하는 프로세스가 자식 프로세스를 만든다.
3. 사용자가 명령을 내려 만든다.
위의 3가지 경우 모두 결국은 운영체제가 프로세스를 만드는 것입니다.
프로세스 또는 사용자의 요청을 받아 프로세스를 만드는 것은 운영체제이기 때문입니다.
프로세스가 종료되는 이유
1. 정상적인 종료
프로세스의 마지막 Instruction까지 실행되면 Exit이라는 System-Call이 호출됩니다.
이 System-Call은 운영체제에게 이 프로세스의 실행이 끝났으니 프로세스를 종료시켜달라고 요청하는 것입니다.
2. Protection error
허용되지 않는 메모리를 접근하려고해서 프로그램의 실행을 중단시킵니다.
3. 부모 프로세스의 요청
부모 프로세스가 자식 프로세스가 더 이상 필요하지 않아 운영체제에게 종료시켜달라고 요청합니다.
4. Arithmetic error, I/O failure, Invalid instruction, etc.
프로그램 실행 중 비정상적인 경우가 발생하면 종료시킵니다.
위의 경우중 1, 3번은 정상적인 종료이지만, 2, 4번은 비정상적인 종료에 해당합니다.
'운영체제' 카테고리의 다른 글
혼자 공부하는 컴퓨터구조 + 운영체제 10장 정리 (0) | 2024.04.14 |
---|---|
혼자 공부하는 컴퓨터구조 + 운영체제 8장 정리 (0) | 2024.03.31 |
[운영체제] OS-Architecture(Monolithic Kernel, Micro Kernel) (0) | 2023.04.04 |
[운영체제] 운영체제의 구성 (0) | 2023.04.03 |
[운영체제] Timesharing (0) | 2023.04.02 |