[운영체제] chapter3 Process

AnSuebin·2022년 12월 4일
0

프로세스의 개념

  • Process is a program in execution

    • 실행중인 프로그램
  • 프로세스의 문맥(context)

    • CPU 수행 상태를 나타내는 하드웨어 문맥
      • 프로세스란 것은 CPU를 잡고 매순간 instruction을 실행, 현 시점에서 instruction을 어디까지 실행했는가를 알기 위해서는 register에 어떤 값을 넣었는지 아는 것 필요, 프로그램 카운터가 어디를 가리키고 있는 지 아는 것 중요
      • Program Counter
      • 각종 register
    • 프로세스 주소공간
      • 주소공간에 어떤 내용이 들어있는가
      • code, data, stack
    • 프로세스 관련 커널 자료 구조
      • 운영체제가 이 친구에 대해서 어떤 것을 가지고 있는지, 평가하고 있는지 중요
      • PCD(Process Control Block)
      • Kernel Stack
    • 이런것들이 중요한 이유 : 현대 컴퓨터는 멀티 쉐어링이 이루어지기 때문, 하나의 프로세스가 CPU를 잡고 실행을 하다가 놓고 다른 프로세스에게 CPU가 넘어가는 상황이 많음. 다시 돌아왔을 때 어디까지 실행 했는지 기록하는 것이 필요

프로세스 상태(Process State)

  • 프로세스는 상태가 변경되며 수행됨
    • Running
      • CPU를 잡고 instruction을 수행중인 상태
    • Ready
      • CPU는 하나기 때문에
      • CPU를 기다리는 상태(메모리 등 다른 조건을 모두 만족하고)
    • Blocked(wait, sleep)
      • CPU를 지금 줘봤자 실행하기 어려운 상태
      • CPU를 주어도 당장 instruction을 수행할 수 없는 상태
      • Process 자신이 요청한 event(예: IO)가 즉시 만족되지 않아 이를 기다리는 상태
      • 예) 디스크에서 file을 읽어와야 하는 경우
    • New : 프로세스가 생성중인 상태
      • 대부분 포함 안시킴
    • Terminated : 수행이 끝난 상태(정리할 것들이 남아있는 상태)
      • 대부분 포함 안시킴

프로세스 상태도

1. new : 프로세스가 생성 중인 상태
2. ready : CPU만 얻으면 실행 가능한 상태
최소한의 메모리는 가진 상태
당장 CPU 실행할 때 필요한 부분은 메모리에 올라온 상태
3. running : 본인이 차례가 되서 CPU가 넘어온 상태

  • waiting(blocked) : 자진해서 CPU를 내놓는 것
    IO와 같이 오래 걸리는 작업
  • Timer interrupt : 할당 시간이 만료된 상태여서 CPU를 뺏긴 상태
  1. termianted : 프로그램 종료 상태 (정리만 남아있는)

프로세스의 상태

  • CPU는 굉장히 빠르고 여럿이 공유하는 자원

  • 하나의 Process가 CPU에서 작업하고 있다가, time interrupted를 받으면, 맨 뒤로 줄을 서는 것을 반복

  • 그러다 IO와 같은 긴 시간의 작업이 필요하면, block으로 상태가 바뀌면서, IO에 줄을 서게됨

  • IO는 컨트롤러에 따라 순서대로 처리

  • 다하면, CPU에 IO가 interrupted를 걸고

  • CPU는 잠시 멈추고, 운영체제에게 CPU가 돌아가 프로세스의 상태를 ready로 바꿔줌

  • 하드웨어에 하는 경우도 있지만 자원 중에는 소프트 자원에서도 있음
    - 공유 데이터 : 여러 프로세스가 동시에 접근하면, 다른 데이터의 접근을 막아주는 것이 필요한데, 이때도 줄서야함
    - 따라서 blocked 상태로 만들어줌

  • 큐라는 것은 운영체제의 커널이 본인의 자료구조 영역에 데이터를 만들어 놓고 상태에 따라 운영하는 것

Process Control Block (PCB)

  • PCB
    • 운영체제가 각 프로세스를 관리하기 위해 프로세스당 유지하는 정보
    • 다음의 구성 요소를 가짐(구조체로 유지)
      1) OS가 관리상 사용하는 정보
      - 프로세스의 상태, 프로세스 ID
      - Process state, Process ID
      - 우선순위가 높은 친구 값을 유지
      - scheduling information, priority
      2) CPU 수행 관련 하드웨어 값
      - CPU에 어떤 레지스터 값들을 넣어서 실행하고 있었는가
      - Program counter, register
      3) 메모리 관련
      - code,data,stack이 메모리 어디에 위치하고 있는가
      - Code,data,stack의 위치 정보
      4) 파일 관련
      - 이 프로세스가 사용하고 있는 오픈하고 있는 파일이 어떤 것인지
      - Open file descriptors

문맥 교환(Contect Switch)

  • 어떤 프로세스가 CPU를 장악해서 계속적으로 쓰는 것이 아닌 짧은 시간 간격으로 CPU를 얻었다가 뺐기는 과정을 반복
  • CPU를 뺏겼다가 다시 얻으면 처음부터 실행하는 것이 아닌 뺏기던 시점의 문맥을 기억해 뒀다가 그 시점부터 계속해서 실행 해줄 수 있게 하는 메커니즘 필요
  • 문맥 교환 : CPU가 사용자 프로세스 하나로 부터 또다른 프로세스로 넘어가는 과정
  • 문맥 교환시 필요한 작업 : 중간에 끊긴 작업을 고대로 수행하기 위해 process의 PCB에 관련 데이터 저장
    • program counter도 저장
    • memory map도 저장
  • CPU를 얻게 된 프로세스 : 운영체제가 process를 넘겨 줄 때 문맥을 PCB에서 찾아서 하드웨어에 복원
  • CPU를 한 프로세서에서 다른 프로세스로 넘겨주는 과정
  • CPU가 다른 프로세스에 넘어갈 때 운영체제는 다음을 수행
    • CPU를 내어주는 프로세스 상태를 그 프로세스의 PCB에 저장
    • CPU를 새롭게 얻는 프로세스 상태를 PCB에서 읽어옴

  • system call : 프로세스가 본인이 필요해서 운영체제에게 뭔가를 요청할 때
  • Interrupt : 컨트롤러와 같은 장치가 CPU에게 정보를 전달할 목적으로 거는 것
  • system call, Interrupt 모두 CPU 제어권이 사용자 process에서 운영체제로 넘어가게 됨
  • 사용자 프로세스에서 운영체제로 넘어가는 것을 문맥교환이라 부르는 것이 아님 (운영체제로 넘어가기 때문)
  • 문맥교환은 사용자 프로세스로부터 또다른 사용자 프로세스로 넘어가는 고정 의미
  • but system call이나 interrupt 이후 다른 프로세스로 넘겨주면 문맥 교환
  • 대부분 사실 1번과 같이 이전 프로세스로 넘겨줌
  • time interrupt에서는 또다른 사용자 프로세스에게 넘겨주게 되기도 함
  • 1번과 같은 경우도 PCB에 일부를 저장해야 하지만, 문맥교환 만큼 큰 부담으로 하지 않음
  • 문맥교환은 케시 메모리를 모두 지워야할 정도로 큰 작업

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

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

Ready Queue와 다양한 Device Queue

  • PCB를 줄세움
    • PCB에는 pointer가 있음
    • pointer를 이용하여 연결

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


1. ready queue에 와서 줄을 선다
2. 자기 차례가 되면, CPU를 얻음
3. 할당 시간이 끝나면 다시 레디큐로
4. 오래 걸리는 작업 IO가 있다면, IO 큐로 이동, 작업이 끝나면, ready queue로 이동
5. 만약 interrupt가 걸리면 다른 위치에 놓이게 됨
6. 프로세스가 CPU를 잡고있다가 자식 프로세스를 만들 수 있음.
6. 자신의 역할을 모두 끝나면 빠져나옴

스케줄러(Scheduler)

  • 순서를 정해주는 것
  • 각각의 자원별로 이번엔 어떤일을 하고 다음엔 어떤 일을 하는 지 나타내는 것
  • Long-term-scheduler(장기 스케줄러 or job scheduler)
    • 처음 프로세스가 시작하고 나서 메모리를 전혀 얻지 못하면, 아무것도 할 수 없음
    • 메모리에 올라가는 것을 허락해주면 ready상태가 됨 => CPU를 얻을 수 있음
    • 메모리에 너무 많은 프로그램이 동시에 올라가도 컴퓨터 전체 성능이 안좋아짐
    • 메모리에 프로그램이 너무 적게 올라가도 성능이 안좋아짐
    • 사실 장기 스케줄러가 거의 없음
    • 시작 프로세스 중 어떤 것들을 ready queue로 보낼지 결정
    • 프로세스에 memory를 주는 문제
    • degree of Multiprogramming 제어
    • Multiprogramming : 메모리에 몇개 올라가 있는가
    • time sharing system에는 보통 장기 스케줄러가 없음(무조건 ready)
  • short-term-scheduler(단기 스케줄러 or CPU scheduler)
    • 짧은 시간 단위로 스케줄이 이루어지기 때문
    • 어떤 프로세스를 다음번에 running 시킬지 결정
    • 프로세스에 CPU를 주는 문제
    • 충분히 빨라야함
  • Medium-Term Scheduler(중기 스케줄러 or Swapper)
    • 지금의 시스템
    • 장기 스케줄러가 없기 때문에 필요한 스케줄러
    • 메모리에 너무 많은 프로그램이 동시에 올라가는 문제 발생
    • 이때, 일부 프로그램을 골라서 쫓아냄
    • 여유 공간 마련을 위해 프로세스를 통째로 메모리에서 디스크로 쫓아냄
    • 프로세스에서 memory를 뺏는 문제
    • degree of Multiprogramming 제어

프로세스 상태 (Process State)

  • 중기 스케줄러로 인한 하나의 프로세스 추가
  • Suspended(stopped)
    • 외부적인 이유(중기 스케줄러, 리눅스 중지 시켰을때)로 프로세스의 수행이 정지된 상태
    • 프로세스는 통째로 디스크에 swap out 됨
    • 사용자가 프로그램을 일시 정지시킨 경우(break key)
    • 시스템이 여러 이유로 프로세스를 잠시 중단
      (메모리에 너무 많은 프로세스가 올라와 있을 때)
  • blocked와 suspended의 차이
    • blocked : 자신이 요청한 event가 만족되면 ready
    • suspended : 외부에서 resume 해주어야 active

프로세스 상태도

  • suspended 추가
  • 프로세스가 러닝이다가, 시스템콜로 운영체제의 코드가 실행되더라도 사용자 프로세스가 커널모드에서 러닝하고 있다고 말함 (운영체제가 러닝하고 있다고 하지 않음)
  • 운영체제로 넘어가도 그 프로세스가 러닝하고 있다고 간주
  • 서스팬디드도 blocked 상태에서 된건지, ready상태에서 된것인지 구분
  • 서스팬디드 내에서도 blocked에서 ready로 상태 변경 가능 (IO작업과 같은 것)

Thread

  • Thread : Process 내부에 CPU 수행 단위가 여러개 있는 경우
  • 동일한 프로세스가 여러개 있다 하고, 별도의 process를 만들면, 주소공간이 여러개 만들어지게 됨 => 메모리 공간 낭비
  • 같은 일을 하는 프로세스를 여러개 띄어놓고 싶다면 주소공간 즉 메모리 공간을 하나만 띄어 놓고
  • 현재 각 프로세스마다 다른 부분의 코드를 실행할 수 있도록 해주면 됨
  • 즉 하나의 프로세스 하나에 CPU 수행 단위만 여러개 두고 있는것 : Thread
  • CPU 실행을 위해서는 어느부분을 가르키는지 program counter 필요, CPU에서 실행되면서 메모리에 레지스터 값들을 세팅하고 실행하기 때문에 현재 register에 어떤 값을 넣는지도 필요
  • 함수도 별도로 쌓기 위해서 stack도 별도로
  • 프로세스 하나에서 공유할 수 있는 것은 최대한 공유
    (메모리 주소공간, 프로세스 상태, 프로세스 각종 자원)
  • 별도로 가지고 있는 것은 CPU 수행과 관련된 정보
    (프로그램 카운터, 레지스터, stack)

  • Thread : CPU를 수행하는 단위
  • Thread의 구성
    • program counter (카운터)
    • register set (레지스터)
    • stack space (스택)
  • 프로세스 내부에서 Thread가 동료 thread와 공유하는 부분(=task)
    • code section
    • data section
    • OS resources
  • Thread : lightweight process
    • 프로세스를 별도로 두는 것 보다 훨씬 가볍기 때문
  • 전통적인 개념의 heavyweight process : 하나의 Thread를 가지고 있는 task
  • Thread 사용시 장점
    • 하나의 서버 스레드가 blocked상태인 동안에도 동일한 테스크 내의 다른 스레드가 실행되어 빠른 처리 가능
    • 동일한 일을 수행하는 다중 스레드가 협력하여 높은 처리율과 성능 향상을 얻을 수 있음
      • 성능 향상, 자원 절약
    • 스레드를 사용하면 병렬성 높일 수 있음
      • 이례적인 경우
        • CPU가 여러개일경우

Single and Multithreaded Processes

Threads 장점

  • 응답성
    • 사용자 입장에서 빠른 것
    • 웹브라우저가 thread를 여러개 가지고 있으면 하나의 Thread가 block되더라도 다른 것을 먼저 불러올 수 있기 때문에 덜 늦다고 생각하게 됨
    • 동기식 입출력과 비동기식 입출력 차원과 유사
  • 자원 공유
  • 경제성
    • 빠르다
    • 프로세스를 하나 만드는 것은 오버헤드가 상당히 큼
    • 그러나 thread 하나 추가하는 것은 프로세스에 숟가락 하나 엊는 것이기 때문에 크지 않음
    • 컨텍스 스위치가 일어날 때 문맥교환은 오버해드가 상당히 큼
    • 그러나 thread 간의 스위치는 간단
  • CPU가 여러개 있을 때 얻을 수 있는 장점
    • 각각의 thread가 서로 다른 CPU에서 병렬적으로 일 가능
    • 결과를 더 빨리 얻을 수 있음

Thread 구현 방법

  • 커널 Thread: 운영체제 커널에 지원을 받음
    • Thread가 여러개 있다는 사실을 운영체제가 알고 있음
    • 따라서 하나의 Thread에서 다른 Thread로 넘어가는 과정도 커널이 CPU 스케줄링을 하듯 넘겨주게 됨
  • User Thread: 라이브러리 형태 구현
    • 프로세스안에 Thread가 여러개 있다는 사실을 운영체제는 모름
    • User 프로그램이 스스로 관리
    • 약간의 구현상의 제약점이 있음
  • 리얼타임 threads
profile
고객에게 명료한 의미를 전달하고, 명료한 코드를 통해 생산성 향상에 기여하고자 노력합니다.

0개의 댓글