Tôi đang làm việc để triển khai một máy chủ cơ sở dữ liệu trong C sẽ xử lý các yêu cầu từ nhiều máy khách. Để làm như vậy tôi đang sử dụng fork() để xử lý các kết nối cho các máy khách cá nhân.Chia sẻ bộ nhớ heap với fork()
Máy chủ lưu trữ dữ liệu trong heap bao gồm một con trỏ gốc vào bảng băm của các bản ghi được cấp động. Các bản ghi là các cấu trúc có các con trỏ đến các kiểu dữ liệu khác nhau. Tôi muốn cho các quá trình để có thể chia sẻ dữ liệu này để khi một khách hàng thực hiện một thay đổi cho đống, những thay đổi sẽ được hiển thị cho các khách hàng khác.
Tôi đã học được rằng fork() sử dụng COW (Copy On Write) và sự hiểu biết của tôi là nó sẽ sao chép bộ nhớ heap (và ngăn xếp) của quá trình cha mẹ khi trẻ sẽ cố gắng sửa đổi dữ liệu trong bộ nhớ.
Tôi đã phát hiện ra rằng tôi có thể sử dụng thư viện shm để chia sẻ bộ nhớ.
-Nó có đủ để chia sẻ con trỏ gốc của cơ sở dữ liệu hay tôi phải làm cho tất cả bộ nhớ được phân bổ như được chia sẻ?
-Nếu một đứa trẻ cấp phát bộ nhớ, phụ huynh/trẻ em khác có thể truy cập vào bộ nhớ đó không?
-Ngoài ra nếu một đứa trẻ cấp phát bộ nhớ và sau đó bị giết sẽ bộ nhớ được phân bổ vẫn ở lại trên heap?
Ví dụ: mã dưới đây là cách hợp lệ để chia sẻ bộ nhớ heap (trong shared_string)? Nếu một đứa trẻ sử dụng mã tương tự (tức là bắt đầu từ // bắt đầu) thì những đứa trẻ khác có thể đọc/ghi nó trong khi đứa trẻ đang chạy và sau khi nó đã chết không?
key_t key;
int shmid;
key = ftok("/tmp",'R');
shmid = shmget(key, 1024, 0644 | IPC_CREAT);
//start
char * string;
string = malloc(sizeof(char) * 10);
strcpy(string, "a string");
char * shared_string;
shared_string = shmat(shmid, string, 0);
strcpy(shared_string, string);
Việc sử dụng * đề tài * phổ biến hơn nếu bạn muốn chia sẻ bộ nhớ giữa các phần của cùng một chương trình. Nhưng bạn phải rất cẩn thận về cách bạn đồng bộ hóa quyền truy cập vào cấu trúc dữ liệu được chia sẻ với khóa, v.v. – alberge
Vâng, bạn cần sử dụng bộ nhớ dùng chung cho tất cả nội dung bạn muốn chia sẻ. –
Chỉ có thể chia sẻ shm, nếu bạn cấp phát bộ nhớ mới, nó cũng phải được bật, không cắt ngắn. – pizza