Context Switching, 스레드 수준, fork()

11. Context Switching 이란?

하나의 프로세스가 CPU를 사용 중인 상태에서, 다른 프로세스가 CPU를 점유하려고 할 때,

사용 중인 프로세스의 context를 PCB에 저장하고, 새로운 프로세스 의 상태를 CPU에 적재하는 작업

11-1. PCB의 저장 위치

PCB는 중요 정보를 담고있기 때문에, 일반 사용자가 접근할 수 없는 보호된 메모리에 저장한다.

일부 OS에서는 안전하고, 편리한 커널의 스택 첫 부분에 저장을 한다.

11-2. PC(Program Counter) 이란?

CPU 내부의 레지스터 중 하나로, 다음에 실행될 명령어의 주소를 가지고 있다.

명령 주기에 따라 자동으로 증가하고, 반복문 등에서는 다음 코드가 아닌 새로운 코드의 위치 값이 들어간다.


12. 사용자 수준 스레드와 커널 수준 스레드의 차이

커널 수준 스레드는 OS에서 생성하고, 관리하는 스레드이고, 사용자 수준 스레드는 라이브러리 등을 통해 사용자가 생성한 스레드다.

영역을 나눠줌으로써 코드 단에서 critical 한 systemcall(중요 파일에 대해 파일삭제 등)을 날리면 커널에서 막아준다.

사용자 수준 스레드

  • 장점
  • kernel에 접근하지 않기 때문에, context switching이 없다. 따라서 커널 스레드에 비해 오버헤드가 적다.
  • 라이브러리를 통해 스케줄링을 제어하여 유연한 스케줄링 가능
  • 단점
  • 한 스레드가 block되면 모든 스레드가 실행 불가 상태가 된다.
  • 커널 수준의 보호 방법을 사용할 수 없다.

커널 수준 스레드

  • 장점
  • 각 스레드들을 독립적으로 관리할 수 있고, 멀티 프로세서를 활용할 수 있다.
  • 한 스레드가 block돼도 다른 스레드들은 실행시킬 수 있다.
  • 단점
  • context switching으로 인한 오버헤드

12-1. 멀티 프로세싱과 멀티 프로그래밍의 차이

멀티 프로세싱

  • 여러 개의 CPU가 협력적으로 일을 처리하는 것
  • fork를 통해 프로세스를 여러 개로 늘려, 여러 프로그램을 병렬로 처리

멀티 프로그래밍

  • 한 프로그램이 대기 상태일 때, 다른 프로그램을 수행하는 것

멀티 태스킹

  • OS의 스케줄링을 통해 task를 번갈아가며 수행하는 것
  • task를 자주 번갈아가며 수행하여 동시에 수행하고 있다고 느낀다.

멀티 스레딩

  • 하나의 프로세스를 여러 개의 스레드끼리 자원을 공유하여 처리하는 것
  • 하나의 프로그램을 병렬로 처리

13. fork()와 vfork()의 차이점

자식 프로세스를 생성하는 시스템콜이다.

fork()는 부모 프로세스의 메모리를 복사해서 사용하지만, vfork()는 부모 프로세스의 메모리를 공유한다.

fork()를 실행하고 자식 프로세스에 변경사항이 생기면 독립적인 주소 공간을 생성시킨다.

vfork()는 fork()에 비해 생성 속도가 빠르지만, 자원을 공유하기 때문에 race condition이 발생하지 않도록 자식 프로세스가 부모 프로세스를 exit하거나 실행될 때까지 block 해야한다.

13-1. 스레드의 저장 위치

PCB 내부에 Thread Control Block에 저장한다.

멀티 프로세스에서는 둘 다 교환해준다.

13-2. 오버헤드

어떤 처리를 하기 위해 소요되는 처리시간, 메모리 등을 말한다.

13-3. 혼합 스레드

N:M 매핑을 통해 사용자 수준의 스레드

오버헤드 측면에서 thread pooling으로 보완가능

13-4. vfork()를 할 때 공유 자원에 대한 conflict 회피할 수 있는 방법

=> copyOnWrite() > COW

Context Switching, 스레드 수준, fork()

http://inwoo.github.io/11/10/0-interview-os4/

Author

Inwoo Jeong

Posted on

2021-11-10

Updated on

2021-11-10

Licensed under

You need to set install_url to use ShareThis. Please set it in _config.yml.

댓글