2013-03-24 34 views
12

Tôi bị nhầm lẫn bởi linux man pages cho shmctl(). Tôi sử dụng lệnh sau: shmctl (id , IPC_RMID , 0) để xóa phân đoạn được chia sẻ. man pages dường như mâu thuẫn với tuổi thọ của bộ nhớ.Xóa phân đoạn bộ nhớ chia sẻ với shmctl

Tình trạng man pages:

IPC_RMID

Đánh dấu phân khúc bị phá hủy. Phân đoạn này sẽ chỉ thực sự bị phá hủy sau khi quá trình cuối cùng phá hủy nó (tức là khi thành viên shm_nattch shmidattch của cấu trúc liên kết là số không). Người gọi phải là chủ sở hữu hoặc người sáng tạo hoặc được đặc quyền. Nếu một đoạn đã được đánh dấu để hủy, thì cờ SHM_DEST (không chuẩn) của trường shm_perm.mode trong cấu trúc dữ liệu được liên kết được truy xuất bởi IPC_STAT sẽ được đặt.

Nếu tôi đúng, tôi tin rằng điều này có nghĩa nếu bạn có hai quá trình mà cả hai gắn với bộ nhớ chia sẻ, (Cho phép gọi họ Process1Process2), Process1 có thể tạo ra các bộ nhớ chia sẻ, đính kèm, tách, phá hủy các chia sẻ bộ nhớ, và cuối cùng chấm dứt. Sau đó, bộ nhớ sẽ vẫn tồn tại cho đến khi Process2 cũng bị gián đoạn.

Điều này có đúng không?

Thứ hai, những gì hiện tuyên bố này trong man pages có nghĩa là:

Người gọi phải đảm bảo rằng một phân khúc được cuối cùng bị phá hủy; nếu không trang của nó đã bị lỗi sẽ vẫn còn trong bộ nhớ hoặc trao đổi.

Điều này làm cho nó có vẻ như Process1, vì nó đánh dấu phân đoạn để xóa, sẽ cần chặn cho đến khi tất cả các quy trình khác được tách ra để đảm bảo bộ nhớ bị xóa. Nhưng điều này dường như mâu thuẫn với tuyên bố trên. Tôi cũng không có ý tưởng làm thế nào điều này sẽ được thực hiện (nếu nó là nghĩa vụ phải được thực hiện), vì vậy nếu đó là trường hợp, bạn có thể cũng giải thích làm thế nào tôi sẽ đi về việc này.

Trả lời

15

Lý do đầu tiên của bạn là chính xác. Phân đoạn được chia sẻ sẽ tồn tại cho đến khi cả hai: nó được đánh dấu bằng IPC_RMID và quá trình xử lý lần cuối.

Mục đích của đoạn thứ hai là nhắc nhở bạn, rằng trong một giải pháp sử dụng bộ nhớ chia sẻ, bạn cần phải có một số quá trình đánh dấu nó để hủy hoặc nó sẽ vẫn còn trong bộ nhớ/trao đổi mãi mãi. Có thể nên sử dụng IPC_RMID ngay sau khi tạo phân đoạn.

Nếu bạn không chắc chắn bạn đã phát hành thành công bộ nhớ, bạn có thể sử dụng chương trình ipcs để liệt kê các phân đoạn còn lại.

Các vấn đề liên quan