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에서 사용자 프로세스가 입출력해줘~ 부탁하고 기다려야되면 동기식. 입출력 부탁하고 입출력이 끝나는거 기다리지않으면 비동기식
잘읽었습니다. 코루틴과 쓰레드의 차이가 콘텍스트 스위칭이 일어나지않아 코루틴이 훨씬 효율적이라는 내용을 봤었는데 많은 도움이 되었습니다.