[운영체제] 프로세스

서지혜·2023년 6월 27일
1

TIL

목록 보기
11/22

🧭 CS Study - 운영체제

🚩 주제 : 프로세스(Process)

🎥 강의 : KOCW 운영체제 강의 - 이화여자대학교 반효경 교수님

프로세스

프로세스는 실행되고 있는 프로그램을 의미한다.

프로세스의 Context

특정 시점에서 프로세스가 어느 일을 수행했는가?, Program Counter가 어느 코드를 수행하는가? stack과 data에 어떤 값이 들어있는가? 등의 프로그램의 현재 상태를 나타내기 위한 문맥을 프로세스 context라고 한다.

  • 하드웨어 문맥 (hardware context)
    Program Counter가 어떤 코드를 가리키고 있고, 각 레지스터가 어떤 값을 저장하고 있는지를 나타낸다.

  • 프로세스의 주소공간
    code, data, stack에 어떤 값을 저장하고 있는지를 나타낸다

  • 프로세스와 관련된 커널 자료구조를 가진다.
    PCB(Process Control Block), Kernel Stack

프로세스의 상태

https://www.geeksforgeeks.org/states-of-a-process-in-operating-systems/

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

프로세스 상태의 종류

  • Running : CPU를 받아서 instruction을 수행중인 상태

  • Ready : CPU를 기다리는 상태

  • Blocked(wait, sleep)
    : I/O와 같이 오래거리는 작업중이어서 CPU를 할당해도 instruction을 수행할 수 없는 상태이다. 메모리에 코드가 올라오지 않아서 Disk에서 파일을 읽어와야 하는 경우도 Blocked 상태이다.

  • New : 프로세스가 생성중인 상태

  • Terminated : 프로세스가 종료된 상태

  • Suspended(stopped)
    : 외부적인 이유로 프로세스의 수행이 정지된 상태이다.(사용자 혹은 중기 스케줄러 등의 외부 요소가 멈출수도 있다.)
    : 프로세스는 통째로 디스크에서 swap out된다.

📌 Blocked와 Suspended의 차이

  • Blocked : 자신이 요청한 event가 만족되면 Ready상태가 된다.
  • Suspended: 외부에서 resume해 주어야 Active한 상태가 된다.

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

  • job queue : 현재 시스템에 있는 모든 프로세스의 집합
  • ready queue : CPU를 기다리는 프로세스의 집합
  • device queue : I/O 처리를 기다리는 프로세스의 집합
  • queue의 head와 tail이 PCB의 메모리 위치를 저장하여 list형태로 연결된다.

프로세스의 동작 방식 예시

  1. CPU를 할당 받기 위해 Ready Queue에서 대기하는 프로세스들은 Timer interrupt를 통해 Ready Queue에서 나와서 CPU를 할당받거나, CPU를 빼앗긴 프로세스는 Ready Queue의 tail로 다시 들어가는 방식으로 CPU를 돌아가며 쓰고 있다.

  2. 프로세스 A가 CPU를 점유하여 Running 상태이다.

  3. keyboard I/O가 필요해서 프로세스 A는 blocked 상태가 되고 keyboard I/O queue에 들어간다.

  4. keyboard I/O가 끝나면 keyboard의 controller는 CPU에게 I/O interrupt를 날린다.

  5. CPU는 하던 작업을 멈추고 CPU 제어권을 kernel에게 넘긴다.

  6. kernel은 프로세스 A의 메모리 영역에 keyboard로부터 들어온 데이터를 넣어주고, 프로세스 A의 상태를 ready상태로 바꾼다.

Process Control Block(PCB)

PCB는 운영체제가 프로세스를 관리하기 위해 프로세스 당 유지하는 정보를 저장하는 자료구조이다.

PCB의 구성 요소

  • OS가 프로세스를 관리할 때 필요한 정보
    - Process의 상태, PID, 스케쥴링 정보, 우선순위 등
  • CPU 수행 관련 하드웨어 값
    - PC, 레지스터
  • 메모리 관련 값
    - code, data, stack의 위치 정보
  • 파일 관련
    - 열려있는 파일의 리스트, 정보

Context Switch

Context Switch는 CPU를 한 프로세스에서 다른 프로세스로 넘겨주는 과정이다. CPU가 다른 프로세스에게 넘어갈 때 운영체제는 CPU를 내어주는 프로세스의 상태를 그 프로세스의 PCB에 저장한다. 그 다음, CPU를 새롭게 얻는 프로세스의 상태를 PCB에서 읽어온다.

📌 System call이나 interrupt 발생시에 반드시 context switch가 일어나는 것은 아니다.
📌 사용자 프로세스에서 kernel로 넘어가는 것은 context switch가 아니다.

Context Switch의 예시

  1. 사용자 프로세스 A -> interrupt 발생 -> kernel mode -> 사용자 프로세스 A
  2. 사용자 프로세스 A -> timer interrupt or I/O System call -> kernel mode -> context switch -> 사용자 프로세스 B

1번 예시는 프로세스 A에서 Kernel mode로 바뀌었다가 다시 프로세스 A로 CPU를 할당했기 때문에 Context Switch가 아니다.
2번 예시는 프로세스 A에서 Kernel mode로 변경된 뒤 프로세스 B로 CPU를 할당받는 프로세스가 바뀌었기 때문에 Context Switch이다.
Context Switching을 하는 2번 예시의 경우, 이전 프로세스가 사용하던 cache를 지워야 하기 때문에 1번 예시보다 overhead가 크다.

스케줄러(Scheduler)

스케줄러는 자원별로 어떤일을 할지 계획을 세운다.

스케줄러의 종류

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

    • 시작 프로세스(new 상태의 프로세스) 중 어떤 것을 ready queue에 보낼지 결정한다.
    • 프로세스에 memory등의 자원을 주는 문제를 고려한다.
    • degree of multiprogramming(메모리에 올라간 프로그램의 수)를 제어한다. 메모리에 너무 많은/너무 적은 프로그램이 올라가면 성능이 좋지 않다. 그래서 프로그램의 개수를 조절한다.
    • time sharing system에는 보통 장기 스케줄러가 없다. 무조건 프로세스가 시작되면 ready queue로 올려둔다.
  • Short-term scheduler(단기 스케줄러, CPU scheduler)

    • 어떤 프로세스를 다음에 running 시킬지 결정한다.
    • 프로세스에 CPU를 부여하는 문제를 관리한다.
    • millisecond 단위로 매우 빨라야한다.
  • Medium-Term Scheduler(중기 스케줄러, Swapper)

    • 프로세스를 통째로 메모리에서 디스크로 쫓아낸다.
    • 메모리에 프로그램이 너무 많이 올라가면 문제가 발생하기 때문에 프로세스에게서 memory를 빼앗는다.
    • degree of Multiprogramming을 제어한다.

Thread

프로세스 내부에 CPU 수행 단위가 여러개 있는 것을 쓰레드(lightweight process)라고 한다.
쓰레드는 프로세스 내부에서 공유할 수 있는 자원을 공유한다.

Thread의 구성

  • Program counter
  • Register set
  • Stack space

쓰레드는 code section, data section, OS자원을 동료 쓰레드와 공유한다
전통적인 개념의 heavyweight process는 하나의 쓰레드를 가지고 있는 task로 볼 수 있다.
** task는 스케줄링의 기본 단위이다. task는 프로세스, thread로 구현된다.

Thread의 장점

  • 빠른 응답성 : 하나의 쓰레드가 blocked 되어도 다른 쓰레드가 동작중이기 때문에 응답성이 빠르다.

  • 자원 공유 : 똑같은 일을 하는 프로세스를 여러개 만드는 것이 아니라 하나의 프로세스를 만들어서 CPU 수행 단위를 나눈다면 자원을 공유할 수 있다. code, data를 공유하고 stack을 별도로 가진다.

  • 경제성 : 프로세스를 생성하거나 프로세스 간의 CPU switching이 일어나면 overhead가 크다. 반면 쓰레드를 사용하면 그러한 overhead가 상대적으로 적다.

  • 병렬성 : 쓰레드의 병렬적인 작업을 통해 효율성을 향상시킬 수 있다. 다중 쓰레드로 구성된 테스크 구조에서는 하나의 서버 쓰레드가 blocked 상태인 동안에도 동일한 테스크 내의 다른 스레드가 실행(running)되어 빠른 처리가 가능하다.
    동일한 일을 수행하는 다중 스레드가 협력하여 높은 throughput과 성능을 얻을 수 있다.

https://unstop.com/blog/multithreading-in-os

Process 안에 Thread가 여러개 있다면 CPU 관련 정보(PC, Registers, stack) 등만 Thread마다 따로 갖는다.

참고자료
https://open-support.tistory.com/entry/Process-Thread-Task%EC%9D%98-%EA%B0%9C%EB%85%90

profile
개발자가 되고 싶은 감자

0개의 댓글

관련 채용 정보