2011-03-26 3 views
2

여러 번 호출되는 Linux 프로세스가 있으므로이 프로세스를 가능한 빨리 수행해야합니다.프로세스 호출간에 데이터 전송

문제는 다른 프로세스/데몬을 실행하지 않고도 호출간에 상태를 유지해야합니다 (이전 호출의 데이터를로드하고 다음 호출을 위해 저장).

빠른 방법을 제안 할 수 있습니까? 나는 I/O를 위해 파일을 사용할 수 있다는 것을 알고 있으며, 명백한 성능상의 이유로 그것을 피하고자한다. 내가 할 수있는 실제 디스크 I/O를 피하기 위해 /에서 읽고 쓰는 명명 된 파이프를 만들까요?

+1

* fast *는 상대적입니다. 요구 사항은 무엇입니까? 대부분의 경우 상태 정보를 파일에 저장하는 것이 적절한 해결책 일 수 있습니다. –

답변

2

파이프가이 용도로 적합하지 않습니다. 파일이 너무 느리다고 확신하는 경우 posix shared memory 또는 posix message queue을 사용하십시오. 먼저 테스트해야합니다.

공유 메모리의 경우 프로그램은 존재하지 않으면 shm_open()을 사용하여 세그먼트를 만듭니다. 존재하지 않으면 shm_open()을 사용하여 세그먼트를 만듭니다. 메모리를 mmap()하고 변경하고 종료하십시오. 프로그램이 더 이상 호출되지 않으며 더 이상 공유 메모리가 필요 없다는 것을 알았을 때만 shm_unlink()를 사용합니다.

메시지 대기열을 사용하면 대기열을 설정하기 만하면됩니다. 프로그램은 대기열을 읽고, 변경 사항을 작성하고, 대기열을 작성하고 종료합니다. 대기열이 더 이상 필요하지 않을 때 Mq_unlink().

두 가지 방법 모두 커널 지속성을 갖기 때문에 재부트시 공유 메모리와 대기열을 잃게됩니다.

0

뭔가 계속해서 실행되는 프로세스가있는 것 같습니다.

왜 작업자 스레드를 생성하는 팩터 리를 만들지 않습니까? 공장은 근로자에게 필요한 모든 정보를 제공 할 수 있습니다.

+0

좋은 생각이지만, 그 컴퓨터에서 더 많은 프로세스를 생성 할 수 없습니다. – liorda

0

... I/O 용 파일을 사용할 수 있으며 명백한 성능상의 이유로이를 피하고 싶습니다.

나는

리눅스는 page cache에서 커널 메모리에 파일을 캐시 ... 이러한 이유하시기 바랍니다 무엇인지 궁금합니다. 쓰기는 페이지 현금으로 먼저 이동합니다. 즉, write()은 사용자 공간에서 페이지 캐시로만 데이터를 복사하는 커널 호출입니다 (시스템이 스트레스를받을 때 조금 더 복잡합니다). 잠시 후 pdflush은 디스크에 데이터를 비동기 적으로 씁니다.

파일 read()은 먼저 디스크 캐시를 방지하기 위해 페이지 캐시를 검사하여 메모리에 이미 데이터가 있는지 확인합니다. 즉, 한 프로그램이 파일에 데이터를 쓰고 다른 프로그램이 데이터를 읽으면 이러한 두 프로그램은 페이지 캐시가 해당 파일을 유지하는 한 커널 메모리를 통해 효과적으로 통신합니다.

당신이 디스크를 피하려면

, 즉, 상태이 필요하지 않습니다 은 OS가 재부팅 지속되는 해당 파일이 /dev/shm 또는 /tmp에 넣을 수, 인 -의 일반적으로 마운트 지점이있는 전체 기록 메모리 파일 시스템.

+0

나는 디스크 액세스가 RAM 액세스와 비교할 때 실제로 느리다는 것을 경험 법칙으로 생각한다.나는 내 프로세스 호출 사이에 캐시에 머물기 위해 페이지에 의존 할 수 있다고 생각하지 않는다. 왜냐하면 그 사이에 무엇이 어떻게 일어날 지 모르기 때문이다. – liorda