운영체제 CHAPTER3 - 프로세스(Process)

LYN L·2022년 8월 25일
0

Operating-System

목록 보기
3/5

CHAPTER3 미리보기

  • 프로세스의 개념과 다양한 특성들에 대해 알 수 있다.
  • Shared Memory와 Memory Passing을 통한 프로세스 간 통신에 대해서 알 수 있다.
  • Client-Server System에서의 통신에 대해 알 수 있다.

3.1 프로세스 개념 (Process Concept)

(1) 프로세스 (process)

  • Informally, 프로세스는 실행중인 프로그램이다.
  • 프로세스는 program counter의 값과 같은 현재 활동을 나타내는 것들을 include한다.
  • 프로세스는 temporary data(function의 파라미터, return address, local variable) 를 가지는 process stack을 include 한다.
  • 프로세스는 global variable들을 contain하는 data section을 include 한다.
  • 프로세스는 프로세스 실행 중에 동적으로 할당되는 memory인 heap을 include 한다.

(2) 프로세스 상태 (Process State)

프로세스는 실행되면서 상태가 변화하며, 프로세스의 상태는 현재의 활동에 따라 정의된다.

  • new: 프로세스가 생성중이다.
  • running: 명령어들이 실행되고 있다.
  • waiting: 프로세스가 어떤 이벤트가 일어나기를 기다린다.
  • ready: 프로세스가 processor에 할당되기를 기다린다.
  • terminated: 프로세스의 execution이 종료 되었다.

어느 한 순간에 한 processor에서는 하나의 process만이 실행된다.
따라서, 이에 많은 process가 ready, waiting 상태에 있을 수 있다.

(3) 프로세스 제어 블록 (Process Control Block)

각각의 프로세스는 자신의 종보 묶음인 PCB를 가지고 있다. PCB에는 프로세스 상태와 프로그램 카운터, 메모리 한계, 레지스터 정보 등이 담겨 있다.

  • Process State: new, running, wait, ready, terminate 등의 상태를 가진다.
  • Program Counter: 프로세스가 다음에 실행 될 명령어의 주소를 가리킨다.
  • CPU registers: Accumulator, index register, stack register, general-purpose register 들과 condition code가 포함된다.
  • CPU 스케줄링 정보: process priority, 큐에 대한 포인터 등과 같은 scheduling parameter등을 포함한다.
  • Memory 관리 정보:
  • Accounting 정보: CPU 사용 시간, real time used, time limit, process number 등을 포함한다.

(4) 스레드 (Threads)

프로세스를 쪼개 하나의 프로세스 안에서 동시에 여러 작업을 처리할 수 있다.

  • 대부분의 운영체제에서는 한 프로세스가 다수의 thread를 가질 수 있도록 허용한다.
  • 이에 한 프로세스가 한 번에 하나 이상의 task를 수행할 수 있도록 한다.
  • 이러한 점은 여러 thread가 병렬로 수행되는 multi-core system에서 이익을 얻을 수 있다.
  • thread를 지원하는 System에서, PCB는 각 Thread에 대한 정보를 포함하도록 한다.

3.2 프로세스 스케줄링 (Process Scheduling)

  • multi programming 의 목적은 CPU Utilization을 최대화 하기 위하여 항상 어떤 프로세스가 실행되도록 하는 것이다.
  • Time-sharing 방식의 목적은 각 프로그램이 실행되는 동안 user가 interact할 수 있도록 프로세스들 사이에서 CPU를 자주 switching 해주는 것이다.
  • 프로세스 스케줄러는 CPU에서 실행 가능한 여러 프로세스들 중 한 프로세스를 선택한다.
  • Single-Processor 환경에서, 실행 중인 프로세스는 한 개 이상 있을 수 없다.
  • 만일, 프로세스들이 여러 개가 있다면, 나머지 프로세스들은 CPU가 자유로워질 때까지 대기해야 한다.

(1) 스케줄링 큐 (Scheduling Queue)

  • 프로세스가 시스템에 들어오면, 이들은 Job Queue에 놓이게 된다. Job Queue는 시스템의 모든 프로세스가 있다.
  • Main Memory에 존재하며, Ready 상태에서 실행을 대기하는 Process들은 Ready Queue라 불리는 리스트에 있게 된다.
  • 특정 입출력 장치를 대기하는 프로세스들의 리스트를 device queue라고 한다.

(2) 스케줄러 (Scheduler)

레디 큐에 프로세스를 옮기는 것은 잡 스케줄러, 또는 long-term 스케줄러라고 한다. 프로세스를 프로세서에 할당하는 것은 CPU 스케줄러 또는 short-term scheduler라고 한다.

  • 프로세스들은 life-time동안 다양한 스케줄링 큐들 사이에 있게 된다.

  • 프로세스들은 대용량 메모리에 저장되어, 실행될 때까지 기다리게 된다.

  • long -term Scheduler (Job Scheduler)은 대용량 메모리에서 프로세스들을 선택하여 실행하기 위해 Memory로 load한다.

  • Short-term Scheduler (CPU Scheduler)은 실행 준비가 완료된 프로세스들 중에서 선택하여, 해당 프로세스에게 CPU를 할당한다.

  • long-term Scheduler은 short-term Scheduler에 비해 실행 빈도수가 적은 편이다.

  • long-term scheduler은 degree of Multi-Programming(메모리에 있는 프로세스들의 수)를 컨트롤 한다.

  • Short-term Scheduler은 CPU를 위해 자주 새로운 프로세스를 선택해야 한다. (빈도수가 높다)

    • 100ms마다 한 번씩 실행되기도 하므로, short-term scheduler은 실행 속도가 매우 빨라야 한다.

(3) 문맥 교환 (Context Switch)

프로세스가 실행되다가 인터럽트가 발생해 운영체제가 개입하여 프로세서에 할당된 프로세스를 바꾸는 것을 말한다. 프로세서가 다른 프로세스로 스위치할 때, 시스템은 작업중이던 프로세스의 상태를 저장하고 새로운 프로세스의 상태를 로드한다. 컨텍스트 스위치는 오버헤드가 발생하는 작업이기 때문에 너무 자주 일어나면 성능을 저하한다.

  • Interrupt가 발생하면, 시스템은 interrupt 처리가 끝난 후에 context를 복구할 수 있도록 현재 실행 중인 프로세스의 context를 저장할 필요가 있다.
  • Context는 프로세스의 PCB에 표현된다. (CPU 레지스터 값, 프로세스 상태, 메모리 관리 정보 등)
  • CPU를 다른 프로세스로 switch하기 위해서는, 이전의 프로세스의 상태를 보관하고, 새로운 프로세스의 보관된 상태를 복구하는 작업이 필요하다. 이 작업을 Context Switch라고 부른다.
  • Context Switch가 일어나면, 커널은 과거 프로세스의 context를 PCB에 저장하고 실행할 프로세스의 saved context를 복구한다.
  • Context Switch가 진행되는 동안, 시스템은 어떤 useful work도 할 수 없기 때문에 이 시간은 overhead이다.

3.3 프로세스에 대한 연산 (Operation on Process)

(1) 프로세스 생성 (Process creation)

요약 : 프로세스는 트리 구조로 이루어져 있다. 즉, 부모 프로세스가 자식 프로세스를 만든다. PCB에 저장된 pid값으로 프로세스를 식별하는데, 이는 운영체제가 정해준 고유 번호다. 프로세스 생성은 플라나리아 번식과 유사하다. 시스템 콜의 fork()함수를 호출하면 부모 프로세스는 자신과 똑같은 자식 프로세스를 생성한다. 자식 프로세스는 exec()를 통해 내용을 모두 바꾼다.

  • 실행되는 동안 프로세스는 여러 개의 새로운 프로세스를 생성할 수 있다.

  • 생성하는 프로세스를 부모(parent)프로세스, 새롭게 생성되는 프로세스를 자식(child)프로세스라고 한다.

    • 자식 프로세스는 또 새롭게 다른 프로세스를 생성할 수 있으며, 그 결과 프로세스 트리를 형성한다.
  • UNIX, Linux와 같은 대부분의 현대 운영체제들은 프로세스 식별자 (pid)를 사용하여 프로세스를 구분한다.

  • pid는 보통 정수이며, 시스템의 각 프로세스에게 고유한 값을 가지도록 할당한다.

<프로세스가 새로운 프로세스를 생성할 때, 두 가지 방법!>
(1) 부모는 자식과 병행하여 실행을 계속한다. (continues to execute concurrently)
(2) 부모는 일부 또는 모든 자식이 실행을 종료할 때까지 기다린다.

  • 새로운 프로세스들(자식 프로세스들)의 주소 공간 측면에서 볼 때 아래와 같이 두 경우로 나타날 수 있다.
    (1) 자식 프로세스는 부모 프로세스의 복사본이다.

    • UNIX에서 새로운 프로세스는 fork() system call을 통해 생성된다.

    • 새로운 자식 프로세스는 부모 프로세스의 주소 공간의 복사본으로 구성된다.

    • 기존의 부모 프로세스와 새롭게 생성된 자식 프로세스는 fork()후의 명령어에서부터 실행을 계속한다.

    • 한 가지 차이점은 부모 프로세스는 자식 프로세스의 pid, 자식프로세스는 0이 return 된다.

      (1) 자식 프로세스는 부모 프로세스의 복사본이다.

(2) 프로세스 종료 (Process Termination)


exit()을 호출하면 프로세스를 종료시킬 수 있다. 부모 프로세스가 자식 프로세스보다 먼저 종료되면 자식 프로세스는 그 상위 프로세스를 부모 프로세스로 바라본다. 자식 프로세스가 종료되었는데, 부모 프로세스가 자식 프로세스가 반환한 정보를 회수하지 않으면 자식 프로세스는 종료되었음에도 정보가 메모리에 남아있는 좀비 프로세스가 된다.


3.4 프로세스 간 통신 (Interprocess Communication)

(1) 공유 메모리 시스템 (Shared-Memory Systems)

공유 메모리는 게시판이다. 특정 메모리 공간을 두 프로세스가 함께 사용하며 정보를 주고 받는다. 커널을 거치지 않기 때문에 속도가 빠르지만 메모리에 동시 접근하는 것을 방지하기 위해 프로그래머가 따로 구현을 해줘야 한다.

  • 공유 메모리를 사용하는 IPC에서는 통신하는 프로세스들이 Shared Memory 영역을 구축해야 한다.
  • (생산자-소비자) 문제를 해결하기 위해 공유 메모리 시스템이 사용될 수 있다.

(2) 메시지 전달 시스템 (Message-Passing Systems)

메시지 패싱은 우편이다. 송신 프로세스가 정보를 받는 수신 프로세스에게 커널을 통해 정보를 전달하며, 수신 프로세스도 커널에 접근해 정보를 수신한다. 메시지 패싱은 컨텍스트 스위치가 발생하기 때문에 속도가 느리다. 다만 커널이 기본적인 기능을 제공하므로 공유 메모리 방식에 비해선 구현이 쉽다.
메시지 전달 방식은 동일한 주소 공간을 공유하지 않고도 프로세스들이 통신하고, 동기화할 수 있도록 한다. (특히 분산 시스템에서 유용함)

Naming

  1. Direct Communication:
    연결은 정확히 두 프로세스들 사이에서만 연관된다.
  2. Indirect Communication:
    연결은 두 개 이상의 프로세스들과 연관될 수 있다.

동기화 (Synchronization)

메시지 패싱의 동기화 문제를 해결하기 위함!
1. Blocking send: 수신자가 메시지를 받을 때까지 송신자는 block된다.
2. Non-Blocking send: 송신자가 메시지를 보내고 작업을 계속한다.
3. Blocking receive: 메시지를 수신할 때까지 수신자는 block된다.
4. Non-Blocking receive: 수신자가 유효한 메시지나 Null 메시지를 받는다.

버퍼링 (Buffering)

  1. 무용량 (Zero capacity): 큐의 최대 길이가 0이다. 이 경우, sender는 receiver가 메시지를 수신할 때까지 기다려야 한다.
  2. 유한 용량 (bounded capacity): 큐는 유한한 길이 n을 가진다. 큐가 꽉 찼을 때, sender는 큐가 이용 가능할 때까지 blocking한다.
  3. 무한 용량 (unbounded capacity): 무한한 길이를 가지며, sender는 어느 경우에도 blocking되지 않는다.

3.5 IPC 시스템의 사례


3.6 클라이언트 서버 환경에서의 통신

(1) Sockets

소켓은 서버와 클라이언트가 통신하는 방식이다. IP주소와 포트 정보가 있으면 클라이언트는 네트워크를 통해 서버 프로세스에 접근할 수 있다. RPC(Remote Procedure Calls)는 프로세스와 프로세스가 네트워크로 이어져 있을 때 발생하는 호출을 말한다.

(2) Pipes

파이프는 부모 프로세스와 자식 프로세스가 통신할 때 사용하는 방식이다. 말 그대로 프로세스 사이에 파이프를 두고 정보를 주고 받는 건데, 파이프는 단방향 통신만 가능하기 때문에 양방향으로 정보를 주고 받으려면 두 개의 파이프가 필요하다. (파이프는 파일이다) 파이프에 이름을 붙인 named pipe를 사용하면 꼭 부모-자식 관계가 아니더라도 파이프를 이용해 통신할 수 있다.

profile
steadily, off the wall

0개의 댓글