Apa alasan non-preemptivity dari kernel Linux yang lebih lama?

15

Mengapa pengembang Linux pertama memilih untuk mengimplementasikan kernel non-preemptive? Apakah ini untuk menyimpan sinkronisasi?

Sejauh yang saya tahu, Linux dikembangkan pada awal 90-an, ketika PC memiliki prosesor tunggal. Keuntungan apa yang diberikan kernel non-preemptive pada PC tersebut? Namun, mengapa keuntungannya dikurangi oleh prosesor multi-inti?

Narden
sumber

Jawaban:

25

Dalam konteks kernel Linux, ketika orang berbicara tentang pre-emption mereka sering merujuk pada kemampuan kernel untuk menginterupsi dirinya sendiri - pada dasarnya, berpindah tugas saat menjalankan kode kernel. Membiarkan ini terjadi cukup kompleks, yang mungkin merupakan alasan utama dibutuhkan waktu yang lama untuk membuat kernel menjadi pre-emptible.

Pada awalnya sebagian besar kode kernel tidak dapat diinterupsi, karena dilindungi oleh kunci kernel yang besar. Kunci itu semakin dihilangkan dari semakin banyak kode kernel, yang memungkinkan beberapa panggilan simultan ke kernel secara paralel (yang menjadi lebih penting karena sistem SMP menjadi lebih umum). Tetapi itu masih tidak membuat kernel itu sendiri pre-emptible; yang membutuhkan lebih banyak pengembangan, berpuncak pada PREEMPT_RTset patch yang akhirnya digabungkan dalam kernel mainline (dan tetap mampu mencegah BKL). Saat ini kernel dapat dikonfigurasi untuk lebih atau kurang dapat dipra-emptible, tergantung pada throughput dan karakteristik latensi yang Anda cari; lihat konfigurasi kernel terkait untuk detailnya.

Seperti yang Anda lihat dari penjelasan dalam konfigurasi kernel, pre-emption memengaruhi throughput dan latency, bukan concurrency. Pada sistem CPU tunggal, pre-emption masih berguna karena memungkinkan acara diproses dengan waktu reaksi yang lebih singkat; namun, ini juga menghasilkan throughput yang lebih rendah (karena kernel menghabiskan waktu untuk berpindah tugas). Pre-emption memungkinkan CPU apa pun yang diberikan, dalam sistem CPU tunggal atau ganda, untuk beralih ke tugas lain dengan lebih cepat. Faktor pembatas pada sistem multi-CPU bukanlah pre-emption, itu terkunci, besar atau sebaliknya: kode waktu mengambil kunci, itu berarti bahwa CPU lain tidak dapat mulai melakukan tindakan yang sama.

Stephen Kitt
sumber
11

Kernel preemptive hanya berarti bahwa tidak ada Kunci Kernel Besar .

Linux memiliki multi-tasking preemptive (yaitu kode pengguna preemptible) sejak saat pertama (sejauh yang saya tahu, Linux 0.0.1 yang sangat pertama diunggah oleh Linus ke server ftp funet sudah preemptive multitask). Jika Anda menjalankan, misalnya, beberapa proses kompresi atau kompilasi, mereka dieksekusi secara paralel sejak saat pertama.

Sebaliknya - pada saat itu - banyak digunakan Win31. Pada Win31, jika suatu tugas mendapatkan CPU dari "kernel", secara default itu adalah tanggung jawabnya untuk menentukan kapan memberikan kontrol kembali ke OS (atau ke tugas-tugas lain). Jika suatu proses tidak memiliki dukungan khusus untuk fitur ini (yang membutuhkan pekerjaan pemrograman tambahan), maka ketika menjalankannya, semua tugas lain ditangguhkan. Bahkan sebagian besar aplikasi dasar yang diintegrasikan ke dalam Win31 berhasil.

Preemptive multitasking berarti, bahwa tugas tidak memiliki cara untuk mengalokasikan CPU seperti yang mereka inginkan. Sebaliknya, jika slot waktu mereka kedaluwarsa, kernel menjauhkan CPU dari mereka. Dengan demikian, dalam sistem operasi preemptive, proses penulisan yang buruk atau berfungsi buruk tidak dapat membekukan OS, atau menghindari proses lain dari berjalan. Linux selalu preemptive untuk proses ruang pengguna.

Kunci Kernel Besar berarti bahwa dalam beberapa kasus, di dalam ruang kernel , masih ada beberapa kunci, yang mencegah proses lain dari menjalankan kode yang dilindungi. Sebagai contoh, Anda tidak dapat me - mount beberapa filesystem secara bersamaan - jika Anda memberikan banyak perintah mount, mereka masih dieksekusi secara berurutan, karena me-mount hal-hal yang diperlukan untuk mengalokasikan Big Kernel Lock.

Membuat preemptive kernel diperlukan untuk menghilangkan kunci kernel besar ini, yaitu membuat mount dan tugas-tugas lain untuk dapat berjalan secara bersamaan. Itu pekerjaan besar.

Secara historis, ini dibuat sangat mendesak dengan meningkatnya dukungan SMP (dukungan multi-CPU). Pertama kali, benar-benar ada beberapa motherboard CPU. Kemudian banyak CPU ("core") diintegrasikan ke dalam satu chip, saat ini mainboard yang benar-benar multi-CPU sudah jarang (mereka biasanya dalam sistem server yang mahal). Juga sistem inti tunggal (di mana hanya ada satu CPU, dengan satu inti) jarang terjadi.

Dengan demikian, jawaban atas pertanyaan Anda bukanlah bahwa "apa alasan tidak preemptivity", karena selalu preemptive. Pertanyaan sebenarnya adalah, apa yang membuat eksekusi kernel preemptive benar-benar diperlukan . Jawabannya adalah: semakin banyak rasio dari banyak CPU, banyak sistem inti.

peterh - Pasang kembali Monica
sumber
Saya tidak benar-benar mengerti :( Sampai kernel versi 2.4, hanya proses pengguna yang preemptive dan kernel adalah non-preemptive. Ketika saya menjawab seseorang sebelumnya, saya berpikir bahwa alasannya adalah untuk menyimpan pekerjaan pada deadlock sinkronisasi yang dapat terjadi dengan preemptive implementasi pada proses single-core Bagaimana menurut Anda?
Narden
@ Taman Saya tidak tahu apakah Anda membacanya. Kira-kira sampai 1,3 atau 2.0, hanya satu proses tunggal yang bisa berada dalam ruang kernel, bahkan jika beberapa proses sedang berjalan. Batasan ini dihilangkan secara kasar dengan 2.0. Sampai sekitar 2.4, ada Big Kernel Lock (yaitu secara simultan me-mount beberapa sistem file tidak berfungsi).
peterh
@Narden Tapi ini bukan multitasking yang kooperatif, tidak ada proses yang diperlukan untuk mengembalikan CPU ke penjadwal tugas. Ya, alasan untuk BKL kemungkinan melakukan hal ini dengan benar adalah banyak pekerjaan: 1) kunci harus dipisah 2) struktur data bebas kunci harus digunakan jika mungkin 3) kunci yang terpisah menyebabkan kebuntuan / livelocks, ini biasanya sangat kotor, bug yang sulit diperbaiki, semuanya harus ditemukan dan diperbaiki 4) semua driver harus diangkut ke perubahan API inti kernel.
peterh
Saya membacanya ketika saya sedang mencari jawaban, dan itu juga diberikan sebagai informasi dalam kursus yang saya ambil, bernama Sistem Operasi.
Narden
1
Big Kernel Lock mencegah utas lainnya memasuki kernel ketika ada yang mengeksekusi di kernel. Hanya satu utas yang diizinkan, karena kernel tidak dirancang sejak awal dengan mempertimbangkan multiprosesor simetris. Kernel pre-emptive berarti sesuatu yang berbeda. Secara tradisional konteks eksekusi diubah hanya ketika kernel kembali ke ruang pengguna. Di kernel pre-emptive sebuah thread dapat pre-empted di tengah menjalankan kode kernel.
Johan Myréen
3

Ini bukan jawaban teknis tetapi jawaban historis untuk pertanyaan spesifik yang diajukan oleh OP: "Apa alasan non-preemptivity dari kernel Linux yang lebih lama?"

(Saya berasumsi, seperti yang dijelaskan oleh @peterh dalam jawaban dan komentarnya, bahwa dengan "non-preemptivity" OP mengacu pada salah satu atau kedua fakta bahwa hanya satu proses pengguna yang bisa berada di dalam kernel (dalam API) di sebuah waktu dan / atau Kunci Kernel Besar.)

Linus Torvalds tertarik mempelajari cara kerja sistem operasi, dan cara dia belajar adalah menulis satu. Modelnya, dan basisnya, dan lingkungan pengembangan awalnya adalah Minix, OS yang ada untuk tujuan pendidikan (yaitu, bukan OS produksi) yang tidak gratis (seperti dalam open source, pada waktu itu - tidak gratis seperti dalam bir, antara).

Jadi dia menulis sebuah kernel tanpa preemption (Big Kernel Lock disebutkan dalam jawaban lain) karena itulah cara Anda melakukannya jika Anda ingin mengaktifkan OS baru Anda dan menjalankannya dengan cepat untuk tujuan pendidikan: jauh lebih sederhana dari itu. Kernel untuk mendukung multiprogramming bersamaan dari program dan perangkat pengguna cukup sulit - sangat sulit untuk membuat kernel itu sendiri bersamaan.

Jika dia tahu kemudian seberapa populer / berguna / penting Linux akan menjadi ... dia mungkin akan melakukannya dengan cara yang sama. (Hanya IMO, aku tidak tahu apa yang sebenarnya dia pikirkan.) Karena kamu harus berjalan sebelum bisa berlari.

Dan itu tetap seperti itu untuk waktu yang lama karena a) ada banyak pekerjaan lain yang harus dilakukan untuk membuat Linux seperti sekarang ini (atau bahkan seperti itu pada waktu itu) dan b) untuk mengubahnya akan menjadi usaha yang sangat sulit (seperti yang dijelaskan dalam jawaban lain).

davidbak
sumber