본문 바로가기

OS 공부

OS 공부- 프로세스, PCB, Context switch, thread

728x90
반응형

프로세스
실행중인 프로그램
프로세스는 운영체제에서 작업 단위

 

프로세스가 실행되기 위한 자원
CPU time
memory
files
I/O devices

 

프로세스
HDD 나 SSD 에있는 실행파일이 스토리지에 저장되어 있는데 CPU가 가져와서 실행하지는 못함->
프로그램(set of instruction)을 메모리에 로드하면 CPU입장에선 패치해가지고 실행할 수 있는 상태가 됨 : 프로세스
=> 메모리에 적재된 프로그램
메모리에 올라와 있다고 해도 다 실행되는게 아니라 CPU를 점유해야됨
OS가 해야할 가장 기본적인 일 : 프로세스 관리

 

여러개의 섹션으로 나눠져 있는 이 프로세스의 메모리 레이아웃:
Text section : the executable code 명령어들이 있는 코드
Data section: global variables 전역변수
Heap section: 메모리 얼로케이션 , java의 new, 프로그램 실행동안 동적으로 할당되는 변수가 저장되는 공간
Stack section: 함수호출 시 힙에 함수스택 쌓임, 지역변수, 리턴어드레스

 

코드가 있는 텍스트 섹션 올리고, 전역변수.. 스택은 위에서부터 함수호출 쌓아옴, 힙영역은 밑에서 쌓아오다가 부족해지면 더 늘림

 

x -> uninitialized data
y -> initialized data
argc, argv -> argc, argv
main, values, i -> stack
malloc -> heap
for ~ -> text
return 0 하면 메인함수가 운영체제한테 제어권을 넘겨준다.

 

 

프로세스의 라이프 사이클
New: 프로세스가 막 생성된 상태
Running: 프로세스의 명령어를 cpu에 로드 해서 실행하는 상태
Waiting: 다른 프로세스 cpu 사용 끝날때까지 기다리는 상태 또는 I/O completion이 올때까지 대기하는 상태, 입/출력 완료를 기다리는 상태
Ready: I/O completion 대기하고 있다가 신호가 옴, 점유할 준비가 됐다.
Terminated: 다 종료한 상태

 

CPU가 ready 상태인 프로세스 running 하라고 하는것: 디스패치
return 0 -> terminated , 자원회수

 

 

PCB
Process Control Block
프로세스가 가져야하는 모든 정보를 다 저장하자
프로세스 핸들링함
PCB 내용:
Process state : new, ready, running, waiting, terminated
Program counter : 메모리의 다음 명령어 주소를 저장함
CPU registers: IR(Instruction Register), DR(Data Register), PC(Program Counter)와 같은 저장공간
CPU-scheduling information: 프로세스 실행순서(스케줄링) 정보
Memory-management information: 메모리 관련 정보
Accounting information: 계정 정보, 어떤 유저가 크리에이션했는지, 프로세스의 실행, 시간 제한, 실행 ID 등에 사용되는 CPU양 정보
I/O state information 어떤 파일을 오픈했고 어떤 자원을 오픈해서 락을 걸었는 지 이런 정보들

 

프로세스와 스레드
프로세스는 single thread of execution을 가진다. (한줄로 실행된다)
(thread : 실타래 : 한 줄로 주욱 실행 , 함수만나면 갔다오고 반복문나오면 돌고 .. 죽 이어짐)
한 프로세스 싱글 스레드로 돌다가 다른 프로세스 들어오면 것도 싱글스레드 돌다가 다시돌아와서 죽 이어서함, 시간의 시분할을 통해서 쭉 실행
하나의 싱글 쓰레드를 실행하는 프로그램
한번에 하나의 최소 작업 단위(Task)만 실행이 가능함

 

한번에 한 테스크밖에 못하기 때문에 여러개를 동시에 하고싶다. -> multiple threads of execution
멀티 프로세싱 , 멀티 태스킹

 

thread
프로그램하나에서 여러개의 스레드가 있을 필요가 있다.
위에나온 스레드와 다름
프로세스보다 더 가벼운 개념
멀티스레드가 대세, 멀티 프로세싱보다 장점이 많다.

 

멀티프로그래밍의 목적
여러개의 프로세스를 실행시켜보자 동시에, 병렬적으로
CPU 사용효율 증가 : 시분할 시스템(Time Sharing System)의 목적
타임 쉐어링, 프로세스 자주 교체해서 사용자가 동시에 사용하는것처럼 보이게하자

 

스케줄링 큐(FIFO)
대기열에 대기하고 있다가 (레디큐) CPU획득, cpu 사용후 큐의 다시 뒤로 들어간다. I/O complition 이벤트 기다리는 경우 waiting 상태큐로. waiting 큐에선 ready 큐로
구현은 링크드 리스트

 

Queueing Diagram
I/O request오면 I/O 큐에 있다가 ready queue로감
time slice expired되면 ready queue로감
CPU가 fork하면 new 상태 , child 프로세스 ready queue로감
interrupt기다리다가 발생하면 ready queue

 

Context Switch(문맥 교환)
문맥: 프로세스가 사용되고 있는 상태, PCB에 다 저장돼있음, PCB정보: 문맥
interrupt일어났을때 running proccess 문맥 저장하고 다시 러닝상태 되면 restore복구함
현재프로세스의 문맥을 저장하고 새로운 획득할 프로세스의 pcb를 복원한다.

 

 

부모 프로세스(Parent Process)와 자식 프로세스(Child Process)
프로세스가 프로세스를 만든다.
creating process: a parent process
부모가 만든 프로세스: a child process
기존에 생성한 프로세스 : 부모 프로세스(Parent Process)
기존에 생성한 프로세스에 의해 새롭게 생성된 프로세스 : 자식 프로세스(Child Process)
fork로 만든다.
첫번째 프로세스 init pid=1
cli띄우고 ~ gui 띄우고 로그인하고 ~

 

실행 옵션
자식 포크해주면 만든 자식과 cpu를 공유하면서 동시에 실행될 수 있다.
->부모 프로세스와 자식 프로세스는 동시에 실행
waiting 하는 상태가 될 수 있다. 일종의 I/O complition처럼 자식이
terminated 할때동안 기다렸다가 다시 실행할 수 도 있다.
->부모 프로세스는 자식 프로세스가 종료될때가지 기다림

 

address-space 옵션
address space를 parent process와 복제를 함
->자식 프로세스는 부모 프로세스와 동일한 프로그램을 수행
새로운 프로그램을 로딩하는 경우
->자식 프로세스는 부모 프로세스와는 다르게 새로운 프로그램을 수행

 

부모가 fork해서 pid가 0보다 큰경우 wait() , pid가 0인경우 child이기 때문에 exec()실행하고 exit()

 

 

종료
마지막 문장 (return) 실행.
exit()로 강제 종료
OS입장에서는 프로세스 종료시 메모리해제하고 회수(file, I/O buffer..)

 

좀비(Zombie) 프로세스와 고아(Orphan) 프로세스
고아: 부모 프로세스가 wait 호출하지 않고 종료함
부모프로세스가 자식 프로세스보다 먼저 종료된 프로세스
좀비: 부모가 살아있는데 신경을 안씀, wait 호출 없이 부모일만 함
실행이 종료되었지만 아직 삭제되지 않은 프로세스들

반응형