프로세스 간 링 버퍼의 최적 공유

프로세스 간 링 버퍼의 최적 공유

우리는 임베디드 Linux 시스템을 구현하고 있으며 시스템의 백그라운드 프로세스 데이터를 보여주는 실시간 업데이트 차트를 웹사이트에 제공해야 합니다.

문제는 다음과 같은 측면에서 데이터를 가장 잘 공유하는 방법입니다.

  1. C로 작성된 새로운 값으로 링 버퍼를 주기적으로 업데이트하는 데이터 생성 절차입니다.

  2. 버퍼의 최신 내용을 얻어야 하는 웹 서버 CGI 기능입니다. 우리는 Python을 사용하여 CGI(nginx+wsgi+flask)를 구현합니다.

나는 현재 이를 위해 유닉스 소켓 솔루션 쪽으로 기울고 있지만, 백그라운드 프로세스가 간섭하지 않도록 하려면 C 프로그램의 멀티스레딩이 필요할 것이라고 생각합니다.

더 쉬운 방법이 있는지 궁금합니다. 버퍼 메모리를 가상 파일로 직접 매핑할 수 있나요? RAM 디스크에 있는 일반 파일을 버퍼로 사용하여 찾아서 쓰기만 하면 어떨까요?

답변1

파일 및 원자 이름 변경을 사용하는 간단한 솔루션은 스크립팅 언어를 사용하여 쉽게 구현할 수 있습니다.

보내는 사람

  • 파일에 데이터 쓰기A
  • 파일 이름을 A다음으로 바꿉니다.B

이름 바꾸기는 원자적으로 수행되며 수신자가 이전 파일을 처리하는 동안 수행될 수 있습니다.

수신자가 데이터를 읽지 않으면 발신자는 차단되지 않습니다.

수화기

  1. 동일한 데이터를 두 번 처리해도 문제가 없습니다.

    • 파일을 열다B
    • 데이터 읽기
    • 파일 닫기

    이 옵션은 수신자가 여러 개인 경우에도 작동합니다(예: 웹 서버에 대한 여러 CGI 프로세스).

  2. 수신자가 동일한 데이터를 두 번 처리해서는 안 되는 경우:

    • 파일 이름을 B다음으로 바꿉니다.C
    • 성공하면 파일을 읽고 처리합니다.C
    • 선택적으로 파일 삭제C

    이 옵션은 단일 수신기에만 사용할 수 있습니다.

두 경우 모두, 송신자가 수신자가 읽을 수 있는 것보다 더 빠르게 데이터를 쓰면 이전 데이터가 손실됩니다.

물론 다른 옵션도 있습니다.

관련 정보