# 프로세스의 개념

이 장에서는 운영체제의 핵심 개념 중 하나인 프로세스에 대해 다룹니다. 프로세스는 실행 중인 프로그램을 의미하며, 프로그램 자체는 디스크에 저장된 명령어와 데이터의 집합입니다. 운영체제는 이 명령어와 데이터를 실행하여 프로그램을 작동시킵니다.

사용자는 여러 프로그램을 동시에 실행하기를 원합니다. 예를 들어, 웹 브라우저, 이메일, 게임, 음악 플레이어 등을 동시에 실행하는 것입니다. 운영체제는 실제로 한정된 CPU를 가지고 있음에도 불구하고, 여러 개의 프로세스가 동시에 실행되는 것처럼 만드는 기술, 즉 CPU 가상화를 통해 이를 가능하게 합니다.

이러한 환상을 만들기 위해, 운영체제는 시분할 방식을 사용하여 한 프로세스를 잠시 실행한 후 다른 프로세스로 전환하는 작업을 반복합니다. 이 과정을 통해, 여러 프로세스가 동시에 실행되는 것처럼 보이게 합니다. 하지만 이 방식은 프로세스마다 성능이 다소 저하될 수 있습니다.

운영체제가 이런 작업을 잘 처리하기 위해서는 저수준의 기술적 방법, 즉 메커니즘과, 어떤 프로세스를 언제 실행시킬지 결정하는 정책이 필요합니다. 메커니즘은 운영체제가 필요한 기능을 구현하는 방법을 말하며, 정책은 운영체제가 어떤 결정을 내리기 위한 규칙이나 알고리즘입니다. 예를 들어, 여러 프로그램이 실행 가능할 때 어느 것을 먼저 실행할지 결정하는 스케줄링 정책이 이에 해당합니다.

이처럼 운영체제는 복잡한 작업을 처리하면서도 사용자에게 편리하고 효율적인 환경을 제공하기 위해 설계되었습니다.

```{admonition} 시분할과 공간분할
시분할은 운영체제가 자원을 효율적으로 공유하는 중요한 방법 중 하나입니다. 여러 사용자나 프로그램이 동시에 자원을 사용하는 것처럼 보이게 하기 위해, 운영체제는 짧은 시간 동안 한 사용자(또는 프로그램)에게 자원을 할당하고, 그 다음 사용자에게 순차적으로 할당하는 방식으로 자원(CPU나 네트워크 링크 등)을 관리합니다. 이와 반대되는 개념으로 공간 분할이 있습니다. 공간 분할에서는 자원의 '공간'을 여러 사용자나 프로그램에게 나누어 줍니다. 디스크가 좋은 예인데, 디스크의 경우 특정 공간(블록)이 한 파일에 할당되면, 그 파일이 삭제되기 전까지 다른 파일이 그 공간을 사용할 가능성이 낮습니다.
```

## 프로세스의 개념[^ParkEunSeongKR]
[^ParkEunSeongKR]: [박은성](https://github.com/ParkEunSeongKR)

운영체제는 실행 중인 프로그램을 프로세스라는 개념으로 제공합니다. 프로세스를 간단하게 표현하면, 실행 중에 접근하거나 영향을 받은 자원의 목록이라고 할 수 있습니다.

프로세스를 이해하려면 하드웨어 상태를 이해해야 합니다. 프로그램은 실행 중에 하드웨어 상태를 읽거나 변경합니다. 이때 가장 중요한 하드웨어 구성 요소는 메모리입니다. 메모리는 명령어와 데이터를 저장합니다. 프로세스가 접근할 수 있는 메모리는 프로세스의 구성 요소입니다.

레지스터도 프로세스의 하드웨어 상태를 구성하는 중요한 요소입니다. 많은 명령어가 레지스터를 직접 읽거나 변경합니다. 따라서 프로세스를 실행하려면 레지스터도 필요합니다.

프로세스의 하드웨어 상태를 구성하는 레지스터 중 특별한 레지스터가 있습니다. 프로그램 카운터(PC)는 실행 중인 명령어를 알려줍니다. PC는 명령어 포인터(IP)라고도 불립니다. 스택 포인터(SP)와 프레임 포인터(FP)는 함수의 변수와 리턴 주소를 저장하는 스택을 관리하는 데 사용됩니다.

프로그램은 영구 저장장치에 접근하기도 합니다. 이 입출력 정보는 프로세스가 현재 열어 놓은 파일 목록으로 표현됩니다.

**핵심 내용:**

* 프로세스는 실행 중인 프로그램의 개념입니다.
* 프로세스는 메모리, 레지스터, 파일 등의 자원을 사용합니다.
* 프로그램 카운터는 실행 중인 명령어를 알려줍니다.
* 스택 포인터와 프레임 포인터는 스택을 관리하는 데 사용됩니다.
* 프로세스는 영구 저장장치에 접근할 수 있습니다.

```{admonition} 정책과 구현의 분리
**핵심 개념:**

* **고수준 정책:** 운영체제가 **무엇을** 해야 하는지 결정하는 규칙
* **저수준 기법:** 운영체제가 **어떻게** 작업을 수행하는지 구현하는 방법

**설계 패러다임:**

* **고수준 정책과 저수준 기법을 분리**

**이점:**

* **정책 변경 용이:** 정책 변경 시 기법 변경 필요 없음
* **모듈성 향상:** 코드 재사용 및 유지 관리 용이
* **확장성 향상:** 새로운 정책 및 기법 추가 용이

**예시:**

* **정책:** 어느 프로세스를 실행할 것인가?
* **기법:** 스케줄링 알고리즘 (예: 라운드 로빈, 우선 순위 기반)

**결론:**

고수준 정책과 저수준 기법 분리는 운영체제 설계의 중요한 패러다임이며, 이는 모듈성, 확장성, 유지 관리 용이성을 향상시킵니다.
```

## 프로세스 API[^Jo-Sehyun]
[^Jo-Sehyun]: [조세현](https://github.com/Jo-Sehyun)

운영체제가 반드시 API로 제공해야 하는 몇몇 기본 기능은 다음과 같습니다. 이 API등은 형태는 다르지만 모든 현대 운영체제에서 제공됩니다.

- 생성(Create): 쉘에 명령어를 입력하거나, 응용 프로그램의 아이콘을 더블 클릭하여 프로그램을 실행시키면, 운영체제는 새로운 프로세스를 생성합니다.
- 제거(Destroy): 많은 프로세스는 실행되고 할 일을 다하면 스스로 종료하지만 스스로 종료하지 않는 경우가 있기 때문에 운영체제는 불필요한 프로세스를 종료시키는 기능을 제공합니다.
- 대기(Wait): 특정 프로세스의 작업이 끝날 때까지 기다려야 할 때가 있어 여러 종류의 대기 인터페이스가 제공됩니다. 이는 다른 프로세스와의 작업을 동기화하거나, 특정 조건이 충족될 때까지 기다리는 데 사용될 수 있습니다.
- 각종 제어(Miscellaneous Control): 프로세스를 일시정지 하거나 다시 시작하는 등의 여러 가지 제어 기능들이 제공됩니다. 이는 프로세스의 동작을 조절하거나 문제를 해결하는데 도움이 됩니다.
- 상태(Status): 프로세스의 현재 상태 정보를 얻어내는 인터페이스도 제공됩니다. 이는 프로세스가 얼마 동안 실행되었는지 또는 프로세스가 어떤 상태에 있는지 등이 포함됩니다.

## 프로세스 생성 : 좀 더 자세하게

## 프로세스 상태

## 자료구조
