- Process Creation
- 생성중인 프로세스를 부모 프로세스, 생성된 프로세스를 자식 프로세스라 한다.
- 이런 새로운 프로세스 각각은 다른 프로세스들을 생성할 수 있다.
- 프로세스는 실행 도중에 프로세스 생성 호출을 통하여 여러 개의 새로운 프로세스들을 생성할 수 있다.
- 자원의 공유(Resource sharing) 방법
- 모든 자원을 공유하는 경우
- 자식 프로세스가 부모의 자원을 일부 공유하는 경우
- 공유하지 않는 경우
- 프로세스가 새로운 프로세스를 생성할 때
- 부모와 자식은 동시에 실행
- 부모가 자식이 끝날 때까지 기다림
- A Tree of Processes in Linux
- 부모 -> 자식(부모) -> 자식... 이렇게 트리 형태로 연결되어 있음
- ex) 로그인을 하는 경우 자식 프로세스를 만들어서 실행
- C Program Forking Separate Process
- fork를 만나면 하나를 복사
- 둘 중 하나를 부모, 자식으로 만듦
- 둘 중 하나에는 pid에 0을, 다른 하나에는 0과 다른 어떤 값을 주는데 이 값이 0보다 작으면 error
- pid가 0인 것은 자식, 0이 아닌 것은 부모
- 따라서 서로 조건문에 걸려서 다른 기능을 수행
- 부모가 자식을 만들어서 자식이 exec()로 작업을 수행할 때, 부모 프로세스는 보통 자식 프로세스가 끝날 때까지 대기함
- 부모 프로세스는 wait() 하지 않고도 끝낼 수 있는데 이러한 경우 자식 프로세스가 끝나지 않았다면 exit()를 받기 전까지 유령 프로세스로 남아있음
- windows의 경우는 LINUX와 다름 -> 좀 더 복잡하고 함수 이름이 길다
- Process Termination
- 마지막 문장을 끝내고 나면 exit()를 실행 -> 부모 프로세스는 이를 기다림 - wait()
- 부모 프로세스가 종료되면 자식 프로세스가 계속 실행하지 못하도록(허용 x) 하는 것이 원칙
- 모든 프로세스는 밑에서 같이 끝나게 됨 - cascading termination
- 프로세스들의 커뮤니케이션
- 협업하지 않는 프로세스들은 독립 프로세스(Independent process), 협업을 하도록 만든 프로세스들을 협력 프로세스(Cooperating process)라고 함 -> 만들기 나름
- 협업을 하게 된다면?
- 정보를 공유
- 프로세스의 연산속도가 상대적으로 증가
- 모듈성이 높아짐 -> 가격이 저렴해짐
- 편리함, 안정성 up
- 커뮤니케이션 모델
- 신호(메시지)를 주고 받는 방식
- 약속된 큐(queue)에 데이터를 집어넣고 가져가는 방식
- 메모리를 공유하는 방식
- 두 프로세스 사이에 두 프로세스만 접근할 수 있는 공유 메모리를 가짐
- Shared memory : Producer-Consumer model
- 왼쪽은 생산자, 오른쪽은 소비자 -> 생산자는 데이터를 버퍼에 넣고 소비자는 뽑아내어 쓴다
- 원형 큐를 사용
- 예시
- in과 out이 0이라는 것은 비어있다는 뜻
- 이 말은 in과 out이 같아지면 비어있다는 의미가 되며 따라서 버퍼는 항상 1칸을 비워놔야 함
- 생산자의 알고리즘 - 데이터를 만들어서 버퍼에 저장
- in + 1 이 out과 같아지면 리셋
- out은 생산자와 소비자가 함께 사용하기 때문에 늘었다 줄었다 할 수 있음
- 소비자의 알고리즘 - 데이터를 뽑아감
- 서로 다른 프로세스가 같은 값을 사용하므로 협조적으로 수행할 수 있음
- Message Passing
- send로 메시지를 보내고 receive로 받음
- 교려 할 점
- 연결을 어떻게 해야 하는가
- 프로세스 두 개만 하는가 그 이상 해야 하는가
- 한 쌍의 프로세스 사이에는 큐가 하나만 있는가 여러 개 있는가
- 용량의 크기
- 방향은 단방향인가 양방향인가
- 길이는 고정인가 가변인가
- Direct 방식
- send(P, message) : P에게 보내겠다.
- receive(Q, message) : Q에게 받겠다. 받기 전까지 다른 곳에서 받지 않음
- Indirect 방식
- 받는 것은 메일박스(우편함)로부터 받음
- 접근할 수 있는 누구든지 가져갈 수 있음 - 동시에
- 누구에게 보낼지, 받을지가 아니라 사서함 번호를 사용한다. -> send(A-사서함 번호, message)
- 동기화
- 메시지를 주고받을 때의 동기화는 기다린다는 것
- Blocking : send후 상대가 받을 때까지 기다림 - ex) 전화를 상대가 받으면 그때부터 말을 함
- non-Blocking : 보내 놓고 다른 작업을 수행할 수 있음 - ex) 카카오톡 메시지
- 랑데부 프로토콜(rendezvous) : 보내는 쪽, 받는 쪽 모두 Blocking을 사용 -> 1:1로 연결하여 명확해짐 -> 중간에 버퍼가 필요 없음(zero capacity)
- 일반적인 것은 사서함이 필요함 - Bounded capacity -> 정해진 크기의 용량의 버퍼가 필요
- 무한대의 크기도 있을 수 있으나 이론적으로 불가능
- 프로세스 간의 통신(Communications in Client-Server Systems)
- 컴퓨터 내에서만 일어나는 것이 아니라 여러 컴퓨터끼리도 통신을 함
- 소켓(socket) 통신 : (IP주소 + 포트 번호)를 가지고 연결 -> IP주소가 일치하는 컴퓨터는 같은 포트번호를 열어놓고 있어야 주고받을 수 있음
'운영체제' 카테고리의 다른 글
Chapter 4 - Threads(6주차) (0) | 2019.04.09 |
---|---|
Chapter 4 - Threads (0) | 2019.04.06 |
Chapter 3 : Processes (0) | 2019.03.28 |
Chapter 2 - 디스크, system call, 운영체제의 구조 (0) | 2019.03.23 |
Chapter 2 - 시스템 구조 (0) | 2019.03.14 |