CS

프로세스와 스레드 (운영체제)

rhdaud2 2025. 5. 4. 11:35

프로세스는 운영 체제의 기능 중 하나이다.

프로세스 : 실행중인 프로그램. 
- 운영체제는 프로세스를 관리하고, 필요한 자원(메모리,CPU을 나눠준다.

스레드 : 프로세스 내에서 실제로 코드를 실행하는 단위.
- 하나의 프로세스 내에 여러개의 스레드를 가지고 동시에 여러 작업 실행


프로세스는 메모리에서 아래의 영역으로 나뉘어 저장된다.

(커널 영역)
프로세스 제어 블록(PCB)

(사용자 영역)
- 코드 : 읽기 전용 공간
- 데이터 : 프로그램 실행 중 유지되는 정적 변수와 전역 변수 저장 공간
- 힙 : 동적 메모리 할당(메모리 누수 발생 주의)
- 스택 : 일시적으로 사용되는 변수와 함수 호출 정보 저장 공간

 


 


[프로세스 제어 블록(PCB)]
운영 체제의 커널이 프로세스를 식별하기 위해 필요한 정보를 포함하는 구조체.


다양한 프로세스가 메모리에 동시 적재될 수 있으므로, 운영 체제는 특정 프로세스를 식별할 필요가 있다.
*PCB는 C언어의 문법에 속하는 개념으로 이해할 수 있다.


[프로세스 제어 블록(PCB)의 구성 요소]

프로세스가 사용한 레지스터 값과 실행 진행 상황을 기억하기 위한 정보가 저장되어있다.

고유 번호(PID), 현재 상태 정보, CPU 우선 순위 정보, 스케줄링 관련 정보, 메모리 관련 정보 등을 포함한다.

프로세스의 상태 정보(준비 상태, 대기 상태, 실행 상태 등)도 PCB에 포함된다.

[프로세스 테이블과 좀비 프로세스]
프로세스 테이블 형태로 관리된다.
새로운 프로세스 생성 시 추가되고, 종료된 프로세스는 제거
- 비정상 종료된 프로세스의 PCB가 남아있는 경우를 '좀비 프로세스'라고 하며, 이는 메모리 관리에 악영향을 미친다.

*문맥 교환 : PCB에 저장된 정보를 백업하고 복구하는 과정
(CPU의 공정한 자원 할당을 위해 필요)


[프로세스의 실행 방식]
프로세스들은 메모리에 동시 적재 되며, CPU는 프로세스들을 빠르게 번갈아가며 실행해야한다.
프로그램들의 실행은 '동시다발적으로 실행된다.' 보다는 '빠르게 번갈아가면서 실행된다' 라고 이야기하는것이 좀 더 정확하다.
한 CPU가 시간을 독점해서는 안되므로 프로세스마다 CPU 사용 시간이 정해져 있는 경우가 많다.
- 타이머 인터럽트 또는 타임아웃 인터럽트를 통해 CPU 사용 시간 조절 가능 - 

 


[프로세스의 상태와 멀티 프로세스 및 멀티 스레드]

프로세스의 상태 : 생성, 준비, 실행, 대기, 종료

실행 상태 중 타이머 인터럽트 발생 : 준비 상태로 되돌아감
입출력 명령어를 만날 경우 : 대기 상태로 전이

멀티 프로세스는 여러 프로세스가 동시에 실행되는 환경을 의미한다.

( 프로세스들은 기본적으로 자원을 공유X, 독립 실행)

[멀티 프로세스와 멀티 스레드의 특징]

멀티 프로세스 : 프로세스들이 서로 '독립적으로 실행'
-> 자원을 공유하지 않아서, 한 프로세스에 문제가 발생해도 다른 프로세스에 영향을 적게 준다

* IPC(Inter-Process Communication) : 자원을 공유하지 않고 서로 통신할 수 있는 방법
- 공유 메모리를 통해서 데이터 전송
-> 메시지 전송은 데이터가 커널을 통해 송수신되며, 커널의 도움을 더 받기 때문에 메시지 전달 속도는 공유 메모리보다 느릴 수 있다.

멀티 스레드 : 한 프로세스 내에서 정보를 공유
-> 협력과 통신이 용이하다.
-> 하나의 스레드에 문제 발생시 모든 스레드에 영향을 미친다.

 


 

동기화와 교착상태

 

운영 체제는 프로세스와 스레드가 공유 자원을 안전하게 사용할 수 있도록 *동기화하여 *레이스 컨디션 등 문제를 방지한다.


*동기화 : 데이터 일관성 유지 기법
프로세스나 스레드가 '공유 자원'에 안전하게 접근하도록

*교착 상태 : 2개 이상의 프로세스나 스레드가 공유 자원을 점유하고 해제하지 않아, 무한정 대기하는 상태

*임계 구역 : 동시 접근하면 문제가 발생하는 공유 자원에 접근하는 코드 영역
- 상호 배제를 통해 하나의 프로세스나 스레드만 접근하도록 관리해야한다

*레이스 컨디션 : 공유 변수에 대해 여러 스레드가 동시에 수정할 때 발생
일관성 없는 결과가 나타난다.

 

 

레이스 컨디션 방지를 위한(동기화를 위한) 기법 : 뮤텍스 락, 세마포

뮤텍스 락
- 하나의 공유 변수와 락을 획득, 해제 하는 2 개의 함수로 구현
- 임계 구역에 진입하기 위해 락을 반드시 획득해야해서 상호 배제가 이루어진다
- 프로그래밍 언어에서 C++, 자바 등에서 지원하며 보통 사용자가 직접 구현할 필요는 없다

 

세마포
- 공유 자원의 개수를 나타내는 변수 S와 2개의 함수 wait 및 signal 로 구성
- 공유 자원을 요청하며 S값을 감소시키고, 해제할 때 S값 증가
- 이용 가능한 공유 자원의 개수를 변수로 관리하여 교착 상태 방지
(+)
- 세마포는 크게 '이진 세마포'와 '카운팅 세마포' 두 종류로 나뉜다.
- 이진 세마포는 0과 1의 값을 가지며, 사실상 뮤텍스 락과 유사하게 동작
- 일반적으로 세마포는 카운팅 세마포를 지칭하는 경우가 많다.

 

 

 

 

 

교착 상태는 4가지의 조건이 모두 충족할 때 발생한다(상호 배제, 점유와 대기, 비선점, 원형 대기)

교착 상태 예시

 

 

 

* 교착상태 해결 방안

1. 예방 (ex. 자원 요청 인덱싱 및 일정한 순서 유지)

- 현실에서 사용하기 어렵고 구현이 까다로운 비현실적인 접근 방식

교착 상태 예방

 

 

2. 회피 : 자원을 조금씩 할당하여, 교착 상태의 위험이 있을 때 자원 할당 중단
(ex. 뱅커스 알고리즘)

3. 검출 후 회복 : 교착 상태 검출 후 강제 종료나 특정 자원의 재할당을 통해 회복