본문 바로가기
운영체제

[OS] 프로세스

by 파스텔코랄 2023. 3. 13.

프로세스 개념

운영체제는 다양한 프로그램을 실행

  • 배치 시스템(batch) : 작업(jobs)
  • 시간 공유 시스템(Time-sharing) : 사용자 프로그램 또는 작업(tasks)
  • 작업(job)프로세스(process)라는 용어를 거의 상호 교환적으로 사용

프로세스

  • 실행 중인 프로그램

프로세스 종류

  • 텍스트(text) : 프로그램 코드
  • 데이터(data) : 전역 변수, 정적 변수
  • 스택(stack) : 임시 데이터(함수 매개 변수, 반환 주소, 로컬 변수)
  • 힙(heap) : 런타임 동안 동적으로 할당된 메모리
  • 프로그램 카운터, 프로세서 레지스터 : 현재 활동

주소 공간(Adress space)

 


프로세스 상태

프로세스가 실행되면 상태가 변경

  • 신규(New) : 프로세스를 만드는 중
  • 실행(Running) : 명령이 실행되는 중
  • 대기(Waiting : blocked, sleep) : 프로세스가 일부 이벤트가 발생하기를 기다리는 중
  • 준비(Ready) : 프로세스가 프로세서에 할당되기를 기다리는 중
  • 종료(Terminated) : 프로세스 실행이 완료

 


프로세스 상태의 다이어그램

 


프로세스 제어 블록

데이터 관리를 위한 메타데이터

  • 프로세스용 프로세스 제어 블록, 태스크용 태스크 제어 블록
      예) Linux에서 task_struct
  • 파일에 대한 파일 제어 블록
      예) Unix 파일 시스템의 vnode

 


프로세스 제어 블록

각 프로세스와 관련된 정보

  • 프로세스 ID
  • 프로세스 상태 : New, ready, running, waiting, terminated
  • 프로그램 카운터(Program counter) : 다음 명령의 주소
  • CPU 레지스터: 스택 포인터, 범용 레지스터 등
  • CPU 스케줄링 정보: 우선 순위 등
  • 메모리 관리 정보: 페이지 테이블, 세그먼트 테이블 등
  • 회계(Accounting) 정보: 사용된 CPU의 양 등
  • I/O 상태 정보: 파일 열기, 할당된 I/O 장치 등

 


프로세스 스케줄링 대기열

준비 대기열(Ready queue)

  • 기본 메모리에 상주하고 실행을 기다리는 모든 프로세스의 집합

장치 대기열(Device queues)

  • I/O 장치를 대기하는 프로세스 집합

프로세스가 다양한 대기열 간에 마이그레이션됨

준비 대기열 및 다양한 I/O 장치 대기열

프로세스 스케줄링 표현

 


스케줄러

CPU 스케줄러

다음에 실행할 프로세스를 선택하고 CPU를 할당

프로세스 분류

  • I/O-bound 프로세스
      계산 시간보다 입출력 작업에 더 많은 시간을 할애
      짧은 CPU 버스트 수
  • CPU-bound 프로세스
      계산 더 많은 시간을 소비
      몇 번의 매우 긴 CPU 버스트

스케줄링 알고리즘은 이후 강좌에서 다룬다.


컨텍스트 전환

CPU가 다른 프로세스로 전환될 때 시스템은

  • 이전 프로세스의 상태를 저장
  • 새 프로세스에 대해 저장된 상태를 로드

컨텍스트 전환 시간은 오버헤드

  • 전환하는 동안 시스템이 유용하게 작동하지 않는다.

컨텍스트 전환 시간은 하드웨어에 따라 다르다

  • 레지스터 세트가 다르다.

프로세스 간 CPU 전환

 


프로세스 생성

프로세스 생성

  • 상위 프로세스는 하위 프로세스를 생성
  • 이는 다른 프로세스를 생성
  • 마지막으로, 그것은 프로세스의 트리를 형성

하위 프로세스에 리소스 필요

  • OS 제공, 또는
  • 부모 공유

자원 공유

  • 부모와 자식들은 모든 자원을 공유
  • 자식이 부모 리소스의 하위 집합을 공유하거나
  • 부모와 자식이 리소스를 공유하지 않는다.

실행

  • 부모와 자식이 동시에 실행되거나
    부모는 자식이 종료될 때까지 기다린다.

주소 공간

  • 자식이 부모를 복제
  • 자식에게 새 프로그램이 로드

프로세스 생성 요약

  • OS 커널 내에 PCB를 생성
  • 메모리 공간을 할당
  • 이진 프로그램을 로드
  • 프로그램을 초기화

UNIX 예제

  • fork 시스템 호출은 새로운 프로세스를 만든다.
      부모의 PCB를 복제
      메모리 공간을 할당
  • execve 시스템 호출은 포크 뒤에 사용
      디스크에서 이진 프로그램을 로드
      초기화

 


프로세스 종료

프로세스는 마지막 문을 실행하고 운영 체제에 자체 삭제(exit)를 요청

  • 하위 프로세스는 상태 값을 상위 프로세스로 반환(wait)
  • 하위 프로세스의 리소스는 운영 체제에서 할당 해제

상위 프로세스의 실행을 종료(abort: 비정상적 종료)

  • 자식이 할당된 리소스를 초과한 경우
  • 하위에 할당된 작업이 더 이상 필요하지 않은 경우

일부 운영 체제에서는 상위 항목이 종료된 경우 하위 항목이 존재할 수 없다. 프로세스가 종료되면 모든 하위 프로세스도 종료되어야 한다.

  • 계단식 종단(cascading termination) : 모든 자식, 손자 등이 종료
  • 종료는 운영 체제에 의해 시작

상위 프로세스는 wait() 시스템 호출을 사용하여 하위 프로세스의 종료를 대기할 수 있다. 호출이 종료된 프로세스의 상태 정보 및 PID를 반환

  • pid = wait(&status);

좀비(zombie) : 대기 중인 상위 프로세스가 없는 경우 (wait()가 호출되지 않음)

고아(orphan) : 부모가 wait를 호출하지 않고 종료된 경우

 


프로세스 생성 및 종료

C 프로그램은 별도의 프로세스를 포킹(forking)

int main()
{
    pid_t pid;
    /* fork another process */
    pid = fork();				(1)

    if (pid < 0) { /* error occurred */
        fprintf(stderr, "Fork Failed");
        exit(-1);
    }
    else if (pid == 0) { /* child process */	(2)
        execlp("/bin/ls", "ls", NULL);		(3)
    }
    else { /* parent process */			(4)
        /* parent will wait for the child to complete */
        wait (NULL);				(5)
        printf ("Child Complete");
        exit(0);				(6)
    }
}

fork, exec, exit, wait 시스템 콜

 


협력 프로세스(Cooperating Processes)

독립 과정(Independent)

  • 다른 프로세스의 실행에 의해 영향을 받거나 영향을 줄 수 없다.

협력 프로세스(Cooperating)

  • 다른 프로세스의 실행에 의해 영향을 받거나 영향을 줄 수 있다.

협력 프로세스 장점

  • 정보 공유
      예) 공유 파일 등...
  • 계산 속도 향상
      하위 작업을 통한 병렬 실행
  • 모듈성
      시스템 기능을 별도의 작업으로 나눈다.

소통 모델(Communications models)

 


생산자-소비자 문제(Producer-Consumer Problem)

생산자 프로세스는 소비자 프로세스에 의해 소비되는 정보를 생산

  • 어셈블리 코드 : 컴파일러생산, 어셈블러에 의해 소비
  • 객체 모듈 : 어셈블러생산, 로더(loader)에 의해 소비

unbounded 버퍼

  • 버퍼 크기에 실질적인 제한 X

bounded 버퍼

  • 고정 버퍼 크기로 가정

공유 메모리 솔루션(Shared memory solution)

  • 공유 데이터(Shared data)
#define BUFFER_SIZE 10

typedef struct {
  . . .
} item;

item buffer[BUFFER_SIZE];
int in = 0;
int out = 0;
  • in: 다음으로 비어있는 위치
  • out: 처음으로 차있는 위치
  • 버퍼가 비어 있을 때 : in == out
  • 버퍼가 꽉 찼을 때 : ((in + 1)%BUFFER_SIZE) == out

생산자 프로세스(Producer process)

item nextProduced;

while (true) {
	/* Produce an item in nextProduced */
	while (((in + 1) % BUFFER SIZE) == out); /* do nothing -- no free buffers */
	buffer[in] = nextProduced;
	in = (in + 1) % BUFFER SIZE;
}

소비자 프로세스(Consumer process)

item nextConsumed;

while (true) {
	while (in == out); // do nothing -- nothing to consume
	nextConsumed = buffer[out];
	out = (out + 1) % BUFFER SIZE;
	/* consume the item in nextConsumed */
	return item;
}

메시지 전달(Message passing)

  • 프로세스는 주소 공간을 공유하지 않고 서로 통신

두 가지 기본 작업

  • 메세지 송신(send)
  • 메세지 수신(receive)

P와 Q가 소통할때 필요한 것

  • P, Q 사이에 소통의 링크를 구축
  • 송신(send)/수신(receive)를 통한 메시지 교환

통신 링크 구현

  • 물리적(예: 하드웨어 버스, 네트워크 등)
  • 논리적(예: 직접/간접(direct/indirect), 동기/비동기(synchronous/asynchronous) 등)

 


직접 통신

프로세스는 서로 명시적으로 이름을 지정

  • 송신(P, 메시지) : 프로세스 P에게 메시지를 송신(to P)
  • 수신(Q, 메시지) : 프로세스 Q로부터 메시지를 수신(from Q)

프로세스의 식별자가 변경되는 경우

  • 이전 식별자에 대한 모든 참조를 찾아 변경해야 한다.

 


간접 통신

메시지는 사서함과 주고받는다.

  • 사서함(Mailbox)
      프로세스에서 메시지를 넣고 메시지를 제거할 수 있는 개체
      각 사서함은 고유 ID
      프로세스는 사서함을 공유하는 경우에만 통신 가능
  • 운영
      사서함을 새로 만든다.
      사서함을 통해 메시지를 주고받는다.
      사서함을 없앤다.
  • 원시 요소 정의:
      송신(A, 메시지) : 사서함 A에게 메시지를 송신(to A)
      수신(A, 메시지) : 사서함 A로부터 메시지를 수신(from A)

 


동기화(Synchronization)

메시지 전달(message passing)은 차단(blocking) 또는 비차단(non-blocking)

차단(blocking)은 동기

  • 송신 차단 : 메시지가 수신될 때까지 송신자를 차단
  • 수신 차단 : 메시지가 사용가능 할 때까지 수신자를 차단

비차단(non-blocking)은 비동기

  • 송신 비차단 : 송신자가 메시지를 전송하고 계속
  • 수신 비차단 : 수신자가 유효한 메시지 또는 null을 수신

 



요약

  • 프로세스
      실행 중인 프로그램
      1. 메모리 주소 공간(텍스트/데이터/스택/히프)
      2. 레지스터
      3. 기타 리소스(열린 파일, 세마포어 등)
  • PCB(Process Control Block)
      각 프로세스와 관련된 정보
     저장
  • CPU 스케줄러
      다음에 실행할 프로세스를 선택하고 CPU를 할당
  • 프로세스의 트리
      상위 프로세스는 하위 프로세스를 생성하고 하위 프로세스는 다른 프로세스를 생성
  • 대부분의 경우 프로세스는 서로 협력해야 한다.

'운영체제' 카테고리의 다른 글

[OS] 동기화 도구  (0) 2023.04.03
[OS] CPU 스케줄링  (0) 2023.03.27
[OS] 쓰레드와 프로세스  (0) 2023.03.20
[OS] 서비스, 시스템 콜, 구조, 부팅 과정  (0) 2023.03.09
[OS] 정의, 구조, 작업, 구성 요소  (0) 2023.03.06

댓글