2011-08-24 27 views
7

Tôi tự hỏi ... Khi tôi bắt đầu chương trình X sử dụng thư viện được chia sẻ A, và trong khi chương trình chạy, tôi sửa đổi thư viện được chia sẻ trên đĩa và chạy một chương trình Y khác phụ thuộc vào cùng một lượt chia sẻ thư viện. Liệu chương trình đó Y sẽ sử dụng phiên bản đã có trong thư viện được chia sẻ hay nó sẽ tải một cá thể riêng biệt của thư viện được chia sẻ có các sửa đổi tiếp theo?Khi nào thư viện được chia sẻ được coi là "giống nhau" cho mục đích chia sẻ?

Làm cách nào để xác định có hay không chia sẻ thư viện được tải hoặc tải lại từ đĩa?

Trả lời

4

Bộ nạp năng động chỉ làm thường xuyên cũ open(2)mmap(2) cuộc gọi, và một bản đồ bộ nhớ bumps refcounts inode theo cùng một cách một fd mở không. Vì vậy, nếu bạn thực hiện thủ thuật thay thế tệp nguyên tử thông thường cho thư viện, hãy viết các thay đổi của bạn trong một bản sao mới của tệp và sau đó rename(2) nó trên tên cũ, bất kỳ thứ gì được bắt đầu sau thời điểm đó sẽ nhận mã inode mới và nội dung mới, nhưng các chương trình đang chạy sẽ tiếp tục sử dụng inode cũ và nội dung cũ.

Nếu bạn sửa đổi thư viện tại chỗ, tự nhiên mọi chương trình được bắt đầu sau khi cuộc gọi write sẽ nhận các thay đổi của bạn. Câu hỏi thú vị hơn là những gì xảy ra với các quá trình đã được ánh xạ. Câu trả lời có lẽ là "hệ thống sẽ không cho phép bạn làm điều đó" hoặc "không xác định, phụ thuộc vào các chi tiết của việc triển khai bộ nhớ cache của trang". Poking ngẫu nhiên tại triển khai Linux (đó là những gì tôi phải bàn giao): Trình nạp động glibc sử dụng MAP_DENYWRITE cho tất cả các bản đồ thư viện được chia sẻ của nó, nhưng không được ghi lại nhưng âm thanh như nó có nghĩa là "làm cho tệp này không thể sửa đổi được trong khi ánh xạ tồn tại" . Tuy nhiên, tôi không thể tìm thấy bất cứ điều gì trong các nguồn hạt nhân làm cho MAP_DENYWRITElàm bất kỳ điều gì; nó có thể là một di tích lịch sử hoặc một số như vậy.

Nó cũng sử dụng MAP_PRIVATE. http://pubs.opengroup.org/onlinepubs/7908799/xsh/mmap.html nói rằng "Nó không được chỉ định cho dù sửa đổi đối tượng bên dưới được thực hiện sau khi ánh xạ MAP_PRIVATE được thiết lập có thể nhìn thấy thông qua ánh xạ MAP_PRIVATE." Vì vậy, bạn có thể hoặc không thể sửa đổi hình ảnh thư viện được chia sẻ bên dưới một quy trình đang chạy, tùy thuộc vào chi tiết của việc triển khai bộ nhớ cache của trang.

0

Trình tải động sử dụng mmap(2) để tải thư viện được chia sẻ, vì vậy, tất cả phép thuật thực sự là trong mmap(2).

Trong trường hợp cụ thể của Linux, ánh xạ tập tin gọi một fs cụ thể mmap() hoạt động, mà thường là dây vào mm/filemap.c:generic_file_mmap(), thiết lập vm_ops.fault cho ánh xạ tập tin để mm/filemap.c:filemap_fault(), vì vậy sự kỳ diệu được trì hoãn thời gian lỗi trang. filemap_fault() cố gắng tìm trang trong bộ nhớ cache của trang bằng cách sử dụng find_lock_page().

mmap() → fs_file_ops.mmap() → generic_file_mmap() → file_vm_ops.fault = filemap_fault() 
page fault → filemap_fault() → find_lock_page() 
+0

điều này không thực sự trả lời câu hỏi – zwol

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