2009-12-23 11 views
8

Chúng ta cần nhiều chương trình để gọi các hàm trong một thư viện chung. Chức năng thư viện truy cập và cập nhật bộ nhớ chung chung. Mỗi cuộc gọi hàm của chương trình cần xem bộ nhớ chung chung này. Đó là một cuộc gọi hàm cần xem các cập nhật của bất kỳ cuộc gọi hàm nào trước đó ngay cả khi được gọi từ một chương trình khác. Đối với lý do tương thích chúng tôi có một vài hạn chế thiết kế về cách các chức năng tiếp xúc của các thư viện chia sẻ phải hoạt động:Các đối tượng instantiating trong bộ nhớ chia sẻ C++

  • Bất cứ mục dữ liệu (cả hai loại dữ liệu tiêu chuẩn và đối tượng) được công bố trên toàn cầu phải được hiển thị cho tất cả người gọi không phân biệt chuỗi trong đó mã đang chạy.
  • Bất kỳ mục dữ liệu nào được khai báo cục bộ trong một hàm chỉ hiển thị bên trong hàm đó.
  • Bất kỳ loại dữ liệu chuẩn nào hoặc thể hiện của bất kỳ lớp nào đều có thể xuất hiện cục bộ hoặc toàn cầu hoặc cả hai.

Một giải pháp là đặt bộ nhớ chung chung của thư viện vào bộ nhớ dùng chung. Cuộc gọi thư viện đầu tiên sẽ tạo bộ nhớ được chia sẻ có tên và khởi tạo nó. Các cuộc gọi chương trình tiếp theo sẽ lấy địa chỉ của bộ nhớ dùng chung và sử dụng nó làm con trỏ tới cấu trúc dữ liệu chung. Các cá thể đối tượng được khai báo trên toàn cầu sẽ cần được cấp phát động trong bộ nhớ chia sẻ trong khi các cá thể đối tượng được khai báo cục bộ có thể được đặt trên ngăn xếp hoặc trong vùng cục bộ của chuỗi người gọi. Các vấn đề phát sinh do các đối tượng khởi tạo trong bộ nhớ toàn cục có thể tạo và trỏ tới các đối tượng con phân bổ bộ nhớ bổ sung (mới). Các phân bổ mới này cũng cần phải nằm trong bộ nhớ dùng chung và được tất cả người gọi thư viện nhìn thấy. Một biến chứng khác là các đối tượng này, có chứa các chuỗi, các tệp, vv, cũng có thể được sử dụng trong chương trình gọi điện. Khi được khai báo trong chương trình gọi, bộ nhớ của đối tượng là cục bộ cho chương trình gọi điện, không được chia sẻ. Vì vậy, mã của đối tượng cần xử lý cả hai trường hợp. Dường như với chúng tôi rằng giải pháp sẽ yêu cầu chúng tôi ghi đè vị trí toàn cầu mới, các toán tử mới và xóa thông thường. Chúng tôi đã tìm thấy một thiết kế cho một hệ thống quản lý bộ nhớ có vẻ như nó sẽ hoạt động nhưng chúng tôi chưa tìm thấy bất kỳ triển khai thực tế nào. Nếu có ai biết về việc triển khai thiết kế quản lý bộ nhớ của Nathan Myers (http://www.cantrip.org/wave12.html?seenIEPage=1), tôi sẽ đánh giá cao một liên kết đến nó. Ngoài ra, nếu có ai biết về một trình quản lý bộ nhớ dùng chung khác có khả năng phân bổ động các đối tượng tôi cũng muốn biết về nó. Tôi đã kiểm tra các thư viện Boost và tất cả các nguồn khác mà tôi có thể tìm thấy nhưng không có gì dường như làm những gì chúng ta cần. Chúng tôi không muốn phải viết một bản thân. Kể từ khi hiệu suất và độ mạnh là quan trọng, nó sẽ được tốt đẹp để sử dụng mã đã được chứng minh. Cảm ơn trước vì bất kỳ ý tưởng/trợ giúp nào.

Cảm ơn các đề xuất về thư viện ATL và OSSP. Tôi đang kiểm tra chúng ngay bây giờ mặc dù tôi sợ ATL là quá Wincentric nếu là mục tiêu hóa ra là Unix.

Một điều khác hiện có vẻ rõ ràng đối với chúng tôi. Vì các đối tượng có thể được tạo động trong khi thực thi, lược đồ quản lý bộ nhớ phải có khả năng phân bổ các trang bổ sung của bộ nhớ dùng chung. Điều này bây giờ bắt đầu trông giống như một người quản lý bộ nhớ thay thế heap đầy đủ.

+2

Không phải là giải pháp kinh điển cho vấn đề này để tạo ra một máy chủ, ứng dụng khách nào có thể sử dụng? Dễ dàng hơn nhiều so với futzing với bộ nhớ chia sẻ, mà không có khả năng làm việc vì những lý do bạn đưa ra. –

+0

Đồng ý với Neil. – wheaties

+0

Có. Việc thiết kế lại ứng dụng sẽ là cách dễ nhất để giải quyết vấn đề. Thật không may vì các ràng buộc thiết kế do compatilibty với các thành phần khác, chúng tôi không có tùy chọn đó. – BillC

Trả lời

0

OSSP mm - Thuê chung Memory Allocation:

man 3 mm

1

Hãy xem boost.interprocess.

+1

Như tôi đã đề cập trong bài đăng, chúng tôi đã xem thư viện Tăng cường. Thật không may nó đã không hoàn thành những gì chúng tôi cần. Nó dẫn chúng ta đến một số resouces hứa hẹn, mặc dù, chẳng hạn như liên kết tôi đã đề cập trong bài viết. – BillC

0

Như tôi chắc chắn bạn đã tìm thấy, đây là một vấn đề rất phức tạp và rất khó triển khai chính xác. Một vài lời khuyên từ kinh nghiệm của tôi. Trước hết, bạn chắc chắn sẽ muốn đồng bộ hóa quyền truy cập vào phân bổ bộ nhớ được chia sẻ bằng cách sử dụng các semaphores. Thứ hai, bất kỳ sửa đổi nào đối với các đối tượng được chia sẻ bởi nhiều tiến trình cũng cần phải được bảo vệ bởi các semaphores.Cuối cùng, bạn cần suy nghĩ về bù đắp từ đầu vùng nhớ chia sẻ, chứ không phải là giá trị con trỏ tuyệt đối, khi xác định đối tượng và cấu trúc dữ liệu của bạn (thường có thể cho bộ nhớ được ánh xạ tại một địa chỉ khác trong mỗi quá trình đính kèm , mặc dù bạn có thể chọn địa chỉ ánh xạ cố định nếu cần). Đặt tất cả cùng nhau một cách mạnh mẽ là phần khó khăn. Thật dễ dàng cho các cấu trúc dữ liệu dựa trên bộ nhớ chia sẻ để trở thành bị hỏng nếu một quá trình bất ngờ sẽ chết, do đó, một số cơ chế dọn dẹp/khôi phục thường được yêu cầu.

+0

Bạn hoàn toàn đúng. Vấn đề là phức tạp và đó là lý do tại sao chúng tôi không muốn phải viết mã từ đầu. – BillC

0

Cũng nghiên cứu mutexes và semaphores. Khi hai hoặc nhiều thực thể cần chia sẻ bộ nhớ hoặc dữ liệu, cần phải có cơ chế "tín hiệu giao thông" để giới hạn quyền ghi vào chỉ một người dùng.

+0

Cảm ơn. Chúng tôi hiểu rằng điều này cần phải là chủ đề an toàn và đã thực hiện các mutex để kiểm soát quyền truy cập. Vấn đề chính chúng ta có là làm thế nào để đảm bảo rằng một số đối tượng được cấp phát trong bộ nhớ chia sẻ, cùng với bất kỳ đối tượng nào mà chúng khởi tạo, trong khi các trường hợp khác của cùng một đối tượng được cấp phát cục bộ. – BillC

+0

Quá trình trộn bộ nhớ cục bộ và chia sẻ như bạn mô tả có vẻ như là một công thức cho thảm họa. Việc xác định một giao thức truyền thông giữa các quy trình chính thức hơn có lẽ là một cách tiếp cận tốt hơn. –