본문 바로가기

OS/운영체제론

[운영체제론] 프로세스 개념 / 2021.10.03

* 참고 자료 : 운영체제론 한빛아카데미

 

컴퓨터는 많은 시스템이 동시에 여러 기능을 수행할 수 있다.

예를 들어, 프로그램을 컴파일하고, 파일을 프린터에 보내고, 웹 페이지를 화면에 보여주면서 동시에 이 메일을 받고 영상을 볼 수도 있다.

프로세스는 오늘날 컴퓨터 시스템의 동작 원리와 동시에 수행되는 많은 활동을 관리하는 방법을 이해하는 데 필요한 핵심 개념이다. 

운영체제는 프로세스의 생성, 종료, 일시 정지, 재시작, 깨우기 등을 수행한다.

 

1. 프로세스 정의

먼저, 프로세스는 자신의 메모리(주소) 공간을 가지고 있는 개체이다. 메모리(주소) 공간은 대개 텍스트 영역, 데이터 영역, 스택 영역으로 구성된다.

 

- 텍스트 영역 : 프로세서가 실행하는 코드를 저장하는 영역

- 데이터 영역 : 변수들을 저장하는 영역과 프로세스가 실행 중에 사용하려고 동적으로 할당받은 메모리 공간

- 스택 영역 : 호출된 프로시저용으로 지역 변수와 명령어들을 저장하는 공간

 

다음으로, 프로세스는 '실행 중인 프로그램'이다. 여기서 실행 중인 프로그램을 '활성 개체'라고 한다.

 

프로세스 : 실행 중인 프로그램 (활성 개체)
프로그램 : 활성화되지 않은 개체

 

2. 프로세스 상태 : 프로세스 생명 주기

프로세스는 생명 주기 동안 구분된 프로세스 상태들을 거친다. 다양한 이벤트를 만날 때, 프로세스의 상태가 바뀐다.

- 실행 상태 : 프로세스가 프로세서에서 실행 중

- 준비 상태 : 프로세스가 프로세서에서 실행가능한 상태

- 블록 상태 : 프로세스가 작업을 진행하기에 앞서 특정 이벤트의 발생을 대기

 

운영체제는 준비 상태 프로세스들을 담은 준비 리스트나 블록 상태 프로세스들을 담은 블록 리스트를 보유할 수 있다.

- 준비 리스트 : 우선순위 정보를 포함. 리스트에서 우선순위가 가장 높은 첫 번째 프로세스가 프로세서를 할당받는다.

- 블록 리스트 : 블록 리스트는 순서가 없다. 따라서 블록된 프로세스가 기다리는 이벤트가 발생하는 순서로 블록킹이 해제 된다.

 

1. (참/거짓) 특정 시간에 컴퓨터에서 오직 한 프로세스만 실행 할 수 있다.
답 : 거짓. 멀티프로세서 컴퓨터에서는 프로세서 수만큼 프로세스를 동시에 실행할 수 있다.
2. 프로세스는 이벤트 발생을 대기할 때 블록 상태에 들어간다. 프로세스가 블록 상태에 들어갈 만한 몇 가지 이벤트를 나열하라.
답 : 프로세스가 하드 디스크 처럼 지연 시간이 긴 위치에 있는 데이터를 요청하거나 다른 프로세스에 할당되어 현재 사용이 불가능한 자원을 요청하는 경우 블록 상태에 들어간다. 프로세스는 사용자가 키보드를 누르거나 마우스를 움직이는 등의 이벤트가 발생할 때도 블록될 수 있다.

 

3. 프로세스 관리

(1) 프로세스 상태

- 디스패칭 : 준비 리스트에 있는 첫 번째 프로세스에 프로세서를 할당하는 것으로 디스패처라는 시스템 개체가 수행한다.

- 인터럽팅 클록 운용 : 각 프로세스는 각기 주어진 시간 동안만 실행할 수 있게 한다. 한 프로세스가 시스템의 프로세서를 독점하는 일을 방지한다.

 

(2) 프로세스 상태 전이

프로세스에는 네 가지의 상태 전이가 있다.

- 실행 상태로 전이 : 프로세서를 할당 받으면 준비상태에서 실행 상태로 전이 된다.

- 실행 상태에서 준비 상태로 전이 : 할당 받은 시간이 만료되면 실행 상태에서 준비 상태로 전이 된다.

- 블록 상태로 전이 : 프로세스가 블록 되면 실행 상태에서 블록 상태로 전이된다.

- 대기 상태에서 준비 상태로 전이 : 대기하던 이벤트가 완료되면 프로세스가 깨어나고 블록 상태에서 준비 상태로 전이된다.

 

프로세스 상태 전이

 

1. 운영체제는 한 프로세스가 프로세서를 독점하는 것을 어떻게 방지하는가?
답 : 인터럽팅 클록은 특정 시간 간격 후에 인터럽트를 생성하고, 운영체제는 다른 프로세스가 실행하도록 프로세서를 할당한다.
2. 깨어 있는 프로세스와 잠들어 있는 프로세스의 차이점은 무엇인가?
답 : 깨어 있는 프로세스는 프로세서를 얻으려고 활발하게 경쟁한다. 잠들어 있는 프로세스는 프로세서가 작업을 쉬고 있다 해도 사용할 수 없다.

 

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

프로세스 기술자라고도 부른다. 프로세스 제어 블록은 운영체제가 생성한 프로세스를 관리하는데 필요한 정보를 보관한다. PCB는 대체로 다음과 같은 정보를 포함한다.

- PID (프로세스 식별 번호)

- 프로세스 상태

- 프로그램 카운터

- 스케쥴링 우선순위

- 권한 (프로세스가 접근할 수 있는 권한)

- 프로세스의 부모 프로세스

- 프로세스의 자식 프로세스

- 프로세스의 데이터와 명령어가 있는 메모리 위치를 가리키는 포인터

- 프로세스에 할당된 자원들을 가리키는 포인터

 

(4) 프로세스 테이블

운영체제는 프로세스가 상태 전이를 할 때 해당 프로세스의 PCB안에 있는 상태 정보도 갱신해야 한다. 운영체제는 각 프로세스의 PCB를 가리키는 포인터를 시스템 전체 혹은 사용자별 프로세스 테이블에 유지해 PCB에 빠르게 접근할 수 있다. 프로세스가 종료하면, 운영체제는 프로세스의 메모리와 기타 자원을 해제 하고 프로세스 테이블에서 해당 프로세스를 제거한다.

 

(5) 프로세스 연산

운영체제는 다음을 포함하는 프로세스 연산을 수행할 수 있어야 한다.

- 프로세스 생성

- 프로세스 소멸

- 프로세스 일시 정지

- 프로세스 재시작

- 프로세스의 우선순위 변경

- 프로세스 블록킹

- 프로세스 깨우기

- 프로세스 디스패치

- 프로세스 간 통신 (IPC)

 

(6) 프로세스의 생성과 소멸

프로세스는 새로운 프로세스를 생성할 수 있다. 이떄 프로세스를 생성하는 프로세스를 부모 프로세스라고 하고, 생성된 프로세스를 자식 프로세스라고한다. 각 자식 프로세스는 정확히 한 부모 프로세스를 통해 생성된다.

프로세스가 자식 프로세스를 생성한 경우에는 프로세스를 소멸하는 과정이 더 복잡해진다. 몇몇 운영체제에서는 부모 프로세스가 소멸될 때 자동으로 자식 프로세스들도 소멸한다. 또 다른 운영체제들은 자식 프로세스가 부모에 독립적으로 계속 실행되어, 부모 프로세스의 소멸이 자식에 영향을 미치지 않는다.

 

프로세스 생성 계층

(7) 일시 정지와 재시작

많은 운영체제에서 관리자, 사옹자, 프로세스들이 프로세스를 일시적으로 정지할 수 있게 허용한다.

- 일시 정지 : 악성 코드 실행과 같은 보안 위협 요인을 추적하거나 디버깅할 때 유용하다. 일시정지 프로세스는 아직 소멸되지는 않고 프로세서를 차지하려고 하는 경쟁 대열에서 무기한으로 배제된다. 해당 프로세스 또는 다른 프로세스가 일시 정지 시킬수있다.

- 재시작 : 일시 정지 준비 상태 프로세스는 다른 프로세스에 의해 준비 상태로 변할(재시작) 수 있다.

 

일시 정지와 재시작을 포함한 프로세스 상태 전이도

 

- 일시 정지 준비 : 준비 상태에서 일시 정지

- 일시 정지 블록 : 블록 상태에서 일시 정지

블록 상태 프로세스를 일시 정지 하기보다, 이벤트 완료 시까지 대기했다가 준비상태가 되는 것이 낫다고 생각할 수 있다. 그러면 프로세스는 일시 정지 준비 상태가 된다.

 

1. 프로세스가 일시 정지 준비 상태가 될 수 있는 세 가지 경우는 무엇인가?
답 : 실행 상태에서 일시 정지될 때, 준비 상테에서 다른 실행 프로세스에 의해 일시 정지될 때, 프로세스가 일시 정지 블록 상태에 있을 때 입출력완료난 기다리던 이벤트가 완료되면 일시 정지 준비 상태가 된다.

2. 어떤 경우에 프로세스를 중지하는 것보다 일시 정지하는 것이 좋은가?
답 : 사용자나 시스템 운영자가 볼 때 프로세스가 이상하게 작동한다고 의심이 들지만 이제까지 한 작업을 잃지 않고 싶을 때, 해당 프로세스를 일시 정지해 면밀히 조사하는 것이 좋다.

 

(8) 문맥 교환

운영체제는 실행 중인 프로세스를 멈추고 준비 상태에 있던 다른 프로세스를 실행할 때, 문맥교환을 수행한다. 문맥 교환을 위해서 커널은 먼저 실행 중인 프로세스의 실행 문맥을 해당 프로세스의 PCB에 저장한 후 이후 실행할 준비 상태 프로세스의 이전 실행 문맥을 PCB에서 읽어 로드한다.

문맥 교환은 기본적으로 프로세스에 투명해야한다. 또한 문맥 교환이 일어나는 동안 프로세서는 의미 있는 작업을 수행할 수없다. 따라서 운영체제는 문맥 교환에 드는 시간을 최소화해야한다.

 

4. 인터럽트

- 인터럽트 제어기 : 여러 다른 소스로 부터 오는 인터럽트 요구를 처리한다.

- 인터럽트 처리기 : 인터럽트가 발생할 때 실행하는 루틴

 

(1) 인터럽트 발생

- 프로세서는 프로세스의 명령어를 실행한 결과로 인터럽트를 발생시킬 수 있다. 이는 프로세스의 동작에 동기라고 말한다. 예) 0을 나누거나 보호되는 메모리 위치를 참조하려고 하는 경우

- 프로세스의 현재 명령어와 관련 없는 이벤트에 의해서 인터럽트를 발생시킬 수 있다. 이는 프로세스의 동작에 비동기라고 말한다. 예) 사용자가 키보드를 누르거나 마우스를 움직이는 경우

 

(2) 폴링

인터럽트의 대안으로, 프로세서가 각 장치의 상태를 반복적으로 확인하는 방법이 있는데 이러한 접근법을 폴링이라고 하며 컴퓨터 시스템의 복잡도가 증가할수록 오버헤드가 증가한다.

 

(3) 인터럽트 처리과정

1) 프로세서의 인터럽트 라인이 활성화

2) 프로세서, 현재 진행 중인 명령어 실행이 완료되면 프로세스의 실행을 멈춤

3) 인터럽트 컨트롤러, 우선순위에 맞게 인터럽트 처리하여 제어를 적절한 인터럽트 처리기에 넘김

( 각 유형의 인터럽트는 '인터럽트 벡터'의 인덱스로 사용하는 유일한 값을 부여 받음. '인터럽트 벡터'는 인터럽트 처리기를 가리키는 포인터 배열)

4) 인터럽트 유형에 따라 수행

5) 인터럽트 처리기 완료 후, 인터럽트 된 프로세스의 상태(또는 커널이 문맥교환을 시작 했을 경우, 다음 프로세스)복구

6) 인터럽트 된 프로세스(또는 다른 프로세스) 실행

 

(4) 인터럽트 클래스

컴퓨터가 지원하는 인터럽트 클래스는 시스템 아키텍처에 따라 상이하다.

- IA-32 규격 :

프로세서가 받을 수 있는 신호는 인터럽트, 예외 두가지이다.

인터럽트 : 이벤트 발생, 외부장치의 상태 변경을 알림. IA-32는 '소프트웨어 생성 인터럽트'를 제공하고, 장치는 이를 이용해 시스템을 호출

예외 : 하드웨어나 소프트웨어 명령어 실행 시 발생된 오류를 알림. 폴트, 트랩, 중단으로 분류

 

5. 프로세스 간 통신

많은 운영체제에서 프로세스 간 통신 메커니즘을 제공한다. 예를 들면, 텍스트 에디터가 문서를 프린터 스풀러에 보낼 수 있게 하거나 웹 브라우저가 원격 서버에서 데이터를 조회할 수 있게한다. 또한 프로세스간 통신은 공통의 목적을 달성하려고 서로 협력 즉 동기화 해야하는 프로세스들에 필수적이다.

 

(1) 신호 

신호란 프로세스에 이벤트가 발생했음을 알리는 소프트웨어 인터럽트이다. 교환할 데이터를 명시하지 않는다.

- 신호에 대한 처리 :

운영체제가 해당 신호를 받을 프로세스와 해당 프로세스가 신호에 반응할 방법을 결정한다.

프로세스는 인터럽트가 발생할 때, 운영체제가 호출하는 루틴을 통해 신호를 잡는다. 중단은 프로세스 종료, 덤프는 종료전에 core파일을 만듦, 무시는 그냥 무시한다는 것을 뜻한다.

 

(2) 메시지 전달 

메시지 송수신에 이용되는 함수로는 send(receiveProcess, message), receive(sendProcess, message)가 있다.

- 송신 

블록킹 송신 : 수신자가 메시지를 수신할 때까지 기다려야 하고, 수신자가 메시지를 수신하면 이 사실을 송신자에게 알려주도록 요구한다.

넌블록킹 송신 : 송신자가 수신자로부터 받지 않았을때도 다른 작업을 계속할 수 있는 전송방식이다. 이를 위해서는 수신자가 메시지를 모두 수신할 때까지 메시지를 보유할 수 있는 메시지 버퍼링 매커니즘이 필요하다.

예) 프린터 서버에 송신

 

- 수신 

블록킹 수신 : 수신자가 메시지가 수신될 때까지 대기한다.

넌블록킹 수신 : 메시지가 수신되지 않아도 다른 작업을 계속할 수 있다.

 

- 파이프

파이프는 운영체제에서 보호하는 메모리 영역으로, 버퍼 역할을 해 프로세스 둘 이상이 데이터를 교환할 수 있게 해준다. 운영체제는 버퍼에대한 파이프 접근을 동기화 한다.

 

- 분산 시스템에서 IPC

분산 시스템에서는 전송에 오류가 생기거나 심지어 데이터를 잃어버릴 수도 있다. 그러므로 승인, 타임아웃 메커니즘을 사용한다. 송신자는 타임아웃이 되도록 승인이 도착하지 않으면 메시지를 재전송할 수 있다. 

분산 시스템에서 메시지 전달이 복잡한 이유 중 하나는 특정 프로세스를 명시한 메시지를 송수신할 때 올바른 프로세스를 대상으로 명시적인 send/receive 호출을 하도록 모호하지 않은 프로세스 이름을 지어야한다는 점이다. 이에 대한 대안은 각 컴퓨터에서 자신의 프로세스들이 유일한 프로세스 이름을 갖게하는것이다. 

 

1. 분산 시스템들이 신호 대신 메시지 교환에 의존하는 이유는 무엇인가?
답 : 신호는 대체로 아키텍처에 종속적이다. 즉 한 컴퓨터에서 지원하는 신호들은 다른 컴퓨터에서 지원하는 신호들과 호환되지 않을 수도 있다. 또한 신호들은 대부분의 분산 시스템에 필요한 기능인 '프로세스의 데이터 전송'을 지원하지 않는다.
2. 프로세스가 블록킹 송신을 할 때는 승인 메시지를 받아야 블록 해제 할 수 있다.이러한 구조에서는 어떤 문제가 발생할 수 있는가? 또 이런 문제를 어떻게 피할 수 있는가?
답 : 송신자는 승인 메시지를 받지 못할 수도 있다. 이 경우 프로세스가 무기한으로 블록될 수 있다. 이 문제는 타임아웃 메커니즘을 이용해 해결할 수 있다. 만약 송신자가 일정 시간안에 승인 메시지를 받지 못하면 송신에 실패한 것으로 보고 재전송을 시도한다.

 

6. 유닉스 프로세스

유닉스는 가상 메모리를 구현하므로 모든 유닉스 프로세스는 가상 주소 공간이라는 일련의 메모리 주소를 제공받는다. 커널은 프로세스의 PCB를 사용자 프로세스가 접근할 수 없는 보호된 메모리 영역에 유지한다. 유닉스 시스템에서의 PCB는 프로세서 레지스터 내용, 프로세스 식별자, 프로그램 카운터, 시스템 스택 등의 정보를 저장한다.

모든 프로세서의 PCB는 프로세스 테이블에 리스트되고, 이 때문에 운영체제가 모든 프로세스의 정보에 접근할 수 있다.

유닉스 프로세스들은 시스템 호출을 통해 운영체제와 상호 작용한다. fork시스템 호출을 통해 자식 프로세스를 생성할 수 있다. 자식 프로세스는 부모 프로세스의 자원들의 사본을 받는다.

유닉스 프로세스 우선순위는 -20~19사이의 정수로 낮은 숫자가 높은 우선 순위를 의미한다.