프로세스와 스레드의 정의
- 프로세스 : CPU로부터 자원을 할당받은 작업의 단위(실행 중인 프로그램)
- 스레드 : 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위
프로세스(Process)

프로그램과 프로세스
프로그램
*.exe
, *.dmg
파일과 같은 컴퓨터에서 실행할 수 있는 파일
- 파일을 실행하지 않은 상태이기 때문에 정적 프로그램(Static Program), 줄여서 프로그램이라고 함
- 실행하고 있지 않은 코드 뭉치
프로세스
- 프로그램을 실행시켜 정적 → 동적으로 상태가 변해 프로그램이 동작하고 있는 상태
- 컴퓨터에서 연속적으로 실행되고 있는 프로그램
- 메모리에 올라와 실행되고 있는 프로그램의 인스턴스(독립적인 개체)
- 할당 받는 시스템 자원의 예
- CPU 시간
- 운영을 위한 주소 공간
- Code, Data, Stack, Heap의 구조로 되어 있는 독립된 메모리 영역
프로세스의 구조

- 프로세스는 각각 독립된 메모리 영역을 할당받음
- Code(Text), Data, Heap, Stack의 구조를 가짐
코드(Code/Text) 영역
- 작성한 프로그램 코드가 저장된 영역
- 기계어로 변환되어 저장됨
- 컴파일 타임에 크기가 결정되고, 중간에 코드를 바꿀 수 없게 Read-Only로 되어 있음
데이터(Data) 영역
- 코드가 실행되면서 사용하는 전역 변수나 각종 데이터가 저장된 영역
- 컴파일 타임에 크기가 결정됨
- 데이터 영역은 크게
.DATA
, .RODATA
, .BSS
세 부분으로 나뉨
.DATA
- 선언하고 초기화 된 전역 변수, 정적(static) 변수가 저장됨
- Read-Write 가능
.RODATA
(Read-Only Data)
- 상수, 문자열이 저장됨
- 이름처럼 Read-Only
.BSS
(Block Started by Symbol)
- 초기화되지 않은 전역 변수, 정적 변수가 저장됨
- 컴파일 타임에 크기가 결정되지만, 초기화되지 않은 변수들은 프로그램 시작 시 메모리에 할당됨
- BSS 영역을 사용하는 이유
- 변수의 선언과 초기화가 되었다면 해당 변수의 크기만큼 메모리를 할당해야 함
- 하지만 선언만 되어 있는 경우, 해당 변수가 할당 받을 메모리 크기만 알고 있다면 미리 할당할 필요가 없음 ⇒ 메모리의 절약
- BSS 영역에 아무리 많은 변수를 저장하더라도 크기가 거의 변하지 않음
힙(Heap) 영역
- 생성자, 인스턴스와 같은 동적으로 할당되는 데이터가 저장됨
- 사용자에 의해 메모리 공간이 동적으로 할당되고 해제됨
- 런타임에 메모리 할당됨
- 메모리 주소 아래 → 위 순으로 저장
스택(Stack) 영역
- 지역 변수, 매개변수, 리턴 값 또는 함수 호출 데이터가 저장됨
- 잠시 사용되었다가 사라지는 데이터를 저장하는 영역
- 보통 최대 스택 사이즈는 고정해놓음, 하지만 메모리의 할당은 런타임에 동적으로 됨
- 메모리 주소 위 → 아래 순으로 저장
프로세스의 상태

프로세스는 실행되면서 상태가 변함
- 새로운(new) : 프로세스가 생성 중인 상태
- 실행(running) : 명령어들이 실행되는 상태
- 대기(waiting) : 프로세스가 어떤 이벤트(입출력 완료, 신호 수신 등)가 일어나기를 기다리는 상태
- 준비(ready) : 프로세스가 처리기에 할당되기를 기다리는 상태
- 종료(terminated) : 프로세스 실행 종료 상태
PCB(Process Control Block)

- 운영체제에서 프로세스에 대한 메타데이터를 저장한 데이터
- 운영체제는 PCB를 통해 프로세스를 관리함
- 프로세스의 생성 시에 PCB도 생성되고, 프로세스가 종료되면 사라짐
- PCB의 구조 (OS마다 조금씩 다름)
- 포인터(Pointer) : 프로세스의 현재 위치를 저장하는 정보
- 프로세스 상태(Stage) : 프로세스의 각 상태(New, Ready, Running, Waiting, Terminated)
- 프로세스 번호(PID) : 프로세스 식별자 번호
- 프로그램 카운터(Program Counter) : 프로세스 다음 명령어 주소
- 레지스터(Register) : 누산기, 베이스, 레지스터 및 범용 레지스터 포함하는 CPU 레지스터 정보
- 입출력 상태(I/O Permissions) : 해당 프로세스에 할당된 입출력 장치들과 열린 파일 목록 등
- 회계 정보(Accounting Info) : CPU 사용 시간, 경과 시간, 시간 제한 등
문맥 교환(Context Switching)

- 하나의 CPU를 여러 프로세스가 이용하기 위해 PCB를 사용하여 프로세스의 상태 정보를 교환하는 작업
- 문맥 교환을 통해 멀티태스킹(=멀티프로세싱)이 가능함
💡 멀티태스킹 : 다수의 프로세스가 하나의 CPU 자원을 나누어 사용하는 것
- 문맥 교환 중에는 작업을 할 수 없음(그림에서 Idle, 유휴 시간)
- 문맥 교환이 일어나는 시점
- 멀티 태스킹
- 인터럽트 처리
- 사용자 및 커널 모드 전환
스레드(Thread)

- 프로세스 내에서 실행되는 여러 흐름의 단위
- 프로세스의 특정한 수행 경로
- 프로세스가 할당 받은 자원을 이용하는 실행의 단위
- 프로세스는 하나 이상의 스레드를 가지고 있음
스레드의 구조

- 스레드는 프로세스 내에서 Code, Data, Heap을 공유하고 Stack 영역만 따로 할당받음
멀티프로세스와 멀티스레드

멀티프로세스
- 하나의 응용 프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 하나의 작업(Task)을 처리하도록 하는 것
장점
- 여러 개의 자식 프로세스 중 하나에 문제가 발생해도 다른 프로세스에 영향을 끼치지 않음. (신뢰성이 높음)
- 각 프로세스가 독립적이므로 새로운 기능이나 모듈 추가, 수정이 용이함. (시스템 확장성이 높음)
단점
- 문맥 교환(Context Switching) 과정에서 성능 저하가 일어날 수 있음
- 자원 공유가 어려움(IPC 정리글 참고)
예시
멀티스레드
- 프로세스 내 작업을 여러 개의 스레드로 처리하는 것
장점
- 스레드는 프로세스보다 가벼움
- 하나의 프로세스 내에서 스레드 간 공유 자원이 있으므로 스레드 간 통신이 쉬움
- 응답 시간이 빠름
단점
- 하나의 스레드에서 문제가 생기면 다른 스레드에 영향을 끼칠 수 있으므로 안정성이 낮음
- 공유 자원에 동기화 문제로 인해 성능이 저하됨
- 데드락 위험 있음
- 디버깅이 어려움
예시
공유 자원과 임계 구역

공유 자원(Shared Resource)
- 시스템 안에서 각 프로세스 or 스레드가 함께 접근할 수 있는 자원이나 변수
- 2개 이상의 프로세스가 동시에 읽거나 쓰는 상황을 경쟁 상태(Race Condition)이라고 함

임계 구역(Critical Section)
- 공유 자원 접근 순서에 따라 실행 결과가 달라지는 코드 영역
- 이를 해결하기 위한 방법으로 뮤텍스, 세마포어, 모니터가 있음
임계 구역의 해결 조건 3가지
- 상호 배제(Mutual Exclusion)
- 한 프로세스가 임계 구역에 들어가면 다른 프로세스는 들어갈 수 없음
- 한정 대기(Bounded Waiting)
- 상호 배제 때문에 기다리게 되는 프로세스가 무한하게 대기하지 않아야 함
- 특정 프로세스가 영원히 임계 구역에 들어가지 못하는 상황이 있으면 안 됨
- 진행 융통성(Progress Flexibility)
- 임계 구역에 프로세스가 없다면 아무 프로세스나 들어가서 자원 사용 가능
임계 구역 해결 방법(동기화 기법)
뮤텍스

- 공유 자원을 lock()을 통해 잠금 설정하고 사용한 후에 unlock()을 통해 잠금 해제하는 객체
- 뮤텍스를 소유한 프로세스만이 뮤텍스 해제 가능
- 뮤텍스는 잠금/잠금해제 단 두 개의 상태만 가질 수 있음
- 동시에 한 프로세스/스레드만 뮤텍스 객체를 사용 가능
세마포어

- 뮤텍스의 단점을 해결하기 위해 나온 알고리즘(다익스트라 개발)
- 세마포어는 세 가지로 이루어져 있음
- Semaphore(n) : 공유 가능한 자원의 수 n개로 초기 설정
- P() : 임계 구역에 들어가기 전에 사용중 표시
- V() : 임계 구역에서 나올 때 비었다고 표시
모니터


- 공유 자원에 안전하게 접근할 수 있도록 공유 자원을 숨기고 해당 접근에 대한 인터페이스만 제공하는 방법
- 상호 배타 큐와 조건 동기 큐를 가짐
- 상호 배타 큐 : 공유 자원에 하나의 프로세스만 진입하도록 하는 큐
- 조건 동기 큐 : 공유 자원의 Lock이 해제되기를 기다리는 스레드가 대기하는 큐
교착 상태(Deadlock)
2개 이상의 프로세스가 다른 프로세스 작업이 끝나기만 기다리며 작업을 더이상 진행하지 못하는 상태
교착 상태의 원인
- 상호 배제(mutual exclusion) : 한 프로세스가 자원을 독점하고 있으며 다른 프로세스는 접근 불가능한 상태
- 비선점(non-preemption) : 한 프로세스가 사용 중인 자원은 중간에 다른 프로세스가 빼앗을 수 없는 비선점 자원이어야 함
- 점유 대기(hold and wait) : 프로세스가 어떤 자원을 할당받은 상태에서 다른 자원을 기다리는 상태
- 원형 대기(circular wait) : 점유 대기를 하는 프로세스 간 관계가 원을 이뤄야 함
위의 4가지 조건을 모두 충족해야 교착 상태가 발생함
References
https://inpa.tistory.com/entry/👩💻-프로세스-⚔️-쓰레드-차이
https://fastcampus.co.kr/media_branding_cs
https://gmlwjd9405.github.io/2018/09/14/process-vs-thread.html
https://velog.io/@redgem92/운영체제-프로세스-구조
https://dev-ahn.tistory.com/15
https://learncom1234.tistory.com/80
https://juntheworld.tistory.com/118
https://velog.io/@wejaan/운영체제-a4pg27h2
https://yoongrammer.tistory.com/52
https://brightstarit.tistory.com/12
https://velog.io/@chappi/OS는-할껀데-핵심만-합니다.-8편-Critical-section-임계-구역2-mutex-semaphore-monitor-condition-variable
https://www.guru99.com/ko/mutex-vs-semaphore.html
https://steady-coding.tistory.com/557