GNU/Linux >> Belajar Linux >  >> Linux

Pengantar Utas Linux – Bagian I

Utas eksekusi sering dianggap sebagai unit pemrosesan terkecil tempat penjadwal bekerja.

Suatu proses dapat memiliki beberapa utas eksekusi yang dieksekusi secara asinkron.

Eksekusi asinkron ini membawa kemampuan setiap utas menangani pekerjaan atau layanan tertentu secara independen. Oleh karena itu beberapa utas yang berjalan dalam suatu proses menangani layanan mereka yang secara keseluruhan merupakan kemampuan proses yang lengkap.

Dalam artikel ini kita akan menyentuh dasar-dasar utas dan membangun pemahaman dasar yang diperlukan untuk mempelajari praktiknya. aspek utas Linux.

Seri Utas Linux:bagian 1 (artikel ini), bagian 2, bagian 3.

Mengapa Utas Diperlukan?

Sekarang, orang akan bertanya mengapa kita membutuhkan banyak utas dalam suatu proses ?? Mengapa proses dengan hanya satu thread utama (default) tidak dapat digunakan dalam setiap situasi.

Nah, untuk menjawabnya mari kita perhatikan sebuah contoh :

Misalkan ada suatu proses, yang menerima input secara real time dan sesuai dengan setiap input yang dimilikinya untuk menghasilkan output tertentu. Sekarang, jika prosesnya tidak multi-threaded yaitu jika prosesnya tidak melibatkan banyak thread, maka seluruh pemrosesan dalam proses menjadi sinkron. Artinya proses mengambil input, memprosesnya dan menghasilkan output.

Batasan dalam desain di atas adalah bahwa proses tidak dapat menerima input sampai selesai memproses input sebelumnya dan jika pemrosesan input memakan waktu lebih lama dari yang diharapkan maka penerimaan input lebih lanjut akan ditunda.

Untuk mempertimbangkan dampak dari batasan di atas, jika kami memetakan contoh umum di atas dengan proses server soket yang dapat menerima koneksi input, memprosesnya, dan memberikan output kepada klien soket. Sekarang, jika dalam memproses input apa pun jika proses server membutuhkan waktu lebih dari yang diharapkan dan sementara itu input lain (permintaan koneksi) datang ke server soket maka proses server tidak akan dapat menerima koneksi input baru karena sudah macet memproses koneksi input lama. Hal ini dapat menyebabkan waktu koneksi habis pada klien soket yang sama sekali tidak diinginkan.

Hal ini menunjukkan bahwa model eksekusi sinkron tidak dapat diterapkan di mana-mana, oleh karena itu diperlukan model eksekusi asinkron yang diimplementasikan dengan menggunakan thread.

Perbedaan antara thread dan proses

Berikut adalah beberapa perbedaan utama antara thread dan proses :

  • Proses tidak berbagi ruang alamatnya sementara utas yang dieksekusi di bawah proses yang sama berbagi ruang alamat.
  • Dari poin di atas jelas bahwa proses dijalankan secara independen satu sama lain dan sinkronisasi antar proses dilakukan oleh kernel hanya sementara di sisi lain sinkronisasi utas harus dilakukan oleh proses di mana utas dieksekusi
  • Pengalihan konteks antar-utas lebih cepat dibandingkan dengan peralihan konteks antarproses
  • Interaksi antara dua proses dicapai hanya melalui komunikasi antar proses standar sementara thread yang dieksekusi di bawah proses yang sama dapat berkomunikasi dengan mudah karena mereka berbagi sebagian besar sumber daya seperti memori, segmen teks, dll

Utas pengguna Vs Utas Kernel

Utas bisa ada di ruang pengguna dan juga di ruang kernel.

Ruang pengguna utas dibuat, dikontrol, dan dihancurkan menggunakan pustaka utas ruang pengguna. Utas ini tidak diketahui oleh kernel dan karenanya kernel tidak terlibat dalam pemrosesannya. Utas ini mengikuti multitasking kooperatif di mana-dalam utas melepaskan CPU atas keinginannya sendiri yaitu penjadwal tidak dapat mendahului utas. Keuntungan dari utas ruang pengguna adalah bahwa peralihan antara dua utas tidak melibatkan banyak overhead dan umumnya sangat cepat sementara di sisi negatifnya karena utas ini mengikuti multitasking kooperatif sehingga jika satu utas diblokir, seluruh proses akan diblokir.

ruang kernel utas dibuat, dikontrol, dan dihancurkan oleh kernel. Untuk setiap utas yang ada di ruang pengguna ada utas kernel yang sesuai. Karena utas ini dikelola oleh kernel sehingga mereka mengikuti multitasking preemptive di mana penjadwal dapat mendahului utas dalam eksekusi dengan utas prioritas lebih tinggi yang siap dieksekusi. Keuntungan utama dari utas kernel adalah bahwa meskipun salah satu utas diblokir, seluruh proses tidak diblokir karena utas kernel mengikuti penjadwalan preemptive sementara di sisi negatif, sakelar konteks tidak terlalu cepat dibandingkan dengan utas ruang pengguna.

Jika kita berbicara tentang Linux maka utas kernel dioptimalkan sedemikian rupa sehingga dianggap lebih baik daripada utas ruang pengguna dan sebagian besar digunakan di semua skenario kecuali di mana persyaratan utamanya adalah multitasking kooperatif.

Masalah dengan Utas

Ada beberapa masalah utama yang muncul saat menggunakan utas :

  • Banyak sistem operasi tidak mengimplementasikan utas sebagai proses, mereka melihat utas sebagai bagian dari proses induk. Dalam hal ini, apa yang akan terjadi jika utas memanggil fork() atau lebih buruk lagi bagaimana jika utas mengeksekusi biner baru?? Skenario ini mungkin memiliki konsekuensi berbahaya misalnya dalam masalah selanjutnya seluruh proses induk bisa diganti dengan ruang alamat biner yang baru dieksekusi. Ini sama sekali tidak diinginkan. Linux yang merupakan keluhan POSIX memastikan bahwa memanggil fork() hanya menduplikasi utas yang telah memanggil fungsi fork() sementara exec dari salah satu utas akan menghentikan semua utas dalam proses induk.
  • Masalah lain yang mungkin muncul adalah masalah konkurensi. Karena utas berbagi semua segmen (kecuali segmen tumpukan) dan dapat didahului pada setiap tahap oleh penjadwal daripada variabel global atau struktur data apa pun yang dapat dibiarkan dalam keadaan tidak konsisten dengan mendahului satu utas dapat menyebabkan masalah parah ketika prioritas tinggi berikutnya thread menjalankan fungsi yang sama dan menggunakan variabel atau struktur data yang sama.

Untuk masalah 1 yang disebutkan di atas, yang dapat kami katakan adalah bahwa ini adalah masalah desain dan desain untuk aplikasi harus dilakukan dengan cara yang paling tidak menimbulkan masalah seperti ini.

Untuk masalah 2 yang disebutkan di atas, dengan menggunakan mekanisme penguncian, programmer dapat mengunci sepotong kode di dalam suatu fungsi sehingga bahkan jika terjadi peralihan konteks (ketika variabel global fungsi dan struktur data dalam keadaan tidak konsisten) maka utas berikutnya juga tidak dapat jalankan kode yang sama hingga blok kode yang terkunci di dalam fungsi tersebut dibuka kuncinya oleh utas sebelumnya (atau utas yang memperolehnya).


Linux
  1. Dasar-Dasar Sinyal Linux – Bagian I

  2. Membuat daemon di Linux

  3. Apakah utas kernel Linux benar-benar proses kernel?

  1. Cara mematikan proses zombie di Linux

  2. Pengantar Dasar-dasar Perutean IP Linux (Bagian 1)

  3. Proses Boot Linux

  1. Jumlah maksimum utas per proses di Linux?

  2. Status Proses Linux

  3. Proses Pembuatan Linux?