반효경 교수님의 강의로 운영체제를 공부하고 있습니다.
프로세스 생성
- 부모 프로세스가 자식 프로세스 생성
- 프로세스의 트리(계층 구조) 형성
- 프로세스는 자원을 필요로 함
- 운영체제로부터 받는다.
- 부모와 공유한다.
- 자원의 공유
- 부모와 자식이 모든 자원을 공유하는 모델
- 일부를 공유하는 모델
- 전혀 공유하지 않는 모델
- 수행(Execution)
- 부모와 자식을 공존하며 수행되는 모델
- 자식이 종료(terminate)될 때 까지 부모가 기다리는(wait) 모델
- 주소공간(Address space)
- 자식은 부모의 공간을 복사함(binary and OS data)
- 자식은 그 공간에 새로운 프로그램을 올림
- 유닉스의 예
- fork() 시스템 콜이 새로운 프로세스를 생성
- 부모를 그대로 복사(OS data except PID + binary)
- 주소 공간 할당
- fork 다음에 이어지는 exec() 시스템 콜을 통해 새로운 프로그램을 메모리에 올림
- fork() 시스템 콜이 새로운 프로세스를 생성
프로세스의 생성은 보통 2단계를 거치는데 하나는 부모 프로세스를 복제하고, 또 하나는 새로운 프로그램을 덮어 씌우는 단계이다.이 두 단계가 독립적이기 때문에 복제하고 덮어 씌우지 않을 수도 있다.
프로세스 종료(Process Termination)
- 프로세스가 마지막 명령을 수행한 후 운영체제에게 이를 알려줌(exit)
- 자식이 부모에게 output data를 보냄 (via wait)
- 프로세스의 각종 자원들이 운영체제에게 반납됨
- 부모 프로세스가 자식의 수행을 종료시킴(abort)
- 자식이 할당 자원의 한계치를 넘어섬
- 자식에게 할당된 테스크가 더 이상 필요하지 않음
- 부모가 종료(exit)하는 경우
- 운영체제는 부모 프로세스가 종료하는 경우 자식이 더 이상 수행되도록 두지 않는다.
- 단계적인 종료
fork() 시스템 콜
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)
printf("\n Hello, i am child\n");
else if (pid > 0)
printf("\n Hello, I am parent!\n");
}
포크의 문제점을 생각하면 부모를 복제하게 되면 복제된 프로세스가 또 복제를 하게 되고 ..이걸 반복하면 복제된 프로세스가
자기가 부모라고 주장할 수도 있게 됩니다. 이런 문제를 방지하기 위해 자식의 pid는 리턴값을 0을 받게 됩니다. 그래서 부모와 자식(원본과 복제본)을 구분할 수 있습니다.
exec() 시스템 콜
어떤 프로그램을 완전 새로운 프로세스로 태어나게 하는 역할을 한다.
int main() {
int pid;
pid = fork();
if(pid == 0){
printf("\n Hello, I am child Now i`ll run data \n");
execlp("/bin/date", "/bin/date", (char*)0);
}
else if(pid > 0)
printf("\n Hello, I am parent!\n");
}
wait() 시스템 콜
프로세스 A가 wait() 시스템 콜을 호출하면
- 커널은 chlid가 종료될때까지 프로세스 A를 sleep시킨다.(block 상태)
- Child process가 종료되면 커널은 프로세스 A를 깨운다(ready 상태)
exit() 시스템 콜
프로세스의 종료
- 자발적 종료
- 마지막 statement 수행 후 exit() 시스템 콜을 통해 프로그램에 명시적으로 적어주지 않아도 main 함수가 리턴되는 위치에 컴파일러가 넣어줌
- 비자발적 종료
- 부모 프로세스가 자식 프로세스를 강제 종료 시킴
- 자식 프로세스기 힌계치를 넘어서는 자원요천
- 자식에게 할당된 테스크가 더 이 상 필요하지 않음
- 키보드로 kill, break 등을 친 경우
- 부모가 종료하는 경우
- 부모 프로세스가 종료하기 전에 자식들이 먼저 종료됨
- 부모 프로세스가 자식 프로세스를 강제 종료 시킴
프로세스간 협력
- 독립적 프로세스(Independent process)
- 프로세스는 각자의 주소 공간을 가지고 수행되므로 원칙적으로 하나의 프로세는 다른 프로세스의 수행에 영향을 미치지 못함
- 협력 프로세스(Cooperating process)
- 프로세스 협력 메커니즘을 통해 하나의 프로세스가 다른 프로세스의 수행에 영향을 미칠 수 있음
- 프로세스 간 협력 매커니즘(IPC: Interprocess Communication)
- 메시지를 전달하는 방법 : message passing - 커널을 통해 메시지 전달
- 주소 공간을 공유하는 방법 : shared memory - 서로 다른 프로세스 간에도 일부 주소 공간을 공유하게 하는 shared memory 매커니즘이 있음
- thread : thread는 사실상 하나의 프로세스이므로(하나의 프로세스안에서 CPU수행단위가 여러개있는것) 공유 프로세스간 협력으로 보기는 어렵지만 동일한 process를 구성하는 thread들 간에는 주소 공간을 공유하므로 협력이 가능

Message Passing
Message system
프로세스 사이에 공유변수를 일체 사용하지 않고 통신하는 시스템
Direct Communication
통신하려는 프로세스의 이름을 명시적으로 표시
Indirect Communucation
mailbox(또는 port)를 통해 메시지를 간접 전달
Shared memory
원칙적으로 프로세스들은 독자적인 주소 공간을 가지고 있기 때문에 코드,데이터, 스택을 각자 가지고 있기 때문에 자기 주소 공간만 볼 수 있습니다. 하지만 shared memory는 다른 프로세스간에도 일부 주소공간을 공유합니다.
위의 그림에서 processA와 processB가 공유하는 자원이 있습니다.
'CS > 운영체제' 카테고리의 다른 글
CPU Scheduling (1) | 2023.10.20 |
---|---|
프로세스 (0) | 2023.08.08 |
컴퓨터 시스템 구조 (0) | 2023.08.02 |
운영체제란 무엇인가? (0) | 2023.08.02 |
댓글