-
[운영체제]Operating System Concepts - 공룡책 개념 정리(3)/ProcessCS/OS 2022. 7. 24. 20:59
1. Process Concept
초기의 컴퓨터는 작업(job)을 실행하는 시스템이었다. 이어서 사용자 프로그램(user program) 혹은 태스크(task)를 실행하는 시분할 시스템(time-sharing)이 뒤를 이었다.
1.1 Process
비공식적으로 프로세스란 실행 중인 프로그램이다. 프로세스의 현재 활동 상태는 프로그램 카운터 값과 프로세서 레지스터의 내용으로 표현한다. 프로세스의 메모리 배치는 일반적으로 여러 섹션으로 구분된다.
- Text section - 실행 코드 (excutable code)
- Data section - 전역 변수 (global variables)
- Heap section - 프로그램 실행 중에 동적으로 할당되는 메모리( memory that is dynamically allocated during program run time)
- Stack section - 함수를 호출할 때 임시 데이터 저장장소(temporary data storage when invoking functions - such as function parameters, return addresses, and local variables)
텍스트 및 데이터 섹션의 크기는 고정되기 때문에 프로그램 실행 동안 크기가 변하지 않는다. 그러나 스택 및 힙 섹션은 동적으로 줄어들거나 커질 수 있다. 스택 및 힙 섹션이 서로의 방향으로 커지더라도 운영체제가 서로 겹치지 않도록 해야 한다.
함수가 호출될 때마다 함수 매개변수, 지역 변수 및 복귀 주소를 포함하는 활성화 레코드(activation record)가 스택에 푸시되고 함수에서 제어가 돌아오면 스택에서 팝 된다. 마찬가지로 메모리가 동적으로 할당됨에 따라 힙이 커지고 메모리가 시스템에 반환되면 축소된다.
- 프로그램은 명령어 리스트를 내용으로 가진 저장된 실행 파일이다. 이는 수동적인 존재(passive entity)인 반면 프로세스는 다음에 실행할 명령어를 지정하는 프로그램 카운터와 관련된 자원의 집합을 가진 능동적인 존재(active entity)이다.
1.2 Process State
프로세스는 실행되면서 그 상태가 변한다. 프로세스는 다음 상태 중 하나에 있다.
- New - 프로세스가 생성 중이다.
- Running - 명령어들이 실행되고 있다.
- Waiting - 프로세스가 어떤 이벤트가 일어나기를 기다린다. (The process is waiting for some event to occur - such as an I/O completion or reception of a signal).
- Ready - 프로세스가 처리기(processor)에 할당되기를 기다린다.
- Terminated - 프로세스의 실행이 종료되었다.
특정한 시점에서 프로세서 코어에서는 오직 하나의 프로세스만이 실행된다. 반면에 많은 프로세스들이 준비(ready) 혹은 대기(waiting) 상태에 있을 수 있다.
1.3 Process Control Block(PCB)
각 프로세스는 운영체제에서 프로세스 제어 블록에 의해 표현된다. 특정 프로세스와 연관된 여러 정보를 수록한다.
다음과 같은 것들을 포함한다.
- Process state - 상태는 new, ready, running, waiting, halted 등이다.
- Process counter - 프로세스가 다음에 실행할 명령어의 주소를 가리킨다.
- CPU registers - 컴퓨터의 구조에 따라 다양한 수와 유형을 가진다. 레지스터에는 계산장치(accumulator), 인덱스 레지스터, 스택 레지스터, 범용 레지스터(general-purpose), 상태 코드(condition code) 정보가 포함된다. 프로그램 카운터와 함께 이 상태 정보는 프로세스가 다시 스케줄 될 때 올바르게 실행되기 위해 인터럽트 발생 시 저장되어야 한다.
- CPU-scheduling information - 프로세스의 우선순위, 스케줄 큐에 대한 포인터와 다른 스케줄 매개변수
- Memory-management information - 운영체제에 의해 사용되는 메모리 시스템에 따라 기준 레지스터와 한계 레지스터의 값, 페이지 테이블 또는 세그먼트 테이블과 같은 정보
- Accounting information - CPU 사용 시간과 경과된 실시간, 시간 제한, 계정 번호, job 또는 process 번호 등
- I/O status information - 프로세스에 할당된 입출력 장치들과 열린 파일의 목록 등
즉, 프로세스 제어 블록은 회계 데이터와 함께 프로세스를 시작시키거나 다시 시작하는 데 필요한 모든 데이터를 위한 저장소의 역할을 한다.
2. Process Scheduling
멀티프로그래밍의 목적은 항상 프로세스들이 실행되도록 하여, CPU의 효율을 극대화 하는 것이다. 시분할(time sharing)의 목적은 사용자가 실행 중인 프로그램과 상호 작용할(interact) 수 있도록 CPU 코어를 프로세스들 사이에서 빈번하게 교체하는 것이다. (The objective of multiprogramming is to have some process running at all times so as to maximize CPU utilization. The objective of time sharing is to switch a CPU core among processes so frequently that users can interact with each program while it is running.)
이러한 목적들을 달성하기 위해, 프로세스 스케줄러는 코어에서 실행 가능한 여러 프로세스들 중에서 이용가능한 하나의 프로세스를 선택한다. (To meet these objectives, the process scheduler selects an available process (possibly from a set of several available processes) for program execution on a core. Each CPU core can run one process at a time.)
싱글 코어 시스템은 한 번에 2개 이상의 프로세스가 실행될 수 없지만 다중 코어 시스템은 한 번에 여러 프로세스를 실행할 수 있다. 코어보다 많은 프로세스가 있는 경우 초과 프로세스들은 코어가 사용해지고 다시 스케줄 될 때까지 기다려야 한다. 현재 메모리에 있는 프로세스 수를 degree of multiprogramming 이라고 한다.
멀티프로그래밍과 시분할의 목적을 균형있게 달성하기 위해서는 프로세스의 일반적인 동작을 고려해야 한다. 대부분의 프로세스는 I/O bound 혹은 CPU bound로 설명된다. I/O bound process는 계산(computations)보다 I/O에 더 많은 시간을 사용한다. CPU bound process는 계산에 더 많은 시간을 사용한다.
2.1 Scheduling Queues 스케줄링 큐
- 준비 큐(ready queue) - 프로세스가 시스템에 들어가면 준비 큐(ready queue)에 들어가 CPU 코어에서 실행되기를 기다린다. 준비 큐는 일반적으로 연결 리스트로 저장된다. 준비 큐 헤더에는 리스트의 첫 번째 PCB에 대한 포인터가 저장된다. 각각의 PCB는 준비 큐의 다음 PCB를 가리키는 포인터 필드가 있다.
- 대기 큐(wait queue)(장치 큐, device queue) - 프로세스에 CPU 코어가 할당 되면 프로세스는 잠시 동안 실행되어 종료되거나 인터럽트 되거나 I/O 요청의 완료와 같은 특정 이벤트가 발생할 때까지 기다린다. 프로세스가 디스크와 같은 장치에 I/O 요청을 한다고 가정하자. 장치는 프로세서보다 매우 느린 속도로 실행되므로 프로세스는 I/O가 사용 가능할 때까지 기다려야 한다. 이와 같이 특정 이벤트가 발생하기를 기다리는 프로세스는 대기 큐(waiting queue)에 삽입된다.
새로운 프로세스는 처음에 준비 큐(ready queue)에 놓여진다. 이 프로세스는 실행을 위해 선택되거나 디스패치 될 때까지 기다린다. 프로세스에 CPU 코어가 할당되고 실행 상태가 되면, 여러 이벤트 중 하나가 발생할 수 있다.
- 프로세스가 I/O 요청을 공표한 다음 I/O 대기 큐(wait queue)에 놓일 수 있다.
- 프로세스는 새로운 자식 프로세스를 만든 다음 자식의 종류를 기다리는 동안 대기 큐에 놓일 수 있다.
- 인터럽트 또는 타임 슬라이스가 만료되어 프로세스가 코어에서 강제로 제거되어 준비 큐로 돌아갈 수 있다.
프로세스는 종료될 때 모든 큐에서 제거되고 PCB 및 자원이 반환된다(deallocated).
2.2 CPU Scheduling CPU 스케줄링
CPU 스케줄러는 준비 큐에 있는 프로세스들 중에서 하나를 선택하여 CPU 코어에 할당하는 것이다. CPU 스케줄러는 새로운 프로세스를 자주 선택해야 한다.
An I/O-bound process may execute for only a few milliseconds before waiting for an I/O request. Although a CPU-bound process will require a CPU core for longer durations, the scheduler is unlikely to grant the core to a process for an extended period. Instead, it is likely designed to forcibly remove the CPU from a process and schedule another process to run. Therefore, the CPU scheduler executes at least once every 100 milliseconds, although typically much more frequently
I/O 바운드 프로세스는 I/O 요청을 대기하기 전에 몇 밀리초 동안만 실행할 수 있다. CPU 바운드 프로세스는 CPU 코어를 더 오랜 시간동안 요구하지만 스케줄러는 프로세스에게 코어를 긴 시간동안 제공하지 않는다. 대신 프로세스에서 CPU를 강제로 제거하고 다른 프로세스를 실행하기 위해 스케줄하도록 설계된다.
- 스와핑(swapping) - 일부 운영체제는 스와핑으로 알려진 중간 형태의 스케줄링을 갖고 있다. 스와핑의 핵심 아이디어는 메모리(그리고 active contention for the CPU)에서 프로세스를 제거하여 멀티프로그래밍 정도를 줄이는 것이다. 나중에 프로세스를 메모리에 다시 로드(reintroduced into memory)할 수 있으며 중단된(left off) 위치에서 실행을 계속할 수 있다. 프로세스를 메모리에서 디스크로 ‘swap out’ 하며 현재의 상태를 저장하고, 다시 디스크에서 메모리로 ‘swap in’하며 상태를 복구할 수 있기 때문에 swapping이라고 부른다.
2.3 Context Switch 문맥 교환
- 인터럽트가 발생하면 시스템은 인터럽트 처리가 끝난 후에 문맥을 복구할 수 있도록 CPU 코어에서 실행 중인 프로세스의 문맥을 저장해야 한다.
- 문맥은 프로세스의 PCB에 의해 표현된다. 문맥은 CPU 레지스터의 값(value), 프로세스의 상태, 메모리 관리 정보 등을 포함한다.
- CPU 코어를 다른 프로세스로 교환하려면 이전의 프로세스의 상태를 보관하고 새로운 프로세스의 보관된 상태를 복구하는 문맥 교환(context switch) 작업이 필요하다.
- 문맥 교환이 일어날 때, 커널은 과거 프로세스의 문맥을 PCB에 저장하고 실행이 스케줄된 새로운 프로세스의 저장된 문맥을 복구한다.
- 문맥 교환이 일어나는 시간에는 아무런 유용한 일을 못하기 때문에 순수한 오버헤드(pure overhead)다. 교환 속도는 메모리의 속도, 복사되는 레지스터의 수, 특수 명령어에 의존하므로 기계마다 다르다.
9장에서 계속
3. Operation on process
4. Interprocess Communication
프로세스가 시스템에서 실행 중인 다른 프로세스들과 데이터를 공유하지 않는다면 독립적(independent)이라고 한다. 반면에 다른 프로세스들에 영향을 주고 받는다면 협력적인(cooperating) 프로세스라고 한다.
프로세스의 협력을 허용하는 환경에는 이유가 있다.
- 정보 공유 (Information sharing) - 여러 응용 프로그램들이 같은 정보(ex, copying and pasting)에 흥미를 느낄 수 있으므로 우리는 그러한 정보를 병행적으로(concurrent) 접근할 수 있는 환경을 제공해야 한다.
- 계산 가속화 (Computation speedup) - 특정 태스크를 빠르게 실행하려면 그것을 서브태스크로 나누고 이들이 각각 다른 서브태스크들과 병렬로 실행되도록 하면 된다. 이러한 가속은 컴퓨터가 여러 개의 프로세싱 코어를 가지고 있을 때만 가능하다.
- 모듈성 (Modularity) - 우리는 시스템을 구분된 프로세스들 혹은 스레드로 나누어 모듈식 형태로 시스템을 구성하기를 원할 수도 있다.
협력적 프로세스들은 데이터를 교환할 수 있는 프로세스 간 통신(interprocess communication, IPC) 기법이 필요하다. IPC에는 기본적인 두 가지 모델이 있다.
공유 메모리 모델에서는 협력 프로세스들에 의해 공유 되는 메모리의 영역이 구축된다. 프로세스들은 이 영역에 데이터를 읽고 쓰며 정보를 교환할 수 있다.
메시지 전달 모델에서는 통신이 협력 프로세스들 사이에서 교환되는 메시지를 통해 이루어진다.
운영체제는 통상적으로 두 모델 모두 구현한다.
- 메시지 전달 모델은 충돌을 회피할 필요가 없이 때문에 적은 양의 데이터를 교환하는 데 유용하다. 또한 분산 시스템에서 공유 메모리보다 구현하기 쉽다.
- 일반적으로 메시지 전달 모델은 시스템 콜을 사용하여 구현되므로 커널 간섭 등의 부가적인 시간 소비 작업이 필요하다.
- 공유 메모리 모델에서는 공유 메모리 영역을 구축할 때만 시스템 콜이 필요하다. 영역이 구축되고 나면 모든 접근은 일반적인 메모리 접근으로 취급된다. 즉, 메시지 전달 모델에 비해 빠르다.
출처 - <Operating System Concepts> 10th ed. by A. Silberschatz
'CS > OS' 카테고리의 다른 글
[OS]운영체제 기본 개념 (0) 2022.07.28 [OS]임계 구역 문제와 해결 방안(1) - 하드웨어 지원 (0) 2022.07.27 [OS]경쟁 상태란? (0) 2022.07.25 [운영체제]Operating System Concepts - 공룡책 개념 정리(2) / Operating System Structures (0) 2022.07.15 [운영체제]Operating System Concepts - 공룡책 개념 정리(1)/Overview (0) 2022.07.15