프로세스 생성, 종료
Copy-On-Write (COW) : 자식은 부모 자원을 그대로 공유하여 사용하고 있다가 write 발생할 경우 복사
A process is created by the fork() system call.
creates a new address space that is a duplicate of the caller.
부모 프로세스
int main()
{ int pid;
pid = fork();
if (pid == 0) /* this is child */
printf("\n Hello, I am child!\n");
else if (pid > 0) /* this is parent */
printf("\n Hello, I am parent!\n");
}
위에서부터 실행하다가 fork를 만나면 새로운 프로세스를 만듦
아래와 같은 자식 프로세스가 생기고,
함수 실행이 끝나면 부모 프로세스는 아래쪽의 코드를 계속 실행함
자식 프로세스는 main 함수의 시작부터 실행하는 것이 아니라 fork 이후부터 실행함
자식 프로세스
int main()
{ int pid;
pid = fork();
if (pid == 0) /* this is child */
printf("\n Hello, I am child!\n");
else if (pid > 0) /* this is parent */
printf("\n Hello, I am parent!\n");
}
프로세스의 fork를 통한 복제 생성은 부모 프로세스의 문맥을 그대로 복사함. 부모 입장에서는 프로그램 카운터가 fork를 가리키고 있음. fork가 끝난 시점에 문맥이 이르고, 자식도 그대로 copy 하므로 main 함수의 제일 윗부분부터 실행하는 것이 아닌, 부모가 fork한 것을 그대로 이어 다음 코드 부분을 실행함.
자식과 부모의 혼동 문제를 막기 위해, 구분 해줌
부모 프로세스는 pork의 결과 값이 양수, 자식 프로세스는 0
Parent process
pid > 0
Child process
pid = 0
A process can execute a different program by the exec() system call.
replaces the memory image of the caller with a new program.
int main()
{ int pid;
pid = fork();
if (pid == 0) /* this is child */
{ printf("\n Hello, I am child! Now I'll run date \n");
execlp("/bin/date", "/bin/date", (char *) 0);
}
else if (pid > 0) /* this is parent */
printf("\n Hello, I am parent!\n");
}
execlp 함수가 결국 exec() 시스템 콜을 하게 됨.
새로운 시스템으로 덮어 씌움.
/bin/date 는 리눅스에서의 커맨드, 프로그램임.
부모 프로세스 실행 후 자식은 "\n Hello, I am child! Now I'll run date \n"를 출력하고 이후 date라는 새로운 시스템으로 덮어 쓰는 식으로 실행이 되는 것.
exec 한 뒤에는 다시 돌아갈 수 없음.
꼭 자식을 만들어서 exec 할 필요는 없음
int main(){
printf("\n Hello, I am child! Now I'll run date \n");
execlp("/bin/date", "/bin/date", (char *) 0);
printf("\n Hello, I am parent!\n");
}
프로세스 A가 wait() 시스템 콜을 호출하면
main {
int childPID;
S1;
childPID = fork(); /* fork를 한 뒤에 결과값이 0이면, */
if(childPID == 0)
<code for child process>
else { /* 결과값이 0이 아니라면 (부모 프로세스라면) */
wait(); /* wait을 넣어줘서 잠들게 됨. */
} /* cpu를 얻지 못하고 자식 프로세스가 종료될 때까지 기다림 */
S2;
}
프로세스가 마지막 명령을 수행한 후 운영체제에게 이를 알려줌
(exit)
부모 프로세스가 자식의 수행을 종료시킴
(abort)
Message system
Direct Communication
통신하려는 프로세스의 이름(Q)을 명시적으로 표시
Process P => Process Q
Send (Q, message) Receive (P, message)
Indirect Communication
mailbox (또는 port)를 통해 메시지를 간접 전달
Process P => Mailbox M => Process Q
Send (M, message) Receive (P, message)
shared memory : 주소 공간을 공유하는 방법
🔗강의 바로가기 운영체제 - 이화여자대학교 반효경 교수님 강의를 듣고 정리한 내용입니다.