[ 프로세스 ]
< 프로그램 vs 프로세스 >
- 프로그램
: 어떤 작업을 위해 실행할 수 있는 파일
- 프로세스
: 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램
: 운영체제로부터 시스템 자원을 할당받는 작업의 단위
( 시스템 자원 : CPU 시간, 운영되기 위한 주소 공간,
Code/Data/Stack/Heap의 구조로 되어있는 독립적인 메모리 영역 )
: CPU에 의해 처리되는 사용자 프로그램 / 시스템 프로그램
즉, 실행중인 프로그램을 의미하며, 작업 또는 테스크라고 한다.
: PCB ( Process Control Block )을 지닌 프로그램
: PC ( Program Counter )를 지닌 프로그램
: 능동적 개체로, 순차적으로 수행하는 프로그램
-> 입출력 중심( I/O - Bound ) 프로세스
: 계산보다는 입출력을 많이 하는 프로세스
-> 계산 중심 ( CPU - Bound ) 프로세스
: 입출력보다는 계산을 많이 하는 프로세스
< 프로세스 관리 >
: 사용자 프로세스와 시스템 프로세스의 생성, 삭제
: 프로세스의 일시 중지와 재수행
: 프로세스 스케줄링
: 프로세스 동기화
: 프로세스 간 통신 ( IPC : Inter Process Communication )
: 교착상태 처리 ( Deadlock )
< 프로세스 상태 >
: 하나의 프로세스는 여러가지 이벤트에 의해 일련의 서로 구분되는 상태변화를 겪는다.
: 생성 상태, 준비 상태, 실행 상태, 대기 상태, 완료 상태를 가질 수 있다.
1) 생성 상태 ( New )
- 사용자에 의해 프로세스가 생성된 상태
- 생성되었지만, 아직 승인은 받지 못한 상태
2) 준비 상태 ( Ready )
- CPU를 할당받을 수 있는 상태
3) 실행 상태 ( Running )
- 프로세스가 CPU를 할당받아 동작 중인 상태
4) 대기 상태 ( Waiting )
- Running 상태였다가, 입출력 처리 등을 하게 되면, CPU를 양도하고
입출력 처리가 완료될 때까지 대기하고 있는 상태
5) 완료 상태 ( Complete )
- 프로세스 실행을 완료하고 할당된 CPU를 반납함

< 프로세스 상태 전이 >
new -> ready : OS에 의해 프로세스를 승인(admitted)
ready -> running : 프로세스를 수행하기 위해 CPU를 할당 ( Scheduler Dispatch )
: 준비상태에 있는 여러 프로세스(Ready List) 중, 실행될 프로세스를 선정( Scheduling )하여 CPU를 할당( Dispatch )
: 이 때, 문맥교환이 발생한다. 프로세스는 준비 상태에서 실행 상태로 전이된다.
running -> ready : 할당된 시간이 지나면, timeout interrupt 발생 ( Interrupt )
: CPU를 할당받은 프로세스는 지정된 시간이 초과되면 스케줄러에 의해 PCB 저장, CPU 반납 후 다시 준비상태로 전이된다.
: 타임 슬라이스(Time Slice) 만료, 선점(Preemption) 시 타임아웃 발생
running -> waiting : timeout 전에 I/O 요청 발생 - I/O or Event wait
: 실행 상태에 있는 프로세스가 지정된 할당 시간을 초과하기 전에 입출력이나 기타 사건이 발생(block)하면,
CPU를 스스로 반납하고 입출력이 완료될 때까지 대기 상태로 전이된다.
: 즉시 실행 불가능한 시스템 콜, I/O 작업 시작, 프로세스 간 통신 시 Block 발생
waiting -> ready : I/O요청이 완료되면 다시 ready 상태로 전이 - I/O or event completion
: 입출력이 종료되면, 대기 상태의 프로세스에게 입출력 종료 사실을 wait & signal 등에 의해 알려주고,
준비상태로 전이된다.
running -> terminated : 프로세스 종료
< 프로세스 구성 요소 >
- 코드( Code ) 영역
: 프로그램 코드 자체를 구성하는 메모리 영역 ( hex파일 or bin 파일 )
: CPU가 해석할 수 있는 바이너리 코드 상태로 주기억장치에 올라오는데, 이 영역을 말한다.
: 프로그램 명령이 위치하는 곳으로, 기계어로 제어되는 메모리 영역이다.
- 데이터 ( Data ) 영역
: 사용자 작성 프로그램 코드에서 사용하는 데이터를 담는다.
: 전역변수(global), 정적변수(static), 배열(array), 구조체(structure) 등이 저장된다.
: 초기화된 데이터는 Data 영역에 저장되고, 초기화되지 않은 데이터는 BSS ( Block Stated Symbol )
영역에 저장한다.
: 프로그램이 실행될 때 생성되고, 프로그램이 종료되면 시스템에 반환한다.
: 함수 내부에 선언된 static 변수는 프로그램이 실행될 때 공간만 할당되고, 그 함수가 실행될 때 초기화된다.
- 스택 ( Stack ) 영역
: 프로그램이 자동으로 사용하는 임시 메모리 영역이다.
: 지역(local) 변수, 매개변수(parameter), 리턴 값 등 잠시 사용되었다가 사라지는 데이터를 저장하는 영역이다.
: 함수 호출 시 생성되고, 함수가 끝나면 시스템에 반환된다.
: 스택 사이즈는 각 프로세스마다 할당되지만,
프로세스가 메모리에 로드될 때 스택 사이즈가 고정되어 있어
런타임 시에 스택 사이지를 바꿀 수는 없다.
: 명령 실행 시, 자동 증가/감소 하기 때문에 보통 메모리의 마지막 번지를 지정한다.
- 힙 ( Heap ) 영역
: 필요에 의해 동적으로 메모리를 할당하고자 할 때 위치하는 메모리 영역이다.
: 메모리 주소 값에 의해서만 참조되고 사용되는 영역이다.
: 이 영역에 데이터를 저장하기 위해서는 C는 malloc(), C++는 new() 함수를 사용한다.
:: Heap Overflow
- Heap이 위에서부터 주소값을 채워져 내려오다가, Stack 영역을 침범하는 경우
:: Stack Overflow
- Stack 영역이 Heap을 침범하는 경우

< 프로세스 제어 블록 ( PCB ) >
- 운영체제 커널이 프로세스 관리를 위해 필요한 자료를 담고 있는 자료구조
- "PCB는 운영체제가 프로세스를 표현한 것이다."
운영체제에서 프로세스는 PCB로 표현된다.
- PCB는 프로세스 생성 시 만들어지고, 메인 메모리에 유지되며,
프로세스가 완료되면 PCB도 함께 제거된다.
- PCB는 프로세스 상태 관리와, 문맥 교환(Context Switching)을 위해 필요하다.
- PCB는
PID ( 프로세스 식별자 )
프로세스 상태 ( New, Ready, Running, Wait, Terminated )
프로그램 카운터(PC -> 해당 프로세스가 다음에 실행할 명령어의 주소를 가리킨다 )
레지스터 저장 영역,
프로세서 스케줄링 정보 ( 우선순위, 최종 실행시각, CPU 점유 시간 등 ),
프로세스 계정 정보 ( 페이지 테이블, 스케쥴링 큐 포인터, 소유자, 부모 등 ),
입출력 상태 정보 ( 프로세스에 할당된 입출력장치 목록, 열린 파일 목록 등 ),
메모리 관리 정보 ( 해당 프로세스의 주소 공간 등 )패로 구성된다

위에 설명하지 않은 내용 중 보충 설명..
* Pointer : 프로세스의 현재 위치를 저장하는 포인터 정보
* Registers : 누산기, 베이스 레지스터, 범용 레지스터를 포함하는 CPU 레지스터에 있는 정보
* Memory Limits : 운영체제에서 사용하는 메모리 관리 시스템에 대한 정보.
페이지 테이블, 세그먼트 테이블 등이 포함될 수 있음.
* Open File Lists : 프로세스를 위해 열린 파일 목록
- PCB는 프로세스의 중요한 정보를 포함하고 있기 때문에,
일반 사용자가 접근하지 못하도록 보호된 메모리 영역 안에 넣는다.
- PCB는 커널 스택의 처음에 위치한다.
- 운영체제는 빠르게 PCB에 접근하기 위해 프로세스 테이블을 사용한다.

[ 쓰레드 ]
- 프로세스 내에서 실행되는 여러 흐름의 단위
- 프로세스의 특정한 수행 경로
- 프로세스가 할당받은 자원을 이용하는 실행 단위
- 쓰레드는 프로세스보다 가벼운, 독립적으로 수행되는 순차적인 제어의 흐름, 실행 단위
- 쓰레드는 프로세스에서 실행 제어만 분리한 실행 단위,
한 개의 프로세스는 여러 개의 쓰레드를 가질 수 있다.

- 쓰레드는 한 프로세스 내에서 동작되는 여러 실행의 흐름,
프로세스 내의 주소 공간이나 자원들( Heap )을 같은 프로세스 내에 쓰레드끼리 공유하면서 실행한다.
- 같은 프로세스 안에 있는 여러 쓰레드들은 같은 힙 공간을 공유한다.
반면, 프로세스는 다른 프로세스의 메모리에 직접 접근할 수 없다. ( 프로세스 간 통신 : IPC를 통해 접근 가능 )
- 각각의 쓰레드는 별도의 레지스터와 스택을 가지고 있지만, 힙 메모리는 서로 읽고 쓸 수 있다.
- 한 쓰레드가 프로세스 자원을 변경하면, 다른 이웃 쓰레드(sibling thread)도 그 변경 결과를 즉시 볼 수 있다.
< 멀티 프로세스와 멀티 쓰레드의 차이 >
[ 멀티 프로세싱 ]
-> 하나의 응용프로그램을 여러 프로세스로 구성하여,
각 프로세스가 하나의 작업(테스크)를 처리하도록 하는 것.
장점) 여러 개의 자식 프로세스 중 하나에 문제가 발생하면,
그 자식 프로세스만 죽는 것 이상으로 다른 영향이 확산되지 않는다.
단점)
- Context Switching 발생으로 인한 오버헤드
: Context Switching 과정에서 캐쉬 메모리 초기화 등 무거운 작업이 진행되고
많은 시간이 소요된다.
: 프로세스는 각각의 독립된 메모리 영역을 할당받았기 때문에
프로세스 사이에서 공유하는 메모리가 없어, Context Switching가 발생하면
캐쉬에 있는 모든 데이터를 모두 리셋하고, 다시 캐쉬 정보를 불러와야 한다.
- 프로세스 사이의 어렵고 복잡한 통신 기법 ( IPC )
: 프로세스는 각각의 독립된 메모리 영역을 할당받았기 떄문에
하나의 프로그램에 속하는 프로세스들 사이의 변수를 공유할 수 없다.
[ 멀티 쓰레딩 ]
- 하나의 응용프로그램을 여러 개의 쓰레드로 구성하고,
각 쓰레드로 하여금 하나의 작업을 처리하도록 하는 것이다.
- 웹 서버는 대표적인 멀티 쓰레드 응용 프로그램이다.
장점)
- 시스템 자원 소모 감소 ( 자원의 효율성 증대 )
=> 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어들어
자원을 효율적으로 관리할 수 있다.
- 시스템 처리량 증가 ( 처리 비용 감소 )
=> 쓰레드 간 데이터를 주고 받는 것이 간단해지고, 시스템 자원 소모가 줄어들게 된다.
=> 쓰레드 사이의 작업량이 작아 Context Switching이 빠르다.
- 간단한 통신 방법으로 인한 프로그램 응답 시간 단축
=> 쓰레드는 프로세스 내의 Stack 영역을 제외한 모든 메모리를 공유하기 때문에 통신의 부담이 적다.
단점)
- 주의 깊은 설계가 필요하다.
- 디버깅이 까다롭다.
- 단일 프로세스 시스템의 경우 효과를 기대하기 어렵다.
- 다른 프로세스에서 쓰레드를 제어할 수 없다. ( 프로세스 밖에서 쓰레드를 각각 제어할 수 없다 )
- 자원 공유의 문제가 발생한다 ( 동기화 문제 )
- 하나의 쓰레드에 문제가 발생하면 전체 프로세스가 영향을 받는다.
참고자료 :
https://gmlwjd9405.github.io/2018/09/14/process-vs-thread.html
[OS] 프로세스와 스레드의 차이 - Heee's Development Blog
Step by step goes a long way.
gmlwjd9405.github.io
https://chlgpdus921.github.io/operating%20system/Chapter2_Process/
[운영체제] Process 정의와 Process 상태도
운영체제 process정의와 5가지 State를 알아보자
chlgpdus921.github.io
[운영체제(OS)] 3. 프로세스(Process)
[목차] 1. Process 2. Process State 3. Process Control Block (PCB) 4. Context Switch 5. Process Scheduling 6. Process Management 7. Cooperating Processes 참고) - https://parksb.github.io/article/7.html - KOCW 공개강의 (2014-1. 이화여자대학교
rebro.kr
https://yoongrammer.tistory.com/52
프로세스 제어 블록 (PCB: Process Control Block) 알아보기
프로세스 제어 블록 (PCB: Process Control Block) 알아보기 PCB(Process Control Bolock)는 운영체제가 프로세스를 제어하기 위해 정보를 저장해 놓는 곳으로, 프로세스의 상태 정보를 저장하는 자료구조입니
yoongrammer.tistory.com