일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- sql-mappler
- Spring
- SystemCall
- custom annotation
- @Header
- rainbow table
- Thread Library
- 함수형 인터페이스
- task_struct
- spring-data-jpa
- 문자열 리터럴
- 롬복주의점
- functional interface
- django-crontab
- 운영체제
- AOP
- 쓰레드 라이브러리
- 문자열 불변성
- 프로세스
- hiberbate
- java.util.function
- FunctionalInterface
- python-socketio
- strict stubbing
- OS
- Thread Multiplexing
- ReflectUtils
- none이미지
- 도커
- Process
- Today
- Total
JH's Develog
[OS] 프로세스란?(1) 본문
프로세스란?
프로세스는 실행 중인 프로그램(text segment)이며 작업의 단위입니다. 이뿐만 아니라 다양한 방식으로 표현할 수 있는데 Program Counter가 가리키고 있는 현재의 인스트럭션, 메모리안에 있는 컨텐츠(stack, heap, global variables) 또한 프로세스라고 할 수 있습니다.즉 프로그램은 passive한 개념이고 프로세스는 active한 개념이며 하나의 프로그램으로부터 여러개의 프로세스가 존재할 수 있습니다.
쓰레드와의 차이점
쓰레드는 프로세스 내부에 있는 일련의 Execution이며 하나의 프로세스는 하나 이상의 쓰레드를 가질 수 있습니다. 그리고 각 쓰레드는 프로세스 내부에서 code, data, files는 공유하지만 각자의 Program Counter, Stack, Register를 가집니다. 리눅스에서 실제로 스케줄링하는 단위는 쓰레드입니다.
Process Memory Layout
각 프로세스는 자신의 Memory Layout을 가지고 있는데, 이는 프로세스가 어떻게 메모리 공간을 차지하는지에 대한 Layout입니다. 실제로 전체 메모리 공간을 다 가지는 것은 아니고 프로세스 자신이 가지고 있다고 생각합니다. 이를 프로세스의 가상메모리(Virtual Memory)라고 하는데 이는 아래에서 자세히 설명하겠습니다.
32비트 CPU라는 것은 모든 프로세스가 2^32(4GB)의 가상 메모리를 가지고 있다는 의미입니다.
Layout의 각 영역에 저장되는 데이터는 다음과 같습니다.
이름 | 설명 |
Stack area | 함수 호출시 생성되는 Stack frame이 저장되는 공간입니다. 함수가 호출될 때 아래로 추가됩니다.(아래 방향으로 영역이 확장됩니다.) 함수를 실행하면서 Stack에 계속 읽고 쓰기를 합니다. |
Heap area | 동적으로 할당된 값이 저장되는 공간입니다. 동적 메모리가 요청되면 위로 추가 됩니다. 예를 들어 C의 malloc()을 사용하여 동적으로 공간을 할당받으면 heap area에 저장됩니다. |
Data segment | Global variable들을 초기화하고 해제합니다. |
Text segment | Binary program(.exe)이 복사되어 저장되는 공간입니다. 인스트럭션들이 이 영역에 저장되어 있으며 Program Counter는 text segment의 한 부분(인스트럭션)을 가리키고 있습니다. |
Kernel area | 커널의 코드가 들어있는 영역입니다. Text segment에서 인스트럭션들이 쭉 실행되다가 시스템콜이 호출되면 이 공간으로 와서 실행됩니다. |
Kernel area의 Kernel Stack은 시스템콜의 동작을 위한 공간입니다. 시스템콜도 다른 세분화된 함수들을 호출하기 때문에 이 함수들을 위한 Stack 공간입니다.
프로세스의 Virtual Memory(가상메모리)
메모리 전체의 물리적인 크기가 4GB일 때, 각 프로세스는 자신이 4GB만큼의 메모리 전체를 가지고 있다고 생각하고 동작하지만 실제로는 일부의 메모리만 프로세스에게 주어집니다. 프로세스가 메모리에 값을 저장하려고 할 때 OS가 실제 메모리에 공간을 할당해줍니다.
각 프로세스는 실제 메모리에서 자신만의 공간을 가지지만 Kernel memory area만큼은 모두 공유합니다.
Kernel stack은 각 쓰레드(프로세스)마다 하나씩 Kernel memory area에 생성됩니다. 즉 100개의 프로세스가 있다면 100개의 Kernel stack이 Kernel memory area에 존재합니다.
프로세스의 상태(State)
프로세스의 각 상태가 의미하는바는 다음표와 같습니다.
State | Description |
New | 새로운 프로세스가 생성된 상태입니다. 단, 생성되었다고 바로 실행(running)되는 것은 아닙니다. |
Ready | CPU에 할당되기위해 기다리는 상태입니다. Ready 상태인 프로세스들은 모두 Ready queue에 들어있습니다. |
Running | 실행되고 있는 인스트럭션들입니다. CPU가 1코어라면, 많은 프로세스가 있더라도 한 순간에 오직 하나의 프로세스만 실행합니다. |
Waiting | 프로세스가 어떤 Event를 기다리고 있는 상태이며, Waiting 상태의 프로세스는 Waiting queue에 들어있습니다. 예를 들어, 화면출력이나 프린트와 같은 I/O작업을 하는 중인 프로세스는 그동안 아무 일도 하지 않아서 CPU를 점유하고 있을 필요가 없기 때문에 Waiting 상태가 됩니다. |
Terminated | 실행을 마치고 종료된 상태입니다. |
주의할 점은 Ready queue와 Waiting queue는 스케줄링을 위해 필요하지만, 나머지 상태는 스케줄링이 필요하지 않기 때문에 New queue, Terminated queue, Running queue는 존재하지 않습니다.
'CS > OS' 카테고리의 다른 글
[OS] 쓰레드란? (2) - thread multiplexing, thread library, thread pool (0) | 2022.01.04 |
---|---|
[OS] 쓰레드란? - 쓰레드와 Parallelism/Concurrency (0) | 2022.01.03 |
[OS] 프로세스란?(2) _ PCB, Context switch, Zombie process etc. (0) | 2021.12.30 |
[OS] OS의 디자인과 구조 (0) | 2021.12.28 |
[OS] OS와 System Call (0) | 2021.12.24 |