기술나눔

프로세스 간 통신 - 파이프

2024-07-11

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

여기에 이미지 설명을 삽입하세요.

1. 프로세스 커뮤니케이션 소개

1.1 프로세스 간 통신이 필요한 이유

프로세스 간 협업이 필요합니다. 예를 들어, 학교의 모든 관리 수준은 서로 연결되어 있어 수직적으로 관리할 수 없습니다. 프로세스가 협업해야 하기 때문입니다. 협업의 전제 조건은 프로세스가 통신해야 한다는 것입니다. 데이터에는 알림용 데이터도 있고, 단순히 전송되는 데이터도 있고, 제어 관련 데이터도 있습니다.

사실: 프로세스는 독립적입니다. 프로세스 = 커널 데이터 구조, 프로세스의 코드 및 데이터

프로세스 커뮤니케이션의 목적:

  • 데이터 전송: 한 프로세스는 자신의 데이터를 다른 프로세스로 보내야 합니다.
  • 리소스 공유: 여러 프로세스 간에 동일한 리소스를 공유합니다.
  • 알림 이벤트: 프로세스는 특정 이벤트가 발생했음을 알리기 위해 다른 프로세스나 프로세스 그룹에 메시지를 보내야 합니다(예: 프로세스가 종료될 때 상위 프로세스에 알림).
  • 프로세스 제어: 일부 프로세스는 다른 프로세스(예: 디버그 프로세스)의 실행을 완전히 제어하기를 원합니다. 이때 제어 프로세스는 다른 프로세스의 모든 트랩과 예외를 차단하고 시간에 따른 상태 변화를 알 수 있기를 원합니다.

1.2 프로세스가 통신하는 방법

프로세스 간 통신 비용은 약간 더 높을 수 있습니다. 프로세스는 독립적이며 한 프로세스에서 열린 리소스는 다른 프로세스에서 볼 수 없습니다. 이전에 부모-자식 프로세스에 대해 이야기했을 때 부모 프로세스의 데이터는 자식 프로세스에 상속되었습니다. 이는 상속될 수 있지만 항상 상속되는 것은 아닙니다. 항상 정보를 전송할 수 있습니다.

프로세스 간 통신의 전제: 먼저 서로 다른 프로세스가 동일한(운영 체제) 리소스("메모리 조각")를 볼 수 있도록 합니다. 두 프로세스는 독립적입니다. 통신을 위해서는 두 프로세스가 동일한 메모리를 가질 수 있도록 하는 도구, 즉 운영 체제가 필요합니다. 운영 체제가 이를 수행하는 이유는 사용자가 결정합니다.
운영 체제에 리소스를 생성하도록 지시하는 방법:

  1. 특정 프로세스가 먼저 통신하고 OS가 공유 리소스를 생성하도록 해야 합니다.
  2. OS는 프로세스가 시스템 호출을 통해 시스템 리소스를 적용할 수 있도록 많은 시스템 호출을 제공해야 합니다.
    OS에서 생성된 다양한 공유 리소스와 다양한 시스템 호출 인터페이스에 따라 다양한 유형의 프로세스 간 통신이 결정됩니다.

여기에 이미지 설명을 삽입하세요.

2. 파이프라인

2.1 익명 파이프라인

2.1.1 파일 디스크립터 이해 파이프라인

여기에 이미지 설명을 삽입하세요.

파이프라인은 기본적으로 디스크에 플러시할 필요가 없는 메모리 수준 파일입니다.
첫째, 상위 프로세스는 읽기 및 쓰기 모드에서 파일을 두 번 엽니다. 파일을 두 번 여는 이유는 두 개의 구조체 파일 객체를 얻어서 파일에 대한 두 개의 읽기 및 쓰기 포인터가 있으므로 읽기 및 쓰기 작업이 가능하기 때문입니다. 이렇게 하면 읽기와 쓰기가 서로 영향을 주지 않습니다.읽기-쓰기 포인터는 현재 파일 읽기 또는 쓰기 위치를 기록합니다.struct file 파일에는 읽기-쓰기 포인터가 하나만 있습니다. 파일에 쓰기(또는 읽기)하면 읽기-쓰기 포인터가 이동한 다음 다시 읽기(쓰기)됩니다. 이때 읽기-쓰기 포인터는 더 이상 없습니다. 원래 위치에서는 방금 작성한 내용을 읽을 수 없으므로 동일한 파일을 다른 방법으로 두 번 열어야 합니다. 그런 다음 하위 프로세스를 생성합니다. 즉, 상위 프로세스에서 열린 파일을 상속합니다. 즉, 이때 상위 프로세스와 하위 프로세스는 하위 프로세스를 공유합니다. 프로세스는 파일 디스크립터 4번을 파일에 전달할 수 있습니다. 파일에 쓸 때 상위 프로세스는 파일 디스크립터 3번을 통해 파일에서 읽을 수 있습니다. 이때 상위 프로세스와 하위 프로세스는 데이터 전송, 즉 통신을 실현합니다. . 부모 프로세스와 자식 프로세스는 여기서 파이프 파일이라고 부르는 동일한 메모리 버퍼를 봅니다. 파이프는 단순성 때문에 단방향 통신만 허용합니다.

왜 부모-자식은 인쇄 데이터를 동일한 모니터 터미널로 처리합니까?
해당 하위 프로세스는 상위 프로세스에 해당하는 파일 설명자 테이블을 상속하고 동일한 파일을 가리키기 때문에 상위 프로세스는 파일을 입력하고 하위 프로세스도 파일을 입력하며 동일한 내용이 버퍼에 기록되며 운영 체제는 동일한 모니터에 플러시됩니다.


프로세스는 기본적으로 0, 1, 2의 세 가지 표준 입력 및 표준 출력을 엽니다. 기본적으로 0, 1, 2를 여는 방법은 무엇입니까?
모든 명령은bash자식 프로세스bash이 기능을 켜면 기본적으로 모든 하위 프로세스가 켜집니다.


상위 프로세스의 지속적인 모니터 파일 사용에 영향을 주지 않고 하위 프로세스가 적극적으로 닫히는 이유(0/1/2)는 무엇입니까?
메모리 수준 참조 카운팅--, 메모리 수준 참조 횟수가 0으로 감소하면 파일 리소스가 해제됩니다.


부모-자식 프로세스는 불필요한 파일 설명자를 닫습니다. 이전에 열어야 했던 이유는 무엇입니까?
자식 프로세스가 상속받을 수 있도록 하기 위해서입니다. 닫을 필요는 없으나, 실수로 쓰는 것을 방지하기 위해 닫아 두는 것이 좋습니다.


파이프가 단방향 통신인 이유는 무엇입니까?
방법은 간단하고 개발 비용을 절감하며 단방향 통신만 허용합니다. 모든 파일이 버퍼에 새로 고쳐진 다음 데이터가 파일에 새로 고쳐집니다. 이 프로세스 자체는 단방향입니다.
우리가 생활에서 보는 단순한 파이프는 모두 수도관과 같이 입구와 출구가 하나인 단방향 파이프라인의 특성에 부합합니다.

2.1.2 인터페이스 사용법

사용할 수 있다pipe명명되지 않은 파이프를 생성하려면 매개변수에 파일 경로와 파일 이름이 필요하지 않습니다.

int pipe(int pipefd[2]);