Peningkatan Antrean kerja dan Utas

Topik ini menjelaskan peningkatan dalam Windows 8 untuk antrean dan utas kerja di platform Microsoft Media Foundation.

Perilaku Windows 7

Bagian ini merangkum perilaku antrean kerja Media Foundation di Windows 7.

Antrean Kerja

Platform Media Foundation membuat beberapa antrean kerja standar. Hanya dua yang didokumenkan sebagai untuk penggunaan aplikasi umum:

  • MFASYNC_CALLBACK_QUEUE_STANDARD
  • MFASYNC_CALLBACK_QUEUE_LONG_FUNCTION

Aplikasi atau komponen dapat mengalokasikan antrean kerja baru dengan memanggil MFAllocateWorkQueue atau MFAllocateWorkQueueEx. Fungsi MFAllocateWorkQueueEx menentukan dua jenis antrean kerja:

  • MF_STANDARD_WORKQUEUE membuat antrean kerja tanpa perulangan pesan.
  • MF_WINDOW_WORKQUEUE membuat antrean kerja dengan perulangan pesan.

Untuk mengantre item kerja, panggil MFPutWorkItem atau MFPutWorkItemEx. Platform menjalankan item kerja dengan memanggil implementasi IMFAsyncCallback yang disediakan pemanggil. Di Windows 7 dan yang lebih lama, platform membuat satu utas per antrean kerja.

Dukungan MMCSS

Layanan Penjadwal Kelas Multimedia (MMCSS) mengelola prioritas utas sehingga aplikasi multimedia mendapatkan irisan waktu CPU reguler, tanpa menolak sumber daya CPU ke aplikasi berprioritas lebih rendah. MMCSS mendefinisikan serangkaian tugas yang memiliki profil pemanfaatan CPU yang berbeda. Saat utas bergabung dengan tugas MMCSS, MMCSS menetapkan prioritas utas berdasarkan beberapa faktor:

  • Prioritas dasar tugas, yang diatur dalam registri.
  • Prioritas utas relatif, yang diatur pada durasi dengan memanggil AvSetMmThreadPriority.
  • Berbagai karakteristik run-time, seperti apakah aplikasi berada di latar depan, dan berapa banyak waktu CPU yang dikonsumsi oleh utas di setiap kelas MMCSS.

Aplikasi dapat mendaftarkan antrean kerja dengan MMCSS dengan memanggil MFBeginRegisterWorkQueueWithMMCSS. Fungsi ini mengambil ID antrean kerja, kelas MMCSS (nama tugas), dan pengidentifikasi tugas MMCSS. Secara internal, ini memanggil AvSetMmThreadCharacteristics dengan nama tugas dan ID tugas. Setelah antrean kerja terdaftar di MMCSS, Anda bisa mendapatkan kelas dan ID tugas dengan memanggil MFGetWorkQueueMMCSSClass dan MFGetWorkQueueMMCSSTaskId.

Sesi Media menyediakan akses tingkat yang agak lebih tinggi ke API ini, melalui antarmuka IMFWorkQueueServices. Antarmuka ini menyediakan dua metode utama:

Metode Deskripsi
BeginRegisterPlatformWorkQueueWithMMCSS Mendaftarkan antrean kerja dengan tugas MMCSS. Metode ini pada dasarnya adalah pembungkus tipis di sekitar MFBeginRegisterWorkQueueWithMMCSS, tetapi Anda dapat meneruskan nilai MFASYNC_CALLBACK_QUEUE_ALL untuk mendaftarkan semua antrean kerja platform sekaligus.
BeginRegisterTopologyWorkQueuesWithMMCSS Mendaftarkan cabang topologi dengan antrean kerja.

 

Untuk mendaftarkan cabang topologi, lakukan hal berikut.

  1. Atur atribut MF_TOPONODE_WORKQUEUE_ID pada simpul sumber untuk cabang. Gunakan nilai yang ditentukan aplikasi apa pun.
  2. Secara opsional, atur MF_TOPONODE_WORKQUEUE_MMCSS_CLASS untuk bergabung dengan antrean kerja ke tugas MMCSS.
  3. Panggil BeginRegisterTopologyWorkQueuesWithMMCSS pada topologi yang diselesaikan.

Sesi Media mengalokasikan antrean kerja baru untuk setiap nilai unik MF_TOPONODE_WORKQUEUE_ID. Untuk setiap cabang topologi, operasi alur asinkron dilakukan pada antrean kerja yang ditetapkan ke cabang.

IMFRealTimeClient

Antarmuka IMFRealTimeClient ditujukan untuk komponen alur yang membuat utas mereka sendiri atau menggunakan antrean kerja untuk operasi asinkron. Sesi Media menggunakan antarmuka ini untuk memberi tahu komponen alur tentang perilaku yang benar, sebagai berikut:

Biasanya, komponen alur menggunakan utas atau antrean kerja untuk melakukan tugas asinkron, tetapi tidak keduanya.

Penyempurnaan Windows 8

Antrean Kerja Multithreaded

Dalam Windows 8, Media Foundation mendukung jenis antrean kerja baru yang disebut antrean multithreaded. Antrean multithread menggunakan kumpulan utas sistem untuk mengirimkan item kerja. Antrean multithread diskalakan lebih baik daripada antrean utas tunggal sebelumnya. Misalnya,

  • Beberapa komponen dapat berbagi antrean multithread tanpa memblokir satu sama lain, membutuhkan pembuatan utas yang lebih sedikit.

  • Item kerja dioptimalkan untuk menghindari pengalihan konteks jika peristiwa sudah diatur. Ini lebih efisien daripada membuat utas Anda sendiri untuk menunggu peristiwa.

Saat menggunakan IMFRealTimeClientEx, aplikasi harus menghindari pemutaran utas dan sebaliknya harus menggunakan antrean kerja. Untuk mencapai hal ini, aplikasi harus menerapkan SetWorkQueueEx dan tidak menggunakan RegisterThreads dan UnregisterThreads.

Ketika platform Media Foundation diinisialisasi, platform ini membuat antrean multithreaded dengan pengidentifikasi MFASYNC_CALLBACK_QUEUE_MULTITHREADED.

Antrean multithread tidak menserialisasikan item kerja. Setiap kali utas dari kumpulan utas tersedia, item pekerjaan berikutnya pada antrean dikirim. Penelepon harus memastikan bahwa pekerjaan diserialisasikan dengan benar. Untuk mempermudah ini, Media Foundation mendefinisikan antrean kerja serial. Antrean serial membungkus antrean kerja lain tetapi menjamin eksekusi yang diserialisasikan sepenuhnya. Item berikutnya pada antrean tidak dikirim hingga item sebelumnya selesai.

Kode berikut membuat antrean serializer melalui antrean multithreaded platform.

DWORD workQueueID;
hr = MFAllocateSerialWorkQueue(MFASYNC_CALLBACK_QUEUE_MULTITHREADED, &workQueueID); 

Lebih dari satu antrean serial dapat membungkus antrean multithread yang sama. Antrean serial kemudian berbagi kumpulan utas yang sama, dan eksekusi berseri diberlakukan dalam setiap antrean.

Antrean kerja standar yang ada sebelum Windows 8 sekarang diimplementasikan sebagai antrean kerja serial yang membungkus antrean multithread platform. Perubahan ini mempertahankan kompatibilitas mundur.

Antrean Kerja Tugas Bersama

Untuk bekerja dengan benar dengan penjadwal kernel, harus ada satu antrean kerja multithreaded untuk setiap tugas MMCSS yang Anda gunakan. Platform Media Foundation mengalokasikan ini sesuai kebutuhan, hingga satu per tugas MMCSS, per proses. Untuk mendapatkan antrean kerja bersama untuk tugas MMCSS tertentu, panggil MFLockSharedWorkQueue dan tentukan nama tugas. Fungsi mencari nama tugas dalam tabel. Jika antrean kerja belum ada untuk tugas ini, fungsi mengalokasikan antrean kerja MT baru dan segera menggabungkannya ke tugas MMCSS. Jika antrean kerja sudah ada untuk tugas tersebut, fungsi mengembalikan pengidentifikasi antrean kerja yang ada.

Antrean Tunggu

Antrean tunggu adalah antrean kerja platform khusus yang menunggu peristiwa untuk disinyalkan. Jika komponen perlu menunggu peristiwa disinyalkan, komponen dapat menggunakan antrean tunggu alih-alih membuat utas pekerja untuk menunggu peristiwa.

Untuk menggunakan antrean tunggu, panggil MFPutWaitingWorkItem. Parameter termasuk handel peristiwa dan penunjuk IMFAsyncResult . Saat peristiwa disinyalkan, antrean tunggu memanggil panggilan balik Anda. Ada antrean tunggu satu platform; aplikasi tidak dapat membuat antrean tunggu mereka sendiri.

Penyempurnaan Dukungan MMCSS

Fungsi platform Media Foundation baru berikut ini berkaitan dengan MMCSS.

Fungsi Deskripsi
MFBeginRegisterWorkQueueWithMMCSSEx Mendaftarkan antrean kerja dengan MMCSS. Fungsi ini mencakup parameter untuk menentukan prioritas utas relatif. Secara internal, nilai ini diterjemahkan ke dalam panggilan ke AvSetMmThreadPriority.
MFGetWorkQueueMMCSSPriority Mengkueri prioritas antrean kerja.
MFRegisterPlatformWithMMCSS Mendaftarkan semua antrean kerja platform dengan tugas MMCSS. Fungsi ini mirip dengan metode IMFWorkQueueServices::BeginRegisterPlatformWorkQueueWithMMCSS , tetapi dapat digunakan tanpa membuat instans Sesi Media. Selain itu, fungsi ini menyertakan parameter untuk menentukan prioritas utas dasar.

 

Aplikasi yang menggunakan Sesi Media harus mengatur atribut MF_TOPONODE_WORKQUEUE_MMCSS_CLASS ke "Audio" untuk cabang penyajian audio. Atur atribut ke "Pemutaran" untuk cabang penyajian video.

IMFRealTimeClientEx

Antarmuka IMFRealTimeClientEx untuk menggantikan IMFRealTimeClient, untuk komponen alur yang melakukan operasi asinkron.

Metode Deskripsi
RegisterThreadsEx Memberi tahu komponen untuk mendaftarkan utasnya dengan MMCSS. Metode ini setara dengan IMFRealTimeClient::RegisterThreads, tetapi menambahkan parameter untuk prioritas utas dasar.
SetWorkQueueEx Memberi tahu komponen untuk menggunakan antrean kerja tertentu. Metode ini setara dengan IMFReadTimeClient::SetWorkQueue, tetapi menambahkan parameter untuk prioritas item kerja.
UnregisterThreads Memberi tahu komponen untuk membatalkan pendaftaran utasnya dari MMCSS. Metode ini identik dengan metode IMFRealTimeClient::UnregisterThreads .

 

Komponen alur harus menggunakan antrean kerja, dan tidak boleh membuat utas pekerja, karena alasan berikut:

  • Antrean kerja menskalakan lebih baik, karena menggunakan kumpulan utas OS.
  • Platform ini menangani detail pendaftaran antrean kerja dengan MMCSS.
  • Utas pekerja dapat dengan mudah menyebabkan kebuntuan yang sulit di-debug.

Selain itu, pertimbangkan untuk menggunakan antrean kerja serializer jika Anda perlu membuat serialisasi operasi asinkron Anda.

Cabang Topologi

Jika atribut MF_TOPONODE_WORKQUEUE_MMCSS_CLASS mendaftarkan cabang topologi dengan MMCSS, dalam Windows 8 Sesi Media menggunakan antrean kerja MT bersama. Di versi Windows sebelumnya, Sesi Media mengalokasikan antrean kerja baru.

Dua atribut baru didefinisikan untuk mendaftarkan cabang topologi dengan MMCSS.

Atribut Deskripsi
MF_TOPONODE_WORKQUEUE_MMCSS_PRIORITY Menentukan prioritas utas dasar.
MF_TOPONODE_WORKQUEUE_ITEM_PRIORITY Menentukan prioritas item kerja.

 

Rekomendasi

  • Aplikasi yang menggunakan Sesi Media harus mengatur MF_TOPONODE_WORKQUEUE_MMCSS_CLASS ke "Audio" untuk cabang penyajian audio dan "Pemutaran" untuk cabang penyajian video.
  • Aplikasi yang menggunakan Sesi Media harus memanggil IMFWorkQueueServices::BeginRegisterTopologyWorkQueuesWithMMCSS pada topologi.
  • Untuk komponen alur, antrean kerja direkomendasikan alih-alih utas pekerja. Jika komponen menggunakan antrean kerja atau utas pekerja, terapkan IMFRealTimeClientEx.
  • Jangan membuat antrean kerja privat, karena ini mengalahkan tujuan antrean kerja platform. Gunakan antrean multithread platform atau antrean serial yang membungkus antrean multithread platform.
  • Jika Anda perlu menserialisasikan operasi asinkron, gunakan antrean serial.

Ringkasan

API platform Media Foundation berikut yang terkait dengan utas dan antrean kerja baru untuk Windows 8.

Antrean Kerja