October 27, 2020
✍︎ 운영체제 내부구조 및 설계원리 제8판 (Operating Systems Internals and Design Principles) 을 정리하는 글입니다.
프로세스가 생성되는 이유는 다음과 같다.
어떤 컴퓨터 시스템이든 프로세스가 수행 완료를 표시할 수 있는 수단을 필수적으로 제공해야한다.
프로세스가 종료되는 이유는 다음의 예가 있다.
- 정상 완료 - 메모리 부족 - 경계 범위 위반 - 입출력 실패 |
- 시간 한도 초과 - 보호 오류 - 산술 오류 - 부모 종료/요청 |
프로세스 상태 종류
운영체제는 새로운 프로세스를 생성할 때 다음과 같은 과정을 거친다.
디스패처는 큐에서 다음에 수행할 프로세스를 선택한다. 이때 큐는 FIFO 자료 출입의 자료구조이며, 라운드로빈 형식으로 프로세스를 선택하는데, 이로 인해 발생하는 문제를 해결하기 위해 five state process model이 고안되었다.
프로세스 상태 종류
🟡 주요 전이
Null -> Creation
Creation -> Running
Running -> Exit
Running -> Ready
선점(Preemption)
당했다고 할 수 있다.Running -> Blocked
Blocked -> Ready
Ready -> Exit 또는 Blocked -> Exit
문제 상황
어떻게 처리기의 이용률을 높일 것인가?
해결 방안 1) 주기억장치 확장
더 많은 프로세스를 적재하기 위해 주기억장치의 용량을 확장한다. 하지만 이 방법의 경우 두 가지 문제가 발생한다.
해결 방안 2) Swapping
프로세스의 일부 또는 전체를 주기억장치에서 보조기억장치(예: 디스트)로 옮기는 것
즉, 주기억장치에 있는 모든 프로세스가 blocked 상태일 때, 운영체제는 한 프로세스를 디스크에 전송한다. 이때 생긴 여유 공간에 다른 프로세스를 적재할 수 있고, 디스크에 전송된 프로세스의 상태는 보류 상태(suspended)이다.
운영체제는 디스크에서 어떤 프로세스를 주기억장치로 가져와야할까?
주기억장치 | 보조기억장치 | |
---|---|---|
수행 가능 | 준비(주기억장치에 있고 수행 가능) | 준비/보류(보조기억장치에 있으나 주기억장치에 적재되면 즉시 수행 가능한 프로세스) |
대기 중 | 블록(주기억장치에 있고 사건을 기다리는 중) | 블록/보류(보조기억장치에 있고 사건을 기다리는 중) |
보류 상태 프로세스의 특성
보류에 대한 이유
🟡 보류 상태가 둘인 상태 전이도의 주요 전이
블록 -> 블록/보류
준비/보류 -> 준비
준비 -> 준비/보류
🟠 보류 상태가 둘인 상태 전이도의 그 밖에 고려할만한 전이들
블록/보류 -> 블록
☝️ 지금까지 가상메모리가 사용되지 않으며 프로세스 전체가 주기억장치 내부 또는 외부에 있는 환경을 가정했다. 하지만 가상메모리 환경/기법을 사용하는 환경에서도 때로는 명시적으로 완전히 프로세스들이 swap out되어야 할 필요가 있다.
운영체제가 프로세스들을 제어하고, 할당될 자원들을 관리하기 위해 필요한 정보는 무엇인가?
메모리 테이블: 주기억장치와 보조기억장치의 track을 유지하기 위해 사용됨
파일 테이블: 파일 관리 시스템에 의해 유지/사용되는 경우 운영체제는 정보를 극히 일부만 유지하거나 전혀 유지하지 않음
프로세스 테이블: 위 세 가지 테이블들은 모두 프로세스를 위해 관리하는 것이기 때문에, 프로세스 테이블에서는 이 자원들에 대한 참조가 직/간접적으로 이뤄진다.
프로세스 위치 Location in memory
프로세스 이미지를 메모리의 연속된 인접 블록에 위치시키는 것
이다. 인접블록은 보조기억장치(주로 디스크)에서 관리됨프로세스 속성 집합
프로세스 식별 Process identification
식별자
: 프로세스 식별자, 프로세스를 생성한 프로세스의 식별자, 사용자 식별자처리기 상태 정보 Processor state information
사용자가 사용가능한 레지스터
제어 레지스터
&상태 레지스터
: Program counter, 조건 코드(condition codes), 상태 정보 => 조건 코드와 상태 정보는 Program status word에 저장된다.스택 포인터
(stack의 top을 가리킴): 프로시저와 시스템 호출의 매개변수&호출 주소를 저장하기 위한 스택프로세스 제어 정보 Process control information
스케줄링
과 상태 정보
: 프로세스 상태, 우선순위, 스케줄링 관련 정보, 스케줄링 알고리즘에 따라 요구되는 정보, 이벤트자료구조화(Data structuring)
프로세스간 통신(IPC)
프로세스 권한(Process privileges)
메모리 관리
자원의 소유권과 이용률
☝️ 모든 모듈이 PCB에 접근하는 것은 두 가지 문제를 야기한다. 정확하게는 접근(접근 허용은 쉽다)보다 보호 측면에서 문제가 발생한다.
이 문제들은 “운영체제의 모든 루틴들은 핸들러 루틴*을 통해야 한다”는 조건을 통해 해결될 수 있다.
핸들러 루틴: PCB를 보호하는 루틴으로 PCB에 대한 읽기/쓰기 연산을 제어하는 유일한 조정자 역할을 한다.
커널 모드 (Kernel mode) = 시스템 모드 system mode = 제어 모드 control mode
📍 두 가지 수행 모드로 구별하는 이유
프로그램 상태 워드(PSW)의 한 비트를 이용해 프로세스가 현재 어떤 모드에서 수행되는지 나타낼 수 있다.
Plus 운영체제 커널의 주요 기능
프로세스 관리 | 메모리 관리 | 입출력 관리 | 지원 기능 |
---|---|---|---|
- 생성 & 종료 - 스케줄링 & 디스패칭 - 교환 - 동기화 - 통신 지원 - PCB 관리 |
- 프로세스에 주소공간 할당 - swapping - 페이지와 세그먼트 관리 |
-버퍼 관리 - 프로세스에 입출력 채널과 장치 할당 |
- 인터럽트 핸들링 - 어카운팅 - 모니터링 |
프로세스 제어 블록 초기화
적절한 연결 (linkage) 설정
교환 시점 프로세스 교환은 언제 이뤄져야 할까? ☝️ 수행 중인 프로세스가 운영체제로 제어를 넘길 때, 프로세스 교환이 가능하다.
이유 1: 인터럽트
이유 2: 트랩 Trap
이유 3: SuperVisor Call
📍 프로세스 교환 (Process switching) VS 모드 전환 (Mode switching)
가정 상황
명령어 사이클에서 인터럽트 검사시 인터럽트 신호가 있다면 처리기는
1. pc값을 인터럽트 핸들러 프로그램 시작 주소로 설정
2. 인터럽트 처리 코드의 특권 명령어 사용을 위해 사용자 모드 -> 커널 모드로 수행 모드 전환
이 때 인터럽트 된 프로세스의 문맥은 추후 복귀를 위해 프로그램 PC에 저장된다. 인터럽트 처리 후 만약 수행되던 프로세스를 재개하는 것이 아니라 다른 프로세스로의 교환이 요구되면 저장 또는 처리할 것들이 증가한다.
위의 상황을을 보면 인터럽트가 발생했다고 해서 프로세스 교환이 무조건적으로 이뤄져야 하는 것은 아니라는 것을 알 수 있다.
즉, 모드 전환은 현재 수행상태 프로세스의 상태 변경없이 가능하다는 것을 의미하며, 따라서 문맥 저장 또는 복구 시 생기는 오버헤드는 없다.
그에 반해 프로세스 교환은 아래와 같은 동작들이 차례로 수행되어야 한다.
☞ 프로세스 상태 전이를 포함한 프로세스 교환은 모드 전환과는 다르며 상당히 많은 작업을 요구한다.
운영체제의 특성
📍 운영체제를 하나의 프로세스로 볼 수 있다면, 어떻게 관리해야할까?
if 현재 수행 중인 프로세스가 인터럽트 당하거나 svc 요청:
프로세스 문맥 저장 후 제어는 처리기에서 커널(운영체제)로 넘어감
이때 커널은 자신이 사용할 메모리 영역, 프로시저 호출/복귀 위한 시스템 스택을 갖고있다.
☝️ 프로세스 개념은 사용자 프로그램에만 적용되고, 운영체제 코드는 분리 개체로 수행되며 특권 모드에서 동작함.
if 인터럽트, 트랩, svc 발생:
처리기는 커널 모드로 전이됨
제어는 운영체제로 옮겨감
하지만 여전히 사용자 프로세스 내에서 수행이 계속되고 있다.
=> 프로세스 교환 X, 모드 전환 O
☝️ 이 방식의 이점
사용자 프로세스 내에서 운영체제 루틴이 수행되어도 사용자 모드/커널 모드로 분리되어 있기 때문에 사용자는 운영체제 루틴에 간섭/관여 불가
프로세스 내에서 사용자 프로그램과 운영체제 프로그램 모두 수행 가능하며, 다양한 사용자 프로세스에서 수행되는 운영체제 프로그램은 동일하다.
☝️ 이 방식의 이점