mkfifo - 디스크 I/O가 실제로 발생합니까?

mkfifo - 디스크 I/O가 실제로 발생합니까?

2개의 애플리케이션이 있습니다.

  • 생산자(N인스턴스)
  • 소비자(인스턴스 1개)

현재 쓰고 있어요가운데생산자로부터 결과가 나오면 소비자는 디스크에서 이 파일을 읽고결정적인결과.

생산자의 출력을 소비자에게 직접 "스트리밍"하여 이 I/O를 최소화하고 싶습니다.

명명된 파이프(mkfifo)와 후속 예제를 발견했습니다.여기. 보기엔 좋아 보이지만 실제로 어떻게 구현되는지 알 수 없나요? FIFO 대기열은 파일을 통해 버퍼링됩니까? 그렇다면 그것은 아마도 나에게 도움이 되지 않을 것이다. 디스크를 사용하지 않고 콘텐츠가 "메모리에서" 완전히 스트리밍되기를 원합니다. 프로세스 전반에 걸쳐 이것이 가능하지 않을까요?

답변1

디스크 I/O 없음(fifo 파일을 열기 위해 파일 시스템을 탐색하지 않는 한)

~에서Linux fifo(7) 매뉴얼 페이지:

FIFO 특수 파일(파이프라는 이름)은 파일 시스템의 일부로 액세스된다는 점을 제외하면 파이프와 유사합니다. [...] 프로세스가 FIFO를 통해 데이터를 교환할 때 커널은 모든 데이터를 파일 시스템에 쓰지 않고 내부적으로 전달합니다. 따라서 FIFO 특수 파일에는 파일 시스템에 내용이 없습니다. 파일 시스템 항목은 프로세스가 파일 시스템에서 해당 이름을 사용하여 파이프에 액세스할 수 있도록 참조 지점 역할만 합니다.

답변2

결과가 실제로 디스크 기반인지 여부는 중요하지 않습니다. 충분한 메모리를 사용할 수 있으면 어쨌든 캐시되고 실제 디스크 IO가 수행되지 않기 때문입니다. 반대로, 메모리가 지원되고 사용 가능한 메모리가 충분하지 않은 경우 디스크로 스왑할 수 있습니다.

추측하자면 파이프라인은 실제로 메모리 기반이라고 말하고 싶습니다. 그러나 이는 다시 시작하는 동안 대기 중인 데이터가 유지되는지 여부만 변경해야 합니다.

주의해야 할 점은 생산자가 여러 명 있으므로 쓰기가 원자성이어야 대기열에 인터리브되지 않는다는 것입니다. 바라보다man 7 pipe원자성 쓰기를 보장하는 방법에 대한 세부정보입니다.

관련 정보