[운영체제] 프로세스와 쓰레드 (feat. 쓰레드 장점)

하은 ·2022년 2월 13일
2

운영체제

목록 보기
2/2

https://core.ewha.ac.kr/publicview/C0101020140318134023355997

프로세스

: 실행중인 프로그램

프로세스의 문맥

1. CPU 수행 상태를 나타내는 하드웨어 문맥

  • 프로그램 카운터가 어딜 가리키는지, 레지스터가 어떤 값을 가지고 있었는지

2. 메모리와 관련된 프로세스의 주소 공간

  • 코드, 데이터, 스택

3. 프로세스 관련 커널 자료구조

  • 프로세스가 시작될 때마다 운영체제는 PCB라는 자료구조를 가짐.
  • 프로세스가 시스템 콜 일으키면 커널이 코드를 실행.

=> 프로세스가 번갈아 실행(시분할)되기 때문에 어디까지 작업했는지 기억하기 위해선 프로세스의 문맥을 알아야함.

프로세스의 상태 (CPU 관점)


1. Running: CPU를 잡고 명령어 수행중
2. Ready: 다른 조건 다 만족하고 CPU 대기하는 중 (필요한 자원이 메모리에 올라와있고)
3. Blocked(wait, sleep): CPU가 있어도 당장 명령어 수행 불가한 상태 / IO 등 오래 걸리는 작업 중일 때
4. New: 프로세스가 생성중
5. Terminated: 수행 끝
6. Suspended: 중기 스케줄러에게 메모리를 뺏긴 상태. 프로세스가 통째로 디스크에 swap out된 상태 또는 사용자가 프로그램을 정지한 경우

=> 주로 ready-running에서 CPU가 쉐어링. 러닝에서 할당 시간 만료되면 타이머 인터럽트 발생.

PCB

  • 운영체제가 각 프로세스를 관리하기위해 프로세스당 유지하는 정보.
  • 프로세스 상태, PID, 우선순위, 스케줄링 정보, 코드/데이터/스택의 메모리 내 위치 정보 등

Context Switch

  • CPU를 한 프로세스에서 다른 프로세스로 넘겨주는 과정. PCB에 프로세스 문맥 정보를 넣어 문맥을 저장해둔다.
  • 시스템 콜이나 인터럽트 발생시 반드시 일어나진 않고 타이머 인터럽트나 IO 요청 시스템 콜이 일어난 이후 다른 프로세스를 실행하러 갈 때 문맥교환이 일어남.

프로세스 스케즐링 큐

  • CPU 작업하다가 시간 지나면 다시 레디큐 가서 서야함
  • fork a child(자식 프로세스 생성)하면 자식을 실행해두고 자기는 다시 레디큐에 선다

스케줄러

  • 장기 스케줄러: 프로세스에 메모리를 주는 문제 결정. 메모리에 올라야 레디 큐에 올라갈 수 있음. 메모리에 프로그램이 너무 많아도 적어도 문제임. 너무 적으면 CPU가 놀 수도 있음. 얼마나 멀티 프로그래밍(degree of Multiprogramming)을 할지 정함
  • 중기 스케줄러(=swapper): 메모리에 프로세스가 너무 많이 올라가 있으면 메모리를 뺏고 통째로 디스크로 쫓아냄

쓰레드

  • 프로세스 내부의 CPU 수행 단위. 각 쓰레드마다 현재 어떤 부분을 실행하고 있었는지 PCB 안에 각각 적어둔다.
  • 프로세스에서 코드 섹션, 데이터 섹션(메모리 주소공간), OS 자원 등은 공유하고 CPU 수행 상태는 별도로 가진다. 이때 공유하는 부분은 task라고 한다. (= 1 process 1 task)
  • 프로그램 카운터, 레지스터, 스택 공간을 별도로 가짐

쓰레드를 사용하면 좋은 점


1. 응답성: 1 process 안에 여러 쓰레드가 있으면 쓰레드 하나가 blocked여도 다른 스레드가 running이 가능.
(e.g.네트워크로 웹 페이지 읽어오는 동안(io 작업) 내 웹 브라우저는 blocked. 웹 브라우저를 여러 쓰레드로 불러오게하면 한 쓰레드가 웹 읽어오는 동안 다른 쓰레드가 html 파일에서 읽어온 조금의 텍스트라도 보여줄 수 있음.)
- 비동기식 IO처럼
2. 자원 공유: 한 프로세스에 있는 쓰레드간 자원을 공유함으로써 절약 가능
3. 경제성: 프로세스를 스위치할때보다 쓰레드를 스위칭할 때 오버헤드가 덜함
4. 멀티프로세서 구조의 효용성: 프로세서는 하나일때 쓰레드가 병렬로 일 가능 (e.g. 거대한 병렬 계산할 때 등)

커널 쓰레드와 사용자 쓰레드

  • 커널 쓰레드: 쓰레드가 여러개라는 걸 os가 알고 있음. 커널의 지원 받을 수 있음
  • 유저 쓰레드: 라이브러리를 통해 지원됨. 프로세스에 쓰레드가 여러개라는걸 os는 모름. 라이브러리 차원에서 관리함.

헷갈리기 쉬운 것

  • ch2에서 사용자 프로세스가 입출력해줘~ 부탁하고 기다려야되면 동기식. 입출력 부탁하고 입출력이 끝나는거 기다리지않으면 비동기식
profile
Human slash developer who's striving to be the BEST version of herself

1개의 댓글

잘읽었습니다. 코루틴과 쓰레드의 차이가 콘텍스트 스위칭이 일어나지않아 코루틴이 훨씬 효율적이라는 내용을 봤었는데 많은 도움이 되었습니다.

답글 달기