[KOCW 반효경 운영체제] 3. Process
Computer Science/Operating System

[KOCW 반효경 운영체제] 3. Process

728x90

http://www.kocw.net/home/cview.do?cid=3646706b4347ef09

 

운영체제

운영체제는 컴퓨터 하드웨어 바로 위에 설치되는 소프트웨어 계층으로서 모든 컴퓨터 시스템의 필수적인 부분이다. 본 강좌에서는 이와 같은 운영체제의 개념과 역할, 운영체제를 구성하는 각

www.kocw.net


프로세스의 개념

💡 “Process is a program in execution
: 실행 중인 프로그램
: 디스크에 실행 파일 형태로 존재하던 프로그램이 메모리에 올라가서 실행되기 시작하면 비로소 생명력을 갖는 프로세스가 된다.

프로세스의 문맥(context)

프로세스가 시작해서 종료할 때까지 CPU에서 명령을 한꺼번에 수행하면 좋겠지만, 여러 프로세스가 함께 수행되는 시분할 환경에서는 CPU를 자주 빼앗기고 획득하게 된다. 따라서 CPU를 다시 획득해 명령의 수행을 재개하는 시점이 되면, 이전 CPU 보유 시기에 어느 부분까지 명령을 수행했는지 정확한 상태를 재현할 필요가 있다. 이때 정확한 재현을 위해 필요한 정보가 바로 프로세스의 문맥이다. 즉, 프로세스의 문맥은 그 프로세스의 주소 공간(코드, 데이터, 스택 상태)을 비롯해 레지스터에 저장된 값, 시스템 콜을 통해 커널에서 수행한 일의 상태, 그 프로세스에 관해 커널이 관리하고 있는 각종 정보 등을 포함하게 된다.

  • CPU 수행 상태를 나타내는 하드웨어 문맥
    • Program Counter
    • 각종 register
    → 현재 시점에 프로세스가 instruction을 어디까지 실행 했는지를 나타내 준다.
  • 프로세스의 주소 공간
    • code, data, stack
  • 프로세스 관련 커널 자료 구조
    • PCB(Process Control Block) : 프로세스가 하나씩 실행될 때마다 운영체제는 PCB를 하나씩 두고 해당 프로세스에게 CPU, 메모리를 얼마나 줘야할지 등을 관리하는 역할을 한다.
    • Kernel stack : 각 프로세스가 자신의 코드를 실행 중일 때, 함수 호출이 일어난다면 자신의 스택에 관련 정보를 쌓아 놓는다. 하지만 프로세스가 시스템콜을 하게 되면 커널의 코드를 실행한다. 이때 커널에서 함수호출이 이루어지면 커널의 스택에 관련 정보를 쌓아놓는다. 커널에서 함수 호출이 이루어지면 커널 스택에 프로세스 별로 스택을 별도로 두고 있다.

프로세스의 상태(Process State)

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

프로세스의 상태도

  • 프로세스가 생성되면 new 상태에서 ready 상태가 된다.
  • ready 상태에서 CPU를 얻으면 running 상태가 된다.
  • CPU 얻은 상태에서 내려 놓는 경우
    • running → terminated : 본인의 역할을 다하면 종료됨
    • running → waiting : I/O 같은 오래 걸리는 작업을 하면, CPU를 가지고 있어 봐야 명령을 수행할 수 없으므로 waiting 상태가 된다.
    • running → ready : 할당된 CPU 사용 시간이 끝나면 ready 상태가 된다.

  • 프로세스는 큐에 담겨 해당 작업을 기다린다.
  • 하드웨어 자원 서비스를 기다리는 경우도 있지만, 공유 데이터와 같은 소프트웨어 자원 서비스를 기다리는 경우도 있다.

큐는 운영체제 커널이 data 영역에 자료구조 큐를 만들어 놓고 프로세스의 상태를 바꿔가며 운영한다.

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

문맥 교환 (Context Switch)

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

  1. 현재 Process A가 CPU에서 실행 중이다.
    • PC가 Process A의 코드를 가리키고 있다.
    • register는 어떤 값들을 넣어서 실행 중이다.
    • Memory map은 Process A의 메모리 위치 정보를 가지고 있다.
  2. Process A가 CPU를 빼앗긴다.
    • 현재 문맥부터 PC, register, Memory map에 저장된 값을 Process A의 PCB에 저장한다.
  3. Process B가 CPU를 실행하려고 한다.
    • Process B가 예전에 실행 중이던 문맥부터 재개하기 위해서 Process B의 PCB에서 Process B의 문맥을 찾아 하드웨어에 복원시킨다.
  4. Process B에게 CPU를 넘겨준다.
  • System call이나 Interrupt 발생시 반드시 context switch가 일어나는 것은 아님

  • (1)은 사용자 프로세스 A를 실행하며 user mode에서 kernel mode로 넘어왔다가 다시 동일한 사용자 프로세스 A로 돌아오는 경우.
  • (2)는 사용자 프로세스 A를 실행하며 user mode에서 kernel mode로 넘어왔다가 다른 사용자 프로세스 B에게로 CPU를 넘기며 문맥 교환이 일어난 경우.
  • (1)의 경우에도 CPU 수행 정보 등 context의 일부를 PCB에 save 해야 하지만 문맥교환을 하는 (2)의 경우 그 부담이 훨씬 큼(eg. cache memory flush)

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

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

스케줄러 (Scheduler)

💡 어떤 프로세스에게 자원을 할당할지를 결정하는 운영체제 커널의 코드
  • Long-term scheduler (장기 스케줄러 or job scheduler)
    • 시작 프로세스 중 어떤 것들을 ready queue로 보낼지 결정
    • 프로세스에 memory(및 각종 자원)을 주는 문제
    • degree of Multiporgramming(메모리에 올라와 있는 프로세스의 수)을 제어 → 메모리에 프로그램이 너무 안올라와 있어도, 너무 많이 올라와 있어도 성능이 안좋아진다.
    • time sharing system에는 보통 장기 스케줄러가 없음(무조건 ready)
  • Short-term scheduler (단기 스케줄러 or CPU scheduler)
    • 어떤 프로세스를 다음 번에 running 시킬지 결정
    • 프로세스에 CPU를 주는 문제
    • 충분히 빨라야 함 (millisecond 단위)
  • Medium-Term Scheduler (중기 스케줄러 or Swapper)
    • 여유 공간 마련을 위해 프로세스를 통째로 메모리에서 디스크로 쫓아내서(swap out) degree of Multiprogramming 수를 조절한다.
    • 프로세스에게서 memory를 뺏는 문제

중기 스케줄러에 의해 추가된 프로세스의 상태

  • Suspended (stopped)
    • 외부적인 이유로 프로세스의 수행이 정지된 상태
    • 프로세스는 통째로 디스크에 swap out 된다.
    • (예) 사용자가 프로그램을 일시 정지시킨 경우 (break key), 시스템이 여러 이유로 프로세스를 잠시 중단시킴 (메모리에 너무 많은 프로세스가 올라와 있을 때)
    • Suspended Ready : ready 상태에 있던 프로세스가 중기 스케줄러에 의해 디스크로 swap out 된 경우
    • Suspended Blocked : blocked 상태에 있던 프로세스가 중기 스케줄러에 의해 swap out된 경우. 프로세스가 봉쇄되었던 조건을 만족하게 되면 suspended ready 상태로 바뀐다.
  • Blocked는 자신이 요청한 event가 만족되면 Ready, Suspended는 외부에서 resume해 주어야 Active

Thread

💡 “A thread (or lightweight process) is a basic unit of CPU utilization”
: thread는 CPU를 실행하는 단위
: 프로세스 내에서 실행되는 여러 흐름의 단위 혹은 프로세스가 할당 받은 자원을 이용하는실행 흐름의 단위
: 프로세스를 여러 개 두는 것보다 프로세스 안에 thread를 여러 개 두는 것이 훨씬 가볍기 때문에 lightweight process라고 한다.

  • Thread의 구성 (thread 간 독립적으로 가지고 있다.)
    • program counter
    • register set
    • stack space
  • Thread가 동료 thread와 공유하는 부분 (=task)
    • code section
    • data section
    • OS resource
  • 전통적인 개념의 heavyweight process는 하나의 thread를 가지고 있는 task로 볼 수 있다.
  • 프로세스는 하나에 CPU 수행단위만 여러 개 두고 있는 것을 thread라고 한다.
  • thread는 프로세스 하나에서 공유할 수 있는 것(메모리 주소 공간, 프로세스 상태, 프로세스가 사용하는 각종 자원)은 최대한 공유하고, 공유할 수 없는 것(PC, register, stack)는 별도로 가지고 있다.
  • 다중 스레드로 구성된 태스크 구조에서는 하나의 서버 스레드가 blocked(waiting) 상태인 동안에도 동일한 태스크 내의 다른 스레드가 실행(running)되어 빠른 처리를 할 수 있다.
  • 동일한 일을 수행하는 다중 스레드가 협력하여 높은 처리율(throughput)과 성능 향상을 얻을 수 있고, 여러 프로세스를 띄울 필요 없이 하나의 프로세스만 띄우면 되기 때문에 자원을 절약할 수 있다.
  • 스레드를 사용하면 병렬성을 높일 수 있다. (CPU가 여러 개 있는 컴퓨터에서만 해당됨.)

  • 프로세스는 하나만 만들어지기 때문에 PCB도 하나만 만들어진다. 프로세스 안에 스레드가 여러 개 있다면 CPU 수행과 관련된 정보(PC, register)만 각각 스레드마다 별도의 카피를 가지고 있게 된다.

Benefits of Threads

  • Responsiveness (응답성)
    • 다중 스레드로 구성된 task 구조에서 하나의 서버 스레드가 blocked(waiting) 상태인 동안에도 동일한 task 내의 다른 스레드가 실행되어 빠른 처리가 가능하다.
    • eg) 웹 브라우저가 여러 스레드를 가지고 있으면, 하나의 스레드가 네트워크로 html 등을 로드고 다른 이미지 파일 등을 로드하는 동안 다른 스레드가 가져온 html을 화면에 띄운다.
  • Resource Sharing (자원 공유)
    • 같은 일을 하는 프로그램이 여러 개 있을 때, 별도의 프로세스로 사용하는 것보다는 하나의 프로세스에서 CPU 실행 단위만 여러 개 두게 되면 code, data, 각종 자원은 스레드가 공유할 수 있어 자원을 효율적으로 쓸 수 있다.
  • Economy (경제성)
    • 동일한 일을 수행하는 다중 스레드가 협력하여 높은 처리율(throughput)과 성능 향상을 얻을 수 있다.
    • 프로세스 하나를 만드는 것은 overhead가 굉장히 크지만, 프로세스 안에 스레드를 하나 더 만드는 것은 overhead가 크지 않다.
    • 하나의 프로세스에서 다른 프로세스로 CPU가 넘어갈 때(문맥 교환)은 오버헤드가 굉장히 크다. 하지만 프로세스 내부에서 스레드 간에 CPU switching이 일어나는 것은 간단하다.
    • Solaris(운영체제 종류)의 경우 위 두 가지 overhead가 각각 30배, 5배
  • Utilization of MP(Multi Processor) Architectures (CPU가 여러 개 있는 환경에서 얻을 수 있는 장점)
    • 프로세스는 하나지만 스레드가 여러 개 있으면 각각의 스레드가 서로 다른 CPU에서 병렬적으로 일할 수 있어 결과를 더 빨리 얻을 수 있다.

스레드의 단점

  • 자원의 공유로 인한 동기화 문제가 발생할 수 있다.
  • 디버깅이 까다롭다.

Threads 구현 방법

  • 커널의 지원을 받는 방법 → Kernel Threads
    • 스레드가 여러 개 있다는 사실을 운영체제 커널이 알고 있다. 하나의 스레드에서 다른 스레드로 CPU가 넘어가는 것을 커널이 CPU scheduling 하듯이 넘겨준다.
    • Windows 95/98/NT
    • Solaris
    • Digital UNIX, Mach
  • 라이브러리 형태로 구현 → User Threads
    • 프로세스 안에 스레드가 여러 개 있다는 사실을 운영체제는 모른다. user program이 스스로 라이브러리의 지원을 받아서 여러 개의 스레드를 관리한다. 프로그램 스스로 스레드를 관리하기 때문에 커널 스레드보다는 여러가지 제약점들이 있을 수 있다.
    • POSIX Pthreads
    • Mach C-threads
    • Solaris threads
  • Some are real-time threads

 

참고 - https://steady-coding.tistory.com/514

728x90