본문 바로가기

CS/운영체제

[ 운영체제 ] 프로세스와 스레드

[ 출처 ]

혼자 공부하는 컴퓨터 구조 + 운영체제 10강

https://www.youtube.com/watch?v=isj4sZhoxjk

[ 프로세스 개요 ]

프로세스 종류

1. 포그라운드 프로세스(foreground process)

= 사용자가 볼 수 있는 공간에서 실행되는 프로세스

 

2. 백그라운드 프로세스(background process)

   2-1. 사용자와 직접 상호작용이 가능한 프로세스

   2-2. 사용자와 직접 상호작용하지 않고 그저 정해진 일만 수행하는 프로세스

   = 데몬(daemon), 서비스(service)

 

프로세스 제어 블록

프로세스들은 돌아가면서 한정된 시간만큼 CPU 이용

= 자신의 차례에 정해진 시간만큼 CPU 이용

= 타이머 인터럽트가 발생하면 차례 양보

= 빠르게 번갈아 수행되는 프로세스들을 관리해야 함

= 이를 위해 사용하는 자료구조가 프로세스 제어 블록(이하 PCB)

 

PCB

= 프로세스 관련 정보를 저장하는 자료 구조

= 프로세스 생성 시 커널 영역에서 생성, 종료 시 폐기

= 운영체제는 커널 영역에 적재된 PCB를 보고 프로세스를 관리

 

PCB에 담기는 대표적인 정보

- 프로세스 ID(PID)

   = 특정 프로세스를 식별하기 위해 부여하는 고유한 번호

- 레지스터 값

   = 프로그램 카운터, 스택 포인터 등등

- 프로세스 상태

- CPU 스케쥴링 정보

- 메모리 정보

- 사용한 파일과 입출력장치 정보

 

문맥 교환(context switch)

한 프로세스(프로세스 A)에서 다른 프로세스(프로세스 B)로 실행 순서가 넘어가려면

1. 기존에 실행되던 프로세스 A는 지금까지의 중간 정보를 백업

   = 프로그램 카운터 등 각종 레지스터 값, 메모리 정보, 열었던 파일, 사용한 입출력장치 등

   = 문맥(context)

2. 뒤이어 실행할 프로세스 B의 문맥 복구

 

프로세스의 메모리 영역

커널 영역은 PCB 저장

 

사용자 영역은 크게 코드 영역, 데이터 영역, 힙 영역, 스택 영역으로 나뉨

1. 코드 영역(텍스트 영역)

   = 실행할 수 있는 코드, 기계어로 이루어진 명령어 저장

   = 데이터가 아닌 CPU가 실행할 명령어가 담기기에 쓰기가 금지된 영역 (read-only)

2. 데이터 영역

   = 잠깐 썼다가 없앨 데이터가 아닌 프로그램이 실행되는 동안 유지할 데이터 저장

   = 전역 변수

3. 힙 영역

   = 프로그램을 만드는 사용자, 즉 프로그래머가 직접 할당할 수 있는 저장공간

   = 할당한 힙 영역의 메모리 공간을 자동으로 반환해주는 경우 존재 (가비지 컬렉션)

   = 그렇지 않은 경우 메모리 낭비 초래 (메모리 누수)

4. 스택 영역

   = 데이터가 일시적으로 저장되는 공간

   = 매개 변수, 지역 변수

 

힙 영역과 스탭 영역의 크기는 가변적

= 일반적으로 힙 영역은    낮은 주소 → 높은 주소로 할당

= 일반적으로 스택 영역은 높은 주소 → 낮은 주소로 할당

= 일반적으로 두 영역은 반대되는 방향으로 할당 (코드, 데이터, 힙 → ← 스택)

[ 프로세스 상태와 계층 구조 ]

프로세스 상태

1. 생성 상태

   = 이제 막 메모리에 적재되어 PCB를 할당 받은 상태

   = 준비가 완료되었다면 준비 상태로

2. 준비 상태

   = 당장이라도 CPU를 할당 받아 실행할 수 있지만, 자신의 차례가 아니기에 기다리는 상태

   = 자신의 차례가 된다면 실행 상태로 (디스패치)

3. 실행 상태

   = CPU를 할당 받아 실행 중인 상태

   = 할당된 시간 모두 사용 시(타이머 인터럽트 발생 시) 준비 상태로

   = 실행 도중 입출력장치를 사용하면 입출력 작업이 끝날 때까지 대기 상태로

4. 대기 상태

   = 프로세스가 실행 도중 입출력장치를 사용하는 경우, 입출력 작업은 CPU에 비해 느리기에 이 경우 대기 상태로 접어듬

   = 입출력 작업이 끝나면 (입출력 완료 인터럽트를 받으면) 준비 상태로

5. 종료 상태

   = 프로세스가 종료된 상태

   = PCB, 프로세스의 메모리 영역 정리

 

프로세스 계층 구조 (리눅스, macOS 등등)

 프로세스 실행 도중 (시스템 호출을 통해) 다른 프로세스 생성 가능

- 부모 프로세스 : 새 프로세스를 생성한 프로세스

- 자식 프로세스 : 부모 프로세스에 의해 생성된 프로세스

- 부모 프로세스와 자식 프로세스는 별개의 프로세스이므로 각기 다른 PID를 가짐

- 일부 운영체제에서는 자식 프로세스 PCB에 부모 프로세스 PID(PPID)를 명시하기도 함

 

프로세스 생성 기법 (리눅스, macOS 등등)

복제와 옷 갈아입기 (Fork-exec)

- 부모 프로세스는 fork 시스템 호출을 통해 자신의 복사본을 자식 프로세스로 생성

- 자식 프로세스는 exec 시스템 호출을 통해 자신의 메모리 공간을 다른 프로그램으로 교체

   - 코드/데이터 영역은 실행할 프로그램 내용으로 바뀌고 나머지 영역은 초기화

[ 스레드 ]

스레드 (thread)

= 프로세스를 구성하는 실행 흐름의 단위

= 하나의 프로세스는 하나 이상의 스레드를 가질 수 있음

 

스레드의 구성 요소

= 스레드 ID, 프로그램 카운터를 비롯한 레지스터 값, 스택 등

= 실행에 필요한 최소한의 정보

 

멀티 스레드 프로세스

= 실행 흐름이 여러 개인 프로세스

= 프로세스를 이루는 여러 명령어 동시에 실행 가능

= 스레드들은 프로세스의 자원을 공유 (코드, 데이터, 힙, 파일)

= 나머지는 각자 가짐 (레지스터, 스택, 프로그램 카운터)

= 스택 영역에 각 스레드만의 스택 존재

= 코드 영역에 각 스레드만의 코드 존재, 프로그램 카운터를 통해 접근 가능

'CS > 운영체제' 카테고리의 다른 글

[ 운영체제 ] CPU 스케줄링  (0) 2025.10.03
[ 운영체제 ] 전체적인 운영체제  (0) 2025.09.25