본문 바로가기

혼자 공부하는 컴구, 운체

[4주차] Chapter 10. PCB, 문맥 교환, 프로세스 메모리 영역, 프로세스 상태, 복제와 옷 갈아입기, 스레드, 프로세스

Chapter 10 프로세스와 스레드


10-1 프로세스 개요

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

-윈도우는 작업 관리자의 [프로세스] 탭에서, 유닉스는 ps명령어로 확인 가능하다.

 

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

 -사용자가 보는 앞에서 실행되는 프로세스 

 

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

 -사용자가 보지 못하는 뒤편에서 실행되는 프로세스, 사용자와 상호작용이 있을 수도 없을 수도 있다.   

 -데몬(daemon, 유닉스 운영체제) / 서비스(service, 윈도우 운영체제) : 사용자와 상호작용하지 않고 정해진 일만 수행하는 백그라운드 프로세스   

 

2. 프로세스 제어 블록 

 프로세스들은 차례대로 돌아가며 정해진 시간만큼 CPU를 이용하고 타이머 인터럽트(타임아웃 인터럽트, 클럭 신호를 발생시키는 장치에 의해 주기적으로 발생하는 하드웨어 인터럽트)가 발생하면 자신의 차례를 양보한다.  

 

프로세스 제어 블록(PCB; Process Control Block)

 -프로세스와 관련된 정보를 저장하는 자료 구조, 메모리의 커널 영역에 생성된다. 

 -운영체제가 빠르게 번갈아 수행되는 프로세스의 실행 순서를 관리하고 자원을 배분하기 위해 사용

 -프로세스 생성 시에 만들어지고 실행이 끝나면 폐기된다.

 -PCB에 담기는 대표적인 정보(②~⑦)

 

프로세스 ID(PID; Process ID)

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

 -같은 프로그램이라도 2번 실행하면 PID가 서로 다른 2개의 프로세스가 실행된다. 

 

레지스터 값

 -프로세스가 실행하며 사용했던 프로그램 카운터를 비롯한 레지스터 값

 -자신의 실행 차례가 돌아왔을 때 레지스터의 중간값들을 모두 복원하여 이전까지 진행했던 작업을 이어서 실행  

 

프로세스 상태

 -프로세스의 현 상태

ex) 입출력장치 사용 대기 중, CPU 사용 대기 중, CPU 사용 중 등

 

CPU 스케줄링 정보

 -프로세스가 언제, 어떤 순서로 CPU를 할당받을지에 관한 정보

 

메모리 관리 정보

 -프로세스가 어느 주소에 저장되어 있는지에 대한 정보

 -베이스 레지스터, 한계 레지스터 값, 페이지 테이블 정보(프로세스의 주소를 알기 위한 중요 정보 중 하나) 등이 담긴다.

 

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

 -프로세스가 실행 과정에서 특정 입출력 장치나 파일을 사용한 내용  

 

3. 문맥 교환

문맥(context)

 -하나의 프로세스 수행을 재개하기 위해 기억해야 할 정보

 -하나의 프로세스 문맥은 해당 프로세스의 PCB에 표현되어 있다. (PCB에 저장된 정보들을 문맥이라 봐도 무방) 

 

문맥 교환(context switching) 

 -기존 프로세스의 문맥을 PCB에 백업하고, 새로운 프로세스의 문맥을 PCB로부터 복구하여 새로운 프로세스를 실행하는 것

 -여러 프로세스가 번갈아 가며 실행되는 원리

 -너무 자주하면 오버헤드가 발생할 수 있으므로, 문맥 교환이 잦다고 좋은 것은 아니다.   

 

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

-사용자 영역에 프로세스가 배치되는 영역

 

코드 영역(code segment, 텍스트 영역(text segment))

 -기계어로 이루어진 명령어가 저장된다.

 -CPU가 실행할 명령어가 저장되어 있으므로 읽기 전용(read-only) 공간이다.

 -크기가 변하지 않는다. (정적 할당 영역)

 

데이터 영역(data segment)

 -프로그램이 실행되는 동안 유지할 데이터가 저장된다.

ex) 전역 변수(global variable)

 -크기가 변하지 않는다. (정적 할당 영역)

 

힙 영역(heap segment)

 -프로그래머가 직접 할당할 수 있는 저장 공간이다.

 -공간을 할당했다면 언젠가는 반드시 반환해야만 한다.(=운영체제에게 더이상 해당 메모리 공간을 사용하지 않음을 알리는 것)

 -메모리 누수(memory leak) : 반환하지 않은 공간이 메모리에 남아 메모리 낭비를 일으키는 일     

 -크기가 변할 수 있다. (동적 할당 영역) : 일반적으로 메모리의 낮은 주소→높은 주소로 할당된다.

 

스택 영역(stack segment)

 -일시적인 데이터가 저장된다.

ex) 매개 변수, 지역 변수 

 -일시적으로 저장할 데이터는 PUSH되고, 더이상 필요하지 않은 데이터는 POP 된다.

 -크기가 변할 수 있다. (동적 할당 영역) : 일반적으로 메모리의 높은 주소→낮은 주소로 할당된다.


확인문제

1. ④, 데몬 혹은 서비스는 사용자와 상호작용하지 않는 백그라운드 프로세스이다.  

2. ①, 문맥 교환이 너무 잦으면 오버헤드가 발생한다.  


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

1. 프로세스 상태

생성 상태(new)

 -메모리에 적재되어 PCB를 할당받은 상태(프로세스를 생성 중)

 -곧바로 실행되지 않고 준비상태가 되어 CPU 할당을 기다린다.

 

준비 상태(ready)

 -CPU를 할당받아 실행할 수 있지만, 자신의 차례가 아니어서 기다리고 있는 상태

 -디스패치(dispatch) : 준비 상태인 프로세스가 실행 상태로 전환되는 것 

 

실행 상태(running)

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

 -타이머 인터럽트가 발생한다면 다시 준비 상태가 된다.

 -입출력장치를 사용하여 입출력장치의 작업이 끝나기를 기다려야 한다면 대기 상태가 된다.   

 

대기 상태(blocked)

 -입출력 완료 인터럽트를 받을 때까지 입출력장치의 작업을 기다리는 상태

 -입출력 작업이 완료되면 다시 준비 상태가 되어 CPU 할당을 기다린다. 

 -프로세스가 특정 이벤트가 일어나길 기다릴 때 대기 상태가 되는 것이지만, 대부분의 원인이 입출력 작업이다.  

 

종료 상태(terminated)

 -프로세스가 종료된 상태

 -운영체제는 PCB와 프로세스가 사용한 메모리를 정리한다.

 

프로세스 상태 다이어그램(process state diagram)

2. 프로세스 계층 구조

부모 프로세스(parent process)  

 -프로세스가 실행 도중 시스템 호출을 통해 새 프로세스를 생성한 프로세스    

 

자식 프로세스(child process)

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

 -일부 운영체제에서는 자식 프로세스의 PCB에 PPID(Parent PID, 부모 프로세스의 PID)가 기록되기도 한다. 

 -데몬 혹은 서비스 또한 최초의 프로세스의 자식 프로세스이다.

 

프로세스 계층 구조

 -최초의 프로세스가 자식 프로세스를 생성하고, 생성된 자식 프로세스들이 새로운 프로세스를 낳는 형식을 도표로 그린 것

④ 최초의 프로세스

 -유닉스 : init, 리눅스 : systemd, macOS : launchd

 -PID가 항상 1번이며 모든 프로세스의 최상단에있다.  

 

3. 프로세스 생성 기법

복제와 옷 갈아입기

 -fork와 exec라는 시스템 호출을 반복하는 과정

 

fork

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

 -부모 프로세스의 자원들이 자식 프로세스로 상속된다. (단, PID 값이나 저장된 메모리 위치는 다르다.)

 

exec

 -복사본(자식 프로세스)이 자신의 메모리 공간을 다른 프로그램으로 교체하는 것

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

 -부모 프로세스가 fork한 뒤 자식 프로세스 누구도 exec를 호출하지 않으면, 같은 코드를 병행하여 실행하는 프로세스가 된다.   


확인문제

(기본 미션)1. ① 생성 상태, ② 준비 상태, ③ 실행 상태, ④ 종료 상태, ⑤ 대기 상태

2. ① 로그인 프로세스, ② Vim 프로세스, ③ bash 프로세스

3.

4.


10-3 스레드

1. 프로세스와 스레드

스레드

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

 -프로세스 내에서 각기 다른 스레드 ID, 프로그램 카운터 값을 비롯한 레지스터 값, 스택으로 구성된다.

→스레드마다 각기 다른 코드를 실행할 수 있다.

 -실행에 필요한 최소한의 정보만을 유지한 채 프로세스 자원을 공유하며 실행된다.

ex) 스레드 1과 스레드 2는 각각의 메모리 영역이 있는 것이 아니라 공통의 코드/데이터/힙 영역이 존재한다.     

 

단일 스레드 프로세스

 -실행의 흐름 단위(스레드)가 하나인 프로세스

 

③ 멀티 스레드 프로세스

 -실행의 흐름 단위(스레드)가 여러개인 프로세스 

 

+리눅스 운영체제에서 프로세스 vs 스레드

 -리눅스는 프로세스와 스레드 모두 실행의 문맥(context of execution)이라는 점에서 동등하게 간주한다.

 -태스크(task) : 프로세스와 스레드라는 말대신 통일하여 명명하는 말

 

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

멀티 프로세스(multiprocess)

 -여러 프로세스를 동시에 실행하는 것

 

멀티 스레드(multithread)

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

 

③ 여러 프로세스로 병행하여 실행하기 vs 여러 스레드로 병행하여 실행하기

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

 -프로세스를 fork하여 여러번 같은 작업을 실행하게 되면 PID만 다른 동일한 프로세스가 여러번 메모리에 적재되어 비효율적이다.

(쓰기 시 복사(copy on write) : fork를 한 후 프로세스를 메모리에 중복 저장하지 않으면서 동시에 프로세스끼리 자원을 공유하지 않는 방법)

(독립적이나, 멀티 프로세스 환경에서는 하나의 프로세스에 문제가 생겨도 다른 프로세스에 지장이 적거나 없다.)  

 -스레드는 각자의 스레드 ID, 프로그램 카운터 값을 포함한 레지스터 값, 스택을 가질 뿐, 프로세스 내 자원을 공유하므로 효율적이다.

(협력과 통신에 유리하나, 멀티 스레드 환경에서는 한 스레드에 문제가 생기면 전체 프로세스에 문제가 생길 수 있다는 단점이 있다.)     

 

+ 프로세스 간 통신(IPC; Inter-Process Communication)

 -프로세스 간의 자원을 공유하고 데이터를 주고받는 것

 -파일을 통한 프로세스 간 통신 : 파일 속 데이터를 주고받으며 프로세스 간의 통신이 이루어지는 것

 -공유 메모리(shared memory) : 프로세스 간 공유하는 메모리 영역을 두어 데이터를 주고받는 방식 


확인문제

1. ②, 프로세스내의 스레드들은 각기 다른 코드/데이터/힙 영역을 공유하지 않는다.

2. 공유하지 않지만, 공유합니다