프로세스 관리
by Frinee이 글은 반효경 저 - "운영체제와 정보기술의 원리"를 공부하고 정리하여 작성하였습니다.
1. 프로세스의 개념
1.1. 프로세스의 문맥(Context)
- 프로세스가 현재 어떤 상태에서 수행되고 있는지 정확히 규명하기 위해 필요한 정보
- 시분할 시스템 환경에서는 짧은 시간동안 CPU를 점유하고 뺏기는 과정을 반복하며 CPU 관리가 이루어짐
- 그렇기 때문에 CPU를 다시 획득했을 때 이전 CPU 시기에서 어디까지 명령이 수행했는지를 재현해야 한다.
- 이때 정확한 재현을 위해 필요한 정보가 바로 프로세스의 문맥이다.
1.2. 프로세스의 문맥 정보
- 프로세스의 주소 공간(코드, 데이터, 스택 상태)
- 레지스터 값
- 시스템 콜 등을 통해 커널에서 수행한 일의 상태
- 프로세스와 관련되어 커널이 관리하고 있는 각종 정보
1.3. 프로세스 문맥의 분류
- 하드웨어 문맥
- CPU의 수행 상태
- 프로그램 카운터값과 각종 레지스터에 저장하고 있는 값들을 의미
- 프로세스의 주소 공간
- 코드, 데이터, 스택으로 구성되는 자기 자신만의 독자적인 주소 공간
- 커널상의 문맥
- 운영체제는 프로세스를 관리하기 위한 자료구조를 유지함.
- PCB와 커널 스택이 해당
2. 프로세스의 상태
2.1. 프로세스 상태 구분
- 프로세스의 상태는 실행(running), 준비(ready), 봉쇄(blocked, wait, sleep)로 구분
- 실행 상태
- 프로세스가 CPU를 보유하고 기계어 명령을 실행하고 있는 상태
- 컴퓨터 내에서 실제 실행 상태에 있는 프로세스는 매 시점 하나이다.
- 준비 상태
- 프로세스가 CPU만 보유하면 명령을 실행할 수 있지만 CPU를 할당 받지 못한 상태
- 봉쇄 상태
- CPU를 할당받더라도 당장 명령을 실행할 수 없는 상태
- ex) 입출력 작업 진행 상황
- 시작 상태
- 프로세스 생성 중이지만 메모리 획득을 승인받지 못한 상태
- 완료 상태
- 프로세스가 종료된 상태이지만 운영체제가 프로세스 관련 자료구조를 정리하지 못한 상태
- 실행 상태
2.2. 문맥교환(Context Switch)
- 프로세스를 변경하기 위해 실행 중인 프로세스의 문맥을 저장하고 새로운 프로세스의 문맥을 세팅하는 과정
- 이때 준비 상태에 있는 프로세스들 중 CPU의 제어권을 넘겨받는 과정을 CPU 디스패치라고 함.
2.3. 입출력 요청 프로세스의 상태 변화 과정
- 프로세스 실행 중 디스크 파일 내용을 읽는 명령이 포함되어 있을 수 있음
- 이 경우 읽어온 결과가 있어야 후속 명령 수행이 가능
- 디스크를 읽는 작업은 상대적으로 느리기 때문에 입출력이 완료될 때까지 디스크 입출력 서비스를 기다리며 봉쇄 상태로 바꿈
- 그 다음 준비 상태의 프로세스를 하나 선정해 CPU 할당
- 입출력을 요청한 프로세스는 디스크 입출력을 기다리는 큐에 줄 서 있음
- 그리고 자기 차례 때 디스크 컨트롤러부터 서비스를 받으면 PCU에게 인터럽트를 발생시켜 입출력 완료를 알림
- CPU는 실행 중인 프로세스를 멈추고 인터럽트 처리루틴을 수행
- 실행 중인 프로세스는 사용자모드 실행 → 커널모드 실행으로 바뀜
- 이후 입출력이 완료된 프로세스는 봉쇄 상태 → 준비상태로 바꾼 후 장치의 로컬버퍼의 내용을 메모리로 이동시키는 업무를 수행
- 인터럽트 처리를 끝낸 후 실행 중이었던 프로세스는 CPU를 다시 할당하여 그 프로세스 직전 수행 시점 이후의 코드 수행
- 만약 입출력이 완료된 프로세스의 우선순위가 더 높다면 문맥교환을 통해 CPU 제어권을 이양할 수 있음.
3. 프로세스 제어블록
- 운영체제가 시스템 내의 프로세스들을 관리하기 위해 프로세스마다 유지하는 정보들을 담은 커널 내의 자료구조
- PCB 요소
- 프로세스의 상태: CPU 할당 여부 결정을 위해 필요한 값
- 프로그램 카운터의 값: 다음에 수행할 명령의 위치
- CPU 레지스터의 값: CPU 연산을 위해 현 시점 레지스터값 저장
- CPU 스케줄링 정보
- 메모리 관리 정보
- 자원 사용 정보: 사용자에게 자원 사용 요금을 계산해 청구하는 용도
- 입출력 상태 정보: 프로세스가 오픈한 파일의 정보 등의 프로세스의 입출력 상태 정보
4. 문맥교환
- 사용자 프로세스로부터 다른 사용자 프로세스로 CPU 제어권이 이양되는 과정
- 타이머 인터럽트가 발생할 경우 CPU 제어권이 운영체제로 넘어감
- 운영체제는 타이머 인터럽트 처리루틴으로 가서 수행 중이던 프로세스 문맥을 저장하고 새로운 프로세스에게 CPU를 이양
- 원래 수행 중인 프로세스
- 실행 상태 → 준비 상태
- 프로세스의 문맥을 자신의 PCB에 저장
- 새로 할당 받은 프로세스
- 준비 상태 → 실행 상태
- 예전에 저장된 프로세스 문맥을 PCB로부터 하드웨어로 복원
- 원래 수행 중인 프로세스
- 문맥교환은 실행 중이던 프로세스가 입출력 요청이나 다른 조건을 충족하지 못해 CPU를 회수당하고 봉쇄 상태가 되는 경우에도 발생할 수 있음
- 시스템 콜이나 인터럽트에 의해 실행 중인 프로세스가 커널의 코드에서 실행되는 경우에 프로세스 문맥 일부를 PCB에 저장하지만 이 과정은 문맥교환은 아니다.
- (프로세스가 새롭게 바뀌는 것은 아니니깐)
❓문맥교환시간 = 오버헤드❓
더보기
- 문맥교환에 소요되는 시간은 시스템 입장에서 일종의 오버헤드라 할 수 있음
- CPU 할당 시간을 너무 작게 할 경우 문맥교환이 빈번해져 오버헤드가 상당히 커짐
- 반대의 경우 시분할 시스템의 의미가 퇴색되어 적절한 CPU 할당시간을 설정해야 함
5. 프로세스를 스케줄링하기 위한 큐
5.1. 준비 큐
- 운영체제는 준비 상태에 있는 프로세스들을 줄 세우기 위해 준비 큐를 둠
- 준비 큐에 프로세스를 줄 세우는 방법은 CPU 스케줄링 방법에 따라 달라짐
5.2. 장치 큐
- 프로세스 준비 큐 외에도 운영체제는 자원별로 장치 큐를 둠
- 하드웨어 자원: 디스크 입출력, 키보드 입출력, 프린터 및 화면 출력 등
- 소프트웨어 자원: 공유 데이터 접근 권한
- 공유 데이터 접근에 경우 어떤 프로세스가 사용 중에 다른 프로세스가 같은 자원을 사용하면 일관성이 훼손될 수 있음
- 그래서 공유 데이터는 매 시점 하나의 프로세스만이 접근 가능
- 다른 프로세스가 CPU에 할당되어도 해당 프로세스가 다 사용하고 반납할 때까지 동일한 데이터에 접근할 수 없음
- 프로세스의 상태 관리는 커널 주소 영역 중 데이터 영역에 다양한 큐를 두어 수행
5.3. 작업 큐
- 시스템 내의 모든 프로세스를 관리하기 위한 큐
- 프로세스의 상태와 무관하게 현재 시스템 내에 있는 모든 프로세스가 속함
- 작업 큐가 가장 넓은 개념이고 준비 큐와 장치 큐에 있는 프로세스들은 모두 작업 큐에 속함
5.4. 운영체제의 자료구조 구현
- 큐는 각 프로세스의 PCB를 연결 리스트 형태로 관리하며 포인터를 사용해 순서를 정함
- 프로세스가 수행 중 입출력 요청이 발생하면 해당 장치 큐에 줄을 서면서 대기
- 장치 큐에 속한 프로세스는 봉쇄 상태에 있다가 서비스를 받고나서 인터럽트를 발생시키면 준비상태로 바뀌면서 준비 큐로 이동
6. 스케줄러
- 어떤 프로세스에게 자원을 할당할지를 결정하는 운영체제 커널의 코드
6.1. 스케줄러의 역할
- 장기 스케줄러
- 작업 스케줄러라고도 불리며, 어떤 프로세스를 준비 큐에 진입시킬지 결정하는 역할
- 프로세스가 CPU에서 실행되기 위해서는 메모리를 보유해야 하기 때문에 메모리 할당 문제에 관여
- 시작 상태의 프로세스들 중 어떤 프로세스를 준비 큐에 삽입할 지를 결정하는 역할
- 단기 스케줄러
- CPU 스케줄러라고도 하며, 준비 상태의 프로세스 중 실행 상태로 바꿀 프로세스를 결정함
- 준비 큐에 있는 프로세스들 중 어떤 프로세스에 CPU를 할당할 지를 결정
- 시분할 시스템에서 타이머 인터럽트가 발생하면 단기 스케줄러가 호출
6.2. 스케줄러의 특성
- 단기 스케줄러
- 밀리초 단위로 호출되기 때문에 수행 속도가 빨라야 함.
- 장기 스케줄러
- 수십 초 내지 수분 단위로 호출되기 때문에 속도가 느린 것이 허용됨
- 메모리에 동시에 올라가 있는 프로세스의 수를 조절함
- 시작 상태의 프로세스에서 메모리 할당을 승인할지 여부를 정하기 때문
- 하지만 현대의 시분할 시스템에서는 장기 스케줄러를 두지 않음
- 현대 시분할 시스템용 운영체제는 프로세스가 시작되면 곧바로 프로세스에 메모리를 할당해 준비 큐에 넣음
- 현대에는 장기 스케줄러 대신 중기 스케줄러를 두는 경우가 많음
6.3. 중기 스케줄러
- 너무 많은 프로세스에게 메모리를 할당해 성능이 저하되는 경우를 해결하기 위해 메모리에 적재된 프로세스 수를 동적으로 조절함.
- 프로세스 수가 너무 많아지면 일부 프로세스의 메모리를 통째로 빼앗아 디스크의 스왑 영역에 저장하는 스왑 아웃(swap out)을 실행
- 스왑 아웃을 시키는 0순위 프로세스는 봉쇄 상태에 있는 프로세스들이다.
- 이후에 스왑 아웃이 필요한 경우에는 타이머 인터럽트가 발생해 준비 큐로 이동하는 프로세스를 스왑 아웃시킴
- 중기 스케줄러의 등장으로 프로세스의 상태는 실행, 준비, 봉쇄, 중지 상태로 구분하게 됨.
- 중지(suspended, stopped) 상태
- 외부적인 이유로 프로세스의 수행이 정지된 상태를 말함
- 메모리 자원이 당장 필요하지 않기 때문에 메모리를 통째로 빼앗고 디스크로 스왑 아웃시킴
- 중지준비 상태와 중지봉쇄 상태로 세분화할 수 있음
- 중지준비 상태: 준비 상태에 있던 프로세스가 중기 스케줄러에 의해 디스크로 스왑 아웃된 상태
- 중지봉쇄 상태: 봉쇄 상태에 있던 프로세스가 중기 스케줄러에 의해 디스크로 스왑 아웃된 상태
- 중지봉쇄 상태이던 프로세스가 봉쇄되었던 조건을 만족하면 중지준비 상태로 바뀜
7. 프로세스의 생성
- 최초의 프로세스는 운영체제가 직접 생성한다.
- 하지만 그다음부터는 존재하는 프로세스가 다른 프로세스를 복제 생성한다.
- 이때 프로세스를 생성하면 부모 프로세스이고 새롭게 생성되는 건 자식 프로세스라 함.
- 부모 프로세스를 종료하려고 하면 그의 자식 프로세스를 연쇄적으로 종료한 후에 종료가 가능함.
7.1. 프로세스 자원 획득과 수행 모델
- 자원을 획득하는 방법은 운영체제 및 자원에 종류에 따라 상이함
- 운영체제로부터 직접 할당
- 부모 프로세스와 자원을 공유해서 사용
- 프로세스 수행 모델
- 부모와 자식이 공존하며 수행되는 모델
- 자식과 부모가 CPU를 얻기 위해 경쟁하는 관계가 됨
- 자식이 종료될 때까지 부모가 기다리는 모델
- 자식 프로세스가 종료될 때까지 봉쇄 상태에 머묾
- 자식 프로세스가 종료되면 부모 프로세스는 준비 상태가 됨
- 부모와 자식이 공존하며 수행되는 모델
7.2. 프로세스의 생성과 종료
(ex) 유닉스
- 프로세스가 생성되면 독자적인 주소 공간을 가짐
- 자식 프로세스는 생성될 때 부모의 주소 공간을 복사하여 주소 공간을 생성
- 자식 프로세스가 다른 프로그램을 수행하면 생성된 주소 공간 위에 덮어씌워 실행
- fork() 시스템 콜을 통해 자식 프로세스를 생성할 때 부모 프로세스의 내용을 복제 생성
- 자식 프로세스는 exec()시스템 콜을 통해 새로운 프로그램으로 주소 공간을 덮어 씌운다.
7.2.1. 프로세스 종료
- 자발적 종료
- 프로그램이 마쳐지는 코드에 exit()라는 시스템 콜을 넣게 되어있음.
- 프로세스는 시스템 콜을 통해 종료함을 운영체제에게 알림.
- 이에 운영체제는 프로세스로부터 자원을 회수하고 프로세스를 정리하게 됨
- 비자발적 종료
- 부모 프로세스가 자식 프로세스의 수행을 강제로 종료시킴
- abort() 함수를 통해 이루어짐
- 강제종료가 발생하는 경우
- 자식 프로세스가 할당 자원 한계치를 넘는 자원을 요구할 때
- 자식 프로세스에게 할당된 작업이 더 이상 필요하지 않을 때
- 부모 프로세스가 종료되는 경우
❓ 로그아웃 후에도 프로그램이 수행되야 하는 경우
이때에는 모든 자식 프로세스들이 종료되기 때문에
종료되지 않을 다른 프로세스의 양자로 자식 프로세스를 보내는 작업을 수행하게 된다.
이러한 방식을 통해 부모가 죽기 전 자식이 먼저 죽게 된다는 원칙을 지키게 됨.
7.2.2. 프로세스 생성
- 프로세스가 fork() 시스템 콜을 하게 되면 CPU의 제어권이 커널로 넘어감
- 커널은 fork() 를 호출한 프로세스를 복제하여 자식 프로세스를 생성
- 복제된 자식 프로세스는 부모의 주소공간, 프로그램 카운터, PCB 및 커널스택 등 문맥 동일함.
- 자식 프로세스는 부모 프로세스가 현재 수행한 시점부터 수행하게 됨.
- fork() 함수의 결과값이 1이면 원본, 0이면 복제본이 되어 구분할 수 있음
- exec() 시스템 콜은 프로세스가 지금까지 수행했던 상태를 잊고 새롭게 시작하도록 하는 시스템 콜
- 프로세스 생성과 관련된 fork() , exec()는 특권명령에 해당함.
- wait() 시스템 콜은 자식 프로세스가 종료되기를 기다리며 부모 프로세스가 봉쇄 상태로 머물게 함.
- 자식 프로세스가 종료되면 부모를 준비 상태로 변경하여 프로세스간의 동기화를 가능하게 함.
8. 프로세스 간의 협력
- 프로세스는 원칙적으로 다른 프로세스 수행에 영향을 끼칠 수 없음
- 경우에 따라서는 프로세스들이 협력할 때 업무의 효율성이 증진됨.
8.1. IPC(Inter-Process Communication)
- 운영체제가 제공하는 대표적인 프로세스 간의 협력 메커니즘
- IPC(Inter-Process Communication): 하나의 컴퓨터 안에서 실행 중인 서로 다른 프로세스 간에 발생하는 통신
- 프로세스들 간의 통신과 동기화를 이루기 위한 메커니즘
- 공유 데이터를 사용하는가에 따라 메시지 전달 방식과 공유메모리 방식로 나뉨
8.1.1. 메시지 전달 방식
- 프로세스 간에 공유 데이터를 일체 사용하지 않고 메시지를 주고 받으면서 통신하는 방식
- 두 프로세스의 주소 공간이 다르기 때문에 커널이 메시지 전달 역할을 함
- 메시지 통신을 하는 시스템은 커널에 의해 send와 receive 연산을 제공받음
- 운영체제는 메시지를 주고받는 연산을 특권명령으로 규정하여 커널을 통해서만 하게 함.
- 통신을 원하는 두 프로세스는 커뮤니케이션 링크를 생성한 후 send와 receive를 통해 메시지를 주고받음
- 메시지 전송 대상에 따라 직접통신과 간접통신으로 나뉨.
- 이 두가지 방식의 차이는 연산의 인터페이스에 대한 차이일 뿐, 내부 구현은 동일함.
- 직접통신
- 통신하려는 프로세스의 이름을 명시적으로 표시
- send(P, message) : 프로세스 P에게 메시지 전송
- receive(Q, message) : 프로세스 Q로부터 메시지를 전달 받는 것을 말함
- 커뮤니케이션 링크는 자동으로 생성되고 하나의 링크는 한 쌍의 프로세스에게 할당
- 링크는 단방향성일 수 있지만 대부분 양방향성이다.
- 간접통신
- 메시지를 메일 박스 또는 포트로부터 전달받음
- 각 메일박스에는 고유 ID가 있고 메일박스를 공유하는 프로세스끼리만 통신함
- 하나의 링크가 여러 프로세스들에게 할당될 수 있고 각 프로세스의 쌍은 여러 링크를 공유할 수 있음
- 링크는 단방향성 또는 양방향성이다.
- send(P, message) : P라는 메일박스에 메시지 전송
- receive(Q, message) : 메일박스 Q로부터 메시지를 전달 받음
- 메일박스를 공유하는 경우, 메시지를 전달받는 프로세스가 누군지 혼동할 수 있다.
- 각 프로세스를 1:1 연결하는 링크들을 메일박스를 생성할 때 구성한다.
- 그리고 메시지 내용에 받는 프로세스 대상을 명시하여 전달하도록 한다.
- 공유메모리 방식
- 프로세스들이 주소 공간의 일부를 공유함.
- 운영체제는 공유메모리를 사용하는 시스템 콜을 지원하여 상대의 주소 공간 중 일부를 공유할 수 있도록 함
- 공유메모리 영역은 각자의 주소 공간에 포함되는 영역이므로 여러 프로세스가 읽고 쓰는 것이 가능
- 고유메모리 주소영역에 대해서는 동일한 물리적 메모리 주소가 매핑됨
- 하지만 서로의 데이터 일관성 문제가 발생할 수 있음
자료
- 운영체제와 정보기술의 원리 (반효경 저, 2020.5)
'[컴퓨터 과학자 스터디] > 운영체제' 카테고리의 다른 글
메모리 관리 (0) | 2024.11.01 |
---|---|
CPU 스케줄링 (0) | 2024.10.27 |
프로그램의 구조와 실행 (0) | 2024.10.21 |
컴퓨터 시스템의 동작 원리 (0) | 2024.10.15 |
운영체제 개요 (1) | 2024.10.11 |
블로그의 정보
프리니의 코드저장소
Frinee