[Operating Systems] Process (1)

dandb3·2023년 3월 4일
0

Operating system

목록 보기
5/31

프로세스의 개념

프로세스

  • program in execution

프로세스의 문맥(context)

  • CPU 수행 상태를 나타내는 하드웨어 문맥
    • Program Counter : 다음 실행될 명령을 가리키는 register. (instruction pointer, IP라고도 함.)
    • 각종 register
  • 프로세스의 주소 공간
    • code, data, stack
  • 프로세스 관련 커널 자료 구조
    • PCB (Process Control Block)
    • Kernel stack
      • kernel stack에는 프로세스 별로 stack이 따로 존재한다. 관리의 수월함(?)을 위해서.

프로세스의 상태

  • Running
    • CPU를 잡고 instruction을 수행중인 상태
  • Ready
    • CPU를 기다리는 상태. (프로그램이 메모리에 올라가 있고, 준비가 되어 있어서 CPU만 받으면 바로 동작할 수 있다.)
  • Blocked(wait, sleep)
    • CPU를 주어도 당장 instruction을 실행할 수 없다.
    • Process 자신이 요청한 event(I/O 등)가 즉시 만족되지 않아서 이를 기다리는 상태
    • ex) 디스크에서 파일을 읽어오는 경우
  • New : 프로세스가 생성중인 상태 (메모리에 올라가는 중, 등등)
  • Terminated : 수행(execution)이 끝난 상태 (메모리에서 내려가는 상태), 애초에 프로세스는 프로그램이 실행중인 상태에 해당하므로 프로세스가 종료되고 난 상태는 애초에 프로세스가 아니므로 종료되는 도중의 상태를 의미하게 된다.

  • 프로세스는 CPU를 점유하고 있거나, I/O device나 공유데이터를 사용하고 있거나, 그 이외에는 Queue에 대기중인 상태이다. 즉, 항상 무언가를 하고 있는 상태 (혹은 대기중)이다.

Process Control Block (PCB)

  • PCB
    • 운영체제가 각 프로세스를 관리하기 위해 프로세스당 유지하는 정보.
    • 구조체로 이루어져 있고, 다음과 같은 정보가 담겨 있다.
      1. OS가 관리상 사용하는 정보
        • Process state, Process ID
        • Scheduling information, priority
      2. CPU 수행 관련 하드웨어 값
        • Program counter, registers
      3. 메모리 관련
        • Code, data, stack관련 정보
      4. 파일 관련
        • Open file descriptors
      5. 기타
        • 부모, 자식을 가리키는 task_struct
    • <include/linux/sched.h>에 있는 task_struct로 이루어져 있고, 각 프로세스는 doubly linked list로 연결되어 있다. kernel은 현재 실행중인 프로세스를 current pointer로 가리키게 된다.

  • 프로세스의 종류
    • I/O-bound process : 계산하는 시간보다 I/O를 하는 시간이 더 긴 프로세스
    • CPU-bound process : 계산하는 시간이 I/O를 하는 시간보다 더 긴 프로세스

문맥 교환 (Context Switch)

  • CPU를 한 프로세스에서 다른 프로세스로 넘겨주는 과정.
  • CPU가 다른 프로세스에게 넘어갈 때 운영체제는 다음을 수행한다.
    • CPU를 내어주는 프로세스의 상태를 PCB에 저장.
    • CPU를 새롭게 얻는 프로세스의 상태를 PCB에서 읽어온다.
  • 여기서 궁금한 점
    1. Program Counter가 옮겨져야 운영체제의 코드가 실행될 수 있을 텐데, 그러면 이전의 Program Counter는 어떤 방식으로 저장이 되는 것인가? 운영체제의 코드가 실행되기 전에는 user mode 이므로 PCB에 직접 접근해서 값을 변경시킬 수는 없을거고, 그러면 다른 특수한 메모리 영역이나 레지스터에 그 값을 저장시키는 것인가??
    2. CPU가 운영체제로 넘어갔을 때 운영체제의 instruction을 실행하기 위해서 레지스터가 쓰이게 될 텐데, 이 때에 기존에 존재하던 레지스터들의 정보는 어떤 방식으로 기록되는가?
    3. Memory map이 정확히 무엇인지?
  • System call이나 interrupt 발생 시 반드시 Context Switch가 일어나는 것은 아니다.
  • (1)번과 (2)번이 좀 다른데, (1)의 경우 시간이 오래 걸리지 않는 system call이나 interrupt의 경우 User mode -> kernel mode -> User mode(기존 동일한 프로세스)의 순서로 CPU를 소유하게 된다. (2)의 경우 User mode -> kernel mode -> User mode는 동일하지만 timer interrupt나 I/O와 같은 시간이 오래 걸리는 system call의 경우 이후에 다른 프로세스에게 CPU를 넘겨주어야 한다. 그러므로 A의 문맥이 저장되고, 그 문맥이 B의 문맥으로 넘어가게 되는 Context Switch가 일어나게 된다.
  • 하지만 (1)의 경우 kernel mode로 갔다가 다시 user mode로 돌아오는 과정에서 CPU의 상태, 메모리 위치 등을 기록하는 정도의 동작은 일어나지만, 그 동작이 (2)에서 일어나는 Context Switch의 경우보다 오버헤드가 훨씬 적기 때문에 (1)의 경우를 Context Switch라고 보지는 않는다.(ex : cache memory flush같은 경우 굉장히 오버헤드가 큼)
  • 아래는 그냥 context switch 관련 그림. 근데 개인적인 생각으로는 이 그림에서 오해해서는 안 되는 것이, P0를 실행하다가 P1을 실행하다가 다시 P0를 실행하게 되는 것은 맞는데, CPU scheduling에 의해서 순서가 결정되는 것이지 바로 P0로 다시 돌아가는 것은 아니다. 이 과정을 그림에서는 ... 으로 표현해 놓았다.
  • context switch 시간동안은 시스템이 의미있는 일을 하지 못하기 때문에 pure overhead가 발생한다.

프로세스를 스케줄링하기 위한 큐

  • Job Queue
    • 현재 시스템 내에 있는 모든 프로세스의 집합
  • Ready Queue
    • 현재 메모리 내에 있으면서 CPU를 잡아서 실행되기를 기다리는 프로세스의 집합
  • Device queues
    • I/O device의 처리를 기다리는 프로세스의 집합
  • 프로세스들은 각 큐들을 오가면서 수행된다.

스케줄러 (Scheduler)

  • Long-term scheduler (장기 스케줄러 또는 job scheduler)
    • 시작 프로세스 중 어떤 것들을 ready queue로 보낼지 결정
    • 프로세스에 memory(각종 자원)를 주는 문제
    • degree of Multiprogramming(메모리에 동시에 올라가 있는 프로세스의 수)을 제어
    • time sharing system에는 보통 장기 스케줄러가 없음 (무조건 ready 상태임)
  • Short-term scheduler(단기 스케줄러 또는 CPU scheduler)
    • 어떤 프로세스를 다음번에 running시킬지 결정
    • 프로세스에 CPU를 주는 문제
    • 충분히 빨라야 함 (milisecond 단위)
  • Medium-term scheduler(중기 스케줄러 또는 Swapper)
    • 여유 공간 마련을 위해 프로세스를 통째로 메모리에서 디스크로 쫓아냄
    • 프로세스에게서 memory를 뺏는 문제
    • degree of Multiprogramming을 제어함.
    • 현대 운영체제에서 Long-term의 역할이 필요없는 이유이다.
  • 너무 프로세스가 적게 메모리에 올라와 있으면 CPU가 놀게 되므로 성능 저하, 너무 많이 올라와 있으면 각각의 프로세스가 메모리에 올라와 있는 부분이 너무 적어지므로 제대로 실행이 안됨. 그래서 이 때 Swapper가 동작해서 특정 프로세스들의 memory를 뺏게 된다. -> 이 때 기존의 프로세스 상태만으로는 뺏긴 메모리를 기술 불가능함. ready 상태라서 CPU를 받자마자 동작할 수 있는 것도 아니고, 당연히 running 상태도 아니며, 특정한 I/O나 event를 기다리고 있는 상태도 아니기 때문이다. 그래서 이러한 배경 때문에 Suspended(Stopped)상태가 추가로 필요하다.

프로세스의 상태 (2)

  • Suspended(stopped)
    • "외부적인 이유"로 프로세스의 수행이 정지된 상태
    • 프로세스는 통째로 디스크에 swap out된다.
    • ex) 사용자가 프로그램을 일시 정지시킨 경우(break key, Ctrl + Z)
      메모리에 너무 많은 프로세스가 올라와 있는 경우 시스템에서 프로세스를 잠시 중단시킴.
  • Blocked : 프로세스 자신이 요청한 event가 만족되면 Ready상태가 된다.
  • Suspended : "외부"에서 resume 해 주어야 Active가 된다.

확장된 프로세스 상태도

  • 애초에 커널 관점에서 프로세스를 어떻게 바라볼 것인가? 에 대한 내용이므로 프로세스가 커널 모드로 들어갔을 때에 프로세스는 멈추거나 그런 상태로 보지 않고 똑같이 running이지만 kernel 모드로 동작중인 것으로 생각한다.
  • 상태도를 보면 더 잘 이해할 수 있을듯.

CPU Scheduling

  • CPU scheduler : ready queue에 있는 process 중에서 하나를 선택해서 CPU core를 할당해 준다.
    • I/O-bound process의 경우 I/O 요청 전에 아주 잠깐동안만 CPU를 사용하게 된다.
    • CPU-bound process의 경우 CPU사용시간이 더 오래 필요하기 때문에 한 번에 더 오랜시간동안 CPU를 사용할 것 같지만, 그렇지는 않다. timer interrupt때문에 그런듯.
  • swapping : memory가 너무 많이 사용되고 있는 경우 등의 이유로 memory에서 process를 지우는 과정. memory -> swap disk로 process의 정보들을 이동시킨다.

참고자료

  • 출처 :
    - ABRAHAM SILBERSCHATZ ET AL., OPERATING SYSTEM CONCEPTS, NINTH EDITION, WILEY, 2013
    - 반효경, 운영체제와 정보기술의 원리, 이화여자대학교 출판부, 2008
  • 반효경, 운영체제, 2014-1
profile
공부 내용 저장소

0개의 댓글