GNU/Linux >> Belajar Linux >  >> Linux

Kernel UNIX:Kernel Masuk Kembali, Sinkronisasi, dan Bagian Kritis

Artikel ini adalah bagian dari seri ikhtisar kernel UNIX kami yang sedang berjalan.

Dalam artikel sebelumnya dari seri ini, kita membahas tentang gambaran umum proses UNIX.

Artikel ini menjelaskan tingkat tinggi tentang kernel Reentrant, sinkronisasi, dan bagian penting arsitektur kernel UNIX.

Kernel Masuk Kembali

Seperti namanya, kernel reentrant adalah kernel yang memungkinkan beberapa proses untuk dieksekusi dalam mode kernel pada titik waktu tertentu dan juga tanpa menyebabkan masalah konsistensi di antara struktur data kernel.

Kita tahu bahwa dalam sistem prosesor tunggal hanya satu proses yang dapat dieksekusi pada saat tertentu, tetapi mungkin ada proses lain yang diblokir dalam mode kernel yang menunggu untuk dieksekusi.

Misalnya, dalam kernel reentrant, proses yang menunggu panggilan 'read()' dapat memutuskan untuk melepaskan CPU ke proses yang menunggu eksekusi dalam mode kernel.

Sekarang, orang mungkin bertanya-tanya mengapa kernel dibuat masuk kembali? Baiklah, mari kita mulai dengan contoh di mana sebuah kernel tidak masuk kembali dan melihat bagaimana jika memungkinkan beberapa proses untuk dieksekusi dalam mode kernel.

Mari kita asumsikan bahwa suatu proses sedang dieksekusi dalam mode kernel dan mengakses struktur data kernel dan beberapa nilai global yang terkait dengannya.

  • Misalkan nama prosesnya adalah 'A'.
  • Sekarang 'A' mengakses variabel global untuk melihat apakah nilainya bukan nol (sehingga dapat melakukan beberapa perhitungan dll) dan tepat sebelum mencoba menggunakan nilai ini dalam beberapa logikanya, konteks beralih ke proses ' B' terjadi.
  • Sekarang proses 'B' ini mencoba mengakses nilai variabel global yang sama dan menguranginya.
  • Perubahan konteks lain terjadi dan proses 'A' kembali dieksekusi.
  • Karena 'A' tidak mengetahui bahwa 'B' telah mengurangi nilainya, ia mencoba menggunakan nilai ini lagi.
  • Jadi ini tangkapannya, proses 'A' melihat dua nilai variabel global yang berbeda karena nilainya diubah oleh proses lain 'B'.

Jadi, sekarang kita tahu mengapa kernel perlu masuk kembali. Pertanyaan lain yang mungkin muncul adalah bagaimana cara membuat kernel reentrant?

Pada catatan dasar, poin-poin berikut dapat dipertimbangkan untuk membuat reentrant kernel :

  • Tulis fungsi kernel yang hanya mengubah variabel lokal (tumpukan) dan tidak mengubah variabel global atau struktur data. Jenis fungsi seperti itu juga dikenal sebagai fungsi reentrant.
  • Berpegang teguh pada penggunaan hanya fungsi reentrant dalam kernel bukanlah solusi yang layak. Jadi teknik lain yang digunakan adalah 'mekanisme penguncian' yang memastikan bahwa hanya satu proses yang dapat menggunakan fungsi non reentrant pada waktu tertentu.

Dari poin di atas jelas bahwa penggunaan fungsi reentrant dan mekanisme penguncian untuk fungsi non-reentrant adalah inti dari pembuatan kernel reentrant. Karena implementasi fungsi reentrant lebih terkait dengan pemrograman yang baik, mekanisme penguncian terkait dengan konsep sinkronisasi.

Sinkronisasi dan Bagian Kritis

Seperti dibahas di atas dalam contoh, kernel reentrant memerlukan akses tersinkronisasi ke variabel global kernel dan struktur data.

Potongan kode yang beroperasi pada variabel global dan struktur data ini dikenal sebagai bagian kritis.

Jika jalur kontrol kernel ditangguhkan (saat menggunakan nilai global atau struktur data) karena sakelar konteks, maka tidak ada jalur kontrol lain yang dapat mengakses nilai global atau struktur data yang sama. Kalau tidak, itu bisa memiliki efek bencana.

Jika kita melihat ke belakang dan melihat mengapa kita membutuhkan sinkronisasi? Jawabannya adalah dengan aman menggunakan variabel global kernel dan struktur data. Nah, ini juga bisa dicapai melalui operasi atom. Operasi atomik adalah operasi yang akan selalu dijalankan tanpa ada proses lain yang dapat membaca atau mengubah status yang dibaca atau diubah selama operasi. Sayangnya, operasi atom tidak dapat diterapkan di mana-mana. Misalnya, menghapus elemen dari daftar tertaut di dalam kernel tidak dapat dijadikan operasi atom.

Sekarang mari kita fokus kembali pada cara menyinkronkan jalur kontrol kernel.

Penonaktifan Preemption Kernel

Preemption kernel adalah konsep di mana-di dalam kernel memungkinkan penangguhan/interupsi paksa dari satu tugas dan membawa eksekusi tugas prioritas tinggi lainnya yang telah menunggu di sumber daya kernel.

Dalam istilah yang lebih sederhana, ini adalah pengalihan konteks proses dalam mode kernel di mana proses yang sedang berjalan dihentikan secara paksa oleh kernel dan proses lainnya dijalankan.

Jika kita mengikuti definisinya maka kita menyadari bahwa kemampuan kernel inilah (untuk mendahului ketika proses berada dalam mode kernel) yang menyebabkan masalah sinkronisasi. Solusi untuk masalah ini adalah dengan menonaktifkan preemption kernel. Ini memastikan bahwa peralihan konteks dalam mode kernel hanya terjadi ketika sebuah proses yang sedang dijalankan dalam mode kernel secara sukarela melepaskan CPU dan memastikan bahwa semua struktur data kernel dan variabel global berada dalam keadaan yang konsisten.

Jelas menonaktifkan preemption kernel bukanlah solusi yang sangat elegan dan solusi ini gagal ketika kita menggunakan sistem multiprosesor karena dua CPU dapat mengakses bagian kritis yang sama secara bersamaan.

Menonaktifkan Interupsi

Mekanisme lain yang dapat diterapkan untuk mencapai sinkronisasi di dalam kernel adalah proses menonaktifkan semua interupsi perangkat keras sebelum memasuki wilayah kritis dan mengaktifkannya setelah meninggalkan wilayah yang sangat kritis itu. Solusi ini lagi-lagi bukan solusi yang elegan karena dalam kasus di mana wilayah kritisnya besar maka interupsi dapat dinonaktifkan untuk waktu yang sangat lama sehingga mengganggu tujuan interupsi dan dapat menyebabkan aktivitas perangkat keras terhenti.

Semaphore

Ini adalah metode paling populer untuk menyediakan sinkronisasi di dalam kernel.

Ini efektif pada sistem uniprosesor dan multiprosesor. Menurut konsep ini, semaphore dapat dianggap sebagai penghitung yang dikaitkan dengan setiap struktur data dan diperiksa oleh semua utas kernel ketika mereka mencoba mengakses struktur data tertentu.

Semaphore berisi informasi tentang nilai counter, daftar proses yang menunggu untuk memperoleh semaphore (untuk mengakses struktur data) dan dua metode untuk menambah atau mengurangi nilai counter yang terkait dengan semaphore ini.

Logika kerjanya adalah sebagai berikut:

  • Misalkan suatu proses ingin mengakses struktur data tertentu, proses tersebut akan memeriksa counter yang terkait dengan semaphore dari struktur data terlebih dahulu.
  • Jika penghitung adalah sesuatu yang positif maka proses akan memperoleh Semaphore, menurunkan nilai penghitung, mengeksekusi wilayah kritis dan menambah penghitung Semaphore.
  • Tetapi jika suatu proses menemukan nilai penghitung sebagai nol maka proses tersebut ditambahkan ke daftar (berhubungan dengan semaphore) dari proses yang menunggu untuk memperoleh semaphore.
  • Sekarang, setiap kali penghitung menjadi positif, semua proses yang menunggu semaphore mencoba untuk mendapatkannya.
  • Yang memperoleh kembali menurunkan penghitung, mengeksekusi wilayah kritis dan kemudian meningkatkan penghitung kembali sementara proses lainnya kembali ke mode tunggu.

Menghindari Deadlock

Bekerja dengan skema sinkronisasi seperti Semaphores hadir dengan efek samping 'Deadlocks'.

Mari kita ambil contoh:

  • Misalkan suatu proses A memperoleh Semaphore untuk struktur data tertentu sementara proses B memperoleh Semaphore untuk struktur data lain.
  • Sekarang, pada langkah selanjutnya, kedua proses ingin memperoleh Semaphore untuk struktur data yang diakuisisi satu sama lain yaitu Proses A ingin mengakuisisi Semaphore yang sudah diakuisisi oleh Proses B dan sebaliknya.
  • Situasi seperti ini di mana suatu proses menunggu proses lain untuk melepaskan sumber daya sementara yang lain menunggu yang pertama untuk melepaskan sumber daya dikenal sebagai kebuntuan.
  • Deadlock dapat menyebabkan pembekuan total jalur kontrol kernel.

Jenis kebuntuan ini lebih sering terjadi pada desain di mana sejumlah besar kunci kernel digunakan. Dalam desain ini menjadi sangat sulit untuk menentukan bahwa kondisi kebuntuan tidak akan pernah terjadi. Di OS seperti Linux, kebuntuan dihindari dengan memperolehnya secara berurutan.


Linux
  1. Dapatkan Waktu Pengguna Dan Kernel Dari Proses yang Berjalan?

  2. unix - kepala DAN ekor file

  3. Apakah kernel Linux/Unix yang berbeda dapat dipertukarkan?

  1. Kernel kustom di Ubuntu/Debian – bagaimana, kapan dan mengapa

  2. Linux – Memahami Izin Unix Dan Jenis File?

  3. Linux – Perbedaan Antara Ruang Pengguna dan Ruang Kernel?

  1. Linux – Apakah Kernel Linux/unix yang Berbeda Dapat Dipertukarkan?

  2. Ukuu Kernel Manager – Instal dan Tingkatkan Kernel Linux di Ubuntu

  3. Perbedaan Utama Linux Vs UNIX Kernel