Pengenalan lembut tentang multithreading.
Pembahasan singkat tentang teknologi multi-threading
Pengenalan lembut tentang multithreading
Pembahasan singkat tentang teknologi multi-threading
Mendekati dunia konkurensi, selangkah demi selangkah. Dekati dunia konkurensi langkah demi langkah.
Komputer modern memiliki kemampuan untuk melakukan banyak operasi secara bersamaan. Didukung oleh kemajuan perangkat keras dan sistem operasi yang lebih cerdas, fitur ini membuat program Anda berjalan lebih cepat, baik dari segi kecepatan eksekusi maupun daya tanggapnya. Komputer modern memiliki kemampuan untuk melakukan banyak operasi secara bersamaan. Didukung oleh peningkatan perangkat keras dan sistem operasi yang cerdas, fitur ini membuat program berjalan lebih cepat, baik dari segi kecepatan eksekusi maupun daya tanggapnya.
Menulis perangkat lunak yang memanfaatkan kekuatan tersebut adalah hal yang menarik, namun rumit: mengharuskan Anda memahami apa yang terjadi di balik komputer Anda. Di episode pertama ini saya akan mencoba menggores permukaan thread, salah satu alat yang disediakan oleh sistem operasi untuk melakukan keajaiban semacam ini. Ayo pergi! Menulis perangkat lunak yang memanfaatkan kekuatan ini memang menarik, namun juga rumit: mengharuskan Anda memahami apa yang terjadi di balik layar komputer Anda. Pada artikel ini, saya akan mencoba menggores permukaan utas, alat yang disediakan oleh sistem operasi untuk menjalankan fungsi ajaib ini. Mari kita mulai!
Proses dan rangkaian pesan: memberi nama dengan cara yang benar
Proses dan Utas: Beri nama dengan Cara yang Benar
Sistem operasi modern dapat menjalankan banyak program secara bersamaan. Itu sebabnya Anda dapat membaca artikel ini di browser Anda (sebuah program) sambil mendengarkan musik di pemutar media Anda (program lain). Setiap program dikenal sebagai proses yang sedang dijalankan. Sistem operasi mengetahui banyak trik perangkat lunak untuk membuat suatu proses berjalan bersama dengan yang lain, serta memanfaatkan perangkat keras yang mendasarinya. Apa pun pilihannya, hasil akhirnya adalah Anda merasakan semua program Anda berjalan secara bersamaan. Sistem operasi modern dapat menjalankan banyak program secara bersamaan. Itu sebabnya Anda dapat membaca artikel ini di browser Anda (satu program) sambil mendengarkan musik di pemutar media Anda (program lain). Setiap program disebut proses eksekusi. Sistem operasi mengetahui banyak trik perangkat lunak untuk membuat proses berjalan berdampingan dengan proses lain dan memanfaatkan perangkat keras yang mendasarinya. Apa pun pilihannya, hasil akhirnya adalah Anda merasa semua program Anda berjalan secara bersamaan.
Menjalankan proses dalam suatu sistem operasi bukan satu-satunya cara untuk melakukan beberapa operasi secara bersamaan. Setiap proses mampu menjalankan sub-tugas secara bersamaan di dalam dirinya sendiri, yang disebut thread. Anda dapat menganggap thread sebagai bagian dari proses itu sendiri. Setiap proses memicu setidaknya satu thread pada startup, yang disebut thread utama. Kemudian, sesuai dengan kebutuhan program/programmer, thread tambahan dapat dimulai atau diakhiri. Multithreading adalah tentang menjalankan banyak thread dalam satu proses. Menjalankan proses dalam sistem operasi bukan satu-satunya cara untuk melakukan banyak operasi secara bersamaan. Setiap proses mampu menjalankan subtugas secara bersamaan di dalam dirinya sendiri, yang disebut thread. Anda dapat menganggap thread sebagai bagian dari proses itu sendiri. Setiap proses memicu setidaknya satu thread saat dimulai, yang disebut thread utama. Kemudian, tergantung pada kebutuhan program/programmer, thread lain dapat dimulai atau diakhiri. Multithreading mengacu pada menjalankan banyak thread dalam suatu proses.
Misalnya, kemungkinan besar pemutar media Anda menjalankan beberapa thread: satu untuk merender antarmuka — ini biasanya merupakan thread utama, satu lagi untuk memutar musik, dan seterusnya. Misalnya, pemutar media Anda mungkin menjalankan beberapa thread: satu untuk merender antarmuka—ini biasanya merupakan thread utama, satu lagi untuk memutar musik, dan seterusnya.
Anda dapat menganggap sistem operasi sebagai sebuah wadah yang menampung banyak proses, di mana setiap proses adalah sebuah wadah yang menampung banyak thread. Dalam artikel ini saya akan fokus pada topik saja, tetapi keseluruhan topiknya menarik dan layak untuk dianalisis lebih mendalam di masa mendatang. Anda dapat menganggap sistem operasi sebagai sebuah wadah dengan banyak proses, di mana setiap proses adalah sebuah wadah dengan banyak thread. Dalam artikel ini saya hanya akan fokus pada topik, namun topik keseluruhannya menarik dan layak untuk dianalisis lebih mendalam di masa mendatang.

- Sistem operasi dapat dilihat sebagai sebuah kotak yang berisi proses, yang pada gilirannya berisi satu atau lebih thread.
Perbedaan antara proses dan thread
Perbedaan Antara Proses dan Thread
Setiap proses memiliki bagian memorinya sendiri yang ditetapkan oleh sistem operasi. Secara default, memori tersebut tidak dapat dibagikan dengan proses lain: browser Anda tidak memiliki akses ke memori yang ditetapkan untuk pemutar media Anda dan sebaliknya. Hal yang sama terjadi jika Anda menjalankan dua proses yang sama, yaitu jika Anda meluncurkan browser Anda dua kali. (IPC). Setiap proses memiliki blok memori yang dialokasikan oleh sistem operasi. Secara default, memori tidak dapat dibagi dengan proses lain: browser tidak dapat mengakses memori yang dialokasikan ke pemutar media dan sebaliknya. Hal yang sama terjadi jika Anda menjalankan dua proses yang sama, yaitu meluncurkan browser dua kali. Sistem operasi memperlakukan setiap instance sebagai proses baru, mengalokasikan bagian memorinya sendiri-sendiri. Oleh karena itu, secara default, dua atau lebih proses tidak dapat berbagi data kecuali mereka melakukan trik lanjutan yang disebut komunikasi antar-proses (IPC).Berbeda dengan proses, thread berbagi bagian memori yang sama yang ditetapkan ke proses induknya oleh sistem operasi: data di antarmuka utama pemutar media dapat dengan mudah diakses oleh mesin audio dan sebaliknya. Oleh karena itu lebih mudah bagi dua thread untuk berbicara satu sama lain. Selain itu, thread biasanya lebih ringan dibandingkan proses: thread memerlukan lebih sedikit sumber daya dan lebih cepat dibuat, itulah sebabnya thread juga disebut proses ringan. Berbeda dengan proses, thread berbagi blok memori yang sama yang dialokasikan oleh sistem operasi ke proses induk: data di antarmuka utama pemutar media dapat dengan mudah diakses oleh mesin audio, dan sebaliknya. Oleh karena itu, percakapan antara kedua thread menjadi lebih mudah. Selain itu, thread umumnya lebih ringan dibandingkan proses: thread menggunakan lebih sedikit sumber daya dan lebih cepat dibuat, itulah sebabnya thread juga disebut proses ringan.
Thread adalah cara praktis untuk membuat program Anda melakukan beberapa operasi secara bersamaan. Tanpa thread Anda harus menulis satu program per tugas, menjalankannya sebagai proses dan menyinkronkannya melalui sistem operasi. Ini akan lebih sulit (IPC rumit) dan lebih lambat (proses lebih berat daripada thread). Thread adalah cara mudah bagi suatu program untuk melakukan beberapa operasi secara bersamaan. Tanpa thread, Anda harus menulis program untuk setiap tugas, menjalankannya sebagai proses, dan menyinkronkannya melalui sistem operasi. Ini akan lebih sulit (IPC lebih rumit) dan lebih lambat (proses lebih berat daripada thread).
Benang hijau, dari ijuk
Serat benang hijau
Thread yang disebutkan sejauh ini adalah masalah sistem operasi: suatu proses yang ingin mengaktifkan thread baru harus berkomunikasi dengan sistem operasi. Namun, tidak semua platform mendukung thread secara asli. Benang hijau, juga dikenal sebagai serat, adalah sejenis emulasi yang membuat program multithread bekerja di lingkungan yang tidak menyediakan kemampuan tersebut. Misalnya mesin virtual mungkin mengimplementasikan thread hijau jika sistem operasi yang mendasarinya tidak memiliki dukungan thread asli. Thread yang disebutkan sejauh ini semuanya merupakan masalah sistem operasi: suatu proses yang ingin memicu thread baru harus berkomunikasi dengan sistem operasi. Namun, tidak semua platform mendukung thread. Benang hijau, juga dikenal sebagai serat, adalah emulasi yang memungkinkan program multi-utas bekerja di lingkungan yang tidak menyediakan fungsi ini. Misalnya, mesin virtual mungkin mengimplementasikan thread hijau jika sistem operasi yang mendasarinya tidak mendukung thread asli.
Green thread lebih cepat dibuat dan dikelola karena sepenuhnya melewati sistem operasi, namun juga memiliki kelemahan. Saya akan menulis tentang topik tersebut di salah satu episode berikutnya. Green thread lebih cepat dibuat dan dikelola karena mengabaikan sistem operasi sepenuhnya, namun memiliki kelemahan. Saya akan menulis artikel tentang topik ini di episode berikutnya.
Nama “benang hijau” mengacu pada Tim Hijau di Sun Microsystem yang merancang pustaka thread Java asli pada tahun 90an. Saat ini Java tidak lagi menggunakan thread hijau: mereka beralih ke thread asli pada tahun 2000. Beberapa bahasa pemrograman lain — misalnya Go, Haskell, atau Rust — mengimplementasikan setara dengan thread hijau, bukan yang asli. Nama “Green Threads” diciptakan oleh Tim Hijau Sun Microsystem, yang merancang pustaka threading Java asli pada tahun 1990an. Saat ini, Java tidak lagi menggunakan thread hijau: mereka beralih ke thread asli pada tahun 2000. Beberapa bahasa pemrograman lain - Go, Haskell, atau Rust untuk beberapa nama - mengimplementasikan setara dengan thread hijau alih-alih thread asli.
Thread digunakan untuk apa
Untuk apa benang digunakan?
Mengapa suatu proses harus menggunakan banyak thread? Seperti yang saya sebutkan sebelumnya, melakukan berbagai hal secara paralel akan mempercepat banyak hal. Katakanlah Anda akan merender film di editor film Anda. Editor mungkin cukup pintar untuk menyebarkan operasi rendering ke beberapa thread, di mana setiap thread memproses sebagian dari film terakhir. Jadi, jika dengan satu rangkaian tugas akan memakan waktu, katakanlah, satu jam, dengan dua rangkaian akan memakan waktu 30 menit; dengan empat thread 15 menit, dan seterusnya. Mengapa suatu proses harus menggunakan banyak thread? Seperti yang saya sebutkan sebelumnya, pemrosesan paralel dapat mempercepat secara signifikan. Katakanlah Anda ingin merender film di editor film. Editor bisa cukup pintar untuk menyebarkan operasi rendering ke beberapa thread, di mana setiap thread menangani sebagian dari film akhir. Jadi jika suatu tugas memakan waktu satu jam dengan satu thread, 30 menit dengan dua thread; 15 menit dengan empat thread, dan seterusnya.
Apakah sesederhana itu? Ada tiga hal penting yang perlu dipertimbangkan: Apakah sesederhana itu? Ada tiga hal yang perlu dipertimbangkan:
Pertama, tidak semua program perlu multithread. Jika aplikasi Anda melakukan operasi berurutan atau sering menunggu pengguna melakukan sesuatu, multithreading mungkin tidak terlalu bermanfaat; Tidak semua program membutuhkan multi-threading. Jika aplikasi Anda melakukan operasi berurutan, atau sering menunggu pengguna melakukan tindakan tertentu, multithreading mungkin tidak terlalu bermanfaat;
-
Anda tidak perlu membuang lebih banyak thread ke suatu aplikasi untuk membuatnya berjalan lebih cepat: setiap subtugas harus dipikirkan dan dirancang dengan hati-hati untuk melakukan operasi paralel; Anda tidak perlu membuang lebih banyak thread ke aplikasi untuk membuatnya berjalan lebih cepat: setiap subtugas harus dipikirkan dengan cermat dan dirancang untuk melakukan operasi paralel;
-
tidak ada jaminan 100% bahwa thread akan menjalankan operasinya secara paralel, yaitu pada saat yang sama: ini sangat bergantung pada perangkat keras yang mendasarinya. Tidak ada jaminan 100% bahwa thread akan benar-benar menjalankan operasinya secara paralel, yaitu pada saat yang sama: ini sangat bergantung pada perangkat keras yang mendasarinya.
Yang terakhir sangat penting: jika komputer Anda tidak mendukung beberapa operasi secara bersamaan, sistem operasi harus memalsukannya. Kami akan melihat caranya sebentar lagi. Untuk saat ini mari kita bayangkan konkurensi sebagai persepsi memiliki tugas-tugas yang berjalan pada waktu yang sama, sedangkan paralelisme sejati sebagai tugas-tugas yang benar-benar berjalan pada waktu yang sama.
Poin terakhir ini penting: jika komputer Anda tidak dapat mendukung beberapa operasi secara bersamaan, sistem operasi harus memalsukannya. Kita akan lihat sebentar lagi. Sekarang, mari kita bayangkan konkurensi sebagai perasaan menjalankan tugas secara bersamaan, dan paralelisme sejati sebagai tugas yang berjalan secara bersamaan.
2. Paralelisme adalah bagian dari konkurensi. Paralelisme adalah bagian dari konkurensi.
Apa yang memungkinkan konkurensi dan paralelisme
Apa yang memungkinkan terjadinya konkurensi dan paralelisme
Unit pemrosesan pusat (CPU) di komputer Anda melakukan kerja keras dalam menjalankan program. Itu terbuat dari beberapa bagian, yang utama disebut inti: di situlah perhitungan sebenarnya dilakukan. Sebuah inti hanya mampu menjalankan satu operasi dalam satu waktu. Unit pemrosesan pusat (CPU) di komputer Anda bertanggung jawab untuk menjalankan program. Ini terdiri dari beberapa bagian, yang utama adalah apa yang disebut inti: di sinilah perhitungan sebenarnya dilakukan. Sebuah inti hanya dapat menjalankan satu operasi dalam satu waktu.
Hal ini tentu saja merupakan kelemahan besar. Untuk alasan ini sistem operasi telah mengembangkan teknik-teknik canggih untuk memberikan pengguna kemampuan untuk menjalankan beberapa proses (atau thread) sekaligus, terutama pada lingkungan grafis, bahkan pada mesin inti tunggal. Yang paling penting disebut multitasking preemptive, dimana preemption adalah kemampuan untuk menghentikan suatu tugas, beralih ke tugas lain dan kemudian melanjutkan tugas pertama di lain waktu. Hal ini tentu saja merupakan kelemahan besar. Oleh karena itu, sistem operasi telah mengembangkan teknik-teknik canggih yang memungkinkan pengguna menjalankan beberapa proses (atau thread) secara bersamaan, terutama di lingkungan grafis dan bahkan pada mesin single-core. Yang paling penting dari hal ini disebut multitasking preemptive, dimana preemptive adalah kemampuan untuk menghentikan satu tugas, beralih ke tugas lain, dan kemudian melanjutkan tugas pertama di lain waktu.
Jadi jika CPU Anda hanya memiliki satu inti, bagian dari tugas sistem operasi adalah menyebarkan daya komputasi inti tunggal tersebut ke beberapa proses atau thread, yang dijalankan satu demi satu dalam satu lingkaran. Operasi ini memberi Anda ilusi bahwa lebih dari satu program berjalan secara paralel, atau satu program melakukan banyak hal pada saat yang sama (jika multithread). Konkurensi terpenuhi, namun paralelisme sejati – kemampuan untuk menjalankan proses secara bersamaan – masih belum ada. Jadi jika CPU Anda hanya memiliki satu inti, bagian dari tugas sistem operasi adalah menyebarkan kekuatan komputasi dari satu inti ke beberapa proses atau thread yang dijalankan satu demi satu dalam satu lingkaran. Operasi ini memberi Anda ilusi bahwa ada beberapa program yang berjalan secara paralel, atau bahwa satu program melakukan banyak hal pada saat yang sama (jika multi-threaded). Meskipun konkurensi terpenuhi, paralelisme sejati—kemampuan untuk menjalankan proses secara bersamaan—masih belum ada.
Saat ini CPU modern memiliki lebih dari satu inti, yang masing-masing inti melakukan operasi independen pada satu waktu. Ini berarti bahwa dengan dua atau lebih inti, paralelisme yang sebenarnya dimungkinkan. Misalnya, Intel Core i7 saya memiliki empat inti: ia dapat menjalankan empat proses atau thread berbeda secara bersamaan, secara bersamaan. Saat ini, CPU modern memiliki banyak inti, yang masing-masing menjalankan operasi independen dalam satu waktu. Ini berarti paralelisme sejati dimungkinkan dengan menggunakan dua inti atau lebih. Misalnya, Intel Core i7 saya memiliki empat inti: dapat menjalankan empat proses atau thread berbeda secara bersamaan.
Sistem operasi dapat mendeteksi jumlah inti CPU dan menetapkan proses atau thread ke masing-masing inti tersebut. Sebuah thread dapat dialokasikan ke inti apa pun yang disukai sistem operasi, dan penjadwalan semacam ini sepenuhnya transparan untuk program yang dijalankan. Selain itu, multitasking preemptive mungkin berlaku jika semua core sedang sibuk. Ini memberi Anda kemampuan untuk menjalankan lebih banyak proses dan thread daripada jumlah atau inti sebenarnya yang tersedia di mesin Anda. Sistem operasi mampu mendeteksi jumlah inti CPU dan menetapkan proses atau thread ke setiap inti CPU. Sebuah thread dapat ditetapkan ke inti mana pun yang disukai sistem operasi, dan penjadwalan ini sepenuhnya transparan terhadap program yang sedang berjalan. Selain itu, multitasking preemptive mungkin ikut berperan ketika semua core sedang sibuk. Hal ini memungkinkan Anda menjalankan lebih banyak proses dan thread daripada jumlah atau inti sebenarnya yang tersedia di komputer Anda.
Aplikasi multi-threading pada satu inti: apakah masuk akal?
Aplikasi multithread pada satu inti: Apakah masuk akal?
Paralelisme sejati pada mesin inti tunggal tidak mungkin dicapai. Meskipun demikian, tetap masuk akal untuk menulis program multithread, jika aplikasi Anda dapat memperoleh manfaat darinya. Ketika suatu proses menggunakan beberapa thread, multitasking preemptif dapat membuat aplikasi tetap berjalan meskipun salah satu thread tersebut melakukan tugas yang lambat atau memblokir. Tidak mungkin mencapai paralelisme sejati pada mesin inti tunggal. Namun, tetap masuk akal untuk menulis program multithread jika aplikasi Anda dapat memperoleh manfaat darinya. Ketika suatu proses menggunakan banyak thread, multitasking preemptive dapat membuat aplikasi tetap berjalan meskipun salah satu thread melakukan tugas yang lambat atau memblokir.
Katakanlah misalnya Anda sedang mengerjakan aplikasi desktop yang membaca beberapa data dari disk yang sangat lambat. Jika Anda menulis program hanya dengan satu thread, seluruh aplikasi akan terhenti hingga operasi disk selesai: daya CPU yang ditetapkan ke satu-satunya thread akan terbuang saat menunggu disk aktif. Tentu saja sistem operasi menjalankan banyak proses lain selain yang satu ini, namun aplikasi spesifik Anda tidak akan mengalami kemajuan apa pun. Misalnya, Anda sedang mengerjakan aplikasi desktop yang membaca beberapa data dari disk yang sangat lambat. Jika suatu program ditulis hanya menggunakan satu thread, seluruh aplikasi akan terhenti hingga operasi disk selesai: energi CPU yang dialokasikan ke thread tunggal akan terbuang saat menunggu disk aktif. Tentu saja, selain proses ini, sistem operasi memiliki banyak proses lain yang berjalan, tetapi aplikasi khusus Anda tidak akan mengalami kemajuan apa pun.Mari pikirkan kembali aplikasi Anda dengan cara multithread. Thread A bertanggung jawab atas akses disk, sedangkan thread B menangani antarmuka utama. Jika thread A macet saat menunggu karena perangkat lambat, thread B masih dapat menjalankan antarmuka utama, menjaga program Anda tetap responsif. Hal ini dimungkinkan karena, dengan memiliki dua thread, sistem operasi dapat mengalihkan sumber daya CPU di antara keduanya tanpa terjebak pada thread yang lebih lambat. Mari pikirkan kembali aplikasi Anda dalam istilah multi-utas. Thread A bertanggung jawab atas akses disk, sedangkan thread B bertanggung jawab atas antarmuka utama. Jika thread A macet menunggu karena perangkat lambat, thread B masih dapat menjalankan antarmuka utama, menjaga program tetap responsif. Hal ini dimungkinkan karena terdapat dua thread dan sistem operasi dapat mengalihkan sumber daya CPU di antara keduanya tanpa terjebak pada thread yang lebih lambat.
Semakin banyak thread, semakin banyak masalah
Semakin banyak thread, semakin banyak masalah
Seperti yang kita ketahui, thread berbagi bagian memori yang sama dengan proses induknya. Hal ini sangat memudahkan dua atau lebih dari mereka untuk bertukar data dalam aplikasi yang sama. Misalnya: editor film mungkin menyimpan sebagian besar memori bersama yang berisi garis waktu video. Memori bersama tersebut sedang dibaca oleh beberapa thread pekerja yang ditujukan untuk merender film ke sebuah file. Mereka semua hanya memerlukan pegangan (misalnya penunjuk) ke area memori tersebut untuk membaca darinya dan mengeluarkan bingkai yang dirender ke disk. Kita tahu bahwa thread berbagi blok memori yang sama dengan proses induknya. Hal ini sangat memudahkan dua atau lebih dari mereka untuk bertukar data dalam aplikasi yang sama. Misalnya: editor film mungkin memiliki sebagian besar memori bersama yang berisi garis waktu video. Memori bersama tersebut dibaca oleh beberapa thread pekerja, yang ditujukan untuk merender film ke file. Mereka semua hanya memerlukan pegangan (misalnya penunjuk) ke area memori untuk membaca data dari area memori tersebut dan mengeluarkan frame yang dirender ke disk.
Segala sesuatunya berjalan lancar selama dua atau lebih thread dibaca dari lokasi memori yang sama. Masalah muncul ketika setidaknya salah satu dari mereka menulis ke memori bersama, sementara yang lain membaca dari memori tersebut. Dua masalah dapat terjadi pada saat ini: Dua atau lebih thread yang membaca dari lokasi memori yang sama dapat berjalan dengan lancar. Masalah muncul ketika setidaknya satu memori menulis ke memori bersama sementara yang lain membaca dari memori tersebut. Dua masalah mungkin muncul saat ini:
-
perlombaan data — saat thread penulis memodifikasi memori, thread pembaca mungkin membaca dari memori tersebut. Jika penulis belum menyelesaikan pekerjaannya, pembaca akan mendapatkan data yang rusak; Perlombaan data - saat thread penulisan memodifikasi memori, thread pembacaan mungkin membaca memori. Jika penulis belum melakukan tugasnya, pembaca akan mendapatkan data yang rusak;
-
kondisi balapan — thread pembaca seharusnya dibaca hanya setelah penulis menulis. Bagaimana jika yang terjadi justru sebaliknya? Lebih halus dari data race, kondisi balapan adalah dua atau lebih thread yang melakukan tugasnya dalam urutan yang tidak dapat diprediksi, padahal sebenarnya operasi tersebut harus dilakukan dalam urutan yang tepat agar dapat dilakukan dengan benar. Program Anda dapat memicu kondisi balapan meskipun telah dilindungi dari balapan data. Kondisi balapan - thread bacaan hanya boleh dibaca setelah penulis menulis. Bagaimana jika yang terjadi justru sebaliknya? Lebih halus dari data race, kondisi race adalah ketika dua atau lebih thread melakukan pekerjaannya dalam urutan yang tidak dapat diprediksi, padahal sebenarnya operasi harus dilakukan dalam urutan yang benar agar dapat bekerja dengan benar. Program Anda dapat memicu kondisi balapan meskipun dilindungi dari balapan data.
Konsep keamanan benang
Konsep keamanan benang
Sepotong kode dikatakan thread-safe jika berfungsi dengan benar, yaitu tanpa data race atau kondisi race, meskipun banyak thread yang mengeksekusinya secara bersamaan. Anda mungkin telah memperhatikan bahwa beberapa pustaka pemrograman mendeklarasikan dirinya sebagai thread-safe: jika Anda menulis program multithread, Anda ingin memastikan bahwa fungsi pihak ketiga lainnya dapat digunakan di thread yang berbeda tanpa memicu masalah konkurensi. Jika sebuah kode berfungsi dengan benar, misalnya tanpa data race atau kondisi race, maka kode tersebut aman untuk thread, bahkan jika banyak thread mengeksekusinya secara bersamaan. Anda mungkin telah memperhatikan bahwa beberapa pustaka pemrograman menyatakan dirinya aman untuk thread: jika Anda menulis program multi-thread, Anda ingin memastikan bahwa fungsi pihak ketiga lainnya dapat digunakan di thread yang berbeda tanpa menyebabkan masalah konkurensi.
Akar penyebab data race
Akar penyebab persaingan data
Kita tahu bahwa inti CPU hanya dapat menjalankan satu instruksi mesin dalam satu waktu. Instruksi tersebut dikatakan bersifat atomik karena tidak dapat dibagi: tidak dapat dipecah menjadi operasi yang lebih kecil. Kata Yunani “atom” (ἄτομος; atomos) berarti tidak dapat dipotong. Kita tahu bahwa inti CPU hanya dapat menjalankan satu instruksi mesin dalam satu waktu. Instruksi seperti ini disebut instruksi atom karena tidak dapat dibagi: tidak dapat dibagi menjadi operasi-operasi yang lebih kecil. Kata Yunani “atom” (ἄτομος; atomos) berarti segalanya.
Properti yang tidak dapat dibagi membuat operasi atom secara alami aman untuk thread. Ketika sebuah thread melakukan penulisan atom pada data bersama, tidak ada thread lain yang dapat membaca modifikasi setengah selesai. Sebaliknya, saat thread melakukan pembacaan atomik pada data bersama, thread membaca seluruh nilai seperti yang muncul pada satu waktu. Tidak ada cara bagi thread untuk lolos dari operasi atom, sehingga tidak ada data race yang dapat terjadi. Sifatnya yang tidak dapat dibagi membuat operasi atom secara inheren aman untuk thread. Ketika satu thread melakukan penulisan atom ke data bersama, tidak ada thread lain yang dapat membaca modifikasi setengah jadi. Sebaliknya, ketika sebuah thread melakukan pembacaan atomik pada data bersama, thread tersebut membaca seluruh nilai yang terjadi pada suatu titik waktu. Thread tidak dapat beroperasi secara atomik, sehingga perlombaan data tidak mungkin dilakukan.Kabar buruknya adalah sebagian besar operasi di luar sana bersifat non-atom. Bahkan penugasan sepele seperti x = 1 pada beberapa perangkat keras mungkin terdiri dari beberapa instruksi mesin atom, sehingga penugasan itu sendiri bersifat non-atom secara keseluruhan. Jadi perlombaan data dipicu jika sebuah thread membaca x sementara thread lain melakukan tugas. Kabar buruknya adalah sebagian besar operasinya bersifat non-atom. Bahkan penugasan sederhana seperti x = 1 pada beberapa perangkat keras mungkin terdiri dari beberapa instruksi mesin atom, sehingga penugasan itu sendiri bersifat non-atomik secara keseluruhan. Oleh karena itu, jika satu thread membaca x sementara thread lain melakukan penugasan, data race akan terpicu.
Akar penyebab kondisi balapan
Akar penyebab kondisi balapan
Multitasking preemptif memberi sistem operasi kendali penuh atas manajemen thread: sistem dapat memulai, menghentikan, dan menjeda thread sesuai dengan algoritma penjadwalan tingkat lanjut. Anda sebagai seorang programmer tidak dapat mengontrol waktu atau urutan eksekusi. Faktanya, tidak ada jaminan bahwa kode sederhana seperti ini: Multitasking preemptive memberi sistem operasi kendali penuh atas manajemen thread: sistem dapat memulai, menghentikan, dan menjeda thread berdasarkan algoritma penjadwalan tingkat lanjut. Sebagai seorang programmer, Anda tidak memiliki kendali atas waktu atau urutan eksekusi. Faktanya, tidak ada jaminan bahwa kode sederhana seperti itu:
writer_thread.start()
reader_thread.start ()
akan memulai dua utas dalam urutan tertentu. Jalankan program ini beberapa kali dan Anda akan melihat bagaimana perilakunya berbeda pada setiap proses: terkadang thread penulis dimulai terlebih dahulu, terkadang pembaca memulainya. Anda pasti akan mengalami kondisi balapan jika program Anda mengharuskan penulis untuk selalu berjalan sebelum pembaca. Dua thread akan dimulai dalam urutan tertentu. Jalankan program ini beberapa kali dan Anda akan melihat perilakunya yang berbeda pada setiap proses: terkadang thread penulisan dimulai terlebih dahulu, terkadang thread pembacaan dimulai terlebih dahulu. Jika program Anda mengharuskan penulis untuk selalu berlari sebelum pembaca, Anda pasti mengalami kondisi balapan.
Perilaku ini disebut non-deterministik: hasilnya berubah setiap saat dan Anda tidak dapat memprediksinya. Men-debug program yang dipengaruhi oleh kondisi balapan sangat mengganggu karena Anda tidak selalu dapat mereproduksi masalah dengan cara yang terkendali. Perilaku ini disebut non-determinisme: hasilnya berubah setiap saat dan Anda tidak dapat memprediksinya. Men-debug program yang dipengaruhi oleh kondisi balapan sangat mengganggu karena Anda tidak selalu dapat mereproduksi masalah dengan cara yang terkendali.
Ajari thread untuk akur: kontrol konkurensi
Thread Pengajaran untuk Akur: Kontrol Konkurensi
Baik data race maupun kondisi balapan adalah masalah dunia nyata: beberapa orang bahkan meninggal karenanya. Seni mengakomodasi dua atau lebih thread secara bersamaan disebut kontrol konkurensi: sistem operasi dan bahasa pemrograman menawarkan beberapa solusi untuk mengatasinya. Yang paling penting: Perlombaan data dan kondisi ras adalah masalah dunia nyata: beberapa orang bahkan meninggal karenanya. Tindakan mengakomodasi dua atau lebih thread secara bersamaan disebut kontrol konkurensi: sistem operasi dan bahasa pemrograman menyediakan berbagai solusi untuk menanganinya. Yang paling penting adalah:
-
sinkronisasi — cara untuk memastikan bahwa sumber daya hanya akan digunakan oleh satu thread dalam satu waktu. Sinkronisasi adalah tentang menandai bagian tertentu dari kode Anda sebagai “dilindungi” sehingga dua atau lebih thread bersamaan tidak mengeksekusinya secara bersamaan, sehingga mengacaukan data yang Anda bagikan; Sinkronisasi – Sebuah metode untuk memastikan bahwa hanya satu thread yang menggunakan sumber daya pada satu waktu. Sinkronisasi menandai bagian tertentu dari kode sebagai “dilindungi” sehingga dua atau lebih thread yang bersamaan tidak dapat menjalankannya secara bersamaan, sehingga merusak data yang dibagikan;
-
operasi atom — sekumpulan operasi non-atom (seperti tugas yang disebutkan sebelumnya) dapat diubah menjadi operasi atom berkat instruksi khusus yang diberikan oleh sistem operasi. Dengan cara ini data yang dibagikan selalu disimpan dalam keadaan valid, tidak peduli bagaimana thread lain mengaksesnya; Operasi atom - Berkat instruksi khusus yang diberikan oleh sistem operasi, banyak operasi non-atom (seperti penugasan yang disebutkan sebelumnya) dapat diubah menjadi operasi atom. Dengan cara ini, tidak peduli bagaimana thread lain mengakses data yang dibagikan, data yang dibagikan selalu tetap dalam keadaan valid;
-
data yang tidak dapat diubah — data yang dibagikan ditandai sebagai tidak dapat diubah, tidak ada yang dapat mengubahnya: thread hanya diperbolehkan untuk membaca dari data tersebut, sehingga menghilangkan penyebab utama. Seperti yang kita ketahui, thread dapat membaca dengan aman dari lokasi memori yang sama selama tidak mengubahnya. Ini adalah filosofi utama di balik pemrograman fungsional. Data yang Tidak Dapat Diubah - Data yang dibagikan ditandai sebagai tidak dapat diubah, tidak ada yang dapat mengubahnya: thread hanya diperbolehkan untuk membaca dari data tersebut, sehingga menghilangkan akar permasalahannya. Kita tahu bahwa thread dapat dengan aman membaca data dari lokasi memori yang sama selama thread tersebut tidak mengubahnya. Ini adalah prinsip utama di balik pemrograman fungsional.
Saya akan membahas semua topik menarik ini di episode berikutnya dari mini-seri tentang konkurensi ini. Pantau terus! Dalam episode berikutnya dari mini-seri konkurensi ini, saya akan membahas semua topik menarik ini. Harap tetap disini!
Teks asli: https://www.internalpointers.com/post/gentle-introduction-multithreading
What to read next
Want more posts about Translation?
Posts in the same category are usually the best next step for reading more on this topic.
View same categoryWant to keep following #Translation?
Tags are useful for related tools, specific problems, and similar troubleshooting notes.
View same tagWant to explore another direction?
If you are not sure what to read next, return to the homepage and start from categories, topics, or latest updates.
Back home