[운영체제] 프로세스(Process)

유니야·2023년 1월 3일

운영체제(OS)

목록 보기
3/5
post-thumbnail

✏️ 프로세스 (Process)

실행 중인 프로그램을 말한다.
즉, 디스크에 있는 프로그램이 메모리에 로드되면 프로세스가 된다.

💻 프로세스의 영역

  • 스택(Stack)
  • 힙(Heap)
  • 데이터(Data)
  • 코드(Code)

💻 프로세스 문맥(Process Context)

프로세스의 특정 시점 상태를 표현하는 정보.

  • 하드웨어 문맥(Hardware Context)
    CPU의 수행 상태를 나타내는 것
    프로그램 카운터(Program Counter), 각종 레지스터(Register)에 저장하고 있는 값
  • 주소 공간(Address space)
    코드, 데이터, 스택으로 구성된 프로세스만의 독자적인 주소 공간
  • 커널 상 문맥
    프로세스를 관리하기 위한 자료구조
    PCB(Process Control Block), 프로세스 커널 스택(Process Kernel Stack)

✏️ 프로세스의 상태

프로세스의 상태는 프로세스가 실행됨에 따라 달라진다.
1. New: 프로세스가 처음 생성된 상태
2. Ready: 메모리 등 다른 조건을 만족한 상태에서, 프로세스가 CPU에 할당되기를 기다리는 상태
3. Running: 프로세스가 할당되어 CPU를 잡고 명령을 수행 중인 상태
4. Waiting: 프로세스가 어떠한 이벤트가 발생하기를 기다리는 상태. CPU를 할당해도 당장 명령을 수행할 수 없는 상태
5. Terminated: 프로세스가 실행을 마쳤을 때, 아직 완전히 프로세스가 제거되지 않은 상태

✏️ PCB(Process Control Block)

운영체제가 각 프로세스를 관리하기 위해 프로세스 별로 보유하고 있는 자신의 정보묶음. 커널의 주소 공간에 존재한다.

  • 구성 요소
  1. 운영체제가 관리 상 사용하는 정보
  2. CPU 수행 관련 하드웨어 값
  3. 메모리 관련
  4. 파일 관련

✏️ Context Switch

프로세스가 실행되다가 인터럽트가 발생해 CPU를 한 프로세스에서 다른 프로세스로 넘겨주는 과정. CPU의 입장에서는 PCB가 바뀌는 것을 말한다.

CPU내 존재하는 레지스터들은 현재 실행 중인 프로세스 관련 데이터들로 채워진다. 실행 중인 프로세스가 변경되면 CPU 내 레지스터들의 값도 변경되어야 하는데, 변경되기 전 이전 프로세스의 데이터를 어딘가에 저장해둬야 한다. 또한 새로 실행되는 프로세스가 아니라면 이전에 실행됐을 때 레지스터들이 지니고 있던 데이터들을 불러와 이어서 실행해야 한다. 이 과정을 컨텍스트 스위칭이라고 한다. 실행되는 프로세스의 변경 과정에서 발생하는 컨텍스트 스위칭은 시스템에 많은 부담을 준다.
운영체제는 CPU를 내어주는 프로세스의 상태를 해당 프로세스의 PCB에 저장하고, CPU를 새롭게 얻는 프로세스의 상태를 PCB에서 읽어온다.

스레드의 Context Switching

✏️ Process Scheduling

  • 멀티프로그래밍(Multiprogramming): CPU를 최대한 사용하기 위해 몇몇 프로세스를 항상 실행시키는 것
  • 시간 공유(Tiem Sharing): 프로세스 간에 CPU를 빠르게 전환함으로서 CPU의 시간을 분할해서 쓰고, 사용자가 각 프로그램이 실행되는 동안 서로 상호작용 할 수 있도록 만드는 것

    위와 같은 멀티프로그래밍과 시간 공유의 목적을 달성하기 위해 프로세스 스케줄러는 CPU에서 프로그램 실행을 위해 사용 가능한 프로세스를 선택한다. 이 때 어떤 프로세스를 프로세서에 할당할 것인가 결정하는 일프로세스 스케줄링(Process Scheduling)라고 한다.

프로세서 당 하나의 Running 시스템을 가질 수 있고, 여러 프로세스가 존재하는 경우 나머지는 CPU가 Free상태가 될 때까지 기다려야 하기 때문에 적절한 프로세스 스케줄링이 필요하다.

💻 프로세스 스케줄링을 위한 큐(Queue)

Job Queue, Ready Queue, Device Queue

💻 스케줄러의 종류

  1. Long-Term Scheduler (Job Scheduler)
  2. Short-Term Scheduler (CPU Scheduler)
  3. Medium-Term Scheduler (Swapper)

✏️ Process Management

프로세스는 동시에 실행될 수 있고, 동적으로 생성되거나 삭제될 수 있다.

1. Process Creation (프로세스 생성)

프로세스는 부모 프로세스가 자식 프로세스를 생성하는 방식으로 만들어지기 때문에 트리(계층)구조로 되어있다. 프로세스는 PCB에 저장된 pid(process identifier)를 통해 식별되고 관리된다. 프로세스에게는 자원이 필요한데, 이는 운영체제로부터 받거나 부모와 공유한다.

1) fork
이 시스템 콜은 부모를 그대로 복사하여 현재 프로세스와 pid만 다른 프로세스를 생성한다.

2) exec
이 시스템 콜은 새로운 프로그램을 메모리에 올려 실행시킨다. 프로세스는 exec()시스템 콜을 통해 다른 프로그램을 수행할 수 있는데, 이렇게 생겨난 프로그램은 기존 프로세스와는 별개의 프로세스이다.

3) wait
프로세스 A가 이 시스템 콜을 호출하면 커널은 자식이 종료될 때까지 A를 Sleep(blocked)시킨다. 그리고 자식 프로세스가 종료되면 커널이 A를 깨워 Ready상태로 만든다.

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

1) 자발적 종료
현재 프로세스는 자신의 일이 끝나면 exit() 명령어를 통해 운영체제에 이를 알린다. 순서는 다음과 같다.
(1) 부모 프로세스가 현재 프로세스의 실행을 종료
(2) wait을 통해 자식으로부터 상태 값을 수집
(3) 프로세스의 각종 자원들은 운영체제에 반납

2) 비자발적 종료 (kill)
부모 프로세스가 자식 프로세스의 수행을 종료시키는 것을 말한다. 이 경우 부모 프로세스는 단계적으로 자식들을 종료시켜 나간다.

✏️ Cooperating Processes

프로세스는 동작 방식에 따라 독립적 프로세스(Independent Process), 협력 프로세스(Cooperating Process)로 나뉜다.

  • 독립적 프로세스(Independent Process)
    각자 주소 공간을 가지고 수행된다. 원칙적으로 하나의 프로세스는 다른 프로세스의 수행에 영향을 미치지 못한다.
  • 협력 프로세스(Cooperating Process)
    프로세스 협력 메커니즘(IPC, Interprocess Communication)을 통해 하나의 프로세스가 다른 프로세스 수행에 영향을 미칠 수 있다.

💻 프로세스 협력 메커니즘(IPC, Interprocess Communication)의 모델

1) 공유 메모리(Shared Memory)
서로 다른 프로세스 간 일부 주소 공간을 공유하게 하는 방식. 커널을 거치지 않기 때문에 속도가 빠르지만 메모리에 동시에 접근하는 것을 방지하기 위해서는 별도의 구현이 필요하다.
2) 메시지 패싱(Message Passing)
주소 공간을 공유하지 않고 커널을 통해 메시지를 주고 받는다. Context Switch가 발생하기 때문에 속도가 느리지만, 커널이 기본 기능을 제공하기 때문에 공유 메모리 방식보다 구현이 쉽다.

(1) Direct Communication

  • 통신하려는 프로세스의 이름을 명시적으로 표시해야 한다.

  • 통신하고자 하는 두 프로세스들이 서로의 이름을 알고있다면 자동으로 링크(link)가 생성된다. 링크는 양방향 또는 단방향이다.

  • 제한된 모듈성 -> 어떤 프로세스의 이름을 변경한다면 연결되어 있는 모든 Sender와 Receive 프로세스의 이름을 바꿔야 한다.

    (2) Indirect Communication

  • 고유 ID를 가지고 있는 Mailbox를 통해 메시지를 전달한다.

  • 서로 Mailbox를 공유하고 있는 경우 링크가 생성되어 통신할 수 있다.

  • 하나의 링크가 셋 이상의 프로세스와 관련될 수 있다.

3) 파이프 (Pipe)
프로세스 사이에 파이프를 두고 정보를 주고 받는 방식. 하나의 파이프 당 단방향 통신만 가능하므로 양방향 통신을 하려면 두 개의 파이프가 필요하다.

💻 메시지 패싱의 동기화 문제 해결 방식

메시지 패싱의 동기화 문제를 해결하기 위한 방식으로는 크게 두 가지가 있다.
- Blocking (동기식)
- Non-Blocking (비동기식)

  • Blocking send: 수신자 (프로세스 or Mailbox)가 메시지를 받을 때까지 발신자는 block 된다.
  • Blocking receive: 수신자가 메시지를 받을 때까지 block 된다.
  • Non-blocking send: 발신자가 메시지를 보내고 작업을 계속한다.
  • Non-blocking receive: 수신자는 유효한 메시지 또는 null 메시지를 받는다.

0개의 댓글