Computer Science/🔒 Operating System

[운영체제/OS] 프로세스

posted by sangmin

"KOCW - 반효경 교수님의 운영체제" 를 듣고 정리한 내용입니다.

Process

프로세스의 개념

  • Process is a program in execution
  • 프로세스의 문맥 (context)
    • 특정 시점을 놓고 봤을 때 CPU 수행 상태를 나타내기 위해 필요한 모든 요소들
    1. CPU 수행 상태를 나타내는 하드웨어 문맥
      • PC (Program Counter)
      • 각종 register
    2. 프로세스의 주소 공간
      • code, data, stack
    3. 프로세스 관련 커널 자료구조
      • PCB (Process Control Block)
      • kernel stack

프로세스의 상태 (Process State)

CPU는 하나밖에 없기 때문에 프로세스는 상태를 변경하며 수행된다.

(사진 출처 - 블로그)

  • Running : CPU를 잡고 instruction을 수행 중인 상태
  • Ready : CPU를 기다리는 상태 (메모리 등 다른 조건은 모두 만족)
  • Blocked (wait, sleep)
    • CPU를 잡아도 당장 instruction을 수행할 수 없는 상태
    • ex) 디스크에서 파일을 읽어와야 하는 경우 (I/O 요청)
  • Suspended (append)
    • 외부적인 이유로 프로세스의 수행이 정지된 상태 (중기 스케줄러 도입으로 생긴 상태)
    • 프로세스가 통째로 디스크로 swap out된 상태
    • ex) 메모리에 너무 많은 프로세스가 올라와 있어 시스템이 중단됨
  • New : 프로세스가 생성 중인 상태
  • Terminated : 수행이 끝난 상태

Blocked vs Suspended

  • Blocked : 자신이 요청한 event가 만족되면 Ready
  • Suspended : 외부에서 resume 해주어야 Active (Running, Ready, Blocked)

PCB (Process Control Block)

PCB는 프로세스 당 하나씩 생성되어 운영체제가 각 프로세스를 관리하기 위해 유지하는 정보이다.

(사진 출처 - 블로그)

  1. OS가 관리상 사용하는 정보
    • process state, process ID
    • scheduling information, priority
  2. CPU 수행 관련 하드웨어 값
    • 프로세스의 문맥을 표시하기 위한 정보들
    • program counter, register
  3. 메모리 관련
    • code, data, stack의 위치 정보
  4. 파일 관련
    • open file descriptors 등

문맥 교환 (Context Switch)

CPU는 굉장히 빠른 자원이기 때문에 한 프로세스가 CPU를 장악하는 것이 아닌 짧은 시간 간격으로 얻었다가 뺏기는 과정을 반복한다. CPU를 뺏겼다가 다시 얻었을 때 처음부터 실행하는 것이 아닌, 뺏기던 시점의 문맥을 기억해뒀다가 그 시점부터 실행하는 메커니즘이다.

  • CPU를 한 프로세스에서 다른 프로세스로 넘겨주는 과정
    • CPU를 내어주는 프로세스의 상태를 그 프로세스의 PCB에 저장
    • CPU를 새롭게 얻는 프로세스의 상태를 PCB에서 읽어옴

시스템콜이나 인터럽트 발생 시 반드시 문맥 교환이 일어나는 것이 아니다.

(사진 출처 - KOCW 운영체제 강의)

timer interrupt는 해당 프로세스의 CPU 할당 시간이 끝나 다른 프로세스에게 CPU를 넘길 의도를 가진 인터럽트이다. I/O 요청은 프로세스 상태가 Blocked 되어 당장 instruction 실행이 불가능하다. 따라서 이와 같은 경우에는 사진에 있는 아래 과정처럼 커널에서 사용자 모드로 돌아올 때 문맥 교환이 일어난다.

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

  • Job queue
    • 현재 시스템 내에 있는 모든 프로세스의 집합
  • Ready queue
    • 현재 메모리 내에 있으면서 CPU를 할당받아 실행되기를 기다리는 프로세스의 집합
  • Device queues
    • I/O device의 처리를 기다리는 프로세스의 집합

프로세스들은 놀이공원에서 여러 놀이기구를 기다렸다 타는 것처럼 각 큐들을 오가며 수행된다.

스케줄러 (Scheduler)

  • Long-term scheduler (장기 스케줄러, job scheduler)
    • 시작 프로세스 중 어떤 것들을 ready queue로 보낼지 결정
    • 프로세스에 memory를 주는 문제
    • 시분할 시스템에는 보통 장기 스케줄러가 없고, 무조건 ready 상태로 간다.
  • Short-term scheduler (단기 스케줄러, CPU shceduler)
    • 어떤 프로세스를 다음번에 running 시킬지 결정
    • 프로세스에 CPU를 주는 문제
  • Medium-term scheduler (중기 스케줄러, Swapper)
    • 여유 공간 마련을 위해 프로세스를 통째로 메모리에서 디스크로 쫓아냄
    • 프로세스로부터 memory를 뺏는 문제

지금의 시스템은 장기 스케줄러 없이 시작하면 일단 메모리를 할당해준다. 이 경우 너무 많은 프로그램이 메모리에 올라가면 문제가 될 수 있다. 이러한 것을 조절해주는 것이 중기 스케줄러이고, 스와퍼가 일부 프로그램을 메모리에서 통째로 쫓아내준다.

Thread

  • A thread is a basic unit of CPU utilization, 프로세스 하나에 CPU 수행 단위만 여러개를 두고 있는 것
  • Thread의 구성
    • program counter
    • register set
    • stack space
    프로세스 상태나 각종 자원은 공유하나 PC, register, stack과 같이 CPU 수행과 관련된 정보는 별도로 갖고 있다.
  • Thread끼리 공유하는 부분 (=task)
    • code section
    • data section
    • OS resources
  • Thread 장점
    • 다중 스레드로 구성된 태스크 구조에서는 하나의 스레드가 blocked 상태인 동안에도 다른 스레드가 running 되어 빠른 처리 가능
    • 동일한 일을 수행하는 다중 스레드가 협력하여 높은 처리율과 성능 향상을 얻을 수 있음
    • 병렬성을 높일 수 있음

Benefits of Threads

  1. Responsiveness
    • ex) multi-threaded Web
    웹 브라우저가 여러 스레드를 갖고 있으면 한 스레드가 이미지 서버에 이미지 파일을 다시 요청했을 때 다른 스레드가 이미 렌더링한 html 텍스트라도 화면에 보여줌으로써 사용자는 더 빨리 화면을 볼 수 있음
  2. Resource Sharing
    하나의 프로세스를 만들고 그 안에 CPU 수행 단위를 여러개 만들게 되면 code, data, 각종 자원을 공유하여 자원을 효율적으로 사용할 수 있음
  3. Economy
    • creating and CPU switching
    프로세스를 하나 만드는 것은 오버헤드가 꽤 크다. 하지만 프로세스 안에 스레드를 하나 더 만드는 것은 밥상에 숟가락 얹는 것처럼 간편하다.
    문맥 교환 또한 오버헤드가 굉장히 크다. 반면 프로세스 내부에서 스레드 간 CPU switching 은 동일한 주소 공간을 쓰고 있기 때문에 더 간단하다.
  4. Utilization of Multi-Processor Architectures
    • ex) 10,000 by 10,000 행렬의 곱셈 연산
    각각의 스레드가 서로 다른 CPU에서 병렬적으로 일을 할 수 있다.

참고