Apakah membunuh proses masih dianggap buruk untuk manajemen memori?

18

Jadi saya melakukan sedikit diskusi dengan bos saya tentang manajemen memori.

Saya telah diberitahu bahwa mematikan suatu proses tidak memungkinkannya untuk membatalkan alokasi memori. Apakah masih demikian, atau bertahun-tahun yang lalu?

Kita berbicara tentang Windows dan OS X di sini.

Jeff
sumber
4
Pertanyaan yang valid; pilih untuk membuka kembali. OP meminta informasi spesifik tentang perilaku OS (2 OS dalam kasus ini), bukan spekulasi atau perdebatan.
JRobert
Wow, tidak pernah terpikir pertanyaan ini akan mendapatkan perhatian sebanyak ini secepat itu .. :) Tapi ya, itu pada dasarnya pertanyaan "ya / tidak, karena ..".
Jeff

Jawaban:

7

Sudah lama sejak saya mempelajari hal ini, tapi begini saja.

Ketika suatu sistem operasi meluncurkan suatu proses, itu menugaskannya halaman dari tabel kehabisan memori virtual. Sistem operasi bertanggung jawab untuk memelihara peta dari tabel memori virtual ke memori nyata atau ke ruang swap pada disk. Ketika suatu proses terbunuh, OS tidak hanya berhenti memberikannya siklus CPU. Itu melakukan beberapa item pembersihan, salah satunya adalah untuk menandai semua halaman memorinya sebagai gratis. Ini memungkinkan mereka untuk digunakan kembali oleh aplikasi lain. OS mungkin juga akan membersihkan semua sumber daya yang dimiliki proses tersebut, secara otomatis menutup file, koneksi jaringan, pipa proses-ke-proses, dan sebagainya. Proses ini sepenuhnya di bawah kendali OS, dan langkah-langkah ini akan diambil tidak peduli bagaimana prosesnya mati.

Ingatlah semua ini berlaku untuk proses sistem operasi. Jika Anda memiliki beberapa jenis mesin virtual, dan menjalankan beberapa proses virtual sekaligus, maka VM bertanggung jawab untuk memutuskan bagaimana mengalokasikan dan membatalkan alokasi untuk mereka. Dari OS, bagaimanapun, masih terlihat seperti satu proses. Jadi dalam kasus ini, jika Anda memiliki VM yang menjalankan banyak proses, dan Anda membunuh salah satunya di dalam VM, maka Anda mungkin tidak akan segera mendapatkan memori kembali di OS host. Tetapi Anda akan mendapatkannya kembali di VM. Namun, jika Anda membunuh VM di dalam sistem operasi, OS akan membunuh VM (yang secara tidak langsung membunuh proses VM) dan mendapatkan kembali semua memori (yang tidak perlu melalui pengumpul sampah, gratis () , hapus, atau yang lainnya).

Sangat spekulatif:

Jika .NET berjalan sebagai mesin virtual dengan lebih dari satu aplikasi .NET pada VM yang sama, maka .NET dapat berpegang pada memori yang belum GCd, sampai menjalankan GC, dan Windows akan berpikir bahwa .NET adalah menggunakan lebih dari yang sebenarnya. (Dan jika MS benar-benar apik, Windows kemudian dapat mengatakan .NET ke GC dalam situasi memori yang ketat, tetapi hampir tidak ada gunanya karena itulah gunanya ruang swap disk.)

Jika .NET memang bekerja seperti itu, maka OS akan tetap menganggapnya sebagai satu proses untuk tujuan OS, yang mengambil tanggung jawab untuk memutuskan apa yang harus disimpan dan apa yang harus dibuang, dan biasanya bukan masalah Windows untuk memberi tahu proses yang diperlukan. untuk memulai deallocating memory. Pada titik ini, mungkin saja MS akan membuat API khusus hanya untuk .NET sehingga proses .NET terlihat seperti proses Windows, kecuali mereka tidak, itulah sebabnya orang mungkin berpikir bahwa memori proses tidak mendapatkan alokasi ulang. Benar-benar; hanya saja Anda melihat proses yang salah.

Saya tidak cukup tahu tentang .NET untuk mengatakan bahwa itu benar-benar berfungsi seperti itu; VM Java tentu saja tidak.

Akhir dari spekulasi.

EDIT: Sejauh membunuh proses yang buruk untuk manajemen memori yang bersangkutan, yang membutuhkan beberapa proses untuk mengalokasikan keluar dari kolam yang sama (yaitu mereka lebih seperti utas daripada proses nyata) dan untuk memori tidak dibebaskan setelah proses terbunuh. Itu hampir akan membutuhkan sistem multitasking kooperatif, karena memori virtual dan multitasking pre-emptive, setahu saya, biasanya dilaksanakan bersama-sama (VM memungkinkan untuk mengisolasi proses dari satu sama lain dan menjaga mereka dari menginjak memori masing-masing). Memiliki memori virtual membuatnya sepele untuk dibersihkan setelah proses di tingkat OS; Anda cukup memindahkan semua halaman dari kumpulan proses ke kumpulan gratis.

jprete
sumber
Jawaban luar biasa; masih memposting milik saya karena Anda hanya beberapa detik di depan. :)
Simon Richter
8

Tidak ada masalah dalam pengalaman saya, bunuh saja.

Sebagai contoh, jika Anda memiliki 4 GB RAM, 3 GB di antaranya digunakan oleh sebuah game dan Anda mematikan proses game, Anda dapat memulai ulang game tanpa masalah dan itu akan memiliki 3 GB RAM pada proses lagi.

Sirex
sumber
setuju, kedengarannya benar bahwa itu tidak akan bisa "membersihkan", tapi saya belum melihat itu menjadi masalah seperti yang dinyatakan Sirex. Di NT proses-proses ini seharusnya dipisahkan, tetapi bahkan kembali pada win98 tampaknya tidak menjadi masalah. Jika Anda bisa membunuhnya, sebagian besar akan hilang. Secara logis seseorang akan mencoba dan membuat sistem untuk menutupnya, atau menutupnya dengan keras terlebih dahulu, kemudian memaksanya untuk benar-benar dibunuh sebagai kesempatan terakhir yang diberikan padanya.
Psycogeek
8

Sistem operasi yang tercantum dalam tanda tanya (Windows dan OS X) menerapkan memori virtual , di mana setiap proses diberi ruang alamatnya sendiri, yang kemudian dipetakan ke memori fisik oleh OS. Tabel pemetaan ini digunakan untuk membersihkan alokasi memori saat proses dihentikan, sehingga memori benar-benar dibebaskan. Halaman fisik dapat dibagikan di antara banyak proses, dalam hal ini mereka dibebaskan ketika tidak ada lagi pengguna.

Biasanya, sumber daya lain seperti pegangan file diberikan ke proses dalam bentuk kemampuan , di mana proses menerima pegangan pada sumber daya dan memanipulasi melalui fungsi akses yang jelas. OS menyimpan pemetaan tabel dari nilai pegangan ke objek di-kernel yang menyediakan fungsi; sekali lagi, tabel ini dapat digunakan untuk pembersihan ketika suatu proses dihentikan.

Ada sumber daya khusus yang bertahan dari proses yang membuatnya, misalnya, dimungkinkan untuk membuat alokasi memori bersama yang persisten yang dapat digunakan dalam komunikasi antarproses. Ini jarang digunakan, justru karena OS tidak dapat menentukan apakah masih diperlukan.

Dalam sistem operasi lain, terkadang tidak ada pemisahan proses yang jelas; ini menempatkan beban pembersihan pada aplikasi individual.

Penutupan proses secara paksa akan menghentikan proses tanpa memberikannya kesempatan untuk membersihkan; jika OS memiliki daftar lengkap semua sumber daya, ini tidak memiliki efek buruk.

Simon Richter
sumber
5

Itu kembali pada hari sebelum manajemen memori diimplementasikan secara luas. Saat ini satu-satunya memori yang mungkin Anda lewatkan adalah memori yang digunakan oleh driver dan modul kernel yang tetap tidak terlatih atau dibantai, tetapi itu benar-benar kacang.

zoomix
sumber