Study/혼자 공부하는 컴퓨터구조+운영체제 정리

10장. 프로세스와 스레드

공부하기 좋은 날 2023. 2. 5. 23:02

10-1) 프로세스 개요

 

프로세스란 실행중인 프로그램. 더 자세히 말하면 보조기억 장치에 저장된 프로그램을 메모리에 적재하고 실행하는 순간 그 프로그램은 프로세스가 된다!!!

 

1) 프로세스 확인하기

컴퓨터에서 작업관리자를 보면 현재 실행중인 프로그램들을 볼 수 있는데, 이를 프로세스라 한다.

프로세스에는 사용자가 보는 앞에서 실행되는 포그라운드 프로세스와 사용자가 보지 못하는 뒤편에서 실행되는 백그라운드 프로세스가 있다.

 

2) 프로세스 제어 블록 (PCB)

운영체제는 빠르게 번갈아가며 실행되는 프로세스들의 순서를 관리하고 자원을 배분하기 위해 프로세스 제어블록(Process Control Block)을 사용한다.

이는 옷에 달린 태그와 같이 프로세스와 관련된 정보를 저장하는 자료구조이며 프로세스 제어블록에는 해당 프로세스를 식별하기 위해 꼭 필요한 정보들이 저장 됨.

 

PCB는 커널영역에 생성되며 아래와 같은 정보들을 담고 있음.

 

1. 프로세스 ID : 특정 프로세스를 식별하기 위해 부여되는 고유번호

2. 레지스터 값 : 이전까지 사용했던 레지스터의 중간값을 찾아 이전 진행한 작업을 이어서 수행하기 위해

3. 프로세스 상태 : 대기중인지, 실행중인지 등의 프로세스의 상태를 저장

4. CPU스케쥴링 정보: 프로세스가 언제, 어떤 순서로 CPU를 할당받을지 기록

5. 메모리 관리 정보: PCB에는 프로세스가 어느 주소에 저장되어있는지, 페이지 테이블이 어디인지의 정보 저장

6. 사용한 파일과 입출력장치 목록

 

3) 문맥교환

문맥(context) : 하나의 프로세스 수행을 재개하기 위해 기억해야 할 정보

하나의 프로세스 문맥은 해당 프로세스의 PCB에 표현되어 있다. PCB에 기록되는 정보들을 문맥이라고 봐도 무관함.

 

기존 프로세스의 문맥을 PCB에 백업하고 새로운 프로세스를 실행하기 위해 문맥을 PCB로부터 복구하여 새로운 프로세스를 실행하는 것을 문맥교환이라고 한다.

 

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

문맥교환이 자주 일어나면 빠르게 번갈아가며 수행되기 때문에 프로세스들이 동시에 실행되는 것처럼 보인다.

 

4) 프로세스의 메모리 영역

사용자 영역에 프로세스는 메모리에 어떻게 배치되는가?

 

정적 할당 영역 : 프로그램이 실행되는 동안 크기가 변하지 않는 고정된 영역

1. 코드 영역

: 기계어로 이루어진 명령어가 저장되는 공간

 

2. 데이터 영역

: 프로그램이 실행되는 동안 유지할 데이터가 저장되는 공간

static등의 전역변수가 저장되는 공간

 

동적 할당 영역: 프로그램이 실행되는 동안 그 크기가 변할 수 있는 영역

3. 힙 영역

- 프로그래머가 직접 할당할 수 있는 저장공간. 메모리 할당 후 해제해야함.

- 메모리 해제, 즉 반환을 하지 않으면 메모리 누수가 발생

- 접근 속도 상대적으로 느림, 메모리 크기 제한 없음.

- 가비지 콜렉터가 메모리를 삭제하거나 delete로 직접 해제해줘야 함. 

- new변수, 클래스 등 런타임에 동적할당 되는 것들이 이 영역에 들어감

 

4. 스택 영역

- 데이터를 일시적으로 저장하는 공간.

- 함수의 실행이 끝나면 사라지는 매개변수, 지역변수가 대표적.

- 일시적 저장 데이터는 스택에 push되고 필요하지 않은 데이터는 pop됨

- 접근속도 빠름, 메모리 크기 제한 있음.

- 크기 결정 시점: 컴파일 타임

- 매개변수, 지역변수, 리턴값, 주소값, 구조체 등이 이 영역에 들어감.

 

힙 영역은 메모리의 낮은 주소에서 높은 주소로 할당되고, 스택영역은 높은 주소에서 낮은 주소로 할당 됨.

 

<확인문제>

1. 4 -> 프로세스는 사용자와 상호작용 하지 않는 것도 있다

2. 1 -> 문맥교환은 빠르게 수행될수록 좋은것이 아니다

 

 

 

10-2) 프로세스 상태와 계층 구조

1) 프로세스 상태

프로세스 상태 다이어그램(출처: 혼공컴운 책)

생성 상태: 이제 막 메모리에 적재되어 pcb를 할당받은 상태

 

준비 상태: cpu를 할당받아 실행할 수 있지만 아직 자신의 차례가 아니라 디스패치(준비를 실행상태로 전환되는 것)를 기다리는 상태

 

실행 상태: cpu를 할당받아 실행중인 상태. 할당된 시간(타이머 인터럽트)을 다 사용하면 다시 준비상태가 되고, 실행중 입출력장치를 사용하여 입출력장치 작업이 끝날 때 까지 기다려야 한다면 대기상태가 됨

 

대기 상태: 입출력을 끝낼때까지 기다리는 상태

 

종료 상태: 프로세스가 종료된 상태

 

 

2) 프로세스 계층 구조

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

 

생성한 프로세스 = 부모 프로세스

생성된 프로세스 = 자식 프로세스

 

둘은 다른 PID를 갖는다. 

 

이 과정을 도표로 나타내면 트리구조를 띄는데, 이를 프로세스 계층구조 라고 함.

 

3) 프로세스 생성 기법

프로세스는 fork를 통해 자신의 복사본을 자식 프로세스로 생성

만들어진 자식 프로세스(복사본)은 exec를 통해 자신의 메모리 공간을 다른 프로그램으로 교체 = 새로운 프로그램으로 전환

 

<확인문제>

 

1. 프로세스 상태 다이어그램 빈칸 채우기

-> 1) 생성 2) 준비 3) 실행 4) 종료 5) 대기

 

2. 1) 로그인 2) vim 3) bash

 

3. 1 번 -> 복사본이 생성됨

 

4. 4번 -> 준비상태는 cpu를 할당받기를 기다리는 상태

 

 

10-3) 스레드

스레드는 실행의 단위

 

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

 

하나의 프로세스는 여러개의 스레드를 가질 수 있다.

 

 

1) 프로세스와 스레드

스레드는 프로세스의 자원을 공유하여 실행 흐름을 갖는다.

한개의 스레드를 갖는 프로세스를 단일 스레드 프로세스라고 하며 여러개의 스레드를 가지는 것을 멀티 스레드 프로세스라고 한다.

 

 

프로세스 = 실행되는 프로그램

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

 

스레드는 프로세스 자원을 공유한 채 실행에 필요한 최소한의 정보만으로 실행되므로 프로세스의 자원을 공유하는 것이 스레드의 핵심이다.

 

2) 멀티 프로세스와 멀티 스레드

여러 프로세스를 동시에 실행 하는 것 = 멀티 프로세스

여러 스레드로 프로세스를 동시에 실행하는 것 = 멀티 스레드

 

프로세스끼리는 기본적으로 자원을 공유하지 않지만 스레드끼리는 같은 프로세스 내의 자원(동일한 주소 공간의 코드, 데이터, 힙 영역, 열린파일 등)을 공유함

 

멀티 스레드 장점 :

1) 여러 프로세스를 병행 실행 하는 것 보다 메모리를 효율적으로 사용하고 낭비하지 않음

2) 서로 협력과 통신에 유리

 

단점: 

1) 하나의 스레드에 문제가 생기면 프로세스 전체에 문제가 생김

2) 자원이 변경되면 모두 영향을 받음

 

<확인 문제>

1. 2번-> 프로세스 내의 스레드들은 모두 같은 코드, 데이터, 힙 영역을 공유한다.

2. 프로세스끼리는 기본적으로 자원을 공유하지 않지만, 프로세스 내의 스레드끼리는 같은 프로세스 내의 자원을 공유합니다.