Process
메인메모리에 로드되어 실행 중인 프로그램
PCB
- 만약에 process a를 실행해야하면 pcb a라는 자료구조를 os가 가지고 있는 것임
- 즉 각 프로세스를 컨트롤하기 위해 각 프로세스와 연관된 정보를 보관하는 자료 구조(저장 장소)
- os가 가짐 메인메모리에 들어있는 구조로 스택 아님
cpu switch
- executing되다가 다른 프로세스 P1을 수행시키기 위해 PCB0에다가 P0프로세스 정보를 저장
- 그리고 레지스터에 PCB1에 저장되어있던 process 1 정보를 가져와 P1을 수행
- 수행중인 프로세스를 변경할 때 레지스터에 프로세스의 정보가 바뀌는 것 : Context Switching
- CPU가 이전의 프로세스 상태를 PCB에 보관하고, 또 다른 프로세스의 정보를 PCB에서 읽어 레지스터에 적재하는 과정
- 프로세스가 준비 -> 실행, 실행 -> 준비, 실행 -> 대기 등으로 상태 변경될 때 발생
*참조
https://dev-mystory.tistory.com/119
Context Switching
- cpu를 다른 프로세스로 교환하려면 시스템은 이전 프로세스 상태를 보관하고 새로운 프로세스의 저장된 상태를 적재해야함
- context는 pcb에 있음
-> pcb : cpu 레지스터 + 프로세스 상태 + 메모리 관리정보
- 이는 문맥 교환 작업으로 순수한 오버헤드임 유용하지 않아서 시간을 줄여야함
- hw에서 동작함
Process 상태, 전이
new : 프로세스 생성
--------------------------------------------------------------------------------------
<반복>
ready : 프로세스가 cpu에 할당되길 기다림
running : 프로세스의 명령어들이 실행되고 있음
waiting : 프로세스가 i/o 요청 or 인터럽트 이벤트 기다리는 경우
--------------------------------------------------------------------------------------
terminate : 프로세스 실행 종료
CPU Sheduler
cpu를 쓰지않는 상태가 될때마다 os는 ready큐에 있는 프로세스 중 하나를 선택해서 실행함
Dispatcher
CPU Sheduler가 선택한 프로세스에게 cpu를 할당함
-> cpu 제어권을 프로세스에 제공함
<기능>
context 교환, user 모드로 전환
*dispatcher 지연 : dispatcher가 하나의 프로세스를 정지하고 다른 프로세스의 수행을 시작하는데 소요되는 시간
-> context switch로 오버헤드임
cpu 스케쥴링 결정이 발생하는 상황
1. running -> waiting : i/o 요청
2. terminate : 종료
3. running -> ready : timer run out 인터럽트
4. waiting -> ready : cpu 반납
5. new : 생성
*1,2는 비선점, 3,4,5는 선점으로 우선순위 높으면 뺏기가능
Process Scheduling queues
- os는 프로세스 동작을 제어해야함
1. cpu 할당 : cpu는 한갠데 프로세스는 여러개
2. i/o 요청에 대한 서비스 스케쥴링 : 동시에 요청오면 뭘 먼저 줘야하나?
queues
1) jop queue : 실행중인 모든 프로세스 들어있음
2) ready queue : 메인 메모리에 레디상태로 존재함, 실행 대기중, 연결리스트로 저장
3) wating queue : wating 상태로 i/o요청 장치 대기중
Process creation
- 프로세스는 실행도중 프로세스를 생성할 수 있음
- fork() 라는 시스템 호출 사용함, 유닉스에서 프로세스를 생성하는 함수로 부모 자식 관계
1. parent -> p'child fork(); 실행해됨가 동시에 자식 프로세스 생성 (복제) , os코드에서 생성한 것
2. 그 후 exec() 라는 프로그램 로드를 통해 hdd에 있는 프로그램을 p'child의 메모리에 로드한 후 프로그램을 실행함.
-> exec()를 통해 새로운 프로그램 p'child의 코드를 교체함
<리턴값>
-> 부모: p'child의 id 값, 자식: 0
<좀비프로세스>
자식 프로세스가 먼저 종료되었지만, 부모 프로세스가 자식의 종료 상태를 수거하지 않은 상태
- 부모보다 자식이 먼저 죽어버림
- 부모는 자식에게 종료됐다는 신호를 받지 못하면
자식 프로세스는 부모가 종료될 때까지 대기한다.
- 죽었으나 죽은 것이 아닌 상태로 메모리에 완전히 사라지지 않는 상태 -> 시스템 자원 낭비
- 해결책 : 부모프로세스에 자식프로세스의 종료 시그널을 받는 코드를 작성
Thread
- cpu를 사용하는 기본 단위로 코드의 실행 흐름
- 하나의 프로세스 내에서 실행되는 하나 또는 여러개의 작업 단위
- 하나의 프로세스가 여러 스레드 소유 가능
- 구성 : 고유한 thread id, pc, registers, stack
Multi-Thread
- 스레드는 그 자체가 또 다른 스레드를 생성할 수 있음
- 하나의 프로세스가 여러 스레드 소유
<<장점>>
1. 응답성 good
2. 경제성 good
3. 자원공유 가능
4. 다중 처리 구조 활용 -> 각각의 스레드가 다른처리기에서 병렬로 수행
'OS' 카테고리의 다른 글
Process 동기화 (0) | 2024.10.27 |
---|---|
OS Scheduling (0) | 2024.10.27 |
Multi Programmed System : Dual- Mode, protection 기법 (0) | 2024.10.26 |
저장 구조 및 입출력 (3) | 2024.10.26 |
OS Interrupt, I/O구조 입출력 과정, DMA (0) | 2024.10.26 |