프로세스가 어떻게 만들어지는가!
부모 프로세스가 자식 프로세스를 생성
👉 생성 과정에서 프로세스의 트리(계층 구조) 형성
프로세스의 실행을 위해서 자원이 필요
수행(Execution)
종료
프로세스를 만들어달라는 요청에 대한 fork의 코드이다.
int main(){
int pid;
}
int main(){
int pid;
pid = fork();
}
부모(pid)가 fork를 요청하면 위 함수와 똑같은 코드가 새로 생성된다.
📍주의점
부모와 자식이 같은 코드를 가지게 되었지만, 부모는 처음부터 코드가 실행되고 자식은 fork() 이후부터 실행된다는 차이가 있다.
int main(){
int pid;
pid = fork();
if(pid == 0)
print("hello, l am child")
else if (pid > 0)
print("hello, l am parent")
}
exec 시스템 콜은 복제된 프로세스가 완전히 새로운 프로세스가 되도록 한다. 복제된 fork 코드 중 자식 프로세스 부분에서 사용된다.
int main(){
int pid;
pid = fork();
if(pid == 0){
print("hello, l am child")
👉execlp("/bin/date", "bin/date",(char*)0);
}
else if (pid > 0)
print("hello, l am parent")
}
위와 같은 exec() 코드가 입력되면, 복제된 내용이 모두 지워지고 함수 안에 작성된 코드에 대한 기능을 수행하게 된다. 즉, 위 코드는 부모를 복제한 자식에게 새로운 기능을 덮어씌우는 코드이다.
💻[코드]
execlp("/bin/date", "bin/date",(char*)0);
#execlp("원하는 기능", "원하는 기능","널포인터")
작성된 exec() 함수는 현재 날짜를 출력하는 기능을 수행한다.
exec() 이후의 코드는 실행되지 않는다!
프로세스를 잠들게(blocked 상태) 한다.
보통 자식 프로세스를 생성한 후 입력되는 코드로, 자식 프로세스가 종료될 때까지 부모 프로세스를 sleep시킨다. exec()과는 다르게, 복제된 fork 코드 중 부모 프로세스 부분에서 사용된다.
int main(){
int pid;
pid = fork();
if(pid == 0)
print("hello, l am child")
else if (pid > 0){
print("hello, l am parent")
wait();
}
}
exit() 시스템 콜은 종료하고싶은 부분에서 실행된다. exit() 시스템 콜을 넣어주지 않아도, 프로그램 내에서 종료가 필요한 부분에 넣어주게 된다.
보통, 자발적 종료 시에 실행된다.
🔻 원칙적으로 프로세스는 독립적!!
🔻 하지만 경우에 따라 협력을 해야할 때도 있다.
프로세스 간 정보를 주고받을 수 있는 것을 IPC라고 한다.
IPC는 두 가지 방법이 있다.
메시지 전달(message passing): 커널을 통해 프로세스 a, b 간 메시지를 주고받음
주소 공간 공유(shared memory): 커널에게 공유를 요청한 후 서로 다른 프로세스 간 일부 공간을 공유
프로그램이 실행될 때, CPU burst와 I/O burst가 번갈아서 사용된다.
이 때, 두 버스트의 사용량에 따라 프로그램의 종류가 나뉜다.
💡컴퓨터 안에는 여러 종류의 bound job이 섞겨있고 이를 관리해야하기 때문에 CPU Scheduling이 필요하다.
프로세스는 job의 사용량에 따라 분류된다.
I/O bound process
: 짧은 CPU 버스트 사용시간
CPU bound process
: 계산 위주의 job으로, 긴 CPU 버스트 사용시간
ready 상태의 프로세스 중 어떤 프로세스에게 CPU를 줄지 선택한다.
CPU의 제어권을 선택된 프로세스에게 넘긴다. 👉 context switch(문맥 교환)
⭐nonpreemptive[비선점성]⭐(CPU 자진 반납)
⭐preemptive[선점성]⭐(CPU 강제로 빼앗음)
잘보고 갑니다~!! 많은 도움이 되었어요♡