2009-04-03 15 views
21

Có thể tạm dừng quy trình, lưu nội dung bộ nhớ vào một tệp hay không và sau đó tải lại tệp để bạn có thể tiếp tục chương trình?Lưu bộ nhớ của quá trình để sử dụng sau này?

Sửa Tôi đã đọc về vấn đề này:

http://en.wikipedia.org/wiki/Setcontext

Có thể đổ nội dung của các cấu trúc, và bằng cách nào đó buộc malloc để cấp phát các vùng nhớ giống nhau không?

+0

cryopid được phép làm điều đó mà không cần sửa đổi hạt nhân trên Linux. – user2284570

Trả lời

16

Về mặt kỹ thuật, có thể, nhưng nó cũng sẽ yêu cầu lưu tất cả trạng thái tài nguyên được hệ thống phân bổ - ví dụ như trình giải mã tệp và sau đó khôi phục chúng. Vì vậy, đó là một nhiệm vụ đầy thử thách.

Cách dễ nhất để đạt được những gì bạn muốn là sử dụng máy ảo như VMWare. Khi bạn tạm dừng nó, bạn thực sự lưu toàn bộ trạng thái máy cùng với tất cả các chương trình đang chạy.

+0

Và VMWare đảm bảo rằng các tài nguyên khác như giao diện mạng được khởi động lại đúng cách. –

+0

Nó không chỉ challanging, nhưng, trong trường hợp chung, không thể. Xem http://blogs.msdn.com/oldnewthing/archive/2004/04/20/116749.aspx – GSerg

+0

@GSerg, liên kết đó giả định rằng các tài nguyên bên ngoài quy trình sẽ được phát hành khi được ngủ đông. Đó không phải là trường hợp trong một tình huống mà quá trình này chỉ được lưu trữ trên một hàng đợi không chạy và không gian địa chỉ của nó được gửi đến đĩa mà không từ bỏ các tài nguyên quá trình exo. – paxdiablo

0

Nền quy trình làm việc trong .NET 3.0 trở lên cho phép luồng công việc bị dừng và khởi động lại.

2

Vâng java có serialization và nó đến một nơi nào đó gần với nó. Mặc dù bạn không thể làm điều đó đến mức thấp nhất như CPU ​​đăng ký địa chỉ bộ nhớ vv vì điều này sẽ yêu cầu os phải ở trong trạng thái giống như khi bạn 'tạm dừng' quá trình.

Đây có thể là một dự án tốt như một module kernel linux :-)

1

Đó là lộn xộn đến mức là không thể khi giao dịch với mã nguồn gốc, như sharptooth đề cập đến.

Tuy nhiên, một số chương trình (ví dụ: iirc emacs) đã sử dụng các thủ thuật "tự giải quyết bộ nhớ của riêng tôi" để bảo toàn cấu hình, thay vì xử lý các tệp cấu hình. Tuy nhiên, điều này không hoạt động trên Windows, vì các tệp thực thi được chạy trong chế độ chia sẻ từ chối. Nhưng đó là một mẹo dễ thương (mặc dù nguy hiểm) trên linux hoặc DOS :)

6

Điều này thường được gọi là persistent continuation. Một số ngôn ngữ như SmallTalk và SBCL có hỗ trợ lớp học đầu tiên cho việc tiếp tục liên tục. Hầu hết các ngôn ngữ đều không.

+0

Continuations cấu trúc luồng điều khiển bên trong một chương trình, chúng không dừng lại hoặc bắt đầu thực hiện chương trình. – sth

+0

@sth Một số thời gian hoạt động của Smalltalk và SBCL hỗ trợ việc tiếp tục liên tục, thay vì chỉ là những thay đổi tạm thời mà bạn đang nghĩ tới. –

4

Tùy thuộc vào yêu cầu và hệ điều hành của bạn, bạn có thể thử buộc một core dump

Tôi chưa bao giờ cố gắng thực sự tải một chương trình đổ lõi sao lưu khác so với gdb. Có vẻ như bất kỳ tệp nào bạn mở hoặc bất kỳ trạng thái nào khác không có trong bộ nhớ chương trình của bạn sẽ bị mất khi được chỉ rõ.

Một cách tiếp cận khác sẽ đơn giản là tuần tự hóa trạng thái bạn cần vào đĩa trong chương trình của bạn. Nó hút nhưng nó có lẽ là cách đáng tin cậy nhất trừ khi bạn đang có nội dung với việc đình chỉ thực hiện chương trình. Điều đó có thể được thực hiện với thư viện chuỗi hệ điều hành của bạn. Hoặc như một tấm áp phích chỉ ra với vỏ của bạn.

0

Raymond Chen explains lý do tại sao không thể. Rõ ràng, không phải tất cả các kỹ sư của Microsoft đều đọc điều này, bởi vì trình biên dịch Visual Studio thực hiện điều này khi biên dịch trước các tiêu đề. Nó kết thúc trạng thái riêng của nó sau khi biên dịch các tiêu đề lần đầu tiên, và tự phục hồi để tiếp tục.

+1

Ông Chen đúng và sai. Nó chỉ là không thể nếu các tài nguyên bên ngoài biến mất. Điều này không phải xảy ra. Bạn có thể dừng lại một quá trình hoàn toàn trong khi vẫn giữ nguyên các tài nguyên ngoài quy trình - rõ ràng là sẽ không thể khởi động lại được nhưng điều đó không nhất thiết là những gì cần thiết ở đây. – paxdiablo

+0

Khả năng dừng quá trình hoàn toàn trong một giờ trong khi bạn thực hiện một số công việc đòi hỏi nhiều CPU vẫn có giá trị. Sau đó, bạn chỉ cần khởi động lại quá trình đó. SIGSTOP/SIGCONT đã thực hiện điều này trên UNIX và cộng sự. – paxdiablo

+0

Trên thực tế, điều đó đủ để giảm mức độ ưu tiên thành không hoạt động. Không có hại trong việc sử dụng vài% cuối cùng của lõi cuối cùng, nhiều thuật toán song song không thể duy trì tính song song hoàn toàn trong toàn bộ hoạt động - đặc biệt là với cây cối. – MSalters

1

Trích từ "Persist (hibernate!) a process state to disk for quiker loading" (sic):

Q.Bạn có thể giải thích thêm về cách hoán đổi này hoạt động sao cho trạng thái xử lý sẽ được lưu vào đĩa và tái sử dụng khi được yêu cầu? "

A. Tệp này rất đơn giản trên đĩa nơi các quá trình không hoạt động là lưu trữ theo cách tối ưu hóa cao. Khi quá trình như sơ yếu lý lịch chạy, hệ thống Automagically đọc nó trở lại vào bộ nhớ và nó chỉ tiếp tục từ nơi nó được. nó là loại như thế nào chương trình chạy trên iPad :)

Tất cả các chức năng này đã được tích hợp sẵn trong Windows. Trong khi quá trình của bạn tiếp tục chạy, hệ thống đảm bảo rằng nó nằm trong bộ nhớ hoặc trong pa tệp ge (mặc dù có ít ngoại lệ, mà bạn có thể bỏ qua).

Nói cách khác, Windows đã có khả năng ngủ đông một quy trình cho tệp trang. @MSalters trích dẫn từ Raymond Chen "explaining why its impossible" chỉ đơn giản là sai.

+1

Lưu ý rằng sổ kế toán cho một quá trình phân trang vẫn tồn tại trong RAM (hạt nhân). Tay cầm cửa sổ của nó vẫn hợp lệ; bạn có thể gửi tin nhắn đó sẽ khiến nó trở lại trang, v.v. Đó là lý do tại sao điều này thường không được coi là quá trình ngủ đông. – MSalters

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