[OS] 3. Process

정연희·2024년 4월 28일
0

OS

목록 보기
3/5
post-thumbnail

프로세스 개념

"Process is a program in execution"

프로세스 문맥 (context)

  • CPU 상태: CPU 수행 상태를 나타내는 하드웨어 문맥
    • program counter (코드의 어느 부분까지 실행헸는가)
    • 각종 register (현재 register에 어떤 값을 저장하고 있는가)
  • 메모리 상태: 프로세스의 주소 공간
    • code, data, stack
  • 커널 상태: 프로세스 관련 커널 자료 구조
    • PCB (process control block)
    • kernel stack

프로세스 상태 (process state)

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

  • running
    • CPU를 잡고 instruction을 수행중인 상태
    • user mode에서 사용자 프로그램을 실행할 때, 그리고 kernel mode에서 커널 코드를 실행할 때 모두 running이라고 표현
  • ready
    • 메모리 등 프로세스를 수행하기 위해 준비를 모두 마친 상태에서 CPU를 기다리는 상태
  • blocked(wait, sleep)
    • CPU를 주어도 당장 instruction을 수행할 수 없는 상태
    • IO와 같은 event가 만족되기를 기다리는 상태
    • 자신이 요청한 event가 만족되면 ready
    • ex) 디스크에서 file을 읽어와야 하는 상태 (disk IO queue), IO 입력을 기다려야 할 경우 (keyboard IO queue), 공유데이터 읽을 때(resource queue)
  • new
    • 프로세스가 생성중인 상태
  • terminated
    • 수행이 끝난 상태
  • suspended (stopped)
    • 중기 스케줄러로 인해 생긴 프로세스 상태
    • 외부적인 이유로 프로세스의 수행이 정지된 상태
    • 프로세스는 통째로 디스크에 swap out 된다
    • 외부에서 resume해 줘야 active
    • ex. 사용자가 프로그램을 일시 정지시킨 경우(break key, ctrl+z). 시스템이 여러 이유로 프로세르르 잠시 중단시킨 경우(메모리에 너무 많은 프로세스가 올라와있는 경우)

*여기서 queue는 사실 커널의 data에 저장됨

Process control block (PCB)

  • 운영체제가 각 프로세스를 관리하기 위해 프로세스당 유지하는 정보
  • 다음의 구성 요소를 가짐 (구조체로 유지)
    1. OS가 관리상 사용하는 정보
      • process state, process ID
      • scheduling information, priority
    2. CPU 수행 관련 하드웨어 값
      • program counter (다음 instruction 주소를 저장하는 특별한 register)
      • registers
    3. 메모리 관련
      • code, dqta, stack의 위치 정보
    4. 파일 관련
      • open file descriptors

문맥 교환 (context switch)

  • CPU를 한 프로세스에서 다른 프로세스로 넘겨주는 과정
  • 이때, CPU는 넘겨받은 프로세스를 처음부터 실행하지 않고, 저번에 멈췄던 곳에서 이어서 함
    • CPU를 내어주는 프로세스의 상태를 그 프로세스의 PCB에 저장. 즉, CPU registers, PCB 등의 데이터를 PCB에 백업해놓는 것임
    • CPU를 넘겨받는 프로세스의 상태를 PCB에서 읽어옴

system call/interrupt 발생시 반드시 context switch가 일어나는 것은 아님

만약 system call/interrupt가 발생하고 다시 같은 process로 돌아가면 context swtich를 하지 않음. 사진을 예시로 보자면 (1)의 경우에는 CPU 수행 정보 등 context의 일부를 PCB에 save해야 하지만 문맥교환을 하는 (2)의 경우 그 부담이 훨씬 크다

  • ex. cache memory flush
    • 문맥교환이 일어나면 프로세스가 사용하던 캐시 메모리를 다 지워야 한다. 이를 cache memory flush라 하는데 이것이 많은 오버헤드를 요구한다.

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

프로세스들은 각 큐들을 오가며 수행된다. 가령, device queue에 있든 프로세스가 IO 요청 처리가 완료되면 ready queue로 간다.

  • job queue
    • 현재 시스템 내에 있는 모든 프로세스의 집합
    • ready queue, device queue에 있는 모든 프로세스들은 job queue에 포함되어있음
  • ready queue
    • CPU를 기다리는 큐
    • 현재 메모리 내에 있으면서, CPU를 잡아서 실행되기를 기다리는 프로세스의 집합
  • device queue
    • IO device의 처리를 기다리는 프로세스의 집합

스케줄러 (scheduler)

1. long-term scheduler

= 장기 스케줄러 = job scheduler

  • 시작 프로세스 중 어떤 것들을 ready queue로 보낼지 결정
  • 프로세스에 memory(및 각종 자원)을 주는 문제
  • degree of multiprogramming을 제어
  • time sharing system에는 보통 장기 스케줄러가 없고 medium-term scheduler를 활용함 (무조건 ready)

2. short-term scheduler

= 단기 스케줄러 = CPU scheduler

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

3. medium-term scheduler

= 중기 스케줄러 = swapper

  • 여유 공간 마련을 위해 프로세스를 통째로 메모리에서 디스크로 쫓아냄
  • 프로세스에게서 memory를 뺏는 문재
  • degree of multiprogramming을 제어

degree of multiprogramming
메모리에 올라가있는 프로세스 수. 이를 제어할 필요가 있는 이유는 수가 컴퓨터 성능에 영향을 미치기 때문이다. 만약 메모리에 너무 많은 프로세스가 올라가있으면, 또는 너무 적게 올라가있으면 컴퓨터 성능이 떨어진다. 적당한 프로세스들이 메모리에 올라가면 CPU가 한 프로세스를 실행하다가, 다른 프로세스 실행하는 등 효율을 높일 수 있다. 그러나 프로세스가 너무 많으면 프로세스마다 할당된 메모리가 너무 적어져 성능이 낮다. 프로세스가 너무 없으면 CPU가 idle한 경우가 있을 수 있다.

Thread

Thread(=lightweight process)는 프로세스의 CPU 실행 단위이다. 쓰레드는 프로세스 내에서 메모리 및 자원을 공유하며, 동시에 여러 작업을 수행할 수 있다. 각 쓰레드는 별도의 작업을 수행하고, 동시에 다른 쓰레드와 동기화하여 데이터를 공유하거나 통신할 수 있다. 전통적인 개념의 heavyweight process는 하나의 thread를 가지고 있는 task로 볼 수 있다.

  • 구성 (process와 별도로 가지는 정보)

    • program counter
    • register set
    • stack space
  • task: Thread가 동료 Thread와 공유하는 부분

    • code section
    • data section
    • OS resources

Thread의 장점/필요성

  • 자원 절약:
    • 쓰레드를 사용하면 프로세스 내에서 데이터와 자원을 공유할 수 있다.
    • 이를 통해 메모리와 시스템 리소스를 효율적으로 활용할 수 있다.
  • 병행성:
    • 쓰레드를 사용하면 더 빨리 여러 작업을 동시에 실행하는 것처럼 보이게 할 수 있다(여러 작업을 번갈아가며 실행).
    • 쓰레드 생성 및 CPU switching에 대한 오버헤드가 process에 비해 훨씬 적기 때문에 여러 작업을 병행하는 데 있어 시간이 더 빠르다.
    • 예를 들어, 웹 브라우저에서 동시에 여러 웹 페이지를 로드하거나, 게임에서 동시에 여러 객체를 처리할 수 있다.
  • 병렬성:
    • multi-core인 컴튜터에 한해서, 여러 작업을 동시에 실행(병렬처리)할 수 있다.
    • 이를 통해 프로그램 성능 및 throughput 향상할 수 있다.
  • 반응성:
    • 쓰레드를 사용하면 프로그램이 사용자 입력 또는 외부 이벤트에 신속하게 반응할 수 있다.
    • 다중 스레드로 구성된 태스크 구조에서 하나의 서버 스레드가 blocked(waiting) 상태인 동안에도 동일한 태스크 내의 다른 스레드가 실행(running)되어 빠른 처리를 할 수 있기 때문
    • ex. 네트워크를 통해 웹페이지를 읽어오는 IO 작업 동안에는 blocked 상태. 하지만 다중 스레드를 이용해서 blocked 상태에서 다른 스레드로 다른 작업을 수행할 수 있음

Thread 종류

1. kernel threads

  • 커널 쓰레드는 운영체제 커널에서 직접 관리되는 쓰레드이다.
  • 이러한 쓰레드는 운영체제 수준에서 실행되며, 시스템 리소스에 직접 액세스할 수 있다
  • 주요 작업은 시스템 관리, 자원 할당, 인터럽트 처리 등과 같은 운영체제의 핵심 기능을 지원하는 것
  • 커널 쓰레드는 사용자 프로세스가 아닌 운영체제 자체의 일부로써 실행된다

2. user threads

  • 사용자 쓰레드는 사용자 수준에서 관리되는 쓰레드이다.
  • 이러한 쓰레드는 응용 프로그램 내에서 생성되고 관리되며, 운영체제는 그 존재를 알지 못한다.
  • 주로 응용 프로그램의 동시성을 구현하고, 작업을 분리하거나 병렬화하는 데 사용된다.
  • 사용자 쓰레드는 응용 프로그램의 쓰레드 라이브러리나 런타임 환경에 의해 관리된다.

3. real-time threads

  • 시간에 민감한 응용 프로그램에서 사용되는 특수한 유형의 쓸레드
  • 이러한 쓰레드는 특정한 시간 제약을 가지고 있으며, 일정한 시간 안에 정확하게 동작해야 한다.
  • 리얼타임 쓰레드는 주로 실시간 시스템(real-time systems)에서 사용된다.
profile
추가 블로그: https://prickle-justice-361.notion.site/720540875b754767a73f52c038056990?v=11366b23c086803f889b000c2562fa51&pvs=4

0개의 댓글

관련 채용 정보