본문 바로가기

Computer Science/OS

프로세스의 관리 ,PCB(Proccess Control Block)

처음에 몸풀기로 저번에 했던 프로세스의 상태변화를 살펴봅니다.

 

1,2 - 운영체제에서 프로세서를 사용할 수 있다면 1을 실행합니다.

프로세서 사용 시간이 다되면 2를 실행합니다.

 

3 - 프로세스가 이벤트나 입출력을 모두 완료했다면 다시 준비상태로 갑니다.

4 - n

 

5 - 프로세스가 이벤트나 입출력을 실행하려면 대기 상태로 가야합니다.

6 - n

 

처음에 생성할 때 많이 생성하면 다중 프로그래밍 정도가 높아질 것입니다.'

그 반대도 적용됩니다.

 

프로세스의 상태 변화와 상태 정보

준비상태의 프로세스들은 대기열이 있어야 합니다.

 

프로세스 컨트롤 블럭을 연결하는것과 같습니다.

 

프로세스 컨트롤 블럭

프로세스의 모든 정보를 가지고 있습니다.프로세스의 실행상태를 가지고 있습니다.

 

프로세스 테이블도 있습니다. 살아있는 프로세스가 뭐가 있는지 알 수 있습니다.

프로세스 id도 알 수있고 그에 해당하는 블록을 알 수 있습니다.

 

 

프로세스 컨트롤 블록안에 무었이 있는지 자세히 알아봅시다

실행 상황을 가지고 있기 때문에 레지스터를 가지고 있습니다.

프로그램 카운터는 위 그림의 head에서부터 가는 화살표 입니다.

 

레지스터 저장 영역은 PCB블록 안에 레지스터 블록입니다.

 

각각 다 떨어져 있는것이 아닙니다.

프로세스가 사용할 수 있는 메모리 부분이 어디부터 어디까지 인지 상한, 하한 레지스터가 가지고 있습니다.

사용하는 메모리를 페이지, 세그먼트 기법으로 관리할 경우 엑세스 할 수 있습니다.

 

왜 PCB가 레지스터 저장영역을 가지고 있어야 할까요?

프로세스 하나가 cpu를 계속 차지하면 필요가 없을 겁니다.

근대 항상 차지하지 않지 때문에 내쫒깁니다. cpu를 사용하고 내쫒길 때 초기화 하면 안되니

그런 상태를 저장하는 것이 레지스터 저장영역입니다.

 

 

그림에서 프로세스 2개를 놓고 예시를 들고 있습니다.

 

1. 시스템 콜이나 인터럽트가 발생하면 P0의 PCB의 내용을 저장합니다.

이 때 PCB 내용은 무었일까요? cpu안에 있는 레지스터 들을 저장합니다.

 

2. 그리고 옛날에 저장한 P1 프로세스의 PCB를 불러와서 cpu를 사용하게 합니다.

 

3. 끝나면 다시 P1프로세스의 PCB를 저장하고 다시 P0의 PCB를 불러와서 cpu를 사용합니다.

 

문맥 교환을 해주는 일꾼을 디스페처 입니다.

스케줄러는 준비 큐에 어떤 것을 뽑아서 cpu에 어떤것을 전달하지 정하는 것 입니다.

 

 

4번 입니다.

프로세스의 우선순위는 스케줄러가 가지고 있을 겁니다.

 

아니였습니다.

 

1번 이였습니다.

프로세스의 개수는 속하지 않습니다.

 

2번 같습니다.

자말적으로 프로세스가 cpu를 놓을 때 같습니다.

실행 -> 대기 상태로 갑니다.

 

1번

대기 -> 준비 상태이기 때문에 cpu 변화를 주지는 않습니다.

 

3번

대기 -> 준비 상태이기 때문에 cpu 변화를 주지는 않습니다.

 

4번

준비 -> 대기로 갈 수 없습니다.

 

 

 

 

 

 

 

프로세스의 관리

프로세스의 계층구조, 생성, 종료, 제거, 중단, 재시작, 우선 순위, 문맥 교환

 

 

 

 

 

프로세스의 관리 - 프로세스의 계층구조

커널에서 직접 생성하는 프로세스를 제외하고 나머진 다 부모를 가집니다.

 

fork()를 부르는건 부모고 생성된건 자식입니다.

i=0일 때 부모1 자식1

i=1일 때 부모2 자식2

i=2일 때 부모3 자식3 

 

이렇게 될거 같습니다.

부모와 자식은 완벽하게 똑같습니다., 코드 수행하는 줄도 똑같습니다.

프로세스id 리턴값만 다릅니다.

 

아니였습니다.

i=0일 때 부모1 자식1-1

i=1일 때 부모1-2 자식1-1-1

i=2일 때 부모1-3 자식1-1-1-1, 자식 1-1-2, 자식 1-2-1 

 

만약 return 전에 print문이 있었다면 몇번 출력이 될까요?

8줄

 

 

fork()를 하면 pid만 다른 자식 프로세스가 만들어 집니다.

부모 프로세스에서 pid

자식 프로세스에서 pid에 0이 들어 갑니다.

 

pid가 0보다 작다면 fork를 제대로 못했다는 것 입니다.

 

fork한 후에 이그젝을 하면 다른일을 시킬 수있습니다.

 

 

프로세스의 관리 - 프로세스의 생성

앞에서 말할 때는 프로세스 생성은

디스크에 들어 있는 프로그램이 메모리를 차지하면서 메모리 영역을 차지하고 ,PCB도 차지하고 하는 것들이 생성입니다.

 

생성에 필요한 새부작업은 

사실 부모가 생성하는 것이 많습니다.

부모는 대기하고 있다가 자식 만들어서 시키고 다 끝나면 자기 할일 합니다.

 

위 그림은 무엇을 설명하고 있는 걸까요?

부모프로세스에서 fork를 실행하면 위는 부모가 가는길이고 밑은 자식프로세스가 가는 길 입니다.

wait()의 리턴값은 자식 프로세스의 id입니다. (= 자식 프로세스를 회수 합니다.)

 

exit()는 정상종료했는지 비정상종료했는지 반환 합니다.

 

fork()가 리턴한 값은 pid인 변수에 불과합니다.

부모에서는 fork()리턴값이 자식 프로세스의 id 입니다.

1번 - 자식 프로세스 종료 입니다.

 

 

 

 

 

 

 

프로세스의 관리 - 프로세스의 종료

자발적으로 종료하는 것은 2가지 이빈다.

정상종료, 실패

 

core dump - 메모리 상태를 파일에 저장하는 것 입니다.

운영 체제에 따라서 다릅니다.

프로세스를 관리하는 방법입니다.

부모가 없는 자식을 허용하지 않음 - VMS(운영체제)

 

UNIX는 양부모에게 입양합니다.(init을 새로운 부모로 따릅니다.)

 

항상 부모가 있어야 합니다.

부모의 역활은 무엇인가? 종료상태를 회수하는 것입니다.

 

wait명령어로 회수합니다.

리턴값이 자식 프로세스 id입니다.

 

wait()

매개변수에 int 포인터를 넣어주면 종료 상태를 반환해줍니다.

 

좀비란 무엇일까요? 부모가 종료상태를 회수하지 않았는대 자식이 죽었습니다. 자식이 차지하던 자원이 약간 남아있습니다. (= 종료상태를 시스템에서 남겨둡니다.)

 

좀비가 많이 있다면 쓸때 없는 자원을 메모리에 남겨둔 것 입니다.

고아도 남겨저서 역할이 있다면 괜찮은대 아니면 낭비입니다.

 

2번 - 정당하게 하는 것인대 종료시키면 안됩니다.

 

 

 

 

 

 

 

 

프로세스의 관리 - 프로세스의 제거

자원 = 메모리, PCB가 차지고 있는 메모리

 

 

 

 

 

프로세스의 관리 - 프로세스의 중단과 재시작

728x90