프로세스(Process)
디스크에 저장되어 있는 실행 파일(프로그램)이 실행되어 메모리에 올라오면 이를 프로세스라고 한다.
이때 프로그램 전체를 모두 메모리에 올릴 수도, 필요한 일부만 메모리에 올릴 수도 있다.
프로세스의 구성
프로세스는 메모리에 위치하며 구체적으로 Text(Code), Data, Heap, Stack 영역으로 구분된다.
- Text(Code) : 코드
- Data : 전역변수, Static 변수
- Heap : 동적할당
- Stack : 지역변수, 파라미터
프로세스는 자신만의 물리적인 메모리 공간을 할당받아 그 안에서 자신만의 가상 주소 체계를 갖는다.
일부 레지스터 또한 프로세스의 구성 요소인데 다음 명령어를 가리키는 Program Counter(PC), 스택 내의 특정 공간의 위치를 가리키는 Stack Pointer 등이 해당한다.
PCB(Process Control Block)
PCB란 OS가 프로세스를 관리하기 위한 struct 형 자료구조로, 프로세스 당 1개의 PCB가 할당된다.
PCB는 문맥 교환에 이용되는데 어떤 프로세스가 인터럽트 될 때, program counter 및 레지스터들의 현재 값이 해당 PCB의 필드에 저장되고 프로세스의 상태가 변경된다. OS는 다른 프로세스를 선택하여 수행 상태로 만들고 그 프로세스의 program counter와 레지스터 값을 적재하여 새로운 프로세스를 수행한다.
프로세스의 생성
fork() 같은 시스템 콜을 사용해 프로세스를 생성할 수 있다. 다음은 프로세스가 생성되는 과정이다.
- 프로그램 코드를 프로세스의 가상 주소 공간으로 load
- disk와의 I/O는 시간이 많이 걸리는 작업이므로 한 번에 전부 load 하지 않고 가장 먼저 필요한 일부분을 우선 load 한 뒤 실행 도중 나머지 코드와 데이터를 페이지 단위로 나눠 load 한다. - 프로그램의 Runtime Stack 할당
- 지역변수, 함수 파라미터, 리턴 주소 등을 저장한다. - 프로그램의 Heap 생성
- malloc(), free() 등 명시적으로 요청된 동적 할당 작업을 수행한다. - OS는 다른 초기화 작업 진행 (I/O setup...)
- 진입점인 main()에서 프로그램 시작
- OS는 CPU 제어권을 새로 생성된 프로세스에 전달한다.
프로세스 상태
- 2가지 상태로 구분
OS는 새로운 프로세스를 생성할 때 그 프로세스에 대한 PCB를 생성하고 그 프로세스를 비수행 상태로 초기화한다.
때때로, 현재 수행 중인 프로세스가 I/O 작업을 하거나 Time Quantum이 지나 인터럽트 당하게 되면 디스패처가 수행할 다음 프로세스를 선택하게 된다. 그러면 선택받은 프로세스는 수행 상태로 바뀌며 이전 프로세스는 비수행 상태가 된다.
- 3가지 상태로 구분
ready 상태는 프로세스가 수행될 준비가 된 상태로 디스패처에 의해 CPU의 할당을 기다리고 있는 것을 말한다.
block 또는 sleep 상태는 대개 프로세스가 disk I/O를 수행하고 있는 상태를 말한다. disk I/O 작업은 CPU가 아닌 다른 disk interface가 대부분 작업하기 때문에 block 상태의 경우에는 언제든 다른 프로세스에게 CPU 점유를 빼앗길 수 있다. (preemption)
- 5가지 상태로 구분
3가지 상태에 생성과 종료 상태가 추가되었다.
- 9가지 상태로 구분
생성 상태에서부터 보면 프로세스 생성 시 메모리의 여유가 있다면 바로 ready 상태로 갈 수 있지만 만약 그렇지 않다면 suspend(swap) ready 상태로 간다. 이는 프로그램이 메모리가 아닌 디스크 내의 swap 공간으로 이동된 경우를 말한다.
이 경우 swap in 되어 메모리로 이동하는 것을 기다리는 것 밖에 할 수 없다.
ready 상태에서는 kernel mode로 가거나 user mode로 갈 수 있다. user mode는 CPU 선점(preemtion)을 통해 가거나 kernel mode를 거쳐 갈 수 있다. user mode에서는 I/O를 하거나 인터럽트 등이 발생하면 kernel mode로 이동하게 된다.
kernel mode에서의 수행이 끝나면 다시 preemtion을 통해 user mode로 돌아가거나 block 상태로 넘어갈 수 있다. block 상태에서도 메모리의 여유가 사라지면 swap out 되어 suspend 상태로 넘어갈 수 있다.
한편, kernel mode에서는 exit()을 통해 zombie 상태가 될 수도 있다.
프로세스 API
프로세스 API란 OS가 프로세스의 생성 및 제어를 위해서 제공하는 API이며 흔히 System call 이라고 부른다.
OS는 프로세스의 실행, 종료나 I/O 작업 등의 사용자가 함부로 사용하면 문제가 될 만한 명령들을 privileged instruction으로 분류하여 막아놓았다. 따라서 사용자들이 이와 같은 기능을 사용하기 위해서는 OS가 제공하는 시스템 콜을 사용하여야 한다.
시스템 콜(system call)
- fork() - 새 프로세스를 생성한다.
- wait() - 자식 프로세스가 끝날 때까지 대기한다.
- exec() - 다른 프로그램을 실행한다.
- exit() - 프로세스를 종료한다.
※ fork()와 exec()을 분리해서 만들어 놓은 이유 => I/O redirection과 Pipe를 가능하도록
'운영체제(OS)' 카테고리의 다른 글
[OS] 가상 메모리(Virtual Memory) (0) | 2022.10.18 |
---|---|
[OS] 물리 메모리 관리 기법 (0) | 2022.10.18 |
[OS] Scheduling (0) | 2022.10.17 |
[OS] Limited Direct Execution (0) | 2022.10.17 |
[OS] Introduction to Operating Systems (0) | 2022.10.14 |