I/O yang dapat diperingatkan

I/O yang dapat diperingatkan adalah metode di mana utas aplikasi memproses permintaan I/O asinkron hanya ketika berada dalam status yang dapat diperingatkan.

Untuk memahami kapan utas dalam status yang dapat diperingatkan, pertimbangkan skenario berikut:

  1. Utas memulai permintaan baca asinkron dengan memanggil ReadFileEx dengan penunjuk ke fungsi panggilan balik.
  2. Utas memulai permintaan tulis asinkron dengan memanggil WriteFileEx dengan penunjuk ke fungsi panggilan balik.
  3. Utas memanggil fungsi yang mengambil baris data dari server database jarak jauh.

Dalam skenario ini, panggilan ke ReadFileEx dan WriteFileEx kemungkinan besar akan kembali sebelum panggilan fungsi di langkah 3. Ketika mereka melakukannya, kernel menempatkan penunjuk ke fungsi panggilan balik pada antrean Asynchronous Procedure Call (APC) utas. Kernel mempertahankan antrean ini secara khusus untuk menahan data permintaan I/O yang dikembalikan hingga dapat diproses oleh utas yang sesuai.

Ketika pengambilan baris selesai dan utas kembali dari fungsi, prioritas tertingginya adalah memproses permintaan I/O yang dikembalikan pada antrean dengan memanggil fungsi panggilan balik. Untuk melakukan ini, ini harus memasuki status yang dapat diperingatkan. Utas hanya dapat melakukan ini dengan memanggil salah satu fungsi berikut dengan bendera yang sesuai:

Saat utas memasuki status yang dapat diperingatkan, peristiwa berikut terjadi:

  1. Kernel memeriksa antrean APC utas. Jika antrean berisi penunjuk fungsi panggilan balik, kernel akan menghapus penunjuk dari antrean dan mengirimkannya ke utas.
  2. Utas menjalankan fungsi panggilan balik.
  3. Langkah 1 dan 2 diulang untuk setiap penunjuk yang tersisa dalam antrean.
  4. Saat antrean kosong, utas akan kembali dari fungsi yang menempatkannya dalam status yang dapat diperingatkan.

Dalam skenario ini, setelah utas memasuki status yang dapat diperingatkan, ia akan memanggil fungsi panggilan balik yang dikirim ke ReadFileEx dan WriteFileEx, lalu kembali dari fungsi yang menempatkannya dalam keadaan yang dapat diperingatkan.

Jika utas memasuki status yang dapat diperingatkan saat antrean APC-nya kosong, eksekusi utas akan ditangguhkan oleh kernel hingga salah satu hal berikut terjadi:

  • Objek kernel yang sedang ditunggu menjadi sinyal.
  • Penunjuk fungsi panggilan balik ditempatkan dalam antrean APC.

Utas yang menggunakan proses I/O yang dapat diperingatkan permintaan I/O asinkron lebih efisien daripada ketika mereka hanya menunggu pada bendera peristiwa dalam struktur TUMPANG TINDIH yang akan diatur, dan mekanisme I/O yang dapat diperingatkan kurang rumit daripada port penyelesaian I/O untuk digunakan. Namun, I/O yang dapat diperingatkan mengembalikan hasil permintaan I/O hanya ke utas yang memulainya. Port penyelesaian I/O tidak memiliki batasan ini.

Panggilan Prosedur Asinkron