SY 개발일지
article thumbnail
Published 2023. 6. 2. 00:14
[운영체제] 프로세스 CS 정리/강의

프로세스의 개념

프로세스는 실행중인 프로그램이다

  • 프로세스의 문맥(context)
    • 특정 시점을 봤을 때 이 프로세스가 어디까지 실행을 했는가를 규명
      • PC가 어디를 가리키고 있는가
      • 레지스터에 어떤 값을 넣어두고 있는가
      • 현재 메모리에 어떤 내용을 담고 있는가
      • 어떤 instruction까지 실행했는가
    • CPU 수행 상태를 나타내는 하드웨어 문맥
      • Program Counter(PC)
        • 현재 메모리의 어느 부분을 실행하고 있는지 가리키는 레지스터셋
      • 각종 register
    • 프로세스의 주소 공간 - 메모리와 관련
      • code, data, stack
    • 프로세스 관련 커널 자료 구조
      • PCB(Process Control Block)
      • Kernel stack
        • 커널은 어떤 프로세스든 간에 접근 가능하기 때문에 프로세스 별로 커널에 별도의 스택을 가지고 있음

프로세스의 상태 (Process State)

프로세스는 상태(state)가 변경되며 수행된다

  • Running
    • CPU를 잡고 instruction을 수행중인 상태
  • Ready
    • CPU를 기다리는 상태(메모리 등 다른 조건을 모두 만족하고)
  • Blocked (wait, sleep)
    • CPU를 주어도 당장 instruction을 수행할 수 없는 상태
    • Process 자신이 요청한 event(예: I/O)가 즉시 만족되지 않아 이를 기다리는 상태
    • (예) 디스크에서 file을 읽어와야 하는 경우
  • New: 프로세스가 생성중인 상태
  • Terminated: 수행(execution)이 끝난 상태

프로세스가 CPU에 줄서고 있다. 차례대로 CPU에서 Running이 되는데, 만약에 그 프로세스가 Disk의 입출력이 필요하다면 상태를 blocked로 바꾸고 Disk I/O queue 뒤에 줄 선다. 그러면 Disk는 요청이 들어온 것들을 차례로 실행한다. 만약에 디스크의 작업이 끝나면 CPU에 인터럽트를 걸어 자신의 일이 끝났음을 알린다. CPU에는 인터럽트가 들어왔기 때문에 하던 작업을 잠시 멈추고, CPU의 제어권이 운영체제(커널)에게 넘어가게 된다. 그러면 CPU가 여러 작업을 하는데 그 중 하나가 프로세스의 상태를 다시 ready으로 바꿔서 CPU의 작업이 가능하도록 만든다.

자원에는 소프트웨어 자원(공유 데이터 등)도 있는데, 이러한 경우 한번에 하나의 작업만 가능하기 때문에 줄을 서야 한다. 이럴 경우 상태가 다시 blocked 이 된다. 이처럼 어떤 작업이 필요하느냐에 따라 줄서는 queue가 바뀐다.

Process Control Block (PCB)

PCB

  • 운영체제가 각 프로세스를 관리하기 위해 프로세스 당 유지하는 정보
  • 다음의 구성요소를 가진다(구조체로 유지)
    1. OS가 관리상 사용하는 정보
      • Process state, Process ID
      • scheduling information, priority - CPU 스케줄링
    2. CPU 수행 관련 하드웨어 값
      • Program counter, registers
    3. 메모리 관련
      • code, data, stack의 위치 정보
    4. 파일 관련
      • Open file descriptors ...

문맥 교환 (Context Switch)

  • CPU를 한 프로세스에서 다른 프로세스로 넘겨주는 과정
  • CPU가 다른 프로세스에게 넘어갈 때 운영체제는 다음을 수행
    • CPU를 내어주는 프로세스의 상태를 그 프로세스의 PCB에 저장
    • CPU를 새롭게 얻는 프로세스의 상태를 PCB에서 읽어옴

CPU는 굉장히 빠른 자원이기 때문에 어떤 프로세스가 CPU를 장악해서 계속적으로 사용하는 것이 아니라 짧은 간격으로 CPU를 얻었다가 뺏겼다가 하는 과정을 반복한다. 이 때 CPU를 뺏겼다가 다시 얻게 되면 처음부터 시작하는 것이 아니라 뺏기던 시점의 문맥을 기억해 두었다가 그 시점부터 계속해서 다시 실행할 수 있도록 하는 매커니즘이 필요하다. 

  • System call이나 interrupt 발생 시 반드시 context switch가 일어나는 것은 아님
    • ISR: Interrupt Service Routine

(1)의 경우에도 CPU 수행 정보 등 context의 일부를 PCB에 save해야 하지만 문맥교환을 하는 (2)의 경우 그 부담이 훨씬 큼 (ex. cache memory flush)

  • 원래 문맥교환이 일어나는 A프로세스에서 B프로세스로 넘어가는 것은 cache memory flush라는 상당한 오버헤드가 발생하는 작업이 필요한데, (1)과 같은 경우에는 문맥교환이 일어나지 않기 때문에 굳이 cache memory flush를 발생시킬 필요가 없다

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

Job Queue

  • 현재 시스템 내에 있는 모든 프로세스의 집합

Ready Queue

  • 현재 메모리 내에 있으면서 CPU를 잡아서 실행되기를 기다리는 프로세스의 집합

Device Queues

  • I/O device의 처리를 기다리는 프로세스의 집합

각 프로세스들은 각 큐들을 오가며 수행된다.

Ready Queue와 다양한 Device Queue

프로세스 스케줄링 큐의 모습

스케줄러(Scheduler)

Long-term scheduler (장기 스케줄러 or job scheduler)

  • 시작 프로세스 중 어떤 것들을 ready queue로 보낼지 결정
    • 즉 어떤 프로세스가 new 상태에 있는데, 그 프로세스에게 ready상태(CPU를 점유할 수 있는 상태)를 줄 지를 결정
  • 프로세스에 memory(및 각종 자원)을 주는 문제
  • degree of Multiprogramming을 제어
    • multiprogramming: 메모리에 여러 프로그램이 같이 올라가는 것. 즉 메모리에 몇 개의 프로세스를 올릴 지를 결정
  • time sharing system에는 보통 장기 스케줄러가 없음 (무조건 ready)

Short-term scheduler (단기 스케줄러 or CPU scheduler)

  • 어떤 프로세스를 다음번에 running 시킬 지 결정
  • 프로세스에 CPU를 주는 문제
  • 충분히 빨라야 함 (millisecond 단위)

Medium-term scheduler (중기 스케줄러 or Swapper)

  • 현재는 무조건 ready 상태로 올리는데 그래서 메모리에 계속 프로세스가 쌓인다. 그래서 메모리에 너무 많은 프로그램들이 올라가 있으면 swapper가 쫓아내 메모리에 올라가있는 프로세스의 수를 제어한다.
  • 여유 공간 마련을 위해 프로세스를 통째로 메모리에서 디스크로 쫓아냄
  • 프로세스에게서 memory를 뺏는 문제
  • degree of Multiprogramming 을 제어

따라서 중기 스케줄러에 의해 메모리에서 쫓겨난 상태를 프로세스의 상태로 표현할 수 없다.

Running
- CPU를 잡고 instruction을 수행중인 상태
Ready
- CPU를 기다리는 상태(메모리 등 다른 조건을 모두 만족하고)
Blocked (wait, sleep)
- CPU를 주어도 당장 instruction을 수행할 수 없는 상태
- Process 자신이 요청한 event(예: I/O)가 즉시 만족되지 않아 이를 기다리는 상태
- (예) 디스크에서 file을 읽어와야 하는 경우

그래서 기존의 위 프로세스 상태 말고도 Suspended(stopped) 상태가 추가가 된다.

Suspended (stopped)

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

Running(user mode): 프로세스가 CPU를 가지고 있으면서 본인의 코드를 실행중인 상태

Running(monitor mode): 본인이 프로세스를 실행할 수 없어서 운영체제에게 대신 요청한, 즉 System call을 한 상태

Thread

A thread (or lightweight process) is a basic unit of CPU utilization

스레드는 CPU를 수행하는 단위 !

  • Thread의 구성(독립적으로 가지고 있음)
    • program counter
    • register set
    • stack space
  • Thread가 동료 Thread와 공유하는 부분(=task)
    • code section
    • data section
    • OS resources
  • 전통적인 개념의 heavyweight process 는 하나의 thread 를 가지고 있는 task로 볼 수 있다.

스레드는 프로세스 내부에 CPU 수행 단위가 여러개 있는 경우에 그걸 스레드라고 한다.

프로세스가 하나 주어지면 프로세스마다 PCB가 만들어지고, 데이터 스택이 만들어지고 PCB에서 현재 메모리에서 어느부분을 실행하고 있는지 program counter가 가리키고 있다. 이 때 동일한 일을 하는 프로세스가 여러개 있다고 하자. 이것들을 별도의 프로세스로 만들면 메모리 주소 공간이 여러 개가 만들어지고, 그래서 메모리가 낭비가 된다. 그래서 같은 일을 하는 프로세스를 여러개 띄워놓고 싶다하면 주소공간(메모리 공간)을 하나만 띄워놓고 현재 각 프로세스마다 다른부분의 코드를 실행할 수 있게 해주면 된다. 그게 바로 스레드의 개념이다.

다시 정리하자면 스레드는 프로세스는 하나만 띄워놓고 현재 CPU가 코드의 어느 부분을 실행하고 있는가, 즉 프로그램 카운터(PC)만 여러 개 두는 것이다. 프로세스 하나에 CPU 수행 단위만 여러개 둔 것을 스레드라고 한다.

스레드 간에는 프로세스 하나에서 공유할 수 있는 것들은 최대한 공유한다.

  • 메모리 주소 공간
  • 프로세스 상태(프로세스는 하나이기 때문 !)
  • 프로세스가 사용하는 자원

하지만 CPU 수행과 관련된 정보들은 별도로 가지고 있다.

  • program counter
  • register
  • stack 등

Thread 이어서

  • 다중 스레드로 구성된 태스크 구조에서는 하나의 서버 스레드가 blocked (waiting) 상태인 동안에도 동일한 태스크 내의 다른 스레드가 실행(running) 되어 빠른 처리를 할 수 있다.
  • 동일한 일을 수행하는 다중 스레드가 협력하여 높은 처리율(throughput)과 성능 향상을 얻을 수 있다.
  • 스레드를 사용하면 병렬성을 높일 수 있다.
    • CPU가 여러개 달린 컴퓨터에서만 기대할 수 있는 장점
  • 자원을 절약
    • 같은 일을 하는 프로세스들을 여러개 띄워두게 되면 각각 메모리에 올라가야 하기 때문에 메모리 낭비가 심하다.
    • 하지만 스레드를 이용하게 되면 자원을 공유할 수 있어 자원을 절약하고 성능 향상을 기대할 수 있다.

Single and Multithreaded Processes

Thread 장점

응답성

  • 사용자 입장에서 빠르다
  • 웹브라우저가 스레드를 여러개 가지고 있다고 가정하면, 하나의 스레드가 서버에서 blocked 됐을 때도 다른 스레드는 계속 작업을 할 수 있다. 예를 들면 html문서를 띄울 때 내부에 이미지 등이 많다고 하자. 그럴 때 모든 자원을 다 가져온 후 화면을 그리는 것이 아니라 도착하면 하나씩 그려서 사용자 입장에서 덜 답답하다.

자원 공유

  • 같은 일을 하는 프로세스가 여러개 있을 때 스레드로 만들면 코드, 데이터 등이 공유되어 자원을 효율적으로 사용할 수 있다.

속도가 빠르다(경제적)

  • 프로세스를 하나 만드는 것도 오버헤드가 크다. 하지만 프로세스에 스레드를 하나 추가하는 것은 숟가락을 하나 얹는 것이라 오버헤드가 그리 크지 않다.
  • 문맥 교환이 일어날 때 하나의 프로세스에서 다른 프로세스로 넘어가는 것은 오버헤드가 상당히 크다. 하지만 프로세스 내부에서 스레드간에 CPU switch가 일어나는 것은 동일한 주소공간을 사용하고 있기 때문에 간단한 작업이다.

Utilization of MP Architectures

  • 위 작업들은 모두 CPU가 하나 있을 때의 장점이지만 이 장점은 CPU가 여러개 있을 경우에 해당된다.
    • MP: Multi Processor
  • 스레드가 여러 개 있으면 스레드들이 각각의 CPU에서 병렬적으로 작업이 가능하다. 그러면 결과를 더 빠르게 얻을 수 있다.

스레드의 구현 Implementation of  Threads

Some are supported by kernel → kernel Threads 

어떤 스레드는 운영체제, 커널의 지원을 받는다.

  • Windows 95/98/NT
  • Solaris
  • Digital UNIX, Mach

스레드가 여러개 있다는 사실을 운영체제가 알고 있어 하나의 스레드에서 다른 스레드로 CPU가 넘어가는 것도 커널이 CPU스케줄링 하는 것처럼 넘겨준다.

Others are supported by library → user Threads

어떤 스레드는 라이브러리를 통해 지원된다.

  • POSIX Pthreads
  • Mach C-threads
  • Solaris threads

프로세스 안에 스레드가 여러개 있다는 사실을 운영체제는 모르고, 유저 프로그램이 라이브러리의 지원/도움을 받아 스스로 스레드를 여러개 관리한다. 그래서 유저 레벨 스레드는 커널이 모르고 있고, 일반적인 프로세스로 보이는데, 프로세스 내부에서 CPU 수행단위를 여러개 두고 수행하는 것이기 때문에 구현상에 제약점이 존재할 수 있다.

Some are real-time threads

어떤 스레드는 real-time 기능을 지원하는 스레드도 생성할 수 있다.

 

 

본 포스트는 이화여자대학교 운영체제 강의 정리본입니다.

profile

SY 개발일지

@SY 키키

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!