수행의 기본 단위
📝 정의
기본 단위
PID
가 있음Process control block(PCB)
에 프로세스의 여러 정보를 저장job, task, sequential process
등으로 불리기도 함UNIX에서 Process 생성
fork() system call
PCB
를 생성 & 초기화(기본적으로 부모의 주소공간을 카피)
(경우에 따라 부모의 자원을 공유)
exec() system call
중지
주소 공간
에 로드하드웨어 컨텍스트, 새 프로그램에 대한 Argument
초기화Ready Queue
에 배치
📝 새 프로세스를 생성하는 것은 아님 !!
main()
으로 부터 returnexit()
호출_exit()
호출abort()
호출 📝 프로세스가 어떤 방식으로 종료되든, 커널
에선 동일한 코드
가 작동한다.
프로세스의 PCB와 할당된 Memory를 해제 등
부모 Process
는 자식 Process
를 생성프로세스 그룹
이라고 부름윈도우 운영체제
는 이런 계층 구조 개념이 없음각 프로세스에는 현재 수행 중인 작업을 나타내는
실행 상태
가 있다.
ready
- 실행 가능 But, 다른 프로세스가 CPU를 사용하는 중
running
- 현재 프로세스가 CPU를 사용 중
blocked
이벤트
가 발생해서 프로세스가 진행될 수 없을 때
PCB(Process Control Block) == PT(Process Table)
에 프로세스에 대한 모든 정보 저장
PCB는 운영체제가 관리한다.
Context switch가 발생 → Running 상태의 Process 정보를 PCB에 저장
📝 Context switch
: CPU를 점유하는 프로세스가 변경되는 것
Unschedule될 때의 상태를 저장하고 Ready 상태
다시 Running 상태로 돌아갈 때 PCB를 토대로 정보를 복원
Process address space
Parallel Program
을 수행하려면, 여러 프로세스를 생성해야 함자원 할당
⚠️ Process로 병렬 처리를 하는 것은 비효율적!
코드와 데이터(주소 공간)
공유권한
Resource(파일, 소켓 등)
공유
📌 정의
- 특정 프로세스 안에서 실행되는 흐름의 단위
- 특정 프로세스 안에 리소스를 할당하고 실행을 할당하는 단위
📌 참고
Thread
를 만들고 관리하는 것이Process
를 만드는 것보다오버헤드
가 적다.Process
를 만들 때 사용되는SystemCall
의오버헤드
가Thread
를 만들 때 보다 큼- 프로세스 간의 정보 교환 →
Interprocess Communication
- 다른 프로세스로의 접근
- SystemCall을 통해
운영체제
담당오버헤드
가 크다.- Thread는
같은 주소 공간
을공유
→ 정보 교환 과정단순
+오버헤드
가 적음
<⚠️ 단점
- 하나의 Thread에서
오류나 Fault
발생 → 해당 프로세스의모든 Thread 종료
안정성
이 낮아진다.
누가 Thread를 생성하고 관리하는지?
OS
가 Thread 생성 및 관리 → Kernel Threads
Libarary
가 Thread 생성 및 관리 → User-level Threads
Example
라이브러리의 함수 호출
을 통해 생성Thread Table
을 User-level
에서 생성 및 관리생성
과 Switch
이 빠르다.Kernel Threads
보다 빠름Blocking System Call
사용 → Process 전체 BlockPage Fault
발생 → Process 전체 Block(User-level Threads는 Clock interrupt X)
결국 CPU할당은 OS가 담당한다.
User-level Threads는 OS 입장에서 하나의 Process로 보이기 때문에 여러 개의 CPU가 IDLE하더라도, 하나의 CPU밖에 할당 할 수 없다.
Kernel Threads
는 OS
가 Threads를 관리Kernel Threads
는 Threads의 수가 제한됨오버헤드
가 크다.But, Process로만 관리하는 것보단 낫다.
Multithreaded Programs
에서 각 Thread들은 협력
해야 함Synchronization
을 통한 Thread 제어
필요Race Condition
Output
을 예상할 수 없는 경우타이밍
에 따라 결과가 다르게 나올 수 있는 상황- Example
📌 공유된 자원에 Synchronization
없이 접근 → Race Condition
발생할 수 있음
모든 공유된 자원에 대해 Synchronization는 필수적
이다.
공유된 자원에 Access하는 Code
상호 배타적으로 수행하는 방식
동시에 수행할 수 없도록 하는 방식
📌 Mutual exclusion
을 통해 Critical Region
의 실행을 동기화
하자!
Mutual exclusion
Bounded waiting(No starvation)
Progress
Disabling Interrupt
Locks
Semaphores
Monitors
Messages
Critical region
에 진입하면 interrupt를 disable
Mutual exclusion 위배
⚠️ Context swtich
가 일어나는 시점에 따라 Mutual exclusion
위배할 수 있음
Busy waiting
Spin lock
Busy waiting
을 사용하는 LockMutual exclusion
Progress
상황 발생 가능해결방법
Peterson's Solution
- 이해하기 어려움, 성능 문제 등
TSL(Test and Set Lock) instruction
Atomic한 명령어
를 지원하는하드웨어의 도움
Atomic instructions
: 중간에 끼어들 수 없는 명령어, 쪼갤 수 없음- 위 사진에서 Lock을 테스트하는 명령어와 Setting하는 명령어가
Atomic
- Lock방식과 비슷하지만,
Atomic
이 보장 →Mutual exclusion
⚠️ 하지만 이 방식들은 Busy Waiting 방식 → CPU 낭비
sleep(), wakeup() System Call 사용
sleep()
wakeup()
Example
![](https://velog.velcdn.com/images/quddlr96/post/3d807792-adde-4cf6-8afd-9426e190f0aa/image.png)
- 파란색에서 빨간색으로 진행할 때, Context Switch가 발생 → 둘 다 Sleep하는 문제 발생
- count와 buffer는 `전역변수(공유된 자원)`
- Sleep & Wake-Up은 `Mutual exclusion X`
- count와 buffer에 접근하는 명령어는 Mutual exclusive 해야 함
down
,up
Operation이 있음down(semaphore)
semaphore 값이 0보다 크면 semaphore값을 1만큼 감소
semaphore 값이 0이라면 wait
if (semaphore >0) semaphore--; else wait();
up(semaphore)
📌 up(semaphore)
에 의해 wait이던 Process or Thread가 깨워지면, down(semaphore)
를 다시 수행해야 함
깨워졌다고 해서 semaphore값이 0이 아니라는 보장을 할 수 없다!
Binary Semaphore
Counting Semaphore
📌 Thread
는 같은 주소 공간을 공유하기 때문에 전역 변수
에 접근하기 수월하다. 하지만
Process
는 그렇지 않기 때문에, OS의 도움으로 주소 공간을 공유 또는 Semaphore
를 공유하는 자료 구조로 Kernel
이 제공하는 방식을 사용해 자원을 공유하게 해준다.
프로그래밍 언어
에서 제공
Semaphore보다 쉽게 사용 가능
Mutual Exlusion
보장
Monitor
안에서 선언된 함수에 특정 Thread or Process가 접근하면 다른 Thread or Process는 그 함수에 접근할 수 없음
wait(c)
Monitor 밖으로 나옴
(Monitor lock 해제)
signal(c)
그럼 signal보낸 쓰레드랑 wait에서 깬 쓰레드랑 어떤게 먼저 수행되어야하나 ?
❓ signal을 보낸 Thread or Process와 wait에서 깬 Thread or Process중 어떤 것 먼저 수행?
hoare monitors
wait에서 깬
Thread or Process 먼저 수행mesa monitors
signal을 보낸
Thread or Process 먼저 수행다시 한번 체크하고 진행
hansen monitors
⚠️ 단점
공유 메모리
가 아닌 네트워크
로 연결된 환경Semaphore
도 동일네트워크 같은 분산 환경에서 사용
send
, receive
System Call 사용