Computer Science/운영체제
4강) 프로세스 관리, 시스템 콜의 종류(Process management, types of system calls)
열심히 사는 우진
2023. 1. 25. 02:53
반응형
** KOCW에서 반효경 교수님의 운영체제(2014년) 강의를 수강한 내용을 정리한 글입니다.
프로세스 생성 (Process Creation)
- 부모 프로세스가 자식 프로세스를 생성
- 프로세스의 트리 형성(계층 구조)
- 프로세스에게 필요한 자원
- 운영체제로부터 받는다
- 부모와 공유한다
- 자원의 공유 방식 → 가능하면 공유하다가 COW(Copy-on-Write)
- 부모와 자식이 모든 자원 공유하는 모델
- 일부를 공유하는 모델
- 전혀 공유하지 않는 모델
- 수행(Execution)
- 부모와 자식이 공존하며 수행되는 모델
- 자식이 종료(Terminate)될 때까지 부모가 기다리는 모델
- 주소 공간(Address space)
- 자식은 부모의 공간을 복사함(+ OS data)
- 그 공간에 새로운 프로그램을 올림
- 유닉스의 예
- fork() 시스템 콜이 새로운 프로세스를 생성
- 부모를 그대로 복사
- 주소 공간 할당
- fork 다음에 이어지는 exec() 시스템 콜을 통해 새로운 프로그램을 메모리에 올림
- fork() 시스템 콜이 새로운 프로세스를 생성
프로세스 종료 (Process Termination)
- 프로세스가 마지막 명령을 수행한 후 운영체제에게 이를 알려주는 경우(exit 시스템 콜)
- 자식이 부모에게 output data를 보냄 (via wait)
- 프로세스의 각종 자원들이 운영체제에게 반납됨
- 부모 프로세스가 자식의 수행을 종료시키는 경우(abort 시스템 콜)
- 자식이 할당 자원의 한계치를 넘어섬
- 자식에게 할당된 Task가 더이상 필요하지 않음
- 부모가 종료(exit)하는 경우
- 운영체제는 부모 프로세스가 종료하는 경우 자식이 더이상 수행되도록 두지 않는다
- 단계적인 종료
fork() 시스템 콜
- 프로세스는 fork() 시스템 콜에 의해 생성된다
- 생성된 새로운 주소 공간은, caller의 복제이다.
int main() {
int pid;
pid = fork();
if(pid == 0) printf("\n Hello, I am child!\n");
else if(pid > 0) printf("\n Hello, I am parent!\n");
}
- fork() 메서드가 실행되면, 새로운 프로세스가 생성된다.
- 이때, 생성된 프로세스는 부모 프로세스의 문맥을 그대로 이어 받아, fork() 메서드 실행 이후의 코드부터 실행한다.
exec() 시스템 콜
- 프로세스는 exec() 시스템 콜을 통해 다른 프로그램을 실행한다.
- 새로운 프로그램으로 caller의 메모리 이미지를 대체한다.
int main() {
int pid;
pid = fork();
if(pid == 0) {
printf("\n Hello, I am child!\n");
execlp("/bin/date", "/bin/date", (char *) 0);
}
else if(pid > 0) {
printf("\n Hello, I am parent!\n");
}
}
/* date */
int main() {
...
}
- fork()를 통해 복제된 자식 프로세스라면(if pid == 0) → execlp() 함수를 실행한다.
wait() 시스템 콜
- 프로세스 A가 wait() 시스템 콜을 호출하면
- 커널은 child가 종료될 때까지 프로세스 A를 sleep 시킨다(blocked 상태)
- Child process가 종료되면 커널은 프로세스 A를 깨운다 (ready 상태)
int main {
int childPID;
S1;
childPID = fork();
if(childPID == 0)
...
else {
wait();
}
S2;
}
exit() 시스템 콜
- 프로세스의 종료
- 자발적 종료
- 마지막 문장 수행 후(혹은 exit() 시스템 콜이 명시되어 있을 때) exit() 시스템 콜을 통해 이루어짐
- main 함수 리턴 위치에 묵시적으로 컴파일러가 넣어줌
- 비자발적 종료
- 부모 프로세스가 자식 프로세스를 강제 종료시킴
- 자식 프로세스가 한계치를 넘어서는 자워 ㄴ요청
- 자식에게 할당된 태스크가 더이상 필요하지 않을 때
- 키보드로 kill, break 등을 친 경우
- 부모가 종료하는 경우
- 부모 종료 전에 자식들이 먼저 종료됨
- 부모 프로세스가 자식 프로세스를 강제 종료시킴
- 자발적 종료
프로세스 간 협력
- 독립적 프로세스 : 프로세스는 각자의 주소 공간을 가지고 수행되므로, 원칙적으로 다른 하나의 프로세스는 다른 프로세스의 수행에 영향을 미치지 못함
- 협력 프로세스 : 프로세스 협력 메커니즘을 통해 영향을 미칠 수 있음
- 프로세스 간 협력 메커니즘(IPC: InterProcess Communication)
- 메시지 전달(Message passing) : 커널을 통해 메시지 전달
- 주소 공간 공유(Shared memory) : 서로 다른 프로세스 간에도 일부 주소 공간 공유
- ** Thread는 사실상 하나의 프로세스이므로 프로세스 간 협력으로 보기 어렵지만, 동일한 Process를 구성하는 Thread들 간에는 주소 공간을 공유하므로 협력이 가능
Message Passing
- 프로세스 사이에 공유 변수를 일체 사용하지 않고 통신하는 시스템
- Direct Communication : 통신하려는 프로세스의 이름을 명시적으로 표시
- Indirect Communication : Mailbox(또는 Port)를 통해 메시지를 간접 전달
반응형