728x90
http://www.kocw.net/home/cview.do?cid=3646706b4347ef09
프로세스 생성 (Process Creation)
- 운영체제가 최초의 프로세스를 생성하면, 이미 존재하는 프로세스가 다른 프로세스를 복제 생성한다. 이때 기존 프로세스를 부모 프로세스(Parent process)라 하고, 새로 생긴 프로세스를 자식 프로세스(children process)라고 부른다.
- 프로세스의 트리(계층 구조) 형성
- 프로세스는 자원을 필요로 함
- 운영체제로부터 받는다.
- 부모와 공유한다
- 자원의 공유
- 부모와 자식이 모든 자원을 공유하는 모델
- 일부를 공유하는 모델
- 전혀 공유하지 않는 모델 (원칙적으로는 자원을 공유하지 않고 서로 자원을 차지하기 위해 경쟁한다. 좀 더 효율적인 운영체제에서는 일단 카피하지 않고 부모의 주소 공간을 공유하고 있는다. 이런 상태로 실행되다가 부모와 내용이 달라지게 되면 부모와 공유하던 메모리 공간의 일부를 카피해서 가지게 된다. → Copy-on-write(COW))
- 수행 (Execution)
- 부모와 자식은 공존하며 수행되는 모델 (이때는 부모와 자식이 CPU를 획득하기 위해 경쟁하는 관계가 됨)
- 자식이 종료(terminate)될 때까지 부모가 기다리는(wait) 모델
- 주소 공간 (Address space)
- 자식은 부모의 공간을 복사함 (프로세스 ID를 제외한 운영체제 커널 내의 정보와 주소 공간의 정보, binary and OS data)
- 자식은 그 공간에 새로운 프로그램을 올림
- 유닉스의 예
- fork() 시스템 콜이 새로운 프로세스를 생성
- 부모를 그대로 복사 (OS data except PID + binary)
- 주소 공간 할당
- fork 다음에 이어지는 exec() 시스템 콜을 통해 새로운 프로그램을 메모리에 올림(덮어 씌운다)
- fork() 시스템 콜이 새로운 프로세스를 생성
프로세스 종료 (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.
- 운영체제는 자식 프로세스의 생성을 위해
fork()
시스템 콜을 제공한다. - 프로세스가 해당 시스템 콜을 호출하면 CPU의 제어권이 커널로 넘어가고, 커널은
fork()
를 호출한 프로세스를 복제하여 자식 프로세스를 생성한다. fork()
를 수행하면 부모 프로세스의 주소 공간을 비롯해 프로그램 카운터 등 레지스터 상태, PCB 및 커널 스택 등 모든 문맥을 그대로 복제해 자식 프로세스의 문맥을 형성한다.
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");
}
- 자식 process는 생성된 후, main 함수의 시작부터 실행되는 것이 아니라 부모 process의 문맥을 이어받았기 때문에 fork() 함수가 실행된 이후부터 실행된다.
- 부모 process와 자식 process의 fork() 함수 실행 리턴 값이 다르다.
- 부모 process : pid > 0 (정확히는 자식 프로세스의 pid를 리턴 받는다.)
- 자식 process : pid = 0
- 부모 프로세스와 자식 프로세스의 fork() 결괏값이 다르기 때문에, 두 프로세스에게 다른 일을 실행시킬 수 있다.
- fork()의 결과값이 다른 것을 이용해서 서로 다른 일을 시킬 수 있지만, 결국 같은 주소 공간을 가지는 같은 프로그램이다. 다른 프로그램을 실행시키려면 exec() 시스템 콜을 호출하면 된다.
exec() 시스템 콜
- A process can execute a different program by the
exec()
system call.- replaces the memory image if the caller with a new program.
- 어떤 프로그램을 새로운 프로세스로 태어나게 하는 역할을 한다.
fork()
시스템 콜만으로는 같은 코드에 대해 조건을 분기하는 정도로 밖에 사용할 수 없다.- 자식 프로세스에게 부모 프로세스와는 독자적인 프로그램을 수행할 수 있는 메커니즘이 바로
exec()
시스템 콜이다. - 이 시스템 콜은 프로세스의 주소 공간에 새로운 프로그램을 덮어 씌운 후, 새로운 프로그램의 첫 부분부터 다시 실행하도록 한다.
- 따라서 새로운 프로그램을 수행하기 위해서는
fork()
시스템 콜로 복제 프로세스를 생성한 뒤,exec()
시스템 콜로 해당 프로세스의 주소 공간을 새롭게 수행하려는 프로세스의 주소 공간으로 덮어 씌우면 된다.
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 an parent!\n");
}
wait() 시스템 콜
- 프로세스 A가 wait() 시스템 콜을 호출하면
- 커널은 child가 종료될 때까지 프로세스 A를 sleep 시킨다. (block 상태)
- child process가 종료되면 커널은 프로세스 A를 깨운다. (ready 상태)
exit() 시스템 콜
- 프로세스의 종료
- 자발적 종료
- 마지막 statement 수행 후
exit()
시스템 콜을 통해 프로세스를 종료시킨다. - 프로그램에 명시적으로 적어주지 않아도 main 함수가 리턴되는 위치에 컴파일러가 넣어줌
- 마지막 statement 수행 후
- 자발적 종료
abort() 시스템 콜
- 프로세스의 종료
- 비자발적 종료
- 부모 프로세스가 자식 프로세스를 강제 종료시킴
- 자식 프로세스가 한계치를 넘어서는 자원 요청
- 자식에게 할당된 태스크가 더 이상 필요하지 않음
- 키보드로 kill, break 등을 친 경우
- 부모가 종료하는 경우
- 부모 프로세스가 종료하기 전에 자식들이 먼저 종료됨
- 부모 프로세스가 자식 프로세스를 강제 종료시킴
- 비자발적 종료
프로세스와 관련한 시스템 콜
fork()
: create a child (copy)exec()
: overlay new imagewait()
: sleep until child is doneexit()
: frees all the resources, notify parent
프로세스 간 협력
- 독립적 프로세스(Independent process)
- 프로세스는 각자의 주소 공간을 가지고 수행되므로 원칙적으로 하나의 프로세스는 다른 프로세스의 수행에 영향을 미치지 못함
- 협력 프로세스 (Cooperating process)
- 프로세스 협력 메커니즘을 통해 하나의 프로세스가 다른 프로세스의 수행에 영향을 미칠 수 있음
- 프로세스 간 협력 메커니즘(IPC: Interprocess Communication)
- IPC는 프로세스들 간의 통신과 동기화를 이루기 위한 메커니즘을 의미한다.
- 메시지 전달 방식(커널을 통해 메시지 전달)과 공유 메모리 방식(일부 주소 공간을 공유)이 있다.
- 메시지를 전달하는 방법
- 프로세스 간에 공유 데이터를 일체 사용하지 않고 메시지를 주고받으면서 통신하는 방식
- message passing: 커널을 통해 send와 receive 연산을 제공받아 메시지를 보낸다.
- 주소 공간을 공유하는 방법
- shared memory: 서로 다른 프로세스 간에도 일부 주소 공간을 공유하게 하는 shared memory 메커니즘이 있음
- thread: thread는 사실상 하나의 프로세스이므로 프로세스 간 협력으로 보기는 어렵지만 동일한 process를 구성하는 thread들 간에는 주소 공간을 공유하므로 협력이 가능
Message Passing
- Message system
- 프로세스 사이에 공유 변수(shared variable)를 일체 사용하지 않고 통신하는 시스템
- Direct Communication (직접 통신)
- 통신하려는 프로세스의 이름을 명시적으로 표시
- 각 쌍의 프로세스에게는 오직 하나의 링크만 존재한다.
- Indirect Communication (간접 통신)
- mailbox (또는 port)를 통해 메시지를 간접 전달
- 각 메일 박스에는 고유의 ID가 있으며 메일 박스를 공유하는 프로세스만 통신할 수 있다.
- 하나의 링크가 여러 프로세스에게 할당될 수 있다.
Shared Memory
- 공유 메모리 방식은 프로세스들이 주소 공간의 일부를 공유한다.
- 서로의 데이터에 일관성 문제가 유발될 수 있다.
- 프로세스 간 동기화 문제를 스스로 책임져야 한다.
728x90
'Computer Science > Operating System' 카테고리의 다른 글
[KOCW 반효경 운영체제] 5. CPU Scheduling (1) | 2024.08.24 |
---|---|
[KOCW 반효경 운영체제] 3. Process (1) | 2023.04.18 |
[KOCW 반효경 운영체제] 2. System Structure & Program Execution (0) | 2023.04.04 |
[KOCW 반효경 운영체제] 1. Introduction to Operating Systems (0) | 2023.04.01 |