2013-03-24 22 views
12

Jestem zdezorientowany linuxem man pages dla shmctl(). Używam następującego polecenia: shmctl (id , IPC_RMID , 0), aby usunąć udostępniony segment. man pages wydaje się zaprzeczać samej pamięci życia.Usuwanie segmentu pamięci współużytkowanej za pomocą shmctl

man pages stan:

IPC_RMID

Mark segment zostać zniszczone. Segment zostanie faktycznie zniszczony dopiero po odjęciu ostatniego procesu (tj. Gdy członek shm_nattch powiązanej struktury shmid_ds ma wartość zero). Dzwoniący musi być właścicielem lub twórcą lub być uprzywilejowanym. Jeśli segment został oznaczony do zniszczenia, wówczas zostanie ustawiona (niestandardowa) flaga SHM_DEST pola shm_perm.mode w powiązanej strukturze danych pobranej przez IPC_STAT.

Jeśli jestem poprawny, wierzę, że to oznacza, że ​​jeśli masz dwa procesy, które zarówno dołączyć do pamięci współdzielonej (Nazwijmy je Process1 i Process2) Process1 może utworzyć pamięci współdzielonej, załączyć, odłączyć, niszczyć wspólne pamięć, a ostatecznie zakończyć. Wtedy pamięć nadal będzie istniała do momentu, aż Process2 się odłączy.

Czy to prawda?

Po drugie, co to oświadczenie w man pages myśli:

Rozmówca musi zapewnić, że segment jest ostatecznie zniszczone; W przeciwnym razie jego strony, do których doszło, pozostaną w pamięci lub zamienią się na .

To sprawia, że ​​wydaje się Process1, gdyż oznaczała segment do usunięcia, musiałaby zablokować aż wszystkie inne procesy są odłączane w celu zapewnienia pamięci zostanie usunięty. Ale wydaje się to sprzeczne z powyższym stwierdzeniem. Nie mam też pojęcia, jak to się robi (jeśli ma to być zrobione), więc jeśli tak jest, czy mógłbyś również wyjaśnić, jak to zrobię.

Odpowiedz

15

Twoje pierwsze rozumowanie jest poprawne. Współużytkowany segment będzie istnieć do momentu, aż oba zostaną oznaczone: IPC_RMID, a ostatni proces zostanie odłączony.

Celem drugiego fragmentu jest przypomnienie, że w rozwiązaniu korzystającym z pamięci współdzielonej trzeba mieć jakiś proces oznaczyć go do zniszczenia lub pozostanie w pamięci/wymianie na zawsze. Dobrym pomysłem może być użycie IPC_RMID natychmiast po utworzeniu segmentu.

Jeśli nie masz pewności, czy udało się zwolnić pamięć, możesz użyć programu ipcs, aby wyświetlić pozostałe segmenty.

Powiązane problemy