본문 바로가기
카테고리 없음

프로세스

by SpearZero 2024. 9. 11.

프로세스의 개념

프로세스란 실행 중인 프로그램을 말한다. 프로세스는 현대의 컴퓨팅 시스템에서 작업의 단위이다.

프로세스

프로세스의 현재 활동의 상태는 프로그램 카운터 값과 프로세서 레지스터의 내용으로 나타낸다.

 

프로세스의 메모리 배치는 다음과 같다.

  • 텍스트 섹션
    • 실행 코드
  • 데이터 섹션
    • 전역 변수
  • 힙 섹션
    • 프로그램 실행 중에 동적으로 할당되는 메모리
  • 스택 섹션
    • 함수를 호출할 때 임시 데이터 저장 장소(함수 매개변수, 복귀 주소 및 지역변수 등)

텍스트 및 데이터 섹션은 고정되며 프로그램 실행 시간 동안 크기가 변하지 않는다. 스택 및 힙 섹션은 프로그램 실행 중에 동적으로 줄어들거나 커질 수 있다.

 

프로그램 그 자체는 프로세스가 아니다.

  • 프로그램
    • 명령어 리스트를 내용으로 가진 디스크에 저장된 파일과 같은 수동적인 존재
  • 프로세스
    • 다음에 실행할 명령어를 지정하는 프로그램 카운터와 관련 자원의 집합을 가진 능동적인 존재

프로세스 상태

프로세스는 실행되면서 다양한 상태를 가지게 된다.

  • new : 프로세스가 생성중이다.
  • running : 명령어들이 실행되고 있다.
  • waiting : 프로세스가 어떤 이벤트(입출력 완료 또는 시그널 수신)가 일어나기를 기다린다.
  • ready : 프로세스가 처리기에 할당되기를 기다린다.
  • terminated : 프로세스의 실행이 종료되었다.

프로세스 제어 블록

각 프로세스는 운영체제에서 프로세스 제어 블록(process control block, PCB)에 의해 표현된다.

 

PCB는 다음과 같은 정보를 포함한다.

  • 프로세스 상태
    • new, ready, waiting, halted(정지) 상태 등을 포함
  • 프로그램 카운터
    • 프로세스가 다음에 실행할 명령어의 주소를 가리킨다.
  • CPU 레지스터들
    • 나중에 프로세스가 다시 스케줄 될 때 계속 올바르게 실행되도록 하기 위해서 인터럽트 발생 시 상태 정보가 저장되어야 한다.
  • CPU 스케줄링 정보
    • 프로세스 우선순위, 스케줄 큐에 대한 포인터, 다른 스케줄 매개변수를 포함한다.
  • 메모리 관리 정보
    • 기준(base) 및 한계(limit) 레지스터의 값, 페이지 테이블 또는 세그먼트 테이블 등과 같은 정보를 저장한다.
  • 회계(accounting) 정보
    • CPU 사용 시간, 시간 제한, 계정 번호, 프로세스 번호 등을 포함한다.
  • 입출력 상태 정보
    • 프로세스에 할당된 입출력 장치들과 열린 파일의 목록 등을 포함한다.

PCB는 프로세스를 시작하거나 다시 시작시키는데 필요한 모든 데이터를 위한 저장소의 역할을 한다.

스레드

  • 단일 제어 스레드
    • 프로세스가 한 번에 한 가지 일만 할 수 있음
  • 현대의 운영체제는 한 프로세스가 다수의 실행 스레드를 가질 수 있도록 허용한다.
    • 여러 스레드가 병렬로 실행 될 수 있다.

프로세스 스케줄링

다중 프로그래밍의 목적

  • CPU 이용률 최대화
    • 항상 어떤 프로세스가 실행되도록 해야 한다.
  • 프로세스 스케줄러는 코어에서 실행 가능한 여러 프로세스 중에서 하나의 프로세스를 선택한다.

현재 메모리에 있는 프로세스 수를 다중 프로그래밍 정도라고 한다.

 

프로세스의 동작

  • I/O 바운드 프로세스
    • 계산보다 I/O에 많은 시간을 소비하는 프로세스
  • CPU 바운드 프로세스
    • 계산에 더 많은 시간을 사용한다.

스케줄링 큐

  • 준비 큐(ready queue)
    • 프로세스가 시스템에 들어가면 준비 큐에 들어가 준비 상태가 되어 CPU 코어에서 실행되길 기다린다.
  • 대기 큐(wait queue)
    • I/O 완료와 같은 특정 이벤트가 발생하기를 기다리는 프로세스가 들어가는 큐

프로세스는 대기 상태에서 준비 상태로 전환되는 상태를 반복하다 종료된다. 종료 시점에 모든 큐에서 제거되고 PCB 및 자원이 반환된다.

CPU 스케줄링

CPU 스케줄러의 역할

  • 준비 큐에 있는 프로세스 중에서 선택된 하나의 프로세스에 CPU 코어를 할당하는 것
  • CPU 스케줄러는 CPU를 할당하기 위한 새 프로세스를 자주 선택해야 한다.
    • I/O 바운드 프로세스는 I/O 요청을 대기하기 전 몇 밀리초 동안만 실행
    • CPU 바운드 프로세스에서 CPU 코어를 강제로 제거해야 함
      • CPU 바운드 프로세스는 CPU 코어를 오래 사용하고 싶지만, CPU 스케줄러는 이를 허용하지 않음

문맥 교환

인터럽트는 운영체제가 CPU 코어를 현재 작업에서 뺏어 내어 커널 루틴을 실행할 수 있게 한다.

 

인터럽트가 발생하면 시스템은 인터럽트 처리가 끝난 후애 문맥을 복구할 수 있도록 현재 실행중인 프로세스의 문맥을 저장할 필요가 있다.

 

문맥 교환(Context Switching)

  • CPU 코어를 다른 프로스세로 교환하려면 이전의 프로세스의 상태를 보관하고 새로운 프로세스의 보관된 상태를 복구하는 작업이 필요하다. 이를 문맥 교환이라고 한다.

문맥 교환이 일어나면, 커널은 과거 프로세스의 문맥을 PCB에 저장하고, 실행이 스케줄된 새로운 프로세스의 저장된 문맥을 복구한다.

 

문맥 교환이 진행되는 동안 시스템은 아무런 유용한 일을 못하기 때문에 문맥 교환 시간은 순수한 오버헤드 시간이다.

프로세스간 통신

프로세스가 협력을 허용하는 환경을 제공하는 이유

  • 정보 공유(information sharing)
    • 여러 응용 프로그램들이 동일한 정보에 관심이 있을 수 있으므로, 그러한 정보를 병행적으로 접근할 수 있는 환경을 제공해야 한다.
  • 계산 가속화(computation speedup)
    • 특정 태스크를 빨리 실행하려면, 그것을 서브태스크로 나누어 이들 각각의 다른 서브태스크들과 병렬로 실행되게 해야 한다.
  • 모듈성(modularirty)
    • 시스템 기능을 별도의 프로세스들 또는 스레드들로 나누어, 모듈식 형태로 시스템을 구성하기를 원할 수도 있다.

협력적인 프로세스들은 데이터를 교환할 수 있는, 즉 서로 데이터를 보내거나 받을 수 있는 프로세스간 통신(interprocess communication, IPC) 기법이 필요하다.

 

프로세스간 통신에서 사용되는 모델

  • 공유 메모리(shared memeory)
    • 협력 프로세스들이 사용하는 공유 메모리 영역이 구축된다. 프로세스들은 그 영역에 데이터를 읽고 쓴다.
    • 공유 메모리 영역을 구축할 때만 시스템 콜이 사용되고, 메모리 영역이 구축되면 일반적인 메모리 접근으로 취급되어 커널의 도움이 필요없다.
  • 메시지 전달(message passing)
    • 협력 프로세스들 사이에 교환되는 메시지를 통하여 통신이 이루어진다.
    • 충돌을 회피할 필요가 없다. 따라서 적은 양의 데이터를 교환하는데 유용하다.
    • 일반적으로 메시지 전달에 시스템 콜을 사용한다.

공유 메모리 방식과 메시지 전달 방식

공유 메모리 시스템에서의 프로세스 간 통신

일반적으로 운영체제는 한 프로세스가 다른 프로세스의 메모리에 접근하는 것을 금지한다.

  • 공유 메모리는 둘 이상의 프로세스가 이 제약조건(메모리 접근 금지)을 지키지 않는것에 동의해야 한다.
  • 프로세스들은 공유 영역에 읽고 씀으로서 정보를 공유할 수 있다.

협력하는 프로세스의 일반적인 패러다임

  • 생산자 프로세스
    • 정보를 생상한다.
  • 소비자 프로세스
    • 정보를 소비한다.

생산자와 소비자 프로세스들이 병행으로 실행되려면, 생산자가 정보를 채우고, 소비자가 소모할 수 있는 항목(아이템)들의 버퍼가 사용 가능해야 한다.

 

버퍼는 공유 메모리 영역에 존재하며, 두 가지 유형의 버퍼가 사용된다.

 

버퍼의 종류

  • 무한 버퍼(unbounded buffer)
    • 버퍼 크기의 한계가 없다. 생산자는 항상 새로운 항목을 생산할 수 있다.
  • 유한 버퍼(bounded buffer)
    • 버퍼의 크기가 고정되어 있다. 버퍼가 비어져 있으면 소비자가 대기해야 하고, 버퍼가 차있으면 생산자가 대기해야 한다.

메시지 전달 시스템에서의 프로스세간 통신

메시지 전달 방식은 주소 공간을 공유하지 않고도 프로세스들이 통신을 하고, 그들의 동작을 동기화할 수 있도록 허용하는 기법을 제공한다.

 

메시지 전달 시스템은 send(messsage)와 receive(message) 연산을 제공한다.

 

프로세스 P와 Q가 통신을 원하면, 반드시 서로 메시지를 보내고 받아야 한다. 이들 사이에 통신 연결(communication link)가 설정되어야 한다.

 

하나의 통신 연결과 send() / receive() 연산을 논리적으로 구현하는 방법

  • 직접 또는 간접 통신
  • 동기식 또는 비동기식 통신
  • 자동 또는 명시적 버퍼링

명명

직접 통신

  • 통신을 원하는 각 프로세스는 통신의 수신자 또는 송신자의 이름을 명시해야 한다.
  • send(P, message)
    • 프로세스 P에 메시지를 송신한다.
  • receive(Q, message)
    • 프로세스 Q로부터 메시지를 수신한다.
  • 연결의 특성
    • 연결이 자동으로 구축된다.
    • 연결은 두 프로세스 사이에만 연관된다.
    • 통신하는 프로세스들의 각 쌍 사이에는 정확하게 하나의 연결만 존재한다.

간접 통신

  • 메시지들은 메일박스(mailbox) 또는 포트(port)로 송신되고, 메일박스로 부터 수신된다.
  • send(A, message)
    • 메시지를 메일박스 A로 송신한다.
  • receive(A, message)
    • 메시지를 메일박스 A로부터 수신한다.
  • 연결의 특성
    • 한 쌍의 프로세스들 사이의 연결은 공유 메일박스를 가질 때만 구축된다.
    • 연결은 두 개 이상의 프로세스들과 연관될 수 있다.
    • 통신하고 있는 각 프로세스 사이에는 다수의 서로 다른 연결이 존재할 수 있고, 각 연결은 하나의 메일박스에 대응된다.

동기화

프로세스간 통신 send / receive를 설계하기 위한 다양한 옵션

  • blocking send
    • 송신하는 프로세스는 수신 프로세스 또는 메일박스가 수신할 때 까지 봉쇄된다.
  • nonblocking send
    • 송신하는 프로세스가 메시지를 보내고 작업을 재시작한다.
  • blocking receive
    • 메시지가 이용 가능해질 때 까지 수신 프로세스가 봉쇄된다.
  • nonblocking receive
    • 수신하는 프로세스가 유효한 메시지 또는 null을 받는다.

버퍼링

직접 또는 간접 통신하는 프로세스들에 의해 교환되는 메시지는 임시 큐에 들어 있다.

 

큐를 구현하는 세가지 방식

  • 무용량(zero capacity)
    • 큐의 최대 길이가 0이다. 송신자는 수신자가 메시지를 수신할 때 까지 기다려야 한다.
  • 유한 용량(bounded capacity)
    • 큐는 유한한 길이 n을 가진다.
    • 버퍼가 찰 때까지 송신자는 메시지를 계속 보낼 수 있다. 버퍼가 차면 송신자는 봉쇄 되어야 한다.
  • 무한 용량(unbounded capacity)
    • 큐는 잠재적으로 무한한 길이를 가진다.
    • 송신자는 절대 봉쇄되지 않음