카테고리 없음

#43. 프로세스와 스레드

story0689 2026. 4. 26. 15:12
 

프로세스의 구성요소와 프로세스의 상태, 계층구조. 그리고 프로세스내의 실행흐름인 스레드

 

 

 

 


목차(T.O.C)

1. 프로세스의 개요
1-1. 프로세스 직접확인하기
1-2. 프로세스 제어블록(pcb)
1-3. 문맥교환
1-4 사용자 영역 프로세스

 

 

2. 프로세스의 상태와 계층구조

2-1. 프로세스의 상태
2-2. 프로세스의 계층구조

3. 스레드
3-1. 스레드
3-2. 스레드의 구성

3-3. 멀티 프로세스와 멀티 스레드

 

1. 프로세스 개요

 

1-1. 프로세스 직접 확인하기

 

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

사용자가 볼 수 있는 공간에서 실행되는 프로세스 ex> 메모장, 워드, 게임 프로세스

 

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

사용자가 안보이는 공간에서 실행되는 프로세스

 

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

- 사용자와 직접 상호작용이 안되고, 정해진 일만 수행하는 프로세스=데몬, 서비스 

 

1-2. 프로세스 제어블록(pcb)

모든 프로세스는 실행을 위해 cpu가 필요하다. 하지만 cpu 자원은 한정되어있다.

-> 자신의 차례에 정해진 시간만큼 cpu를 사용한다. 타이머 인터럽트가 발생하면 차례를 양보한다.

운영체제가 빠르게 번갈아 수행되는 프로세스들을 어떻게 관리하는지

 

1. pcb

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

마치 상품에 달린 태그와 같은 정보

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

 

2. pcb 에 담기는 대표적인 정보

- 프로세스 id(=pid)

프로세스를 식별하기 위한 번호

- 프로세스 상태

cpu 이용중 , 기다리는 중/입출력 장치 기다리는 중

 

- cpu 스케줄링 정보

프로세스가 언제 어떤 순서로 cpu를 할당받아 사용할 지

- 레지스터 값

자신의 실행할 차례가 오면 이전까지 사용한 레지스터 중간 값을 모두 복원

 

- 메모리 관리 정보

프로세스가 현재 어느 주소에 저장되어 있는지(주소지정을 위한 메모리 정보)

페이지 테이블 정보(메모리 주소를 알 수 있는 정보)

 

- 사용한 입출력 장치정보(할당된 입출력 장치)

- 사용한 파일(사용 중인 파일정보)

 

1-3. 문맥교환

한 프로세스에서 다른 프로세스로 실행순서를 넘김

 

1. 기존에 실행되던 프로세스

지금까지의 중간정보를 백업.

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

이런 중간정보=문맥

다음차례가 왔을 때 실행을 제개하기 위한 정보

 

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

여러 프로세스가 끊임없이 빠르게 번갈아가며 실행되는 원리

 

1-4. 사용자 영역에서의 프로세스

코드영역(=텍스트 영역)/ 데이터 영역/ 힙 영역/ 스택 영역

 

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

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

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

 

2. 데이터 영역

잠깐 썻다가 없앨 데이터가 아닌 프로그램이 실행되는 동안 유지할 데이터가 저장(전역변수)

-> 코드, 데이터 영역은 프로그램 실행도중 바뀌지 않는 정적할당 영역

 

3. 스택 영역<-> 데이터 영역

데이터가 일시적으로 저장되는 영역

잠깐 쓰다가 말 값들이 저장되는 공간 ex> 매개변수, 지역변수

 

4. 힙 영역

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

나중에 반환해야하고 안하면 누수가 발생한다.

 

-> 스택과 힙 영역은 크기가 가변적인 동적할당영역이다.

 

스택영역은 높은주소->낮은주소로 힙영역은 낮은주소->높은주소로 할당된다.

2. 프로세스의 상태와 계층구조

 

2-1. 프로세스의 상태

->pcb에 기록되는 프로세스의 상태

1. 생성상태

이제 막 메모리에 적재되어 pcb를 할당받은 상태. 준비가 완료되면 준비상태로

 

2. 준비상태

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

자신의 상태가 되면 실행상태로(디스패치)

 

3. 실행상태

cpu를 할당받아 실행중인 상태

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

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

 

4. 대기상태

프로세스가 실행도중 입출력작업을 하는 경우

입출력 작업은 cpu에 비해 느리기에 이 경우 대기상태로 접어든다

입출력 작업이 끝나면 준비상태로

 

5. 종료상태

프로세스가 종료된 상태

pcb, 메모리 영역정리

 

2-2. 프로세스의 계층구조

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

 

1. 부모프로세스

새 프로세스를 생성한 프로세스

 

2. 자식 프로세스

부모 프로세스에 의해 생성된 프로세스

부모프로세스와 별개이므로 각각 다른 pid 값을 가진다.

일부 운영체제에서는 자식 프로세스의 pcb에 부모프로세스의 pid 값을 적기도 한다.

->자식 프로세스도 자식 프로세스를 생성할 수 있기에 계층구조를 가진다.

 

2-3. 자식 프로세스 생성기법

부모 프로세스는 자식 프로세스를 어떻게 생성하고, 자식 프로세스는 어떻게 자신만의 코드를 생성할까?

 

- 복제와 옷 갈아입기

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

부모프로세스의 자원이 자식프로세스에게 상속됨.(단 별개의 프로세스이므로 pid 가 다름)

 

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

 

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

3. 스레드

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

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

3-1. 스레드의 종류

1. 실행 흐름이 하나인 프로세스(단일 스레드 프로세스)

2. 실행 흐름이 여러 개인 프로세스(멀티 스레드 프로세스)

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

 

3-2. 스레드의 구성요소

스레드 id, 프로그램 카운터를 비롯한 레지스터 값, 스택 -> 실행에 필요한 최소정보를 지님.

단 , 프로세스 자원을 공유하면서 실행된다(코드영역을 공유, 한 스레드가 파일을 열면 다른 스레드도 접근가능)

 

3-3. 멀티 프로세스와 멀티 스레드

동일한 작업을 수행하는 단일 스레드 프로세스 여러 개 실행 vs 하나의 프로세스를 여러 스레드로 실행

멀티 스레드 프로세스

1. 멀티 프로세스

프로세스를 fork 하면 코드, 데이터, 힙 영역 등 모든 자원이 복제되어 저장됨.

저장된 메모리 주소를 제외하면 모든 것이 동일한 프로세스 두 개가 통째로 메모리에 적재

 

프로세스 간 통신 ipc : 프로세스 간에도 자원을 주고받을 수 있다.

파일, 공유메모리를 통한 프로세스 간 통신

 

2. 실행 흐름이 여러 개인 프로세스(멀티 스레드 프로세스)

실행을 위해 꼭 필요한(카운터 값을 포함한 레지스터 값, 스택)을 가질 뿐, 프로세스가 가지는 자원을 공유

-> 협력과 통신에 유리, 때로는 문제가 발생할 수도있다.