2009-08-25 5 views
1

"mmap"에 대해 알고 있지만, 내가 알고있는 한 부모 프로세스에 의해 할당 된 메모리를 공유하고 클라이언트 프로세스 내가 임시 파일을 만들어야합니다.어떻게 부모 - 자식 프로세스간에 메모리를 공유 할 수 있습니다 그들이 죽을 때 메모리를 자동으로 해제

그러나 프로세스가 종료되면이 파일이 계속 존재하게됩니다.

나는 결코 쓰레기를 버리지 말라는 교육을 받았습니다. 실생활과 프로그래밍 모두.

이 솔루션은 Linux, FreeBSD 및 Solaris에서 작동해야합니다.

답변

0

명명 된 파이프는 위에서 언급 한대로해야합니다. 당신은 두 개의 파이프 (가능한 경우)를 사용할 수 있습니다 :

  1. parentpid_childpid - 부모가 쓰고 아이가
  2. childpid_parentpid를 읽고 - 아이가 쓰고 parebt가 읽습니다.

이 작품은 저에게 좋습니다. 고려할 특별한 시나리오가 있다면 언급하십시오.

2

article은 공유 메모리의 시작점입니다.

그러나 일반적으로 파이프를 사용하여 경쟁 조건 및 모든 정신적 오버 헤드가 동시에 발생하지 않도록하는 것이 좋습니다. 하위 프로세스를 열면 stdin 및 stdout은 부모 프로세스에서 읽고 쓸 수있는 파일 설명자입니다.

+0

죄송합니다 이것은 내 소프트웨어의 작고 중요한 부분이며 가능한 한 빨리 데이터 세트를 교환 할 수 있어야합니다. 그리고 동시성과 경쟁 조건에 대해 두렵지 않습니다. 나는 고속 동시성 프로그래밍을 좋아한다. 하지만 여기에 내가 메인 애플 리케이션을 크래시 수 없어야 안전하지 않은 플러그인을로드 할 수 있으므로 외부 자식 프로세스를 호출해야합니다. – Lothar

+2

당신이 사물의 위에 있고 내가 링크 된 기사가 의미가있는 것처럼 들립니다. 부모가 공유 버퍼에서 부모가 읽는 모든 내용을 부모 전용 버퍼에 복사 한 다음 분명히 확인합니다. 그리고 어느 시점에서 커널이 파이프를 통해 무엇을 하는지를 사용자 영역에서 시도하려고 할 것이므로 파이프가 느려지는 것을 발견하지 못할 수도 있습니다. – Will

0

부모 메모리 할당. 부모와 자식 모두에서이 메모리를 사용하십시오. 부모에게 메모리를 확보 할 책임을 부여하십시오. 자식에 대한 부모 대기 (시스템 호출 대기)를 만듭니다. 부모는 종료 전에 메모리를 해제합니다.

안전한 측면을 유지하기 위해 부모가 살아 있는지 여부를 확인하기 전에 자녀가 나간다. 그렇지 않은 경우 자식 자체에 메모리를 확보하십시오. 그러나 여러 자식이있을 수 있으면이 작업이 작동하지 않습니다.

메모리의 처음 몇 비트를 사용하여이 메모리를 사용하는 프로세스 수를 추적 할 수 있습니다. 프로세스가 메모리 사용을 시작할 때마다이 카운트를 증가시키고 종료하기 전에 카운트를 감소시킵니다. 카운트가 0이되면, 메모리를 확보하십시오.

또 다른 방법이 있습니다. 시스템 malloc (또는 사용하는 함수)의 맨 위에있는 ownMalloc 함수를 작성하십시오. 이것은 할당 된 모든 메모리와이를 사용하는 프로세스를 추적합니다. 주기적으로 할당 된 여러 청크를 통해 사용되지 않는 청크를 해제합니다.

1

일반적으로 Mmap은 쓰레기를 생성하지 않는 "익명"모드를 지원합니다. Solaris에서 매뉴얼 페이지에 따르면, LInux에서 작동합니다. FreeBSD에 대해서는 잘 모르겠습니다. 매뉴얼 페이지를보고 MAP_ANON 또는 MAP_ANONYMOUS를 검색하십시오.

+1

그리고 나는 MAP_ANONYMOUS 전에 그것을 추가해야합니다. 트릭은 mmap 바로 뒤의 파일을 unlink()하는 데 익숙합니다. 이렇게하면 상위 및 하위 프로세스가 공유 메모리를 사용할 수 있습니다. – ondra

+0

흠 만약 내가 MAP_ANONYMOUS를 사용한다면 어떤 파일의 설명자를 전달해야합니까? 좋아, 내가 (또는 데이터가 쓰여진 적이없는) 핸들을 사용하기 위해 "/ tmp/dummy"파일을 생성하려고 할 수있다. 하지만 여전히 쓰레기가 남아 있습니다. – Lothar

+0

'MAP_ANONYMOUS'를 사용할 때 파일 설명자로'-1'을 전달합니다. – caf

0

POSIX shm_open (3) 및 관련 함수를 사용하여 파일이 지원되지 않는 메모리를 매핑합니다. shm_open()에 의해 반환 된 파일 디스크립터는 부모와 자식이 존재하지 않으면 자동으로 닫혀 야하지만, 항상 그렇다면 100 % 확실하지는 않습니다. 어쩌면 다른 누군가가 그것에 대해 더 많은 것을 밝힐 수 있습니까?

+0

"shm"과 posix 세마포어는 FreeBSD (shm은 디자인 상 - FreeBSD 메일 링리스트에서 대화를 통해 알게되었습니다)에서 그렇게 부러졌습니다. – Lothar

0

부모 프로세스에서 메모리를 할당하고 자식 프로세스가 실행될 때까지 대기 상태를 유지하거나 다른 작업을 수행하게하십시오.자식 프로세스가 끝나면 부모 프로세스로 돌아갑니다. 메모리를 할당 해제합니다.

하위 프로세스 (자식이이 경우 고아라고 말하기 전에)를 중지해야하는 경우 exec()를 사용하면 하위 프로세스가 새 프로세스로 시작됩니다.

관련 문제