KOCW 반효경 교수님 운영체제 강의 정리
이 글은 공부한 것을 복습 및 기록하기 위한 게시물입니다.
잘못된 정보가 기입되어 있을 수 있으니 주의해주시기 바랍니다.
강의 링크 : http://www.kocw.net/home/cview.do?lid=b988d89cb0bc07b3, http://www.kocw.net/home/cview.do?lid=3a5437eaa6c9e5b0
1. 프로세스 생성
부모 프로세스 하나가 자식 프로세스를 여러 개 낳을 수 있으며 트리를 형성한다.
보통 부모 프로세스와 자식 프로세스 사이는 경쟁상대가 되기 때문에 자원을 공유하지 않는다.
부모 프로세스와 자식 프로세스가 주소 공간을 공유하지 않는 것이 원칙이지만
리눅스에서는 일단 주소 공간을 공유하게 되어있다.
PC(Program Counter)만 복사하여 똑같은 위치를 가르키게 된다.
그런 다음 자식 프로세스는 각자의 길을 가게 되면서 주소 공간을 복사하여 사용하게 된다.
이것을 Copy on Write(COW) 기법 이라고 한다.(Write가 발생했을 때 주소공간을 Copy)
프로세스의 생성은 부모 프로세스를 복제하여 프로그램을 덮어씌우는 단계로 수행되며
운영체제를 통해서만 프로세스 생성이 가능하다.
프로세스가 운영체제에게 자식을 낳아 달라고 부탁을 해서 운영체제가 대신 낳아주는 형태인 것이다.(fork() 시스템 콜)
- fork() : 프로세스 복제
- exec() : 새로운 프로그램을 덮어 씌움
2. 프로세스 종료
프로세스 종료는 2가지가 있다.
exit
프로세스 종료 시스템콜, 자식이 부모에게 output data를 보내는 자발적 종료abort
강제적 종료
프로세스는 자식 프로세스가 먼저 종료된 후 부모 프로세스가 마지막으로 종료되어야 한다.
3. 프로세스와 관련한 시스템 콜
3-1. fork() 시스템 콜
예를 들어 위와 같은 C언어 코드가 있다.
부모 프로세스에서 pid = fork(); 줄이 실행되면 똑같은 자식 프로세스를 만들게 되고
부모 프로세스는 그 다음 코드를 실행하게 된다.
생성된 자식 프로세스는 int pid; 부터 실행되는 것이 아닌 pid = fork()부터 실행하게 된다.
왜냐하면 부모 프로세스의 Program Counter가 pid = for()를 가리킨 상태에서 복제하였기 때문이다.
그러나 자식 프로세스 또한 부모 프로세스와 동일한 코드를 가지고 있어 구분이 어렵게 된다.
이럴 경우에는 pid에 반환된 값을 통해 판단할 수 있다.
부모 프로세스는 양수를 반환받게 되며 자식 프로세스는 0을 반환받게 된다.
3-2. exec() 시스템 콜
exelp 명령어를 통해 exec() 시스템 콜을 실행할 수 있다.
위 코드에서는 자식 프로세스가 "/bin/date"라는 프로그램으로 덮어 씌어진것이다.
exec()을 사용하게 되면 다시 원 상태로 돌아올 수 없다.
꼭 자식 프로세스를 만들어서 exec()을 사용할 필요는 없기 때문에 fork()를 사용하지 않아도 된다.
3-3. wait() 시스템 콜
wait() 시스템 콜은 자식 프로세스가 종료될 때까지 기다리는 시스템 콜이다.(block 상태)
예를 들어 리눅스 쉘에서 프로그램 이름을 기입하고 엔터를 치면 해당 프로그램이 실행되며
쉘에는 프로그램이 종료될 때까지 아무것도 기입할 수가 없게 된다.
왜냐하면 쉘도 하나의 프로그램이기 때문이다.
쉘에서도 프로그램을 실행하면 그 프로그램은 일종의 자식 프로그램이며
쉘이 wait() 시스템 콜로 인해 block 상태가 되는 것이다.
3-4. exit() 시스템 콜
- 비자발적 종료 : 외부적인 요인으로 인한 종료
4. 프로세스간 협력(IPC)
프로세스간 협력 메커니즘(IPC)는 프로세스간 정보를 주고 받을 수 있는 방법을 뜻한다.
프로세스는 원칙적으로 독립적이기 때문에 메세지를 전달할 수 있는 방법이 없다.
그러나 kernel을 통해 메시지를 전달할 수 있다.
프로세스는 독립적인 주소공간을 갖기 때문에 자신의 주소공간만 볼 수 있다.
그러나 그럼에도 불구하고 shared memory는 서로 다른 프로세스가 일부 주소공간을 공유할 수 있다.
Thread는 CPU 수행 단위이기 때문에 하나의 프로세스의 주소공간을 공유하고 있으므로 협력이 쉽다.
4-1. Message Passing
Message Passing은 2가지 방법이 있다.
통신하려는 프로세스의 이름을 명시하는 여부에 따라 직접, 간접으로 나뉘게 된다.
2가지 방법 모두 kernel을 통해 전달하게 된다.
Direct Communication(직접)
특정 대상에게 메시지를 전달한다.Indirect Communication(간접)
Mailbox에 메시지를 넣기 때문에 아무 대상에게 메시지를 전달한다.
4-2. Shared Memory
위 그림으로 예를 들어 프로세스A와 프로세스B는 주소공간이 서로 독립적으로 존재하지만
물리적인 메모리에 Mapping할 때 두 프로세스의 일부 영역을 공유되도록 Mapping을 시켜 놓는 것이다.
Shared Memory도 마찬가지로 Kernel에게 Shared Memory 관련 시스템 콜을 해서 메모리에 Mapping 해놓은 다음에
사용자 프로세스끼리 공유 영역을 사용할 수 있는 것이다.
Shared Memory는 프로세스간 신뢰가 높아야 한다.
'Computer Science > OS' 카테고리의 다른 글
8. CPU Scheduling (0) | 2021.03.20 |
---|---|
7. CPU Scheduling 1 (0) | 2021.03.14 |
5. Process 2~3 (0) | 2021.03.06 |
4. Process 1 (0) | 2021.02.27 |
3. System Structure & Program Execution 2 (0) | 2021.02.11 |