Apakah mungkin untuk 'menghibernasi' proses di linux? Sama seperti 'hibernate' di laptop, saya akan menulis semua memori yang digunakan oleh suatu proses ke disk, membebaskan RAM. Dan kemudian, saya dapat 'melanjutkan proses', yaitu membaca semua data dari memori dan mengembalikannya ke RAM dan saya dapat melanjutkan proses saya?
linux
linux-kernel
hap497
sumber
sumber
Jawaban:
Saya dulu memelihara CryoPID , yang merupakan program yang melakukan persis apa yang Anda bicarakan. Ini menulis konten ruang alamat program, VDSO, referensi deskriptor file, dan status ke file yang nantinya dapat direkonstruksi. CryoPID dimulai ketika tidak ada kait yang dapat digunakan di Linux itu sendiri dan bekerja sepenuhnya dari ruang pengguna (sebenarnya, ini masih berfungsi, tergantung pada pengaturan distro / kernel / keamanan Anda).
Masalahnya adalah (memang) soket, sinyal RT yang tertunda, banyak masalah X11, implementasi getpid () caching glibc di antara banyak lainnya. Pengacakan (terutama VDSO) ternyata tidak dapat diatasi bagi sedikit dari kita yang mengerjakannya setelah Bernard meninggalkannya. Namun, ternyata menyenangkan dan menjadi topik tesis beberapa master.
Jika Anda hanya memikirkan sebuah program yang dapat menyimpan status berjalannya dan memulai kembali secara langsung ke status itu, jauh .. jauh .. lebih mudah untuk hanya menyimpan informasi itu dari dalam program itu sendiri, mungkin saat melayani sinyal.
sumber
Saya ingin memasang pembaruan status di sini, mulai 2014.
Jawaban yang diterima menyarankan CryoPID sebagai alat untuk melakukan Checkpoint / Restore, tetapi saya menemukan proyek tersebut tidak terawat dan tidak mungkin untuk dikompilasi dengan kernel terbaru. Sekarang, saya menemukan dua proyek yang dikelola secara aktif yang menyediakan fitur pos pemeriksaan aplikasi.
Yang pertama, yang saya sarankan karena saya lebih beruntung menjalankannya, adalah CRIU yang melakukan checkpoint / restore terutama di userspace, dan membutuhkan opsi kernel CONFIG_CHECKPOINT_RESTORE diaktifkan untuk berfungsi.
Yang terakhir adalah DMTCP ; mengutip dari halaman utama mereka:
Ada juga halaman Wikipedia yang bagus dengan argumen: Application_checkpointing
sumber
Jawaban yang disebutkan
ctrl-z
sebenarnya berbicara tentang menghentikan proses dengan sinyal, dalam hal iniSIGTSTP
. Anda dapat mengeluarkan sinyal berhenti dengankill
:Itu akan menunda pelaksanaan proses. Ini tidak akan segera membebaskan memori yang digunakan olehnya, tetapi karena memori diperlukan untuk proses lain, memori yang digunakan oleh proses yang dihentikan akan ditukar secara bertahap.
Saat Anda ingin membangunkannya lagi, gunakan
Solusi yang lebih rumit, seperti CryoPID, benar-benar hanya diperlukan jika Anda ingin proses yang dihentikan dapat bertahan saat sistem dimatikan / dimulai ulang - sepertinya Anda tidak membutuhkannya.
sumber
Masalahnya adalah memulihkan aliran - file dan soket - yang dibuka oleh program.
Ketika seluruh OS Anda hibernate, file lokal dan semacamnya jelas dapat dipulihkan. Koneksi jaringan tidak, tetapi kemudian kode yang mengakses internet biasanya lebih memeriksa kesalahan dan semacamnya dan bertahan dari kondisi kesalahan (atau seharusnya).
Jika Anda melakukan hibernasi per program (tanpa dukungan aplikasi), bagaimana Anda menangani file yang terbuka? Bagaimana jika proses lain mengakses file tersebut untuk sementara? dll?
Mempertahankan status saat program tidak dimuat akan menjadi sulit.
Hanya menangguhkan utas dan membiarkannya ditukar ke disk akan memiliki efek yang sama?
Atau jalankan program di mesin virtual dan biarkan VM menangani penangguhan.
sumber
Kernel Linux sekarang telah menerapkan sebagian dari checkpoint / restart futures: https://ckpt.wiki.kernel.org/ , statusnya ada di sini .
Beberapa informasi berguna ada di lwn (linux mingguan net): http://lwn.net/Articles/375855/ http://lwn.net/Articles/412749/ ......
Jadi jawabannya adalah ya"
sumber
Jawaban singkatnya adalah "ya, tetapi tidak selalu dapat diandalkan". Lihat CryoPID:
http://cryopid.berlios.de/
File terbuka memang akan menjadi masalah paling umum. CryoPID menyatakan secara eksplisit:
Masalah yang sama juga akan mempengaruhi koneksi TCP, meskipun CryoPID mendukung tcpcp untuk melanjutkan koneksi.
sumber
Jawaban singkatnya adalah "ya." Anda dapat mulai dengan melihat ini untuk beberapa ide: Rekonstruksi ELF yang dapat dieksekusi dari gambar inti ( http://vx.netlux.org/lib/vsc03.html )
sumber
Saya memperluas Cryopid menghasilkan paket yang disebut Cryopid2 tersedia dari SourceForge. Ini dapat memigrasikan proses serta melakukan hibernasi (bersama dengan file dan soket yang terbuka - data di soket / pipa disedot ke dalam proses saat hibernasi dan diludahi kembali saat proses dimulai ulang).
Alasan saya belum aktif dengan proyek ini adalah saya bukan pengembang kernel - baik ini (dan / atau cryopid asli) perlu mendapatkan seseorang yang dapat menjalankannya dengan kernel terbaru (misalnya Linux 3.x) .
Metode Cryopid berfungsi - dan mungkin merupakan solusi terbaik untuk proses hibernasi / migrasi tujuan umum di Linux yang pernah saya temui.
sumber
Seperti yang telah dicatat orang lain, sulit bagi OS untuk menyediakan fungsionalitas ini, karena aplikasi perlu memiliki beberapa pengecekan kesalahan bawaan untuk menangani aliran yang rusak.
Namun, di samping catatan, beberapa bahasa pemrograman dan alat yang menggunakan mesin virtual secara eksplisit mendukung fungsi ini, seperti bahasa pemrograman diri .
sumber
Ctrl-Z meningkatkan kemungkinan halaman proses akan ditukar, tetapi tidak membebaskan sumber daya proses sepenuhnya. Masalah dengan membebaskan sumber daya proses sepenuhnya adalah hal-hal seperti pegangan file, soket adalah sumber daya kernel yang dapat digunakan proses, tetapi tidak tahu cara bertahan sendiri. Jadi Ctrl-Z sebagus yang didapatnya.
sumber
Ada beberapa penelitian tentang checkpoint / restore untuk Linux dalam 2.2 dan 2.4 hari, tetapi tidak pernah berhasil melewati prototipe. Dimungkinkan (dengan peringatan yang dijelaskan dalam jawaban lain) untuk nilai-nilai tertentu yang mungkin - Jika Anda dapat menulis modul kernel untuk melakukannya, itu mungkin. Tetapi untuk kemungkinan nilai umum (dapatkah saya melakukannya dari shell pada distribusi Linux komersial), itu belum memungkinkan.
sumber
Ini semacam tujuan akhir dari sistem operasi berkerumun. Mathew Dillon berusaha keras untuk mengimplementasikan hal seperti ini dalam proyek Dragonfly BSD- nya.
sumber
menambahkan solusi lain: Anda dapat menggunakan virtualbox. menjalankan aplikasi Anda di mesin virtual biasa dan cukup "simpan status mesin" kapan pun Anda mau. Saya tahu ini bukan jawaban, tetapi saya pikir ini bisa berguna ketika tidak ada pilihan nyata.
jika karena alasan apa pun Anda tidak menyukai virtualbox, vmware dan Qemu sama baiknya.
sumber
Ada
ctrl+z
di linux, tapi saya tidak yakin itu menawarkan fitur yang Anda tentukan. Saya curiga Anda menanyakan pertanyaan ini karena ternyata tidaksumber