OS

Process, Thread

sshhhh 2024. 10. 26. 18:38

Process

메인메모리에 로드되어 실행 중인 프로그램 

 

PCB

os안에 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. 다중 처리 구조 활용 -> 각각의 스레드가 다른처리기에서 병렬로 수행