Bagikan melalui


Multiprocessor-Safe

Sistem operasi berbasis Microsoft Windows NT dirancang untuk berjalan seragam pada platform uniprocessor dan symmetric multiprocessor (SMP), dan driver mode kernel harus dirancang untuk melakukannya juga.

Di platform multiprosesor Windows apa pun, kondisi berikut ada:

  • Semua CPU identik, dan baik semua maupun tidak satu pun dari prosesor harus memiliki koprosesor yang identik.

  • Semua CPU berbagi memori dan memiliki akses seragam ke memori.

  • Dalam platform simetris , setiap CPU dapat mengakses memori, menginterupsi, dan mengakses register kontrol I/O. (Sebaliknya, dalam mesin multiprosesor asimetris, satu CPU mengambil semua gangguan untuk satu set CPU subordinat.)

Untuk berjalan dengan aman pada platform SMP, sistem operasi harus menjamin bahwa kode yang dijalankan pada satu prosesor tidak secara bersamaan mengakses dan memodifikasi data yang diakses dan dimodifikasi oleh prosesor lain. Misalnya, jika ISR driver tingkat terendah menangani gangguan perangkat pada satu prosesor, ia harus memiliki akses eksklusif ke register perangkat atau data kritis yang ditentukan oleh driver, jika perangkatnya mengganggu secara bersamaan pada prosesor lain.

Selain itu, operasi I/O driver yang diserialisasikan dalam mesin uniprocessor dapat tumpang tindih di mesin SMP. Artinya, rutinitas driver yang memproses permintaan I/O yang masuk dapat dijalankan pada satu prosesor sementara rutinitas lain yang berkomunikasi dengan perangkat dijalankan secara bersamaan pada prosesor lain. Apakah driver mode kernel dijalankan di mesin uniprosesor atau multiprosesor simetris, mereka harus menyinkronkan akses ke data yang ditentukan oleh driver atau sumber daya yang disediakan oleh sistem yang dibagikan di antara rutinitas driver, dan menyinkronkan akses ke perangkat fisik jika ada.

Komponen kernel Windows NT menyediakan mekanisme sinkronisasi, yang disebut spin lock, yang dapat digunakan driver untuk melindungi data bersama (atau register perangkat) dari akses simultan oleh satu atau beberapa rutinitas yang berjalan bersamaan pada platform multiprosesor simetris. Kernel memberlakukan dua kebijakan mengenai penggunaan pengunci putar.

  • Hanya satu rutinitas yang dapat menahan kunci putaran tertentu pada saat tertentu. Sebelum mengakses data bersama, setiap rutinitas yang harus mereferensikan data harus terlebih dahulu mencoba memperoleh kunci putaran data. Untuk mengakses data yang sama, rutinitas lain harus memperoleh kunci putaran, tetapi kunci putar tidak dapat diperoleh sampai pemegang saat ini melepaskannya.

  • Kernel menetapkan nilai IRQL untuk setiap kunci putaran dalam sistem. Rutinitas mode kernel dapat memperoleh spinlock tertentu hanya ketika rutinitas dijalankan pada IRQL yang ditetapkan untuk spinlock tersebut.

Kebijakan ini mencegah rutinitas driver yang biasanya berjalan pada IRQL yang lebih rendah tetapi saat ini memegang kunci putar agar tidak diambil alih oleh rutinitas driver yang berprioritas lebih tinggi yang berusaha memperoleh kunci putar yang sama. Dengan demikian, kebuntuan dihindari.

IRQL yang ditetapkan ke kunci putar umumnya adalah rutinitas IRQL tertinggi yang dapat memperoleh kunci putaran.

Misalnya, ISR driver tingkat terendah sering berbagi area status dengan rutinitas DPC driver. Rutinitas DPC memanggil rutinitas bagian penting yang disediakan driver untuk mengakses area bersama. Kunci putar yang melindungi area bersama memiliki IRQL yang sama dengan DIRQL tempat perangkat diinterupsi. Selama rutinitas bagian kritis memegang spin lock dan mengakses area bersama di DIRQL, ISR tidak dapat dijalankan di mesin uniprosesor atau SMP.

  • ISR tidak dapat dijalankan di mesin uniprocessor karena gangguan perangkat ditutupi, seperti yang dijelaskan dalam Always Preemptible dan Always Interruptible.

  • Dalam mesin SMP, ISR tidak dapat memperoleh kunci putaran yang melindungi data bersama sementara rutinitas bagian kritis menyimpan kunci putaran dan mengakses data bersama di DIRQL.

Sekumpulan utas dalam mode kernel dapat menyinkronkan akses ke data atau sumber daya bersama dengan menunggu salah satu objek pengatur kernel, seperti peristiwa, mutex, semaphore, timer, atau utas lainnya. Namun, sebagian besar driver tidak menyiapkan utas mereka sendiri karena mereka memiliki performa yang lebih baik ketika mereka menghindari peralihan konteks utas. Setiap kali rutin dan driver mode kernel yang kritis terhadap waktu berjalan pada IRQL = DISPATCH_LEVEL atau DIRQL, mereka harus menggunakan spin lock kernel untuk menyinkronkan akses ke data atau sumber daya bersama.

Untuk informasi selengkapnya, lihat Kunci Putar, Mengelola Prioritas Perangkat Keras, dan Objek Dispatcher Kernel.