Dalam istilah yang paling sederhana, benang umumnya dianggap preemptive (meskipun ini mungkin tidak selalu benar, tergantung pada sistem operasi) sementara serat dianggap ringan, benang kooperatif. Keduanya merupakan jalur eksekusi yang terpisah untuk aplikasi Anda.
Dengan utas: jalur eksekusi saat ini dapat terputus atau didahului kapan saja (catatan: pernyataan ini adalah generalisasi dan mungkin tidak selalu benar tergantung pada OS / paket threading / dll.). Ini berarti bahwa untuk utas, integritas data adalah masalah besar karena satu utas dapat dihentikan di tengah pembaruan sepotong data, meninggalkan integritas data dalam keadaan buruk atau tidak lengkap. Ini juga berarti bahwa sistem operasi dapat memanfaatkan banyak CPU dan inti CPU dengan menjalankan lebih dari satu utas pada saat yang sama dan menyerahkannya kepada pengembang untuk menjaga akses data.
Dengan serat: jalur eksekusi saat ini hanya terganggu ketika serat menghasilkan eksekusi (catatan yang sama seperti di atas). Ini berarti bahwa serat selalu mulai dan berhenti di tempat yang terdefinisi dengan baik, sehingga integritas data jauh dari masalah. Juga, karena serat sering dikelola dalam ruang pengguna, sakelar konteks mahal dan perubahan status CPU tidak perlu dibuat, membuat perubahan dari satu serat ke serat berikutnya menjadi sangat efisien. Di sisi lain, karena tidak ada dua serat yang dapat berjalan pada waktu yang sama, hanya menggunakan serat saja tidak akan memanfaatkan banyak CPU atau beberapa inti CPU.
Thread menggunakan penjadwalan pre-emptive , sedangkan serat menggunakan penjadwalan kooperatif .
Dengan utas, aliran kontrol bisa terganggu kapan saja, dan utas lain dapat mengambil alih. Dengan beberapa prosesor, Anda dapat menjalankan semua utas sekaligus pada saat yang bersamaan ( multithreading simultan , atau SMT). Akibatnya, Anda harus sangat berhati-hati tentang akses data bersamaan, dan melindungi data Anda dengan mutex, semaphore, variabel kondisi, dan sebagainya. Seringkali sangat sulit untuk memperbaikinya.
Dengan serat, kontrol hanya beralih saat Anda menyuruhnya, biasanya dengan pemanggilan fungsi bernama sesuatu
yield()
. Ini membuat akses data bersamaan lebih mudah, karena Anda tidak perlu khawatir tentang atomicity struktur data atau mutex. Selama Anda tidak menghasilkan, tidak ada bahaya preempted dan serat lain mencoba membaca atau memodifikasi data yang sedang Anda kerjakan. Namun, sebagai hasilnya, jika serat Anda masuk ke loop tak terbatas, tidak ada serat lain yang bisa berjalan, karena Anda tidak menghasilkan.Anda juga dapat mencampur benang dan serat, yang menimbulkan masalah yang dihadapi oleh keduanya. Tidak disarankan, tetapi kadang-kadang bisa menjadi hal yang benar untuk dilakukan jika dilakukan dengan hati-hati.
sumber
Di Win32, serat adalah sejenis utas yang dikelola pengguna. Serat memiliki tumpukan sendiri dan penunjuk instruksi sendiri, dll., Tetapi serat tidak dijadwalkan oleh OS: Anda harus memanggil SwitchToFiber secara eksplisit. Utas, sebaliknya, sudah ditentukan sebelumnya oleh sistem operasi. Jadi kira-kira berbicara serat adalah utas yang dikelola pada level aplikasi / runtime daripada menjadi utas OS yang sebenarnya.
Konsekuensinya adalah serat lebih murah dan aplikasi memiliki kontrol lebih besar atas penjadwalan. Ini bisa menjadi penting jika aplikasi menciptakan banyak tugas bersamaan, dan / atau ingin mengoptimalkan ketika mereka menjalankannya. Misalnya, server basis data mungkin memilih untuk menggunakan serat daripada utas.
(Mungkin ada penggunaan lain untuk istilah yang sama; seperti disebutkan, ini adalah definisi Win32.)
sumber
Pertama saya akan merekomendasikan membaca penjelasan ini tentang perbedaan antara proses dan utas sebagai bahan latar belakang.
Setelah Anda membaca bahwa itu sangat mudah. Thread dapat diimplementasikan baik di kernel, di ruang pengguna, atau keduanya bisa dicampur. Serat pada dasarnya adalah benang yang diterapkan di ruang pengguna.
Di bagian 11.4 "Proses dan Utas di Windows Vista" di Sistem Operasi Modern, Tanenbaum berkomentar:
sumber
Perhatikan bahwa selain Thread dan Serat, Windows 7 memperkenalkan Penjadwalan Mode Pengguna :
Informasi lebih lanjut tentang utas, serat, dan UMS tersedia dengan menonton Dave Probert: Di dalam Windows 7 - Penjadwal Mode Pengguna (UMS) .
sumber
Utas dijadwalkan oleh OS (pre-emptive). Sebuah thread dapat dihentikan atau dilanjutkan kapan saja oleh OS, tetapi serat lebih atau kurang mengelola diri mereka sendiri (kooperatif) dan menghasilkan satu sama lain. Yaitu, programmer mengontrol kapan serat melakukan pemrosesan dan kapan pemrosesan beralih ke serat lain.
sumber
Thread umumnya mengandalkan kernel untuk menyela thread sehingga thread atau thread lain dapat berjalan (yang lebih dikenal sebagai Pre-emptive multitasking) sedangkan serat menggunakan multitasking kooperatif di mana itu adalah serat itu sendiri yang memberikan waktu berjalannya sehingga serat lain bisa berjalan.
Beberapa tautan bermanfaat yang menjelaskannya lebih baik daripada yang mungkin saya lakukan adalah:
sumber
Utas pada awalnya dibuat sebagai proses yang ringan. Dengan cara yang sama, serat adalah benang yang ringan, mengandalkan (secara sederhana) pada serat itu sendiri untuk menjadwalkan satu sama lain, dengan menghasilkan kontrol.
Saya kira langkah selanjutnya adalah untaian di mana Anda harus mengirim mereka sinyal setiap kali Anda ingin mereka mengeksekusi instruksi (tidak seperti anak 5yo saya :-). Di masa lalu (dan bahkan sekarang pada beberapa platform tertanam), semua utas adalah serat, tidak ada pra-emption dan Anda harus menulis utas Anda untuk berperilaku baik.
sumber
Definisi serat Win32 sebenarnya adalah definisi "Benang Hijau" yang didirikan di Sun Microsystems. Tidak perlu membuang serat istilah pada utas sejenis, yaitu utas yang mengeksekusi di ruang pengguna di bawah kontrol kode pengguna / pustaka-benang.
Untuk mengklarifikasi argumen, lihat komentar berikut:
Kita harus mengasumsikan bahwa proses terbuat dari benang dan bahwa benang harus terbuat dari serat. Dengan logika itu dalam pikiran, menggunakan serat untuk jenis utas lainnya adalah salah.
sumber