본문 바로가기

컴퓨터 전공 공부/운영체제

'파이프'를 이용한 프로세스간 통신 메커니즘

반응형

'파이프'를 이용한 프로세스간 통신 메커니즘

C 언어에서 파이프 구현?


파이프 메커니즘은 우선 예시를 통해 배우는데, main 함수에서 파이프를 생성하는 연산을 살펴봐요.
이 연산은 파이프를 생성하고 파이프를 가리키는 포인터를 전달해요.
읽기 작업 시 0이 아닌 값을 반환하면 오류가 발생했음을 나타낸답니다.
시스템 API는 주로 반환 값으로 오류 여부를 나타냅니다.
 
파이프는 프로세스 간 통신을 위한 메커니즘이며, 이러한 커뮤니케이션 방식은 파일을 통해 이루어집니다.
파이프의 사용된 문맥을 보면, 파일을 통해 부모 프로세스와 자식 프로세스 간에 데이터를 전달하고 통신하는 방법을 설명하고 있습니다.
전체적인 문맥으로 볼 때, 이 내용은 '파이프'라는 용어가 프로세스 간 데이터 교환을 위해 사용되는 특정한 메커니즘을 의미한다고 해석될 수 있습니다.
출처: https://mkisos.tistory.com/entry/IPC-pipe1c [MK 실험실:티스토리]

프로그램 파일 및 파이프 관리 설명


0인 경우, 결과 포인터를 통해 내용 전달되고 값이 배열에 저장돼요.
0이 아닌 경우, 오류로 'error' 출력, 프로그램 실패로 목표 미실현됨.
파이프 0과 파이프 1 값 출력해 파일 디스크립터 설명하며, 열 때 키처럼 작용하는 값들 상세히 설명함.
파일 조작은 코너 아래 및 응용 프로그램 안에서 이루어지며, 파일 API가 작동해 키를 받아 파일 식별하며, 버퍼 포인터를 받고 내용을 전달함.

파일, 파이프, 프로세스 간 통신의 특징은?


파일은 저장 공간에 첨부된 것을 상상하기 쉽지만, 실제로는 응용 프로그램이 읽고 쓸 수 있는 스트림 인터페이스를 가진 모든 것이에요.
파이프는 커널 공간에 상주하는 가상 파일이고, 프로세스 간 통신에 사용돼요.
파이프 생성 시 읽기와 쓰기를 위한 두 개의 파일 디스크립터가 열려요.
fork 시 부모 프로세스로부터 모든 메모리가 자식 프로세스로 복사되며, 파일 디스크립터 정보와 질의도 물려 받아요.

파이프 통신의 과정은?


파이프는 종류에 상관없이 모두 종류의 파일로 간주하므로 부모 프로세스는 작성기로 작동하며 읽기 파이프를 사용할 필요가 없어요.
부모 프로세스는 `getline`를 실행하여 표준 입력에서 어떤 문장을 가져오고 파이프에 씁니다.
`getline`을 실행하면 버퍼에 포함된 한 줄이 채워지고 이것이 부모 프로세스에 의해 파이프에 쓰여져요.
데이터의 양이 발신된 값을 나타내는 정수 값이 주어지며, 모든 제공된 데이터가 한꺼번에 성공적으로 전송된 것을 의미해요.

파이프의 작동 방식은?


파이프는 0으로 폐쇄될 수 있고, 읽기 파이프입니다.
파이프는 여러 종류가 있고, 파이프 중 하나의 종류는 단방향이거나 이중 파이프가 될 수 있죠.
파이프를 생성할 때 읽기 전용 파이프와 쓰기 전용 파이프를 모두 생성해요.
정보 전부를 전송하지 못할 때 읽기 함수의 반환 값이 작으면 다시 쓰기가 일어나요.
남은 데이터 양이 즉시 전송되는 행운의 경우도 있답니다.

소켓 통신 데이터 전송 동작 설명


운영 체제에 따라 쓰기 행동이 결정되어 반환값이 정해지지 않지만, 보장된 것은 이 값 이하의 값이 전송될 수 있다는 점이며 데이터를 완전히 보내기 위해 계속 전달해야 해요.
이 예시는 프로젝트 연습 수업에서 소켓 통신을 다뤘던 분들에게 친숙할 것이며 API로 소켓을 다룰 때 동일한 방식을 사용해요.
송신은 단순히 쓰기 작업에 불과하며, 운영 체제의 쓰기 작업을 직접 조작하는 제어가 중요하죠.
데이터가 운영 체제로부터 전체 전송되지는 않고, 버퍼 공간에 일부 데이터가 쌓이게 되므로 전송량을 지속적으로 추적하여 보내고자 하는 전체 내용물을 완전히 만들어야 해요.
작업이 완료되면 버퍼 공간을 해제하고 진행되며, 이후 remaining parts를 연속적으로 전달해야 해요.

자식 프로세스의 데이터 읽기와 저장 과정은?


자식 프로세스는 32 크기의 제한된 버퍼를 사용하며, 파이프 쓰기를 마치고 읽기 전용이기 때문에 파이프 쓰기를 종료해요.
파이프로부터 연속적으로 데이터를 읽으며, 만약 읽기 작업이 0을 반환하면, 쓰기가 완료된 것으로 간주하고 읽기 파이프를 닫아요.
읽은 데이터 양을 나타내는 반환값을 사용하여 버퍼에 적절한 양의 데이터를 저장하고, 마지막 문자를 널로 설정하여 텍스트 형식으로 출력할 수 있게 합니다.
버퍼에 저장된 데이터를 출력하고 이 과정을 반복하죠.

버퍼와 리드 동작은 어떻게 이루어지는가?


응용프로그램 수준에서 생성된 버퍼에도 용량 한계가 있어요.
따라서 읽기 동작에서 모든 데이터를 한 번에 가져오는 것이 아니라 조각조각 가져오며, 버퍼와 코너 버퍼 사이에 충분한 양의 데이터가 있다면 31문자를 반환하고, 부족한 경우 10바이트만 남아있을 때에도 10바이트를 반환해요.
이에 따라 데이터를 버퍼에 넣고 가져온 양에 따라 문자열을 만들어 화면에 출력해요.

파이프 통신의 특징?


부모 프로세스가 한 문장을 입력하기를 기다리며, 작동 체제 2002 봄 표기해.
동일한 문자열이 파이프를 통해 자식 프로세스로 전송되어 '리처드'를 출력하죠.
큰 데이터가 한 번에 31개의 문자씩 전달되며, 읽기 파이프에서도 31개의 문자까지 읽혀.
커뮤니케이션은 파일을 사용하듯이 파이프를 통해 이루어지며, 이는 부모 프로세스와 자식 프로세스 간에 독점적으로 공유돼.
파이프가 커널 공간에서 생성되지만 고유한 전역 이름이 없기 때문에 부모 프로세스와 자식 프로세스 간에만 공유돼 다른 프로세스에 영향을 미치지 않아.

파이프를 통한 프로그램 설정의 중요성


프로그램에서 사용되는 파일 디스크립터인 3과 4는 파이프 연산을 통해 제공되며, 3은 읽기 파이프 역할을 하고 4는...
부모 프로세스와 자식 프로세스 간에 동일한 파이프를 공유할 수 있지만, 이는 부모 프로세스가 파이프를 생성한 후 포크가 여러 자식 프로세스로 생성되었을 때 가능해요.
이러한 유형의 파이프는 이름이 없는 파이프로 간주되어 두 개의 프로세스 간 통신을 위해 사용돼요.
하지만 이는 여러 자식 프로세스 간의 통신에 사용하는 것은 권장되지 않아요.
여러 프로세스가 관련되어 있을 때, 누가 파이프에 어떤 메시지를 보내고 있는지 명확하지 않아요.
이를 명확히 하기 위해 동기화가 필요하죠.

파이프를 통한 프로세스 간 통신의 중요성은?


싱크로나이제이션에 대해 언급했지만, 파이프를 통한 메시지 교환이 매우 중요해요.
파이프를 이용하면 프로세스 간의 일대일 통신이 가능하죠, 읽기와 쓰기 작업을 위한 구분이 필요해요.
파이프에 토스트기가 관련되어 있다면 메시지가 교차될 수 있어요.
파이프는 메시지를 교차하지만 명확한 읽기와 쓰기를 위해 사용돼요, 프로세스 간 효율적인 커뮤니케이션을 가능케 해 줘요.

 

이 글 자세한 필기 정리본

https://mkisos.tistory.com/entry/IPC-pipe1c

 

IPC: pipe1.c

pipe1.c https://www.youtube.com/watch?v=8v1f6S4JTY0 해당 영상은 '파이프'를 이용한 프로세스간 통신 메커니즘에 대해 상세히 설명하는 내용입니다. 부모 프로세스와 자식 프로세스 간 통신을 파일을 통해

mkisos.tistory.com

 

반응형