<Context Switch>
- When CPU switches to another process, the system must save the state of the old process and load the saved state for the new precess
- save하고 load하는 대상이 무엇인가?
- System context(3가지) : Process data structure allocated by kernel
-> PCB, Page/Segment Table, File table, etc.
- Hardware Context : Register information such as Programe counter, stack pointer, etc
- Memory space, a.out image in disk -> process image
- Context-switch time is purely overhead, the system does no useful work while switching
- time slice to execute를 적절하게 조정해서 context switching time을 결정해야한다
- time slice가 너무 크면 process가 길게 실행되어 사용자가 mutitasking이 안되는것처럼 느낌
- time slice가 너무 작으면 전체 실행 시간 중 overhead인 context-switching에 할당하는 시간이 너무 늘어남
<Process Creation>
- Parent process create children processes
- Resource sharing type in process hierarchy
- Parent and children share all resuoures(UNIX) : 부모,자식이 모든 리소스를 공유
- Children share subset of parent's resoureces : 일부만 공유
- Parent and child share no resources : 공유안함
- Execution
- Parent and children execute concurrently
- Parent watis until children terminate(UNIX) -> 자식이 종료되면 부모 프로세스 시작
- Address space
- Child process duplicates parent process address space-> 주소공간의 모든것을 그대로 복제함 -> fork()
- Child's program is loaded into into its duplicated address space -> 복제된 모든것이 동일한 주소공간에 child process를 호출한 프로그램의 image를 덮어쓴다.
<Fork, Exec, Wait>
- fork() system call
- only way to increase the number of processes -> 프로세스를 증가시키는 유일한 방법
- create a copy of itself : copy a.out image(binary image),kernel data structure(PCB), 두가지를 그대로 복사
- all environment are inherited : file offset, program counter까지 전부 다 복사!
- program counter : program를 어디서부터 읽은지 결정하는 책갈피 같은 거라 이해
- only PID(주민등록번호) differs plus...lock attribure(컴퓨터의 지문 같은 느낌으로 이해하자..)
- exec() system call
- Rerieve a file form disk(program file을 가져옴)
- overlay on old a.out image(기존의 바이너리 파일을 덮어쓴다)
- Jump to start location(program counter를 제일 앞으로 -> 당연히 새로운 image니까 처음부터 읽어야함!)
- wait() system call
- If PA invokes wait() -> the kernel blocks PA
- until child terminates
- when child terminates, kernel wakes up the parent
- kernel puts the parent into ready queue
- parent is dispatched later
<fork와 exec예제 - 리눅스에서 실행해보기>
#include <stdio.h>
int main(){
int pid;
pid = fork();
//wait() 이거 하고 안하고의 차이는??
if(pid == 0){
printf("\n hello child \n");
}
else{
printf("\n hello parent \n");
}
}
include <stdio.h>
main()
{
char *arg[] = {"ls", "-l", (char*)0};
printf("before executing ls -l \n");
execv("/bin/ls",arg);
printf("after executing ls -l \n");
}