OS-5) 프로세스

topics 700-컴퓨터과학 704 운영체제
types 이론 학습
tags

프로세스

실행 중인 프로그램이자 시스템 안에서의 작업 단위다.

프로세스란

  • 프로그램: passive entity (수동적 존재)
  • 프로세스: active entity (능동적 존재)
  • 하나의 프로그램은 여러 프로세스로 만들어질 수 있음
  • 종료 시 재활용 가능한 모든 자원을 반환해야 함
  • 일반적으로 프로세스 식별자(PID)를 이용하여 식별되고 관리됨
  • CPU에 프로세스/스레드를 다중 배정함 → 병행성을 얻음

프로그램 카운터 (PC)

프로세스는 PC(프로그램 카운터)를 가진다.

  • PC는 다음 실행할 명령어 주소를 저장하는 곳
  • 단일 스레드 프로세스: 하나의 PC를 가짐
  • 다중 스레드 프로세스: 스레드마다 하나의 PC를 가짐

자원 처리량에 따른 종류

  • I/O-bound 프로세스: CPU보다 I/O에 시간을 더 많이 소모함
  • CPU-bound 프로세스: I/O보다 CPU에 시간을 더 많이 소모함

참고: 프로세서(Processor)가 CPU다.


프로세스 상태

스크린샷 2024-04-16 오전 11.06.40.png

주의: preempt 방향 반대다!!!

상태 설명
new 프로세스가 생성 중인 상태
ready 프로세스가 스케줄러에 의해 CPU 사용권을 받기 위해 대기하고 있는 상태
running CPU에서 프로세스가 실행 중인 상태
waiting 프로세스가 어떤 사건이 일어나기를 대기하고 있는 상태
terminated 프로세스가 종료된 상태

프로세스 메모리 할당

Pasted image 20240416205457.png
영역 설명
text(=code) 실행할 프로그램의 코드(명령어의 집합)가 저장됨
data 전역 변수와 정적 변수가 저장됨
stack 잠시 사용되었다가 사라지는 데이터(매개변수, 리턴값, 지역변수 등)를 저장. 함수 호출 시 할당, 반환 시 소멸. ==컴파일 타임에 크기 결정==
heap 동적 데이터 영역, 메모리 주소 값에 의해서만 참조됨. ==런타임에 크기가 결정됨==

스레드

프로세스 안의 제어 흐름이다.

  • text(code), data 영역의 자원을 공유한다
  • CPU 코어(물리적 코어)가 많으면 스레드(논리적 코어)도 늘어난다
Pasted image 20240416213116.png

문맥 교환 (Context Switch)

CPU 레지스터 단위에서 일어난다.

PCB (프로세스 제어 블록)

프로세스 제어 블록(Process Control Block)을 이용하여 문맥 교환이 이뤄진다.

시간은 오버헤드지만 반드시 필요하다.

PCB에 저장하는 정보

정보 설명
프로세스 상태 new, ready, running, waiting, terminated
PC(프로그램 카운터) 다음에 실행할 명령어 주소
CPU 레지스터 모든 프로세스 관련 레지스터 내용
CPU 스케줄링 정보 우선순위, 스케줄링 큐 포인터
메모리 관리 정보 프로세스에게 할당된 메모리
회계 정보 사용된 CPU 양, 실행 후 경과된 클럭 타임, 시간 제한 등
I/O 상태 정보 프로세스에게 할당된 I/O 장치

문맥 전환 과정

스크린샷 2024-04-16 오후 9.27.24.png

프로세스 연산

프로세스 생성

부모 프로세스가 자식 프로세스를 생성하는 것 (트리 구조를 형성)

주소 공간

  • 자식은 부모와 주소 공간을 공유한다
  • 그 주소 공간을 복제한 후 그 공간에 프로그램을 적재

옵션

자원 공유 옵션

  • 부모와 자식은 모든 자원을 공유한다
  • 부모와 자식은 부분 집합을 공유한다
  • 부모와 자식은 자원을 공유하지 않는다

실행 옵션

  • 부모와 자식은 병행하게 실행된다
  • 부모는 자식이 종료될 때까지 기다린다

UNIX 예시

  1. fork() 시스템 콜이 새로운 프로세스를 생성
    • 부모를 그대로 복사 (OS data except PID + binary)
    • 주소 공간 할당
  2. fork 다음에 이어지는 exec() 시스템 콜을 통해 새로운 프로그램을 메모리에 올림

프로세스 종료

exit() 시스템 콜을 사용하여 삭제 요청을 함. 종료된 후 자원은 OS에 반환됨.

종료 제어

abort(): 부모가 자식 프로세스 실행을 종료

  • 자식이 할당할 수 있는 자원보다 더 많은 자원을 할당한 경우
  • 자식에게 배정된 일이 더 이상 필요치 않는 경우
  • 부모가 종료 중에 있지만 OS에서 부모가 먼저 종료한 자식 프로세스의 실행을 허용하지 않는 경우

wait(): 부모가 자식 프로세스의 종료를 기다림

  • 자식 프로세스 상태값을 반환

좀비/고아 프로세스

종류 설명
좀비 프로세스 자식이 부모보다 먼저 종료되고 부모가 아직 wait() 호출을 하지 않은 상태의 자식 프로세스. wait을 통해 자식을 회수하지 않으면 자식이 사용하던 리소스를 회수하지 못함. 이 상황을 방지하기 위해 자식이 먼저 종료되더라도 최소한의 정보를 가지고 있음
고아 프로세스 부모가 자식보다 먼저 종료된 자식 프로세스. 부모가 제거되어서 부모 PID가 init 프로세스로 설정됨. init 프로세스가 wait을 대신 호출하여 리소스를 회수

프로세스 통신 (IPC)

필요 이유: 정보 공유, 계산 속도 향상, 모듈성, 편리 등

스크린샷 2024-04-16 오후 10.43.47.png

공유 메모리 모델 (Shared Memory)

  • 프로세스 사이에 공유되는 메모리 영역
  • 해당 통신은 사용자 프로세스의 통제 하에 이뤄짐 (OS 개입 X)
  • 사용자 프로세스가 접근 시 서로 동기화할 수 있는 기법을 제공해야 함 (OS-7) 프로세스 동기화-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EB%8F%99%EA%B8%B0%ED%99%94.html)에 있는 게 다 이걸 해결하기 위한 것)
  • 중개자 없이 곧바로 메모리 접근 가능 == 빠름

생산자 소비자 문제 해결

유한 버퍼를 이용해서 해결한다.

#define BUFFER_SIZE 10
typedef struct {
    . . .
} item;
item buffer[BUFFER_SIZE];
int in = 0;
int out = 0;

// 생산자
item next_produced;
while (true) {
    /* produce an item in next produced */
    while (((in + 1) % BUFFER_SIZE) == out)
        ; /* do nothing - 버퍼 가득 참 */
    buffer[in] = next_produced;
    in = (in + 1) % BUFFER_SIZE;
}

// 소비자
item next_consumed;
while (true) {
    while (in == out)
        ; /* do nothing - 버퍼 비어있음 */
    next_consumed = buffer[out];
    out = (out + 1) % BUFFER_SIZE;
    /* consume the item in next consumed */
}

메시지 전달 모델 (Message Passing)

  • 공유 변수를 접근하지 않고 서로 통신
  • OS(커널을 이용)가 메시지 전달 수단을 제공, OS가 동기화 기법을 제공
  • 연산: send, receive

직접 통신

  • 서로 상대방을 명시적으로 명명해야 함
    • send(P, message), receive(Q, message)
  • 링크는 자동적으로 설정
  • 통신하는 프로세스 쌍에는 하나의 링크만 생성되고 존재한다
  • 연결은 보통 양방향이다

간접 통신

  • 메시지는 메일박스로 보내지고 수신된다
    • 각 메일박스는 고유한 ID를 가진다
    • 프로세스는 서로 공유하는 메일박스를 통해 통신이 가능하다
    • send(A, message), receive(A, message)
  • 메일 박스 공유: 누가 메시지를 수신하는가의 문제 (송신자 입장)
    • 링크는 최대 두 프로세스 사이에만 설정
    • 한 번에 한 프로세스만 receive 가능
    • 시스템이 임의로 수신자 선택, 송신자는 누가 수신자인지 통지

메시지 전달 방식

방식 설명
blocking 동기적
non-blocking 비동기적
rendezvous 송수신자 모두 blocking 방식일 때

버퍼링

링크에 접속된 메시지 큐다.

종류 설명
zero capacity 메시지를 큐에 저장 X, 송신자는 수신자가 메시지 받을 때까지 대기 (rendezvous)
bounded capacity n개의 메시지를 저장할 수 있는 길이 큐, 큐가 가득 찰 시 송신자는 대기
unbounded capacity 무한개의 메시지를 저장할 수 있는 길이 큐, 송신자는 절대 대기하지 않음

메시지 전달 모델 예시

Socket

  • IP 주소와 포트 번호로 정의됨
  • 프로세스 식별하는 숫자가 포트 번호
스크린샷 2024-04-17 오후 1.39.28.png

원격 프로시저 콜 (RPC)

스크린샷 2024-04-17 오후 2.10.30.png
  • 별도의 원격 제어를 위한 코딩 없이 원격에서 함수나 프로시저를 실행 가능하게 하는 프로세스 간 통신 기술
  • RPC는 클라이언트가 원격 프로시저 호출을 자신의 프로시저 호출처럼 한다
  • stubs(스텁): 서버 쪽 실제 프로시저에 상응하는 클라이언트 쪽 proxy
    1. RPC는 스텁을 찾고 매개변수 전달
    2. 스텁은 원격 포트를 찾고 매개변수 정리(marshall)
    3. 스텁은 메시지 전달 기법으로 서버에게 전송

파이프

두 프로세스가 통신할 수 있는 도관 역할을 한다.

ordinary pipes (익명 파이프)

  • 파이프를 만든 프로세스 이외에 접근 불가
  • 단방향
  • 부모 프로세스가 파이프 만들고 자식 프로세스가 통신을 위해 파이프를 사용 (= 통신 프로세스는 부모-자식 관계여야 함)
  • 표준 생산자-소비자 스타일 통신을 허용
    • 생산자와 소비자는 양쪽 끝에서 데이터를 쓰고 읽는다

named pipes

  • 양방향
  • 통신하는 프로세스끼리 부모-자식 관계 아니어도 됨

관련 문서