본 자료 정리는 'Operating System Concepts'(Tenth Edition) - Abraham Silberschatz 원서에 출처합니다.
Copyright © 2020 John Wiley & Sons, Inc.
운영체제에 대해 논의할 때 중요한 것 중 하나는 "모든 CPU 활동들을 어떻게 부를 것인가?"이다. 초기 컴퓨터는 작업(job)을 실행하는 배치 시스템이었다. 이어서 사용자 프로그램 혹은 task을 실행하는 시분할 시스템이 등장했다. 단일 사용자 시스템에서는 프로세스를 실행한다.
프로세스: 실행중인 프로그램. 작업단위이다.
프로세스의 현재 활동 상태는 program counter 값과 프로세서 레지스터의 내용으로 표시된다.
프로그램은 디스크(실행 파일)에 저장된 수동 개체이고 프로세스는 활성화 개체이다.
(실행가능한 파일이 메모리에 로드 되면 프로그램이 프로세서가 된다.)
프로그램 실행은 GUI 마우스 클릭, 명령줄 입력 등을 통해 시작한다.
일반적으로 프로세스의 메모리 배치는 여러 구역으로 구분되는데, 이 구역에는 다음이 포함된다.
text, data 영역의 크기는 고정되기 때문에 프로그램 실행시간 동안 크기가 변하지 않는다.
그러나 stack, heap 영역의 크기는 가변적인데, 함수가 호출될 때마다 함수 매개변수, 지역 변수 및 복귀 주소를 포함하는 활성화 레코드(activation record)가 stack에 push 되며, 함수에서 제어가 되돌아오면 stack에서 활성화 레코드가 pop된다.
마찬가지로 메모리가 동적으로 할당됨에 따라 힙이 커지고, 메모리가 시스템에 반환되면 축소된다.
stack, heap 구역이 서로의 방향으로 커지더라도 운영체제는 서로 겹치지 않도록 해야한다. (그림 참조)
프로세스는 실행되면서 그 상태가 변한다. 프로세스의 상태는 부분적으로 그 프로세스의 현재 활동에 따라서 정의된다. 프로세스는 다음 상태 중 하나에 있게 된다.
new: 프로세스가 생성되고 있다.
running: 명령어들이 실행되고 있다.
waiting: 프로세스가 어떤 이벤트가 일어나기를 기다린다. (e.g. 입출력 완료 또는 신호의 수신)
ready: 프로세스가 처리기에 할당되기를 기다린다.
terminated: 프로세스의 실행이 종료된다.
어느 한 순간에 프로세서 코어에서는 오직 하나의 프로세스만이 실행된다. 하지만 많은 프로세스가 waiting, ready 상태에 있을 수 있다.
각 프로세스와 관련된 정보를 표현한다. (task control block 이라고도 불린다.)
위에서 설명한 프로세스 모델은 한 프로세스가 단일의 실행 스레드를 실행하는 프로그램이라 가정하였다.
하지만 현대 운영체제는 한 프로세스가 다수의 실행 스레드를 가질 수 있도록 허용한다. 이러한 특성은 여러 스레드가 병렬로 실행될 수 있다는 것을 의미한다.
Represented by the C structure taks_struct
multiprogramming 과 time sharing 의 목적은 CPU 활용성을 최대화 하는 것과 사용자의 상호작용을 위해 프로세스 간에 CPU 코어를 빠르게 전환하는 것이다.
이를 위해 프로세스 스케쥴러는 CPU에서 실행 가능한 여러 프로세스 중에서 하나의 프로세스를 선택해 실행한다.
Degree of multiprogramming: 현재 메모리에 있는 프로세스 수
밸런싱을 위해 고려되는 프로세스의 일반적인 동작
Ready queue: 주 메모리에 있는 모든 프로세스의 집합이다. 프로세스가 시스템에 들어가면 ready queue에 들어가서 준비 상태가 되어 CPU 코어에서 실행되기를 기다린다.
Wait queues: 프로세스에 CPU 코어가 할당되면 프로세스는 잠시 동안 실행되어 결국 종료되거나, 인터럽트 되거나, I/O 요청 완료와 같은 특정 이벤트가 발생할 때까지 기다린다. (여러 종류가 있음)
Queueing diagram은 queues, resources, flows를 나타낸다.
프로세스는 ready queue와 다양한 wait queue 사이에서 마이그레이션 된다.
(마이그레이션: 한 운영환경으로부터, 대개의 경우 좀 더 낫다고 여겨지는 다른 운영환경으로 옮겨가는 과정)
CPU scheduler는 다음에 실행할 프로세스를 선택하고 CPU를 할당한다.
( CPU 스케쥴러는 최소한 100 milliseconds 마다 실행된다. [2019년 기준] )
일부 운영체제는 스와핑(swapping)이라는 중간 형태의 스케쥴링을 갖고 있는데,
핵심 아이디어는 때로는 메모리에서 프로세스를 제거하여 다중 프로그래밍의 정도를 감소시키는 것이 유리할 수 있다는 것이다. 이후 디스크에서 메모리로 swap in 하여 상태를 복원할 수 있기 때문에 이 기법을 swapping이라고 한다.
인터럽트는 운영체제가 CPU 코어를 현재 작업에서 뺏어 커널 루틴을 실행할 수 있게 한다. 인터럽트가 발생하면 시스템은 인터럽트 처리가 끝난 후에 문맥(context)을 복구할 수 있도록 현재 실행 중인 프로세스의 문맥을 저장할 필요가 있다.
이 문맥은 프로세스의 PCB에 표현된다.
CPU가 다른 프로세스로 전환할 때 시스템은 이전 프로세스의 상태를 저장(state save)하고 context switch을 통해 새 프로세스에 대해 저장된 상태를 로드(state restore)해야 한다.
컨텍스트 전환 시간은 오버헤드이다. context를 전환하는 동안 시스템이 유용한 작업을 수행하지 않는다.
(-> OS와 PCB가 복잡할수록 컨텍스트 전환이 길어진다.)
하드웨어 지원에 따른 시간 (*참고)
( 일부 하드웨어는 CPU당 여러 레지스터 세트를 제공한다 -> 따라서 A를 실행하다가 B를 실행하더라도 PCB안의 것들이 미리 다 올라와있다. )
System provides mechanisms for:
부모 프로세서는 자식 프로세서를 생성하고, 이는 차례로 다른 프로세스를 생성하여 프로세스 트리(tree of process)를 형성한다.
일반적으로 프로세스 식별자(pid)를 통해 프로세스를 식별하고 관리한다.
Resource sharing options
Execution options
Address-space possibilities (메모리에 있는 주소 공간)
UNIX examples
프로세스가 새로운 프로세스를 생성할 때는 두 프로세스를 실행시키는 데 두 가지 방법이 있다.
프로세스가 마지막 명령문의 실행을 끝내고, exit 시스템 콜을 사용하여 운영체제에 자신의 삭제를 요청하면 종료한다.
부모는 abort() 시스템 호출을 사용하여 자식 프로세스의 실행을 종료할 수 있다.
부모가 자식의 실행을 종료시키는 경우는 다음과 같다.
세 번째의 경우, 보통 부모 프로세스가 종료한 후에 자식 프로세스가 존재할 수 없다. 이 경우 부모가 종료되면 자식도 연달아 종료되는, 연쇄식 종료 작업(cascading termination)이 시행된다.
부모 프로세스는 wait() 시스템 호출을 사용하여 자식 프로세스의 종료를 기다릴 수 있다. 호출은 종료된 프로세스의 상태 정보와 pid를 반환한다.
pid = wait(&status);
좀비
종료되었지만 부모 프로세스가 아직 wait() 호출을 하지 않은 프로세스를 좀비(zombie) 프로세스라고 한다. 종료하게 되면 모든 프로세스는 좀비 상태가 되지만 아주 짧은 시간 동안만 머무른다.
고아
부모 프로세스가 wait()를 호출하지 않고 종료한다면, 자식 프로세스들은 고아(orphan) 프로세스가 된다.
대부분의 최신 웹 브라우저는 탭 브라우징을 제공하여 동시에 여러 웹사이트를 열 수 있다.
-한 웹사이트에서 문제가 발생하면 전체 브라우저가 중단되거나 충돌할 수 있다.
Google Chrome 브라우저는 3가지 유형의 프로세스가 있는 multiprocess이다.
시스템 내의 프로세스는 독립적이거나 협력적일 수 있다.
운영체제 내에서 실행되는 프로세스들은 독립 또는 협력적인 프로세스 두 가지로 분류된다.
간단히 말해서, 다른 프로세스와 데이터를 공유하면 협력(cooperating), 그렇지 않으면 독립적(independent)인 프로세스라고 한다.
프로세스 협력을 하는 이유
협력적 프로세스는 데이터를 교환할 수 있는 프로세스 간 통신(interprocess communication, IPC) 기법이 필요하다.
IPC의 두 가지 모델
공유 메모리를 사용하는 프로세스 간 통신에서는 통신하는 프로세스들이 공유 메모리 영역을 구축해야 한다.
공유 메모리 영역은 공유 메모리 세그먼트를 생성하는 프로세스의 주소 공간에 위치한다.
생산자 - 소비자 문제의 해결책으로 공유 메모리를 사용하는데, 생산자와 소비자 프로세스들이 병행으로 실행되도록 하려면, 생산자가 정보를 채워 넣고 소비자가 소모할 수 있는 항목들의 버퍼가 반드시 사용 가능해야 한다. 또 이 버퍼는 공유 메모리 영역에 존재해야 한다.
이때 두 가지 버퍼가 사용되는데, 무한 버퍼(unbounded-buffer)는 크기에 실질적인 한계가 없고 유한 버퍼(bounded-buffer)는 버퍼의 크기가 고정되어 있다고 가정한다.
Solution is correct, but can only use BUFFER_SIZE-1 elements
동일한 주소 공간을 공유하지 않고 프로세스가 통신하고 작업을 동기화하는 메커니즘
메시지 전달 기능은 두 가지 작업을 제공한다.
특히 메시지 전달 방식은 네트워크에 연결된 다른 컴퓨터들에도 프로세스가 분산되어있는 경우 유용하다.
메시지 크기는 고정 또는 가변이다.
프로세스 P와 Q가 통신하려면 다음을 수행해야 한다.
통신링크의 논리적 구현
프로세스는 서로의 이름을 명시적으로 지정해야 한다.
직접 통신 링크의 특성
메세지는 mailbox로 보내고 받는다. (also referred to as ports)
프리미티브는 다음과 같이 정의된다.
간접 통신 링크의 특성
Mailbox sharing
Solutions
Operations
Message passing may be either blocking or non-blocking.
Blocking은 synchronous로 간주된다. (직접 수령)
Non-blocking은 asynchronous로 간주된다. (놓고 감)
다양한 조합이 가능하다.
링크에 첨부된 메시지 queue이다.
queue를 구현하는 방법
Zero capacity : 링크에 대기 중인 메시지가 없다 - 버퍼링 없음
Bounded capacity : n개 메세지의 유한한 길이 - 자동 버퍼링
Unbounded capacity : 무한 길이 - 자동 버퍼링
수정해야될 사항이 있거나 잘못 번역된 문장이 있을경우 댓글로 알려주세요 :)