운영체제 (8) - 프로세스, PCB, Context switch

@JHSHIN·2023년 3월 30일
0
post-thumbnail

운영체제 수업을 수강하며 정리한 내용을 작성하려고 합니다.

Process의 자원 및 생성

  • 프로세스에 할당된 자원과 Abstraction
    • 메모리: (virtual) Address space
    • 스토리지: (opened) files
    • 네트워크: (opened) sockets
  • 프로세스의 메모리 공간
    • text: 프로그램 코드
    • data: 전역 변수와 데이터
    • heap: 동적으로 할당된 메모리 구역 (e.g., malloc, free)
    • stack: 일시적인 데이터(e.g., 함수 호출시 넘겨주는 파라미터)
  • 프로세스의 주소 공간
    • 프로그램의 메모리 관점은 물리적인 메모리와 구분됨

Process from program

  • 디스크 이미지(실행 파일) vs (메모리) 프로세스
  • 같은 프로그램이 서로 다른 프로세스로 동작할 수 있음
  • 디스크 이미지의 header를 파일 시스템의 메타데이터라고 함
  • 프로세스는 storage에 저장된 프로그램으로부터 변환되어 메모리로 로드됨

Context switch (문맥 전환)

  • CPU에서 수행되는 프로세스가 바뀌는 것
  • 언제 발생하는가?
    • Time quantum expires : 타임슬라이스가 지날 때
    • I/O 호출 (인터럽트)
    • 기타 등등
  • 현재 수행중인 프로세스를 (old) P라고 할 때, (old) P가 위의 조건에 해당되면 (old) P의 동작을 멈추고 새롭게 수행할 프로세스 (new) P를 정하고 (new) P를 실행시킴
  • (new) P를 정하는 과정을 스케줄링(Scheduling)이라고 한다.

OS가 Context switch를 지원하는 방법

  • Context switch: OS는 (old) P의 상태를 저장, 새로운 프로세스의 저장된 상태를 불러옴
  • 운영체제의 구현: 프로세스의 상태를 저장하기 위한 구조체가 필요함
  • Process Control Block (PCB or TCB)
    • 프로세스는 PCB로 표현됨 - 구조체
    • 커널 메모리에 위치
    • 현대 OS에서 흔히 사용됨
  • context switching은 PCB를 저장하고 새로운 프로세스를 골라 로드하는 것

Process Control Block

각 프로세스와 관련된 정보들

  • 프로세스 상태
  • 프로그램 카운터
  • CPU 레지스터
  • CPU 스케줄링 정보 : Priority 정보
  • 메모리 관리 정보
  • 계산 정보
  • I/O 상태 정보

시스템콜은 context switching을 하는가?

시스템콜은 context switch를 하지 않는다. 다른 프로세스를 실행하는 것이 아닌 현재 프로세스에서 모드가 바뀌는 것이다. 즉, context switch가 아닌 mode switch을 한다.

Context switching의 병목

  • Context-switch time = CPU 병목
    • 교체를 수행하는 동안에는 CPU가 유저의 프로세스를 수행하지 않음
    • 한정된 물리 CPU를 여러 프로세스가 공유하게 하기 위한 비용
    • OS가 복잡하고, 프로세스의 Context가 다양할수록 context switch가 오래 걸림
  • 프로세서 구조에 따라 병목이 상이함
    • CISC
      • 복잡한 명령어 셋으로 구성 = 효율이 높지만 클럭 속도가 저하
      • 복잡한 회로 → 물리적 공간 차지 → 레지스터 용량 저하
      • e.g., 인텔 펜티엄 프로세서
    • RISC
      • 간단한 명령어 셋으로 구성 = 클럭 속도를 높임 = 빠른 수행 속도
      • 절약된 물리적 공간에 보다 많은 레지스터 장착
        • Context switch시 레지스터 내용 변경에 상대적으로 큰 오버헤드가 생김
        • e.g., ARM 프로세서, Sparc

Process State

  • 필요성

    • 프로세스 중 특정 이벤트가 와야 다음 실행이 가능한 프로세스가 존재
      • Asleep: I/O 대기 or 동기화
      • IO event가 종료될 때까지 실행을 지속할 수 없음
  • Process state: 각 프로세스의 입장에서 특정 시점의 상태를 나타냄

    • New: process is created.
    • Running: process is being executed.
    • Waiting: process is waiting for some event to occur
      • I/O completion
    • Ready: process is waiting to be assigned to a processor
    • Terminated: process has finished execution
  • 커널은 프로세스를 state별 queue를 통해 관리

    • PCB를 가리키는 큐
    • e.g., ready queue, waiting queue, run queue

프로세스 상태의 전환

Process APIs

  • 프로세스의 생성, 삭제, 실행과 관련된 시스템콜 API들
  • 새로운 프로세스를 생성하고 실행하는 과정
    • 새로운 프로세스를 생성한다 → fork()
    • 새로운 프로세스를 위한 새로운 주소 공간을 생성한다 = 새로운 프로세스가 사용할 프로그램을 로드한다 → exec()

새로운 (자식) 프로세스 생성: fork()

  • 생성되는 프로세스들은 process identifier (pid)라는 고유 식별자로 구분됨
  • 프로세스 생성을 용이하게 하기 위하여
    • 실행 중인 프로세스에서 다른 프로세스를 만들 수 있도록 함
    • 최초의 프로세스 (부모)로부터 타 프로세스(자식)가 순차적으로 생성
    • 프로세스들의 트리 계층을 구성
    • 최초의 프로세스 = init

fork()의 동작

  1. 새로운 프로세스 (자식)에 필요한 데이터 구조를 할당
  2. fork()를 호출하는 프로세스 (부모)의 주소 공간 복사
  3. 자식은 프로세스로서 동작할 준비가 됨
  4. fork()는 부모와 자식에게 각각 다른 값을 return 함
    1. parent: 자식 프로세스의 pid 반환
    2. child: 0 반환
  5. Child 생성 후 부모는 계속 실행되거나(concurrently), 자식이 종료될 때까지 기다리거나(wait)
    1. 시스템콜 wait()
profile
We Need Better UX

0개의 댓글