2008-10-10 22 views
11

Tôi đã tự hỏi nếu nó có thể tạo ra một tập tin "cốt lõi", sao chép nếu đến một máy khác và sau đó tiếp tục thực hiện của một tập tin lõi trên máy đó?Bạn có thể đóng băng quy trình C/C++ và tiếp tục trên một máy chủ khác không?

Tôi đã thấy tiện ích gcore sẽ tạo một tệp lõi từ một quy trình đang chạy. Nhưng tôi không nghĩ gdb có thể tiếp tục thực hiện dựa trên một tệp lõi.

Có cách nào để chỉ đổ đống/ngăn xếp và khôi phục chúng sau này không?

+1

Điều này có liên quan gì với C/C++? – camh

+1

Đồng ý với camh, Bạn có thể vui lòng xóa tham chiếu C/C++ không. Bạn có thể có một quy trình, có mã là hoàn toàn asm và câu hỏi là hợp lệ. –

Trả lời

4

Trên hệ thống hiện đại, không phải từ tệp lõi, không bạn không thể. Để đóng băng và khôi phục một quy trình riêng lẻ trên Linux, CryoPIDKernel-based checkpoint and restart mới đang hoạt động, nhưng khả năng của chúng hiện tại khá hạn chế. OpenVZ và các phần mềm ảo hóa khác có thể đóng băng và khôi phục toàn bộ hệ thống.

-1

Tôi không tin điều này là có thể. Tuy nhiên, bạn có thể muốn xem xét phần mềm ảo hóa - ví dụ: Xen - giúp bạn có thể đóng băng và di chuyển toàn bộ ảnh hệ thống từ máy này sang máy khác.

2

Nói chung, điều này sẽ không đủ để cho phép quá trình tùy ý tiếp tục trên một máy khác. Ngoài trạng thái chồng và ngăn xếp, cũng có thể mở các xử lý I/O, tài nguyên phần cứng được phân bổ, v.v.

Tùy chọn của bạn là viết rõ ràng phần mềm theo cách cho phép nó kết xuất trạng thái trên tín hiệu và sau đó tiếp tục từ trạng thái bán phá giá hoặc chạy phần mềm của bạn trong máy ảo và di chuyển phần mềm đó sang máy chủ thay thế - Xen và Vmware đều hỗ trợ đóng băng/khôi phục cũng như di chuyển trực tiếp.

Điều đó nói rằng, CryoPID cố gắng thực hiện chính xác điều này và đôi khi thành công.

1

Trong một số trường hợp, điều này có thể được thực hiện. Ví dụ, một phần của quá trình xây dựng Emacs là tải lên tất cả các thư viện Lisp và sau đó đổ bộ nhớ hình ảnh trên đĩa để tải nhanh. Một số thông dịch viên ngôn ngữ khác cũng làm như vậy (tôi đang nghĩ về triển khai Lisp và Scheme, chủ yếu). Tuy nhiên, chúng được thiết kế đặc biệt cho loại sử dụng đó, vì vậy tôi không biết họ phải làm gì đặc biệt để cho phép nó hoạt động.

Tôi nghĩ điều này rất khó thực hiện cho một chương trình ngẫu nhiên, nhưng nếu bạn đã viết một khung nơi tất cả các đối tượng hỗ trợ tuần tự hóa/deserialisation, bạn có thể nối tiếp tất cả các đối tượng được chương trình của bạn sử dụng. deserialise chúng ở đầu bên kia.

Câu trả lời của người khác về ảo hóa cũng có tại chỗ.

0

Phụ thuộc vào máy. Nó rất dễ làm trong một hệ thống nhúng rất nhỏ, ví dụ. Tôi nghĩ rằng nó cũng được thực hiện phần nào trong các cụm Beowulf và các ứng dụng siêu máy tính khác.

3

Ngoài ra, hãy thanh toán dự án Condor. Condor có thể làm điều đó với các công việc song song. Condor cũng bao gồm các màn hình có thể tự động di chuyển quá trình của bạn khi một số, ví dụ, bắt đầu sử dụng máy trạm của họ một lần nữa. Nó thực sự được thiết kế để sử dụng chu trình dự phòng trong môi trường mạng.

0

Có nhiều lý do khiến bạn không thể làm những gì bạn muốn một cách dễ dàng. Ví dụ, khi bạn khôi phục tệp lõi trên máy tính khác, làm thế nào để bạn giải quyết các bộ mô tả tệp mà bạn xử lý đã mở? Điều gì về ổ cắm, ống được đặt tên, semaphores, hoặc bất kỳ tài nguyên cấp hệ điều hành khác? Về cơ bản, trừ khi hệ thống của bạn được thiết kế đặc biệt để xử lý một hoạt động như vậy, bạn không thể ngây thơ đổ một tệp lõi và chuyển nó sang một máy khác.

1

Kể từ tháng 2 năm 2017, có một công cụ khá ổn định và trưởng thành, được gọi là CRIU phụ thuộc vào bản cập nhật cho hạt nhân Linux được tạo trong phiên bản 3.11 (như được thực hiện vào tháng 9 năm 2013, hầu hết các bản phân phối hiện đại phiên bản hạt nhân của họ).

Nó có thể được cài đặt thông qua aptitude đơn giản bằng cách gọi sudo apt-get install criu.

Instructions on how to use it.

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