5 프로세스 관리
5. 프로세스 관리
1. 프로세스의 개념
- 프로세스란 실행중인 프로그램을 뜻한다.
- 프로세스는 CPU를 획득해 자신의 코드를 수행하거나, CPU를 반환하고 입출력작업을 수행
- 현대의 운영체제는 여러 프로세스가 함께 수행되는 시분할 시스템이다. 따라서 타이머 인터럽트에 의해 짧은 시간 동안 CPU를 사용한 후 빼앗기는 상황이 반복되기에 이전에 어느 명령까지 수행했는지 정확한 상태를 재현할 필요가 있다 -> 프로세스 문맥
- 프로세스 문맥
- 하드웨어 문맥: CPU의 수행 상태를 나타냄. 프로그램 카운터값과 각종 레지스터에 저장하고 있는 값을 의미
- 프로세스 주소 공간: 코드, 데이터, 스택으로 이루어진 독자적인 주소 공간
- 커널상의 문맥: 운영체제는 프로세스를 관리하기 위해 자료구조를 유지함. PCB(프로세스 제어 블록)와 커널 스택이 이에 해당한다
2. 프로세스의 상태
- 실행(running): 프로세스가 CPU를 보유하고 기계어 명령을 실행하고 있는 상태
- 준비(ready): 프로세스가 CPU만 보유하면 당장 명령을 실행할 수 있지만 CPU를 할당받지 못한 상태
- 봉쇄(blocked): CPU를 할당받더라도 당장 명령을 실행할 수 없는 상태(ex_ 프로세스가 요청한 입출력작업이 진행중인 경우)
- 일시적 상태
- 시작: 프로세스가 시작되어 그 프로세스를 위한 각종 자료구조는 생성되었지만 메모리 획득을 승인받지 못한 상태
- 완료: 프로세스가 종료되었으나 운영체제가 그 프로세스와 관련된 자료구조를 완전히 정리하지 못한 상태
- 문맥 교환(context switch):
- 실행시킬 프로세스를 변경하기 위해 원래 수행 중이던 프로세스의 문맥을 저장하고 새로운 프로세스의 문맥을 세팅하는 과정.
- 문맥교환은 타이머 인터럽트가 발생하는 경우 및 실행 상태에 있던 프로세스가 입출력 요청 등으로 봉쇄 상태로 바뀌는 경우가 있음. 이때 준비상태에 있는 프로세스들 중에서 CPU를 할당받을 프로세스를 선택한 후 실제로 CPU의 제어권을 넘겨받는 과정을 CPU 디스패치라고 한다.
** 입출력을 요청한 프로세스의 상태변화 예시 **
실행 상태의 프로세스가 디스크에서 파일의 내용을 읽어오는 작업 실행
디스크에서 읽는 작업은 CPU 처리 속도에 비해 상대적으로 오랜 시간이 소요되기 때문에 완료가 될때까지 CPU를 반환한 다음 디스크 입출력 서비스를 기다리며 봉쇄상태로 변경
CPU스케줄러가 준비상태의 프로세스들 중에서 적절히 하나를 택해 CPU 할당하여 실행 상태로 변경
입출력을 요청한 프로세스는 디스크 입출력을 기다리는 큐에 서있다가 차례가 되어 디스크 컨트롤러로부터 서비스를 받고나면 디스크 컨트롤러가 CPU에게 인터럽트 발생
CPU가 해당 인터럽트에 대한 루틴을 수행하는 동안 CPU에서 실행되던 프로세스의 상태는 사용자모드에서 커널모드로 변경 (처리루틴과 관련이 없더라도 편의상 직전 프로세스의 문맥에서 실행된 것으로 간주하여 인터럽트를 당한 프로세스가 커널모드로 진입한 것으로 간주)
디스크 컨트롤러가 발생시킨 인터럽트는 입출력이 완료된 프로세스의 상태를 봉쇄상태에서 준비상태로 바꿈.
3. 프로세스 제어블록(Process Control Block)
-
프로세스마다 유지하는 정보들을 담는 커널 내의 자료구조.
-
PCB 요소
- 프로세스의 상태: CPU를 할당해도 되는지 여부를 결정하기 위해 필요
- 프로그램 카운터 값: 다음에 수행할 명령의 위치 (메모리 주소)
- CPU 레지스터 값: CPU 연산을 위해 레지스터에 어떤 값을 저장하고 있는지
- CPU 스케줄링 정보: CPU 스케줄링을 위해 필요한 정보
- 메모리 관리 정보: 메모리 할당을 위해 필요한 정보
- 자원 사용 정보: 사용자에게 자원 사용 요금을 계산해 청구하는 등의 용도
4. 문맥 교환 (context switch)
- 프로세스에서 다른 프로세스로 CPU 제어권이 이양 되는 과정
- 타이머 인터럽트나 시스템콜 발생으로 프로세스 A -> 프로세스 B 로 CPU 제어권이 이양 될 때 이루어진다.
- 사용자 모드(프로세스 A) -> 커널 모드(시스템콜) -> 사용자 모드(프로세스 A) 는 똑같이 PCB를 이용하더라도 문맥 교환이 아니다
- 일종의 overhead로 CPU 할당 시간을 적게 세팅하면 문맥교환의 비용이 크다. CPU 할당 시간을 길게 세팅하면 시분할 시스템의 의미가 퇴색된다. (타이머)
5. 프로세스를 스케줄링하기 위한 큐
- 준비 큐(ready queue)
- 운영체제가 준비 상태에 있는 프로세스들을 줄세우기 위한 큐
- 장치 큐(device queue)
- 운영체제가 특정 자원을 기다리는 프로세스들을 줄세우기 위한 큐 자원마다 하나 씩 존재한다.
- ex) 프로세스가 CPU를 할당받고 코드를 수행하다 입출력 요청이 발생하면 해당 장치 큐에 가서 줄을 섬. 장치 큐에 속한 프로세스들은 봉쇄상태에 있다가 해당 장치의 서비스를 받고 나서 장치 컨트롤러가 인터럽트를 발생시키면 준비상태로 바뀌어 준비큐로 이동한다.
- 소프트 웨어 자원 큐
- 공유데이터 같은 소프트웨어 자원 사용을 기다리는 프로세스들을 줄세우기 위한 큐 (공유데이터 동시 접근 시 데이터 일관성이 깨질 수 있다)
- 작업큐(job queue)
- 모든 프로세스를 관리하는 큐. 가장 넓은 개념. 준비 큐와 장치 큐에 있는 프로세스들이 모두 속해있다.
** 큐는 각 프로세스의 PCB를 연결 리스트 형태로 관리.
6. 스케줄러
-
어떤 프로세스에게 자원을 할당할지 결정하는 운영체제 커널의 코드
- 장기 스케줄러(작업 스케줄러)
- 어떤 프로세스를 준비 큐에 진입시킬지 결정. 메모리 할당에도 관여
- 단기 스케줄러
- 준비 상태 프로세스 중 어떤 프로세스를 다음에 실행 시킬지 결정 밀리초 단위로 빈번하게 호출
- 타이머 인터럽트 발생 시 단기 스케줄러가 관여
- 중기 스케줄러
- 너무 많은 프로세스에게 메모리를 할당해 성능이 저하되는 경우, 프로세스 수를 조절
- 메모리를 통째로 빼앗아 디스크 영역으로 내린다(스왑 아웃). 0순위 프로세스는 봉쇄 상태 프로세스들이다.
- 그 다음은 타이머 인터럽트가 발생해 준비 큐로 이동하는 프로세스들을 스왑아웃 시킨다. 준비 큐에 프로세스가 많으면 다시 할당 받기위해 순서가 돌아오기까지 오랜시간 걸리기 때문이다.
-
중지상태의 프로세스
-
중지준비 상태(suspended ready): 준비상태의 프로세스가 중기스케줄러에 의해 디스크로 스왑 아웃된 것.
-
중지봉쇄 상태(suspended block): 봉쇄상태의 프로세스가 중기스케줄러에 의해 디스크로 스왑 아웃된 것.
-
중지봉쇄 상태이던 프로세스가 봉쇄되었던 조건을 만족하게 되면 이 프로세스는 중지준비 상태로 바뀐다 중지 상태의 프로세스들은 중지준비/중지봉쇄 관계없이 메모리를 조금도 보유하지 않고 디스크에 통째로 스왑 아웃된 상태로 존재하게 됨.
7. 프로세스의 생성
- 프로세스의 생성: 부모 프로세스가 자식 프로세스를 만든다. 최초의 프로세스는 운영체제가 직접 생성한다.
-
프로세스의 소멸: 부모 프로세스가 종료되기 위해서 자식 프로세스가 먼저 종료되어야 한다.
- 프로세스 자원
- 운영체제로부터 직접 할당
- 부모 프로세스의 자원 공유
- 프로세스 주소 공간
- 자식 프로세스는 별도의 주소 공간을 가진다. 부모 프로세스의 주소 공간 내용을 그대로 복사
- 자식 프로그램이 다른 프로그램 수행 시 생성된 주소 공간 위에 새로운 프로그램 주소공간을 덮어씌운다 (exec();).
- 종료 방법
- 자벌적 종료: 프로세스가 마지막 명령을 수행한 후 운영체제에 요청(exit();)
- 비 자발적 종료: 부모프로세스가 자식프로세스 강제 종료.(abort();)
- 자원 요구 한계치 초과
- 수행 도중 자식 프로세스가 필요 없어진 경우
- 부모 프로세스가 종료되는 경우
부모 프로세스가 종료되어도 실행되어야 하는 경우. 시스템 프로세스의 자식으로 이양 시킨다.
-
자식프로세스 생성 과정
- fork() 시스템콜 : 프로세스 복제 생성. 주소공간, 프로그램 카운터, 레지스터 상태, PCB 및 커널스택 등 복사 유일한 차이는 프로세스 식별자와 fork()반환 값이다. 부모는 양수 자식은 0. 반환 값으로 분기
- exec() 시스템콜 : 프로세스가 지금까지 수행했던 상태를 잊고, 완전히 새로운 프로그램으로 주소공간을 덮어씌움 즉 새로운 프로그램을 수행시키려면 fork() 후 생성된 프로세스에 exec()를 하면 된다.
** 번외 wait() 시스템 콜은 fork() 후 자식 프로세스가 종료될 때까지 부모 프로세스가 기다리도록 한다. (동기화)
** fork(), exec(), wait() 모두 특권 명령에 해당한다.
8. 프로세스 간의 협력
-
프로세스는 각자 자신만의 독립적인 주소 공간을 가지고 수행되기에 한 프로세스가 다른 프로세스의 주소 공간을 참조하는 것은 허용되지 않는다. 그런데 경우에 따라서는 독립적인 프로세스들이 협력할 때 업무의 효율성이 증진되는 경우가 있다.
-
IPC (Inter-Process Communication)
-
프로세스가 동시에 데이터를 사용하면 데이터 불일치 문제가 발생한다. 즉 IPC는 프로세스들 간의 통신과 동기화를 이루기 위한 메커니즘이다.
- 메세지 전달 (message passing)
- 프로세스끼리 직접 주고 받는다면 다른 프로세스에게 악영향을 끼칠 수도 있기 때문에 특권 명령으로 규정해 커널을 통해서만 통신한다. 통신하기 원하는 두 프로세스는 커뮤니케이션 링크를 생성한 후 send() 와 receive() (커널이 제공)를 이용해 메세지를 주고받는다.
- 메세지 전달 방식
-
직접 통신 : 프로세스간 통신. send(P, message) P 프로세스에게 송신. receive(Q, message) Q 프로세스로부터 수신
-
간접 통신 : 메일박스 또는 포트를 통해 통신. send(A, message) A 메일박스에 송신. reveive(A, message) A 메일박스
간접 통신에서 P1, P2, P3가 메일박스 A를 공유하는 경우 P1이 메시지를 보내면 P2와 P3 중 어느 프로세스 메시지를 받을까? (데이터 일관성)
(1) P2와 P3에게 각각 따로 링크가 생성된다.
(2) receive() 연산을 매 시점 하나의 프로세스만 수행할 수 있도록 한다.
(3) 시스템이 수신자를 임의로 결정하고, 송신자에게 알려준다.
-
- 공유 메모리 (shared memory)
- 프로세스들의 주소 공간 일부를 공유한다. 일관성 문제는 커널이 책임지지 않는다. 프로세스들이 직접 동기화 문제를 책임져야 한다.
- 주소 공간이 물리적 메모리에 매핑될 때 공유메모리 주소 영역에 대해서는 동일한 물리적 메모리 주소로 매핑된다.
-
Leave a comment