스터디/운영체제 스터디
[반효경 운영체제] Process Management 1 & 2
operating-system-study에서 스터디를 진행하고 있습니다.
프로세스 생성
- 운영체제가 최초의 프로세스를 생성하면, 이미 존재하는 프로세스가 다른 프로세스를 복제 생성한다. 이때 기존 프로세스를 부모 프로세스라 하고, 새로 생긴 프로세스를 자식 프로세스라고 부른다.
- 프로세스의 트리 (계층 구조)를 형성한다.
- 프로세스는 자원을 필요로 한다.
- 운영체제에게 받는다.
- 부모와 공유한다.
- 자원의 공유
- 부모와 자식이 모든 자원을 공유하는 모델
- 일부를 공유하는 모델
- 전혀 공유하지 않는 모델
- 수행 (Execution)
- 부모와 자식이 공존하며 수행하는 모델 (이때는 부모와 자식이 CPU를 획득하기 위해 경쟁하는 관계가 됨)
- 자식이 종료(terminate)될 때까지 부모가 기다리는(wait) 모델
주소 공간 (Address space)
- 자식은 부모의 공간을 복사한다. (프로세스 ID를 제외한 운영체제 커널 내의 정보와 주소 공간의 정보)
- 자식은 그 공간에 새로운 프로그램을 올린다.
- 유닉스의 예
fork()
시스템 콜이 새로운 프로세스를 생성한다. 부모를 그대로 복사하고 주소 공간을 할당한다.fork()
다음에 이어지는exec()
시스템 콜을 통해 새로운 프로그램으로 주소 공간을 덮어 씌운다.
프로세스 종료 (Process Termination)
- 프로세스가 마지막 명령을 수행한 후 운영체제에게 이를 알려준다. (
exit()
)- 자식이 부모에게 out data를 보낸다.
- 프로세스의 각종 자원이 운영체제에 반납된다.
- 부모 프로세스가 자식의 수행을 종료한다. (
abort()
)- 자식이 할당 자원의 한계치를 넘어선다.
- 자식에게 할당된 task가 더 이상 필요하지 않는다.
- 부모가 종료(exit)한다.
- 운영체제는 부모 프로세스가 종료하는 경우 자식이 더 이상 수행되도록 주지 않는다.
- 단계적인 종료
exit()
는 프로그램이 끝날 때 운영체제에게 자신이 끝났음을 알리는 자발적 종료에 해당하는 시스템 콜이고, abort()
는 부모 프로세스가 자식 프로세스의 수행을 중단하는 비자발적 종료에 해당하는 시스템 콜이다.
각종 시스템 콜
fork()
시스템 콜
개념
- 운영체제는 자식 프로세스의 생성을 위해
fork()
시스템 콜을 제공한다. - 프로세스가 해당 시스템 콜을 호출하면 CPU의 제어권이 커널로 넘어가고, 커널은
fork()
를 호출한 프로세스를 복제하여 자식 프로세스를 생성한다. fork()
를 수행하면 부모 프로세스의 주소 공간을 비롯해 프로그램 카운터 등 레지스터 상태, PCB 및 커널 스택 등 모든 문맥을 그대로 복제해 자식 프로세스의 문맥을 형성한다.- 따라서 자식 프로세스는 부모 프로세스의 처음부터 수행하지 않고, 부모 프로세스가 현재 수행한 시점부터 수행하게 된다.
- 다만 자식 프로세스와 부모 프로세스의 식별자는 다르다. (운영체제가 프로세스를 관리해야 하기 때문
소스 코드
- 부모 프로세스가 메인 함수의 첫 번째 줄부터 한 줄씩 코드를 수행하다가
fork()
라인에 이르면 자신과 똑같은 프로세스를 하나 생성한다.
- 이때
fork()
라인까지 수행했다는 기억조차도 똑같은 자식 프로세스가 생성된다. - 그래서 복제된 프로세스는 자기가 복제본이 아니라 원본이며, 자기를 복제해서 다른 복제본을 생성했다는 기억을 갖게 된다.
- 다만 이 자식 프로세스가 복제된 프로세스라는 사실을 알 수 있는 단서가 있는데,
fork()
의 결과 값으로 0을 반환한다. (진짜 부모 프로세스는 0보다 큰 값을 호출한다.)
exec()
시스템 콜
개념
fork()
시스템 콜만으로는 같은 코드에 대해 조건을 분기하는 정도로 밖에 사용할 수 없다.- 자식 프로세스에게 부모 프로세스와는 독자적인 프로그램을 수행할 수 있는 메커니즘이 바로
exec()
시스템 콜이다. - 이 시스템 콜은 프로세스의 주소 공간에 새로운 프로그램을 덮어 씌운 후, 새로운 프로그램의 첫 부분부터 다시 실행하도록 한다.
- 따라서 새로운 프로그램을 수행하기 위해서는
fork()
시스템 콜로 복제 프로세스를 생성한 뒤,exec()
시스템 콜로 해당 프로세스의 주소 공간을 새롭게 수행하려는 프로세스의 주소 공간으로 덮어 씌우면 된다.
소스 코드
execlp()
라인에 이르면 새로운 프로그램으로 덮어 씌운다.
wait()
시스템 콜
- 자식 프로세스가 종료되기를 기다리며 부모 프로세스가 봉쇄 상태에 머무르도록 할 때 사용한다.
- 부모 프로세스가
fork()
후에wait()
을 호출하면 자식 프로세스가 종료될 때까지 부모 프로세스를 봉쇄 상태에 머무르게 하고, 자식 프로세스가 종료되면 부모 프로세스를 준비 상태로 변경한다.
exit() 시스템 콜
- 프로세스를 자발적으로 종료할 때 사용한다.
- 마지막 statement 수행 후
exit()
시스템 콜을 수행한다. - 프로그램에 명시적으로 적어주지 않아도 main 함수가 리턴되는 위치에 컴파일러가 넣어준다.
abort()
시스템 콜
- 프로세스를 비자발적으로 종료할 때 사용한다.
- 부모 프로세스가 자식 프로세스를 강제로 종료한다.
- 자식 프로세스가 한계를 넘어서는 자원 요청
- 자식에게 할당된 task가 더 이상 필요하지 않음
- 키보드로 kill, break 등을 입력한 경우
- 부모가 종료하는 경우
- 부모 프로세스가 종료하기 전에 자식들이 먼저 종료됨.
프로세스 간의 협력
독립적 프로세스 (Independent process)
- 프로세스는 각자의 주소 공간을 가지고 수행되므로 원칙적으로 하나의 프로세스는 다른 프로세스의 수행에 영향을 미치지 못한다.
협력 프로세스 (Cooperating process)
- 프로세스 협력 메커니즘을 통해 하나의 프로세스가 다른 프로세스의 수행에 영향을 미칠 수 있다.
프로세스 간 협력 메커니즘 (IPC: Interprocess Communication)
- IPC는 프로세스들 간의 통신과 동기화를 이루기 위한 메커니즘을 의미한다.
- 메시지 전달 방식 (커널을 통해 메시지 전달)과 공유 메모리 방식 (일부 주소 공간을 공유)이 있다.
메시지 전달 방식 (Message Passing)
- 프로세스 간에 공유 데이터를 일체 사용하지 않고 메시지를 주고 받으면서 통신하는 방식이다.
- 메시지 통신을 하는 시스템은 커널에 의해 send와 receive 연산을 제공받는다.
직접 통신 (Direct Communication)
- 통신하려는 프로세스의 이름을 명시적으로 표시한다.
- 각 쌍의 프로세스에게는 오직 하나의 링크만 존재한다.
간접 통신 (Indirect Communication)
- 메시지를 메일 박스 또는 포트로부터 전달받는다.
- 각 메일 박스에는 고유의 ID가 있으며 메일 박스를 공유하는 프로세스만 통신할 수 있다.
- 하나의 링크가 여러 프로세스에게 할당될 수 있다.
공유 메모리 방식 (Shared Memory)
- 공유 메모리 방식은 프로세스들이 주소 공간의 일부를 공유한다.
- 서로의 데이터에 일관성 문제가 유발될 수 있다.
- 프로세스 간 동기화 문제를 스스로 책임져야 한다.
출처
운영 체제와 정보 기술의 원리 - 반효경
'스터디 > 운영체제 스터디' 카테고리의 다른 글
[반효경 운영체제] CPU Scheduling 2 & Process Synchronization 도입부 (0) | 2021.12.12 |
---|---|
[반효경 운영체제] CPU Scheduling 1 (0) | 2021.12.10 |
[반효경 운영체제] Process 2 & Process 3 (Thread) (0) | 2021.11.30 |
[반효경 운영체제] Process 1 (0) | 2021.11.24 |
[반효경 운영체제] System Structure & Program Execution 2 (0) | 2021.11.24 |
댓글