Utas muncul dalam dua perspektif: sistem operasi, dan bahasa pemrograman. Dalam kedua kasus, ada beberapa variasi dalam atribut apa yang dimiliki thread.
Definisi minimal utas adalah bahwa hal-hal yang terjadi secara berurutan, satu demi satu.
Dalam model eksekusi mesin yang khas, setiap utas memiliki set register tujuan umum dan penghitung programnya sendiri. Jika mesin menetapkan register spesifik sebagai penunjuk tumpukan, ada satu salinan per utas.
Dari perspektif sistem operasi, minimum yang perlu dilakukan sistem operasi untuk mendukung utas adalah menyediakan cara untuk beralih di antara mereka. Ini dapat terjadi baik secara otomatis ( multitasking premptive atau hanya ketika utas membuat permintaan eksplisit (multitasking kooperatif; dalam hal ini utas kadang-kadang disebut serat ). Ada juga model hibrida dengan hasil preemption dan kooperatif, misalnya preemption antara utas grup yang berbeda atau tugas tetapi menghasilkan secara eksplisit antara utas dari grup / tugas yang sama.Pindah antar utas melibatkan minimal menyimpan nilai register dari utas lama dan mengembalikan nilai register utas baru.
Dalam sistem operasi multitasking yang menyediakan isolasi antara tugas (atau proses , Anda dapat memperlakukan istilah ini sebagai sinonim dalam konteks OS), setiap tugas memiliki sumber dayanya sendiri, dalam ruang alamat tertentu, tetapi juga membuka file, hak istimewa, dll. Isolasi memiliki harus disediakan oleh kernel sistem operasi , suatu entitas yang berada di atas proses. Setiap tugas biasanya memiliki setidaknya satu utas - tugas yang tidak mengeksekusi kode tidak banyak digunakan. Sistem operasi mungkin atau mungkin tidak mendukung banyak utas dalam tugas yang sama; misalnya Unix yang asli tidak. Suatu tugas masih dapat menjalankan banyak utas dengan mengatur untuk beralih di antara mereka - ini tidak memerlukan hak istimewa khusus. Ini disebut “ utas pengguna”, Khususnya dalam konteks Unix. Saat ini sebagian besar sistem Unix memang menyediakan utas kernel, khususnya karena itu satu-satunya cara untuk memiliki beberapa utas dari proses yang sama berjalan pada prosesor yang berbeda.
Sebagian besar sumber daya sistem operasi selain dari waktu komputasi melekat pada tugas, bukan utas. Beberapa sistem operasi (misalnya, Linux) secara eksplisit membatasi tumpukan, dalam hal ini setiap utas memiliki sendiri; tetapi ada OS di mana kernel tidak tahu apa-apa tentang tumpukan, mereka hanya bagian dari tumpukan sejauh yang bersangkutan. Kernel juga biasanya mengelola konteks kernel untuk setiap utas, yang merupakan struktur data yang berisi informasi tentang apa yang sedang dilakukan utas; ini memungkinkan kernel menangani banyak utas yang diblokir dalam panggilan sistem pada saat yang bersamaan.
Sejauh menyangkut sistem operasi, utas tugas menjalankan kode yang sama, tetapi berada pada posisi yang berbeda dalam kode tersebut (nilai-nilai program counter berbeda). Mungkin atau mungkin tidak terjadi bahwa bagian-bagian tertentu dari kode suatu program selalu dieksekusi di utas tertentu, tetapi biasanya ada kode umum (misalnya fungsi utilitas) yang dapat dipanggil dari utas apa pun. Semua utas melihat data yang sama, kalau tidak mereka akan dianggap tugas yang berbeda; jika beberapa data hanya dapat diakses oleh utas tertentu, itu biasanya semata-mata bidang bahasa pemrograman, bukan dari sistem operasi.
Dalam sebagian besar bahasa pemrograman, penyimpanan dibagi di antara utas program yang sama. Ini adalah model memori bersama dari pemrograman bersamaan; ini sangat populer, tetapi juga sangat rawan kesalahan, karena programmer perlu berhati-hati ketika data yang sama dapat diakses oleh banyak utas karena kondisi lomba dapat terjadi. Perhatikan bahwa bahkan variabel lokal dapat dibagi di antara utas: “variabel lokal” (biasanya) berarti variabel yang namanya hanya valid selama satu eksekusi fungsi, tetapi utas lain dapat memperoleh pointer ke variabel itu dan mengaksesnya.
Ada juga bahasa pemrograman di mana setiap utas memiliki penyimpanannya sendiri, dan komunikasi di antara mereka terjadi dengan mengirim pesan melalui saluran komunikasi. Ini adalah model message passing dari pemrograman bersamaan. Erlangadalah bahasa pemrograman utama yang berfokus pada pengiriman pesan; lingkungan eksekusi memiliki penanganan utas yang sangat ringan, dan mendorong program yang ditulis dengan utas yang berumur pendek, berbeda dengan kebanyakan bahasa pemrograman lainnya di mana membuat utas merupakan operasi yang relatif mahal dan lingkungan runtime tidak dapat mendukung yang sangat besar jumlah utas pada saat yang sama. Subset berurutan Erlang (bagian dari bahasa yang terjadi dalam utas, khususnya manipulasi data) sebagian besar berfungsi murni; jadi utas dapat mengirim pesan ke utas lain yang berisi beberapa data dan tidak ada utas yang perlu khawatir tentang data yang dimodifikasi oleh utas lain saat sedang menggunakannya.
Beberapa bahasa memadukan kedua model dengan menawarkan penyimpanan thread-lokal, dengan atau tanpa sistem tipe untuk membedakan lokasi penyimpanan thread-lokal dari yang global. Penyimpanan thread-local biasanya merupakan fitur kenyamanan yang memungkinkan nama variabel untuk menunjuk lokasi penyimpanan yang berbeda di utas yang berbeda.
Beberapa tindak lanjut (sulit) yang mungkin menarik untuk dipahami apa utasnya:
- Apa minimum yang perlu dilakukan kernel untuk mendukung banyak utas?
- Di lingkungan multiprosesor, apa yang diperlukan untuk memigrasikan utas dari satu prosesor ke prosesor lainnya?
- Apa yang diperlukan untuk mengimplementasikan multithreading kooperatif ( coroutine ) dalam bahasa pemrograman favorit Anda tanpa dukungan dari sistem operasi dan tanpa menggunakan dukungan bawaannya jika ada? (Berhati-hatilah karena sebagian besar bahasa pemrograman tidak memiliki primitif yang diperlukan untuk mengimplementasikan coroutine di dalam satu utas.)
- Apa yang bisa terlihat dari bahasa pemrograman jika memiliki konkurensi tetapi tidak ada konsep (eksplisit) utas? (Contoh utama: pi-kalkulus .)