본문 바로가기

학교/os

프로세스의 생성과 통신

들어가기 전에

학교 수업 때 배운걸 다시 정리해서 쓴 글입니다.

오타 및 잘못된 부분 지적은 언제나 환영입니다!

 

프로세스의 생성

최초의 프로세스는 OS가 생성하고 그 이후는 다른 프로세스가 프로세스를 생성하게 된다.

보통 이 프로세스 생성 관계를 부모/자식 관계로 비유한다.

리눅스에선 이 관계를 트리 형태로 보여준다.

OS가 생성한 init 프로세스를 최초로 생성하고 그 이후는 init 프로세스에서 파생된다.

pstree 결과의 일부

이렇게 부모-자식 관계가 형성되는 목적은 2가지이다.

 

1. 부모와 자식 프로세스가 같이 수행되기 위해

이 경우, 부모와 다른 자원공간을 할당받을 수 있고, 부모와 자원을 공유해 사용할 수 있다.

부모와 자식이 CPU 자원을 두고 경쟁하게 된다.

 

2. 다른 프로그램이 실행된 결과를 기다려야 할 때

부모는 자식 프로세스를 생성한 뒤, exec()같은 시스템 콜을 호출하고 자신은 wait()콜로 대기 상태로 간다.

자식 프로세스가 실행이 끝나면 부모가 CPU 자원을 받는다.

 

프로세스 생성 함수 - fork

fork에 대한 사용법은 다른 블로그에 많으니 여기선 다루지 않는다.

프로세스가 생성되면 자신만의 공간을 갖게 된다.

이 공간을 채우기 위해 프로세스 ID를 제외한 부모 프로세스 모든 상태를 복사해서 생성한다.

 

그런데 이렇게 같은 문맥을 가지게 되면, 누가 부모인지 자식인지 알 수 없게 된다.

그래서 fork함수는 부모한텐 생성된 자식의 PID를, 자식에겐 0을 반환한다.

이 결과를 가지고 if같은 분기를 타게 된다.

말이 부모-자식이지 그냥 자신의 복제본이다.

 

이렇게 부모-자식의 관계를 가지면 자식 프로세스에서 exec() 시스템 콜을 통해 다른 작업을 할 수 있게 된다.

부모가 프로세스가 사라지지 않는한, 자식 프로세스는 exit()로 종료되지 않는 이상 계속 공간을 차지하게 된다.

그래서 자식 프로세스가 종료되지 않는 경우, 부모 프로세스를 종료시키면 된다.

 

프로세스간 통신

이렇게 부모-자식 관계를 만들어 다른 프로그램을 실행했단 것은, 두 프로세스끼리 주고받을 일이 있단 것이다.

원래는 각 프로세스끼린 서로의 수행에 영향을 미칠 수 없다.

부모-자식 프로세스라도 어쨌든 각각의 프로세스로서 별개의 공간을 차지하는 독립적인 관계가 된다.

하지만, 프로세스간 통신이 필요한 경우가 있어 나온 개념이 IPC(Inter Process Communication)이다.

 

IPC를 통해 프로세스끼리 통신하는 방법은 2가지가 있다.

1. 공유 메모리 방식

프로세스들이 주소 공간 일부를 시스템 콜을 통해공유한다.

하지만, 시스템 콜은 운영체제에 자원을 넘기지 않기 때문에 커널이 관리를 하지 않아

여러 프로세스가 동시에 접근한다면 일관성이 깨질 수 있다.

 

2. 메시지 전달

이 방식은 공유 메모리를 쓰지 않는다.

send와 receive란 시스템 콜을 사용해 통신을 한다.

두 프로세스가 직접 통신하는 직접 통신도 있고, 여러 프로세스가 통신할 경우

서로를 구분하기 위해, 포트를 열거나 메일 박스를 통해 서로의 고유 ID로 통신을 한다.

 

'학교 > os' 카테고리의 다른 글

주소 변환  (0) 2022.07.10
문맥 교환(context switching)  (0) 2022.06.27
프로세스 구조  (0) 2022.06.26
DMA(Direct Memory Access)  (0) 2022.06.25
커널(Kernel)  (0) 2022.06.25