-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
10 changed files
with
186 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,186 @@ | ||
--- | ||
title: "[운영체제] 프로세스" | ||
date: 2024-04-06 19:10:00 +0900 | ||
categories: [Computer-Science, OS] | ||
tags: ['OS', '프로세스'] | ||
--- | ||
{% assign img_path = "/assets/img/posts/OS/2024-04-06-process" %} | ||
|
||
|
||
|
||
## 1. 실행파일과 프로세스 | ||
|
||
### 1.1. 실행파일 | ||
|
||
실행파일이란 **OS가 프로세스를 초기 구동하는 데 사용되는 파일**로, Program 이라고 한다. | ||
|
||
- 저장장치에 저장되어 있는 **정적인 상태** | ||
- **Windows**: `.exe` | ||
- **Linux, macOS**: 확장자는 따로 없지만 `ELF`(Executable & Linkable Format) 형식의 파일이다. | ||
- OS는 executable한 파일을 읽어들여 프로그램을 실행한다. | ||
- 파일 헤더 '매직 넘버': MZ(ascii), ELF(ascii), | ||
|
||
### 1.2. 프로세스 | ||
|
||
실행파일(프로그램)이 실행되면 이를 **프로세스(Process)**라고 한다. | ||
|
||
- 실행파일이 메모리에 로딩되어 실행되는 상태 | ||
- 프로그램들은 메모리에 올라가야만 실행될 수 있음(프로그램 → 프로세스) | ||
|
||
### 1.3. 프로세스 개념 | ||
|
||
프로세스 개념 및 정의는 교재마다 상이하다. 프로세스의 다양한 표현은 아래와 같다. | ||
|
||
- 주기억 장치에 상주된 프로그램이 CPU에 의해 처리되는 상태 | ||
- CPU에 의해 현재 실행되고 있는 프로그램 | ||
- 실행을 위해 메모리에 올라온 동적인 상태 | ||
- **PCB(Process Control Block, 프로세스 제어 블록)의 존재로서 명시되는 것** | ||
- 프로세스가 할당되는 개체로서, Dispatch가 가능한 단위 | ||
- 비동기적 행위를 일으키는 주체 | ||
- CPU가 할당되는 실체 | ||
- OS가 관리하는 최소 단위 작업 | ||
- task란 용어와 함께 사용되며, 다양한 정의 가짐 | ||
- 프로그램과 달리 메모리에 주소 공간 갖는 능동적인 객체 | ||
|
||
|
||
|
||
## 2. 프로그램의 실행 | ||
|
||
### 2.1. 다중 프로그래밍 | ||
|
||
여러 프로그램을 동시에 실행하는 것으로, 여러 프로세스들이 **메모리에 동시에 있을 수 있기 때문**에 가능하다. | ||
|
||
- 프로세스들은 상호 독립적인 메모리 공간에서 실행된다. | ||
|
||
![다중 프로그래밍]({{ img_path }}/2.1. 다중 프로그래밍.png){: width='500'} | ||
|
||
### 2.2. 다중 인스턴스(Multi-instance) | ||
|
||
같은 프로그램을 여러 개 실행할 수 있다. **실행될 때마다 독립된 프로세스가 생성**된다. | ||
|
||
- 각 프로세스는 독립된 메모리 공간을 가진다. | ||
- 모두 별개의 프로세스로 취급된다. | ||
|
||
![다중 인스턴스]({{ img_path }}/2.2. 다중 인스턴스.png){: width='500'} | ||
|
||
### 2.3. Loading | ||
|
||
- **Loading(로딩)**: 실행파일이 메모리에 올라가는 과정 | ||
- **Loader(로더)**: 메모리에 Load(적재)해 주는 것 | ||
|
||
![Loading]({{ img_path }}/2.3. Loading.png){: width='500'} | ||
|
||
- **절대 로더(Absolute loader)** | ||
- 항상 고정된 위치에만 로딩됨 | ||
- 재배치/링킹 없음 | ||
- 다중 프로그래밍 X | ||
|
||
- **재배치 로더(Relocation loader)** | ||
- 주기억 장치 상태에 따라 목적 프로그램을 주기억 장치 임의공간에 적재 | ||
- 프로그램이 여러 개 실행되다 보면, **메모리 위치상에 충돌이 있을 수도 있음** | ||
- **동적 적재(Dynamic loading)** | ||
- 필요 부분만 주기억장치에 적재, 나머지 보조기억장치에 저장 | ||
|
||
|
||
|
||
## 3. 프로세스 생명 주기 | ||
|
||
프로세스는 생성부터 종료까지 여러 상태로 바뀌면서 실행된다. → **State Change** | ||
|
||
![프로세스 생명 주기]({{ img_path }}/3. 프로세스 생명 주기.png) | ||
|
||
![프로세스 생명 주기 2]({{ img_path }}/3. 프로세스 생명 주기 2.png){: width='500'} | ||
_간단한 버전_ | ||
|
||
### 3.1. 프로세스 상태 정리 | ||
|
||
| 상태 | 설명 | 작업 | | ||
| --------- | ---- | ---- | | ||
| 생성 상태 | 프로그램을 메모리에 가져와 **실행 준비가 완료**된 상태 | 메모리 할당, PCB 생성 | | ||
| 준비 상태 | 실행 기다리는 모든 프로세스가 **자기 차례 기다리는** 상태<br>실행될 프로세스를 CPU 스케줄러가 선택| **dispatch(PID)**: 준비 → 실행 | | ||
| 실행 상태 | 선택된 프로세스가 time slice 얻어 **CPU 사용**하는 상태<br>프로세스 사이의 **문맥 교환** 발생 | **timeout(PID)**: 실행 → 준비<br>**exit(PID)**: 실행 → 완료<br>**block(PID)**: 실행 → 대기 | | ||
| 대기 상태 | 실행 상태 프로세스가 I/O 요청시 **I/O 완료될 때까지 기다리는** 상태<br>I/O 완료시 준비 상태로 감 | **wakeup(PID)**: 대기 → 준비 | | ||
| 완료 상태 | **프로세스 종료**된 상태<br>사용 중이던 모든 데이터 정리됨<br>exit(정상 종료), abort(비정상 종료) 모두 포함 | 메모리 삭제, 프로세스 제어 블록 삭제 | | ||
|
||
### 3.2. 보류 상태 | ||
|
||
- 프로세스가 어떤 이유로 인해 **실행 미뤄지고**, 메모리에서 쫓겨난 상태 | ||
|
||
> 메모리에서 쫓겨났다는 것은, **프로그램이 저장장치에 놓여졌다**는 것이다. | ||
{: .prompt-info} | ||
|
||
- 보류 상태로 진입하는 이유 | ||
- 메모리 용량 초과 | ||
- 프로그램 오류 | ||
- Malware라서 격리 | ||
- 매우 긴 주기로 실행됨 | ||
- IO에 지연 있을 경우 | ||
- 예시: 업데이트 소프트웨어 | ||
|
||
![보류 상태]({{ img_path }}/3.2. 보류 상태.png){: width='500'} | ||
|
||
|
||
|
||
## 4. PCB: Process Control Block | ||
|
||
### 4.1. 프로세스 관리 | ||
|
||
프로세스는 생성부터 종료까지 **모두 커널(OS)에 의해 관리**됨 | ||
- 프로세스 생명 주기: 생성, 실행, 중단, 일지 중단, 재개 | ||
- 프로세스 정보(Metadata) 관리 | ||
- 프로세스 통신, 동기화 | ||
- 문맥 교환(Context switching) | ||
|
||
OS는 프로세스를 제어하기 위해 상태 정보 일정한 자료 구조로 저장하는데, 이를 **PCB(Process Control Block)**라 한다. | ||
- 프로세스마다 고유의 PCB가 생성된다. | ||
|
||
![프로세스 관리]({{ img_path }}/4.1. 프로세스 관리.png){: width='400'} | ||
|
||
### 4.2. PCB 구조 | ||
|
||
- OS는 PCB를 **PCB table(Process table)**이라는 곳을 통해 관리함 | ||
- OS마다 구조가 전부 다르다. | ||
|
||
![PCB 구조]({{ img_path }}/4.2. PCB 구조.png){: width='650'} | ||
|
||
- PCB에 저장된 이러한 정보들을 **프로세스의 Context**라고도 부른다. | ||
|
||
|
||
|
||
## 5. 시분할 (Time-slicing) | ||
|
||
- 여러개의 프로세스를 동시에 처리하는 방법 | ||
- 프로세스들에게 **번갈아가며 CPU를 사용하게 하는 방법** | ||
- 진짜로 동시에 실행되는 건 X | ||
- **'번갈아가는 것'**에서 파생되는 문제들 | ||
- 어떻게 번갈아가는 것인가? → **Context Switching** | ||
- 어떤 순서로 번갈아가는 것인가? → **스케쥴링 문제** | ||
|
||
|
||
|
||
## 6. 문맥 교환(Context Switching) | ||
|
||
- 한 프로세스에서 다른 프로세스로 CPU를 넘겨주는 과정 | ||
- 실행 상태에서 **나가는 프로세스**의 PCB에는 **지금까지의 작업 내용 저장** | ||
- 실행 상태로 **들어오는 프로세스**의 PCB의 내용으로 **CPU가 세팅**됨 | ||
|
||
![문맥 교환]({{ img_path }}/6. 문맥 교환.png){: width='500'} | ||
|
||
|
||
|
||
## 7. 고민해볼 문제들 | ||
|
||
프로그램은 로더를 통해 메모리에 적재되어야 하며, 적재된 것을 프로세스라 부른다. 이 과정에서여러 가지 고민해볼 문제들이 파생된다. | ||
|
||
- 로더는 누가 실행하는 것일까? | ||
- 메모리 어디에 로딩하며, 어떻게 로딩하는 것인가? | ||
- **Allocation 문제** | ||
- 프로그램의 크기가 메우 크면? | ||
- **가상 메모리, Paging** | ||
- Context Switching이 Suspend에 걸쳐 이루어지면? | ||
- **Swapping, 단편화 문제** | ||
- 어떤 프로세스가 다른 프로세스 메모리 영역을 침범한다면? | ||
- **보안 문제** | ||
|
||
|
||
이 문제들은 OS를 더 공부하면서 하나씩 알아 볼 것이다. |
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.