반응형
Chapter 10. 프로세스와 스레드
요약
운영체제가 프로세스를 관리하는 방식을 알 수 있었고, 프로세스와 스레드의 차이에 대해 배울 수 있었다.
내용 정리
10-1. 프로세스 개요
프로세스(process)
- 보조기억장치에 저장된 프로그램을 메모리에 적재하고 실행할 때의 프로그램
- 프로세스를 생성한다 고 표현함
프로세스 확인하기
- 윈도우: 작업 관리자 -> 프로세스 탭
- 유닉스 체계: ps 명령어
프로세스 유형
- 포그라운드 프로세스(foreground process): 사용자가 보는 앞에서 실행되는 프로세스
- 백그라운드 프로세스(background process): 사용자가 보지 못하는 뒤편에서 실행되는 프로세스
- 사용자와 상호작용하는 백그라운드 프로세스와 그렇지 않은 프로세스가 있다.
- 데몬(demon): 유닉스 체계 운영체제에서 사용자와 상호작용하지 않는 프로세스를 부르는 명칭
- 서비스(service): 윈도우 체계 운영체제에서 사용자와 상호작용하지 않는 프로세스를 부르는 명칭
프로세스의 CPU 할당
- 프로세스는 차례대로 돌아가며 한정된 시간동안 CPU를 사용한다.
- 본인의 차례가 되면 정해진 시간만큼 CPU를 이용한다.
- 시간이 끝났음을 알리는 타이머 인터럽트가 발생하면 자신의 차례를 양보하고 다음 차례를 기다린다.
- 타이머 인터럽트: 클럭 신호를 발생시키는 장치에 의해 주기적으로 발생하는 하드웨어 인터럽트
- 타임아웃 인터럽트라고도 불린다.
프로세스 제어 블록(PCB; Process Control Block)
- 프로세스와 관련된 정보를 저장하는 자료구조
- 운영체제는 PCB를 이용해 프로세스 실행 순서를 관리하고, 프로세스에 CPU 등 자원을 배분한다.
- 프로세스 제어 블록에는 해당 프로세스 식별을 위해 꼭 필요한 정보들이 저장된다.
PCB 특징
- 커널 영역에서 생성된다.
- 프로세스 실행 시에 PCB가 생성되고, 종료 시에 PCB는 삭제된다.
PCB에 저장되는 정보
- 프로세스 ID (PID; Process ID)
- 특정 프로세스를 식별하기 위해 부여하는 고유 번호
- 레지스터 값
- 프로세스가 이전에 사용했던 레지스터 값들을 저장
- 프로세스가 실행차례가 되었을 때 저장된 레지스터 중간 값들을 모두 복원 후 재실행
- 프로세스 상태
- 프로세스의 상태를 저장
- 프로세스가 CPU 사용을 기다리는지, 입출력장치 사용을 기다리는지, CPU를 이용하는지 등이 기록
- CPU 스케줄링 정보
- 프로세스가 언제, 어떤 순서로 CPU를 할당 받을지에 대한 정보
- 메모리 관리 정보
- 프로세스가 메모리 어디에 저장돼 있는지에 대한 정보
- 프로세스의 메모리 정보를 알 수 있는 페이지 테이블 정보가 담김
- 사용자 파일과 입출력 장치 목록
- 특정 입출력장치나 파일을 사용했던 기록
프로세스 교환
- A 프로세스에 주어진 실행 시간이 종료 시 다른 B 프로세스에 CPU 사용을 양보해야 한다.
- 양보 전에 프로세스 A는 프로그램 카운터 등 레지스터 값, 메모리 정보, 이전에 사용한 파일과 입출력장치 정보 등 중간 정보들을 백업해야 한다.
- 백업 후 다음 차례가 왔을 때 다시 복원해 실행을 재개하게 된다.
문맥 교환
- 문맥(context): 하나의 프로세스 실행을 재개하기 위해 필요한 중간 정보들
- 프로세스 문맥은 PCB에 기록돼 있으며, CPU 사용 시간이 종료되거나 인터럽트가 발생할 때 운영체제는 해당 프로세스의 PCB에 문맥을 백업한다.
- 뒤에 실행을 재개하는 프로세스는 PCB에서 문맥을 복원해서 실행을 재개한다.
- 문맥 교환(context switching): 기존 프로세스의 문맥을 PCB에 백업하고, 새로운 프로세스의 문맥을 PCB로 부터 복구해 실행을 재개하는 과정
- 문맥 교환을 통해 여러 프로세스는 빠르게 번갈아 가며 실행되며, 빠르게 진행될수록 프로그램은 동시에 실행되는 것처럼 보인다.
- 단, 문맥교환이 너무 자주 발생하면 오버헤드가 발생할 수 있기 때문에 문맥교환이 자주 발생하는게 꼭 좋은 것은 아니다.
프로세스의 메모리 영역
사용자 영역의 코드 배치
사용자 영역은 4가지 영역으로 세분화된다.
- 코드 영역
- 데이터 영역
- 힙 영역
- 스택 영역
1. 코드 영역(code segment)
- 실행할 수 있는 코드(기계어 명령어)가 저장된다.
- 데이터가 아닌 CPU가 실행할 명령어들만 담겨있기 때문에 읽기 전용(read-only) 공간이다.
- 즉, 쓰기 행위가 금지된다.
- 텍스트 영역(text segment)라고도 불린다.
2. 데이터 영역(data segment)
- 프로그램이 실행되는 동안 유지해야 할 데이터가 저장되는 공간
- 변경되는 데이터들은 힙이나 스택 영역에 저장된다.
- 전역변수(global variable)와 같이 프로그램 실행동안 데이터가 유지되며, 프로그램 전체에서 접근할 수 있는 데이터들이 저장된다.
3. 힙 영역(heap segment)
- 프로그래머가 직접 할당할 수 있는 영역
- 프로그래밍 과정에서 힙 영역에 메모리 할당이 발생했으면, 언젠가 다시 반환해야 한다.
- 메모리 공간을 반환하지 않으면 메모리 누수(memory leak)가 발생할 수 있다.
- 메모리 내에 할당한 공간이 계속 사용되고 있어서 메모리 낭비가 발생
4. 스택 영역(stack segment)
- 일시적으로 데이터를 저장하는 공간
- 데이터 영역과 달리 데이터는 일시적으로만 저장된다.
- 지역 변수, 함수 실행이 끝나면 사라지는 매개 변수 등이 있다.
- 일시적으로 저장할 데이터는 스택 영역에 PUSH 하고, 필요하지 않은 데이터는 POP 하여 스택 영역에서 제거
영역별 특징
- 정적 할당 영역: 크기가 고정된 영역으로 영역의 크기가 변하지 않는다.
- 코드 영역과 데이터 영역이 이에 해당됨
- 동적 할당 영역: 프로그램 실행 과정에서 크기가 변할 수 있는 영역이다.
- 힙 영역과 스택 영역이 이에 해당됨
힙 영역과 스택 영역
- 힙 영역은 낮은 주소에서 높은 주소로 메모리가 할당됨
- 스택 영역은 높은 주소에서 낮은 주소로 메모리가 할당됨
- 이를 통해 새롭게 할당하는 주소가 겹치지 않게 처리함
10-2. 프로세스 상태와 계층 구조
프로세스 상태
- 운영체제는 프로세스의 상태를 PCB에 기록하고 관리한다.
- 하나의 프로세스는 여러 상태를 거치며 실행된다.
프로세스 상태 종류
1. 생성 상태(new)
- 프로세스가 생성 중인 상태
- 메모리에 적재돼 PCB 할당을 받은 상태
- 생성 후 준비가 된 프로세스들은 준비 상태가 되어 CPU 할당을 대기함
2. 준비 상태(ready)
- 본인이 실행되기를 기다리고 있는 상태
- 차례가 돼 CPU 할당을 받으면 실행 상태가 됨
- 디스패치(dispatch): 준비 상태인 프로세스가 실행 상태로 전환되는 것을 지칭
3. 실행 상태(running)
- CPU를 할당받아 실행 중인 상태
- CPU가 할당된 시간동안 프로세스는 실행될 수 있다.
- 프로세스가 할당된 시간을 모두 사용하면(타이머 인터럽트가 발생하면) 다시 준비 상태가 된다.
- 실행 도중 입출력장치 작업을 대기하게 된다면 대기 상태가 된다.
4. 대기 상태(blocked)
- 입출력장치의 작업을 기다리는 상태로 입출력이 끝날 때까지 (입출력 인터럽트를 받을 때까지) 대기한다.
- 특정 이벤트가 일어나길 기다리는 경우에도 대기상태가 된다.
- 대기 상태가 끝나면 프로세스는 다시 준비 상태로 돌아가 CPU 할당을 준비한다.
5. 종료 상태(terminated)
- 프로세스가 종료된 상태
- 프로세스가 종료되면 운영체제는 PCB와 프로세스가 사용한 메모리를 정리한다.
프로세스 상태 다이어그램(process state diagram)
- 프로세스의 여러 상태들을 나타낸 도표
- 도표처럼 컴퓨터 내의 프로세스는 생성, 준비, 실행, 대기, 종료 상태를 반복하며 실행된다.
- 운영체제는 PCB에 각 프로세스의 상태들을 기록하고 관리한다.
프로세스의 계층 구조
부모 프로세스와 자식 프로세스
- 프로세스는 실행 중 시스템 호출을 통해 다른 프로세스를 생성할 수 있다.
- 부모 프로세스(parent process): 새 프로세스를 생성한 프로세스
- 자식 프로세스(child process): 부모 프로세스에 의해 생성된 프로세스
- 부모 프로세스와 자식 프로세스는 서로 다른 프로세스이기 때문에 다른 PID를 가진다.
- 자식 프로세스의 부모 프로세스 PID가 기록되기도 한다.
- PPID(Parent PID): 부모 프로세스의 PID
프로세스 계층 구조
- 트리 구조를 띄는 프로세스들의 계층적인 구조를 의미함
- 프로세스들은 부모와 자식 관계의 계층적 구조를 가진다.
- 운영체제들은 프로세스의 계층 구조를 통해 프로세스를 관리한다.
- 컴퓨터 실행 시 최초의 프로세스(PID: 1)가 자식 프로세스들을 생성하고, 다시 자식 프로세스들이 프로세스들을 생성하는 구조로 여러 프로세스들이 실행된다.
최초의 프로세스
- 컴퓨터가 부팅될 때 생기는 프로세스로 PID는 1이다.
- 유닉스 운영체제: init
- 리눅스 운영체제: systemd
- macOS: launchd
- 모든 프로세스의 최상단에 위치한 부모 프로세스다.
- pstree를 통해 프로세스의 계층 구조를 확인할 수 있다 (root가 아니면 실행안되는듯...?).
프로세스 생성 기법
- 프로세스 생성은 fork와 exec을 통해 이루어진다.
- fork: 자신의 복사본을 자식 프로세스로 생성해내는 방법
- exec: 자신의 메모리 공간을 다른 프로그램으로 교체하는 방법
- fork와 exec은 시스템 호출이다.
- 즉, 프로세스를 실행하는 과정은 fork와 exec이 반복되는 과정으로 여러 프로세스는 계층적으로 fork와 exec을 실행함
fork
- fork된 자식 프로세스는 부모 프로세스의 복사본이다.
- 부모 프로세스의 자원(메모리 내용, 열린 파일 목록 등) 등 정보가 복사된다.
exec
- 자식 프로세스는 exec을 통해 새로운 프로그램으로 전환할 수 있다.
- exec은 메모리 공간을 새로운 프로그램으로 덮어쓰는 시스템 호출이다.
10-3. 스레드
프로세스와 스레드
스레드(thread)
- 실행의 단위로 프로세스를 구성하는 실행의 흐름 단위다.
- 하나의 프로세스는 여러 스레드를 가질 수 있다.
- 스레드를 이용해서 하나의 프로세스에서 여러 부분을 동시에 실행할 수 있다.
- 단일 스레드 프로세스: 하나의 실행 흐름(스레드)을 가져, 한번에 한 부분만 실행되는 프로세스
스레드의 특징
- 스레드는 각기 다른 스레드 ID, 프로그램 카운터 값을 포함한 레지스터 값, 스택으로 구성됨
- 따라서 각 스레드는 서로 다른 코드를 동시에 실행할 수 있음
- 스레드는 프로세스의 자원은 공유함
- 즉, 실행에 필요한 최소한의 정보(레지스터, 스택)만 분리한 채 프로세스 자원을 공유하며 실행됨
- 최근에 많은 운영체제는 CPU에 처리할 작업단위를 스레드 단위로 전달함
리눅스에서의 프로세스와 스레드
- 리눅스에서는 프로세스와 스레드를 구분짓지 않음
- 둘 모두 실행의 문맥(context of execution) 관점에서 동등하다고 간주함
- 프로세스와 스레드보다는 태스크(task)라는 이름으로 통일해 명명함
멀티프로세스와 멀티스레드
멀티프로세스와 멀티스레드의 개념
- 멀티프로세스(multiprocess): 여러 프로세스를 동시에 실행하는 것
- 멀티스레드(multithread): 여러 스레드로 프로세스를 동시에 실행하는 것
멀티프로세스와 멀티스레드의 차이
- 프로세스는 프로세스간 자원을 공유하지 않지만, 스레드는 같은 프로세스 내의 자원을 공유한다.
- 멀티프로세스
- 동일 작업을 하는 프로세스의 경우, fork를 통해 모든 자원을 복제해 메모리에 적재한다. 즉, 동일한 프로세스 두 개가 각각 메모리에 적재된다.
- 멀티스레드
- 프로세스가 가진 자원을 공유한다.
- 스레드간 차이는 스레드 ID, 프로그램 카운터를 포함한 레지스터 값, 스택만 차이를 가진다.
멀티프로세스와 멀티스레드의 장단점
멀티프로세스 장점
- 각 프로세스간 독립적이기 때문에 하나의 프로세스에 문제가 생겨도 영향이 적다.
멀티프로세스 단점
- 동일한 프로그램 실행을 위해 메모리에 같은 내용이 중복돼 적재되기 때문에 메모리 낭비로 볼 수 있다.
- 자원을 공유하지 않기 때문에 서로 독립적으로 실행된다.
멀티스레드 장점
- 여러 프로세스를 병행실행하는 것보다 메모리를 효율적으로 사용한다.
- 스레드간 협력과 통신에 유리하다.
멀티스레드 단점
- 스레드간 같은 자원을 공유하기 때문에 하나의 프로세스에서 발생한 문제가 전체 스레드에 영향을 줄 수 있다.
프로세스 간 통신(IPC; Inter-Process Communication)
- 프로세스 간 자원을 공유하고 데이터를 주고 받는 방법
- 파일을 통한 프로세스 간 통신: 여러 프로세스가 동일 파일에 접근할 시, 해당 파일의 데이터를 통해 프로세스 간 통신이 이루어진다는 의미
- 공유 메모리(shared memory): 프로세스간 서로 공유하는 메모리 영역으로 공유 메모리를 통해 프로세스간 데이터를 주고 받는다.
- 이외에도 프로세스들은 소켓, 파이프 등을 통해 통신할 수 있다.
- 단, 스레드에 비해 자원 공유는 까다로울 수 있다.
참고
- [유닉스] fork와 exec - https://blackinkgj.github.io/fork_and_exec/
- C/C++, Python, Java 등 프로그래밍 언어로 프로세스 다루기 - https://github.com/kangtegong/self-learning-cs/tree/main/process
- C/C++, Python, Java 등 프로그래밍 언어로 스레드 다루기 - https://github.com/kangtegong/self-learning-cs/tree/main/thread
주요 Point
- pid와 ppid의 차이(pid는 본인, ppid는 그 프로세스를 실행시킨 프로세스)
반응형
'Study > 컴퓨터공학' 카테고리의 다른 글
[컴퓨터 구조] 혼자 공부하는 컴퓨터구조 + 운영체제 Chapter 12 프로세스 동기화 (2) | 2022.12.09 |
---|---|
[컴퓨터 구조] 혼자 공부하는 컴퓨터구조 + 운영체제 Chapter 11 CPU 스케줄링 (4) | 2022.12.06 |
[컴퓨터 구조] 혼자 공부하는 컴퓨터구조 + 운영체제 Chapter 9 운영체제 시작하기 (0) | 2022.11.25 |
[컴퓨터 구조] 혼자 공부하는 컴퓨터구조 + 운영체제 Chapter 8 입출력장치 (2) | 2022.11.24 |
[컴퓨터 구조] 혼자 공부하는 컴퓨터구조 + 운영체제 Chapter 7 보조기억장치 (0) | 2022.11.20 |