Proses, Utas, dan Apartemen
Proses adalah kumpulan ruang memori virtual, kode, data, dan sumber daya sistem. Utas adalah kode yang akan dijalankan secara serial dalam proses. Prosesor menjalankan utas, bukan proses, sehingga setiap aplikasi memiliki setidaknya satu proses, dan proses selalu memiliki setidaknya satu utas eksekusi, yang dikenal sebagai utas utama. Proses dapat memiliki beberapa utas selain utas utama.
Proses berkomunikasi satu dengan yang lain melalui pesan, menggunakan teknologi Panggilan Prosedur Jarak Jauh (RPC) Microsoft untuk meneruskan informasi satu dengan yang lain. Tidak ada perbedaan dengan pemanggil antara panggilan yang berasal dari proses pada komputer jarak jauh dan panggilan yang berasal dari proses lain pada komputer yang sama.
Ketika utas mulai dijalankan, utas berlanjut sampai dimatikan atau sampai terganggu oleh utas dengan prioritas yang lebih tinggi (oleh tindakan pengguna atau penjadwal utas kernel). Setiap utas dapat menjalankan bagian kode terpisah, atau beberapa utas dapat menjalankan bagian kode yang sama. Utas yang menjalankan blok kode yang sama mempertahankan tumpukan terpisah. Setiap utas dalam berbagi proses yang memproses variabel dan sumber daya global.
Penjadwal utas menentukan kapan dan seberapa sering untuk menjalankan utas, sesuai dengan kombinasi atribut kelas prioritas proses dan prioritas dasar utas. Anda mengatur atribut kelas prioritas proses dengan memanggil fungsi SetPriorityClass , dan Anda mengatur prioritas dasar utas dengan panggilan ke SetThreadPriority.
Aplikasi multithread harus menghindari dua masalah utas: kebuntuan dan balapan. Kebuntuan terjadi ketika setiap utas sedang menunggu yang lain untuk melakukan sesuatu. Kontrol panggilan COM membantu mencegah kebuntuan dalam panggilan antar objek. Kondisi balapan terjadi ketika satu utas selesai sebelum utas lain yang bergantung padanya, menyebabkan yang pertama menggunakan nilai yang tidak diinisialisasi karena yang terakhir belum memasok yang valid. COM menyediakan beberapa fungsi yang dirancang khusus untuk membantu menghindari kondisi balapan di server yang tidak diproses. (Lihat Pembantu Implementasi Server Di Luar Proses.)
Apartemen dan Arsitektur Utas COM
Meskipun COM mendukung model per proses utas tunggal yang lazim sebelum pengenalan beberapa utas eksekusi, Anda dapat menulis kode untuk memanfaatkan beberapa utas, menghasilkan aplikasi yang lebih efisien, dengan memungkinkan satu utas dieksekusi sementara utas lain menunggu beberapa operasi yang memakan waktu selesai.
Catatan
Menggunakan beberapa utas bukanlah jaminan performa yang lebih baik. Bahkan, karena faktor utas adalah masalah yang sulit, menggunakan beberapa utas sering menyebabkan masalah performa. Kuncinya adalah menggunakan beberapa utas hanya jika Anda sangat yakin dengan apa yang Anda lakukan.
Secara umum, cara paling sederhana untuk melihat arsitektur utas COM adalah dengan memikirkan semua objek COM dalam proses sebagai dibagi menjadi kelompok yang disebut apartemen. Objek COM tinggal tepat di satu apartemen, dalam arti metodenya dapat secara hukum langsung dipanggil hanya oleh utas yang termasuk dalam apartemen itu. Utas lain yang ingin memanggil objek harus melalui proksi.
Ada dua jenis apartemen: apartemen berulir tunggal, dan apartemen multithreaded.
- Apartemen berulir tunggal terdiri dari tepat satu utas, sehingga semua objek COM yang tinggal di apartemen berulir tunggal dapat menerima panggilan metode hanya dari satu utas yang termasuk dalam apartemen itu. Semua panggilan metode ke objek COM di apartemen berulir tunggal disinkronkan dengan antrean pesan windows untuk utas apartemen berulir tunggal. Proses dengan satu utas eksekusi hanyalah kasus khusus dari model ini.
- Apartemen multithread terdiri dari satu atau beberapa utas, sehingga semua objek COM yang tinggal di apartemen multithreaded dapat menerima panggilan metode langsung dari salah satu utas yang termasuk dalam apartemen multithreaded. Utas di apartemen multithread menggunakan model yang disebut free-threading. Panggilan ke objek COM di apartemen multithreaded disinkronkan oleh objek itu sendiri.
Catatan
Untuk deskripsi komunikasi antara apartemen berulir tunggal dan apartemen multithread dalam proses yang sama, lihat Komunikasi Berulir Tunggal dan Multithreaded.
Proses dapat memiliki nol atau lebih apartemen berulir tunggal dan nol atau satu apartemen multithreaded.
Dalam sebuah proses, apartemen utama adalah yang pertama diinisialisasi. Dalam proses berulir tunggal, ini adalah satu-satunya apartemen. Parameter panggilan dirusak antara apartemen, dan COM menangani sinkronisasi melalui olahpesan. Jika Anda menunjuk beberapa utas dalam proses untuk di-utas bebas, semua utas gratis berada di satu apartemen, parameter diteruskan langsung ke utas apa pun di apartemen, dan Anda harus menangani semua sinkronisasi. Dalam proses dengan utas bebas dan utas apartemen, semua utas gratis berada di satu apartemen dan semua apartemen lainnya adalah apartemen berulir tunggal. Proses yang melakukan pekerjaan COM adalah kumpulan apartemen dengan, paling banyak, satu apartemen multithreaded tetapi sejumlah apartemen berulir tunggal.
Model utas di COM menyediakan mekanisme untuk klien dan server yang menggunakan arsitektur utas yang berbeda untuk bekerja sama. Panggilan di antara objek dengan model utas yang berbeda dalam proses yang berbeda secara alami didukung. Dari perspektif objek panggilan, semua panggilan ke objek di luar proses berperilaku identik, tidak peduli bagaimana objek yang dipanggil diulir. Demikian juga, dari perspektif objek yang dipanggil, panggilan yang tiba berperilaku identik, terlepas dari model utas pemanggil.
Interaksi antara klien dan objek di luar proses sangat mudah, bahkan ketika mereka menggunakan model utas yang berbeda karena klien dan objek berada dalam proses yang berbeda. COM, yang terinterposisi antara klien dan server, dapat memberikan kode untuk model utas untuk dioperasikan, menggunakan marshaling standar dan RPC. Misalnya, jika objek berutas tunggal dipanggil secara bersamaan oleh beberapa klien utas bebas, panggilan akan disinkronkan oleh COM dengan menempatkan pesan jendela yang sesuai dalam antrean pesan server. Apartemen objek akan menerima satu panggilan setiap kali mengambil dan mengirimkan pesan. Namun, beberapa perawatan harus dilakukan untuk memastikan bahwa server dalam proses berinteraksi dengan baik dengan klien mereka. (Lihat Masalah Utas Server Dalam Proses.)
Masalah terpenting dalam pemrograman dengan model multithreaded adalah membuat utas kode Anda aman sehingga pesan yang ditujukan untuk utas tertentu hanya masuk ke utas tersebut dan akses ke utas dilindungi.
Untuk mengetahui informasi selengkapnya, lihat topik berikut:
- Memilih Model Threading
- Apartemen Single-Threaded
- Apartemen Multithreaded
- Komunikasi Berutas Tunggal dan Multithreaded
- Masalah Utas Server Dalam Proses
- Mengakses Antarmuka Di Seluruh Apartemen