Concurrency dengan Python - Threads
Secara umum seperti yang kita ketahui bahwa benang adalah benang pilin yang sangat tipis biasanya dari bahan katun atau sutra dan digunakan untuk menjahit pakaian dan semacamnya. Benang istilah yang sama juga digunakan dalam dunia pemrograman komputer. Sekarang, bagaimana kita menghubungkan benang yang digunakan untuk menjahit pakaian dan benang yang digunakan untuk pemrograman komputer? Peran yang dilakukan oleh dua utas serupa di sini. Pada pakaian, benang menahan kain bersama-sama dan di sisi lain, dalam pemrograman komputer, benang menahan program komputer dan memungkinkan program untuk melakukan tindakan berurutan atau banyak tindakan sekaligus.
Threadadalah unit eksekusi terkecil dalam sistem operasi. Itu sendiri bukanlah sebuah program tetapi berjalan di dalam sebuah program. Dengan kata lain, utas tidak independen satu sama lain dan berbagi bagian kode, bagian data, dll. Dengan utas lain. Utas ini juga dikenal sebagai proses ringan.
Status Benang
Untuk memahami fungsionalitas utas secara mendalam, kita perlu mempelajari tentang siklus hidup utas atau status utas yang berbeda. Biasanya, utas dapat berada dalam lima status berbeda. Status yang berbeda ditunjukkan di bawah ini -
Thread Baru
Utas baru memulai siklus hidupnya di status baru. Namun, pada tahap ini, belum dimulai dan belum dialokasikan sumber daya apa pun. Kita dapat mengatakan bahwa itu hanyalah contoh dari suatu objek.
Dapat dijalankan
Saat utas yang baru lahir dimulai, utas menjadi dapat dijalankan yaitu menunggu untuk dijalankan. Dalam keadaan ini, ia memiliki semua sumber daya tetapi penjadwal tugas masih belum menjadwalkannya untuk berjalan.
Lari
Dalam keadaan ini, utas membuat kemajuan dan menjalankan tugas, yang telah dipilih oleh penjadwal tugas untuk dijalankan. Sekarang, utas dapat beralih ke status mati atau tidak dapat dijalankan / menunggu.
Tidak berjalan / menunggu
Dalam keadaan ini, utas dihentikan sementara karena sedang menunggu respons dari beberapa permintaan I / O atau menunggu penyelesaian eksekusi utas lainnya.
Mati
Utas yang dapat dijalankan memasuki status dihentikan ketika menyelesaikan tugasnya atau sebaliknya.
Diagram berikut menunjukkan siklus hidup lengkap utas -
Jenis Benang
Di bagian ini, kita akan melihat berbagai jenis utas. Jenisnya dijelaskan di bawah -
Utas Tingkat Pengguna
Ini adalah utas yang dikelola pengguna.
Dalam kasus ini, kernel manajemen utas tidak mengetahui keberadaan utas. Pustaka utas berisi kode untuk membuat dan menghancurkan utas, untuk meneruskan pesan dan data antar utas, untuk menjadwalkan eksekusi utas dan untuk menyimpan dan memulihkan konteks utas. Aplikasi dimulai dengan satu utas.
Contoh utas tingkat pengguna adalah -
- Utas Java
- Utas POSIX
Keuntungan dari Thread tingkat Pengguna
Berikut adalah keuntungan berbeda dari utas tingkat pengguna -
- Peralihan utas tidak memerlukan hak mode Kernel.
- Utas tingkat pengguna dapat berjalan di sistem operasi apa pun.
- Penjadwalan dapat menjadi aplikasi khusus di utas tingkat pengguna.
- Utas tingkat pengguna cepat dibuat dan dikelola.
Kekurangan Thread tingkat Pengguna
Berikut ini adalah kerugian berbeda dari utas tingkat pengguna -
- Dalam sistem operasi tipikal, sebagian besar panggilan sistem diblokir.
- Aplikasi multithread tidak dapat memanfaatkan multiprosesing.
Utas Tingkat Kernel
Utas yang dikelola Sistem Operasi bekerja pada kernel, yang merupakan inti sistem operasi.
Dalam hal ini, Kernel melakukan manajemen utas. Tidak ada kode manajemen utas di area aplikasi. Utas kernel didukung langsung oleh sistem operasi. Aplikasi apa pun dapat diprogram untuk menjadi multithread. Semua utas dalam aplikasi didukung dalam satu proses.
Kernel menyimpan informasi konteks untuk proses secara keseluruhan dan untuk setiap utas dalam proses tersebut. Penjadwalan oleh Kernel dilakukan pada basis utas. Kernel melakukan pembuatan, penjadwalan, dan manajemen utas di ruang Kernel. Utas kernel umumnya lebih lambat untuk dibuat dan dikelola daripada utas pengguna. Contoh utas tingkat kernel adalah Windows, Solaris.
Keuntungan dari Kernel Level Threads
Berikut adalah keuntungan berbeda dari utas tingkat kernel -
Kernel dapat secara bersamaan menjadwalkan beberapa utas dari proses yang sama pada beberapa proses.
Jika satu utas dalam suatu proses diblokir, Kernel dapat menjadwalkan utas lain dari proses yang sama.
Rutinitas kernel itu sendiri bisa multithread.
Kekurangan dari Thread Level Kernel
Utas kernel umumnya lebih lambat untuk dibuat dan dikelola daripada utas pengguna.
Transfer kendali dari satu utas ke utas lainnya dalam proses yang sama membutuhkan sakelar mode ke Kernel.
Blok Kontrol Benang - TCB
Thread Control Block (TCB) dapat didefinisikan sebagai struktur data di kernel sistem operasi yang terutama berisi informasi tentang utas. Informasi khusus utas yang disimpan di TCB akan menyoroti beberapa informasi penting tentang setiap proses.
Pertimbangkan poin-poin berikut terkait dengan utas yang terdapat dalam TCB -
Thread identification - Ini adalah id utas unik (tid) yang ditetapkan untuk setiap utas baru.
Thread state - Berisi informasi yang berkaitan dengan status (Berjalan, Dapat Dijalankan, Tidak Berjalan, Mati) dari utas.
Program Counter (PC) - Ini menunjuk ke instruksi program saat ini dari utas.
Register set - Ini berisi nilai register utas yang ditugaskan padanya untuk perhitungan.
Stack Pointer- Ini menunjuk ke tumpukan utas dalam proses. Ini berisi variabel lokal di bawah cakupan thread.
Pointer to PCB - Berisi penunjuk ke proses yang membuat utas itu.
Hubungan antara proses & utas
Dalam multithreading, proses dan utas adalah dua istilah yang sangat terkait erat yang memiliki tujuan yang sama untuk membuat komputer dapat melakukan lebih dari satu hal dalam satu waktu. Suatu proses dapat berisi satu atau lebih utas tetapi sebaliknya, utas tidak dapat berisi proses. Namun, keduanya tetap menjadi dua unit dasar eksekusi. Sebuah program, menjalankan serangkaian instruksi, memulai proses dan utas keduanya.
Tabel berikut menunjukkan perbandingan antara proses dan utas -
Proses | Benang |
---|---|
Prosesnya berat atau boros sumber daya. | Utas ringan yang membutuhkan lebih sedikit sumber daya daripada proses. |
Proses switching membutuhkan interaksi dengan sistem operasi. | Peralihan benang tidak perlu berinteraksi dengan sistem operasi. |
Dalam beberapa lingkungan pemrosesan, setiap proses menjalankan kode yang sama tetapi memiliki memori dan sumber daya file sendiri. | Semua utas dapat berbagi kumpulan file terbuka yang sama, proses anak. |
Jika satu proses diblokir, maka tidak ada proses lain yang dapat dijalankan hingga proses pertama tidak diblokir. | Saat satu utas diblokir dan menunggu, utas kedua dalam tugas yang sama dapat berjalan. |
Beberapa proses tanpa menggunakan utas menggunakan lebih banyak sumber daya. | Beberapa proses berulir menggunakan lebih sedikit sumber daya. |
Dalam banyak proses, setiap proses beroperasi secara independen dari yang lain. | Satu utas dapat membaca, menulis, atau mengubah data utas lainnya. |
Jika akan ada perubahan dalam proses induk maka itu tidak mempengaruhi proses anak. | Jika akan ada perubahan apa pun di utas utama, maka itu dapat memengaruhi perilaku utas lain dari proses itu. |
Untuk berkomunikasi dengan proses saudara, proses harus menggunakan komunikasi antar proses. | Utas dapat langsung berkomunikasi dengan utas lain dari proses itu. |
Konsep Multithreading
Seperti yang telah kita bahas sebelumnya bahwa Multithreading adalah kemampuan CPU untuk mengatur penggunaan sistem operasi dengan mengeksekusi banyak thread secara bersamaan. Ide utama multithreading adalah mencapai paralelisme dengan membagi proses menjadi beberapa utas. Dengan cara yang lebih sederhana, kita dapat mengatakan bahwa multithreading adalah cara mencapai multitasking dengan menggunakan konsep utas.
Konsep multithreading dapat dipahami dengan bantuan contoh berikut.
Contoh
Misalkan kita sedang menjalankan suatu proses. Prosesnya bisa untuk membuka kata MS untuk menulis sesuatu. Dalam proses tersebut, satu utas akan ditugaskan untuk membuka kata MS dan utas lain akan diminta untuk menulis. Sekarang, misalkan jika kita ingin mengedit sesuatu maka thread lain akan diminta untuk melakukan tugas pengeditan dan seterusnya.
Diagram berikut membantu kami memahami bagaimana beberapa utas ada dalam memori -
Kita dapat melihat pada diagram di atas bahwa lebih dari satu utas dapat berada dalam satu proses di mana setiap utas berisi set register dan variabel lokalnya sendiri. Selain itu, semua utas dalam proses berbagi variabel global.
Kelebihan Multithreading
Mari kita lihat beberapa keuntungan multithreading. Keuntungannya adalah sebagai berikut -
Speed of communication - Multithreading meningkatkan kecepatan komputasi karena setiap inti atau prosesor menangani utas terpisah secara bersamaan.
Program remains responsive - Ini memungkinkan program untuk tetap responsif karena satu utas menunggu input dan utas lainnya menjalankan GUI pada saat yang bersamaan.
Access to global variables - Dalam multithreading, semua utas proses tertentu dapat mengakses variabel global dan jika ada perubahan dalam variabel global maka itu juga terlihat oleh utas lain.
Utilization of resources - Menjalankan beberapa utas di setiap program membuat penggunaan CPU lebih baik dan waktu idle CPU menjadi lebih sedikit.
Sharing of data - Tidak ada persyaratan ruang ekstra untuk setiap utas karena utas dalam program dapat berbagi data yang sama.
Kontra Multithreading
Sekarang mari kita lihat beberapa kelemahan multithreading. Kerugiannya adalah sebagai berikut -
Not suitable for single processor system - Multithreading mengalami kesulitan untuk mencapai kinerja dalam hal kecepatan komputasi pada sistem prosesor tunggal dibandingkan dengan kinerja pada sistem multi-prosesor.
Issue of security - Seperti yang kita ketahui bahwa semua utas dalam program berbagi data yang sama, maka selalu ada masalah keamanan karena utas yang tidak dikenal dapat mengubah data.
Increase in complexity - Multithreading dapat meningkatkan kompleksitas program dan debugging menjadi sulit.
Lead to deadlock state - Multithreading dapat mengarahkan program ke potensi risiko mencapai status kebuntuan.
Synchronization required- Sinkronisasi diperlukan untuk menghindari saling pengecualian. Hal ini menyebabkan lebih banyak penggunaan memori dan CPU.