Apa itu "utas" (sebenarnya)?

237

Saya telah berusaha menemukan definisi yang baik, dan mendapatkan pemahaman, tentang apa sebenarnya thread itu.

Tampaknya saya harus kehilangan sesuatu yang jelas, tetapi setiap kali saya membaca tentang apa sebuah utas, hampir merupakan definisi melingkar, ala "utas adalah utas eksekusi" atau "cara untuk membagi ke dalam menjalankan tugas". Uh uh. Hah?

Tampaknya dari apa yang saya baca bahwa utas bukanlah sesuatu yang konkret, seperti sebuah proses. Ini sebenarnya hanya sebuah konsep. Dari apa yang saya pahami dari cara kerja ini, prosesor mengeksekusi beberapa perintah untuk program (yang telah disebut sebagai thread eksekusi ), kemudian saat dibutuhkan untuk beralih ke pengolahan untuk beberapa program lain untuk sedikit, itu menyimpan state dari program yang saat ini sedang dieksekusi di suatu tempat (Utas Penyimpanan Lokal) dan kemudian mulai jalankan instruksi program lainnya. Dan bolak-balik. Sedemikian rupa, utas benar-benar hanya sebuah konsep untuk "salah satu jalur eksekusi" dari program yang sedang berjalan.

Tidak seperti proses, yang benar-benar sesuatu - itu adalah konglomerasi sumber daya, dll.

Sebagai contoh definisi yang tidak banyak membantu saya. . .

Dari Wikipedia :

"Sebuah utas dalam ilmu komputer adalah kependekan dari sebuah utas eksekusi. Utas adalah cara bagi sebuah program untuk membagi (disebut" split ") itu sendiri menjadi dua atau lebih secara simultan (atau pseudo-simultan) menjalankan tugas. Utas dan proses berbeda dari satu sistem operasi ke yang lain tetapi, secara umum, sebuah thread terdapat di dalam suatu proses dan utas yang berbeda dalam proses yang sama berbagi sumber daya yang sama sedangkan proses yang berbeda dalam sistem operasi multitasking yang sama tidak. "

Apakah saya benar? Salah? Apa sebenarnya thread itu?

Edit: Ternyata thread juga diberikan panggilan stack sendiri, sehingga agak dari beton hal .

richard
sumber
6
"Proses" tidak kurang dari istilah abstrak.
hobbs
Apakah penyimpanan lokal utas hanya tumpukan panggilan untuk utas?
berkomitmen dan
1
Kemungkinan duplikat "mengimplementasikan Runnable" vs. "extends Thread"
VahidHoseini
3
Jawaban di bawah ini adalah ... abstrak. Dalam istilah yang lebih sederhana (dan membahas beberapa detail): pada suatu waktu, program komputer hanya dapat melakukan satu hal sekaligus. Jadi itu A, lalu setelah B, lalu C, lalu ... Dalam sistem modern, ini tidak ideal; misalnya Anda ingin terus menjelajahi web saat mengunduh file. Jadi program sekarang memiliki satu atau lebih 'utas'. Setiap 'utas' hanya dapat melakukan satu hal sekaligus, tetapi utas berbeda dapat melakukan berbagai hal secara bersamaan . Thread 1 dapat melakukan A, lalu B, lalu C; utas 2 dapat melakukan X, lalu Y, lalu Z. B tidak dapat memulai sampai A selesai, tetapi A dan X dapat terjadi sekaligus.
Mohan
@ Mohan itu hebat tapi bagaimana bedanya dengan proses?
eric

Jawaban:

153

Utas adalah serangkaian nilai independen untuk register prosesor (untuk satu inti). Karena ini termasuk Instruction Pointer (alias Program Counter), ia mengontrol apa yang dieksekusi dalam urutan apa. Ini juga termasuk Stack Pointer, yang lebih baik menunjuk ke area memori unik untuk setiap utas atau mereka akan saling mengganggu.

Thread adalah unit perangkat lunak yang dipengaruhi oleh aliran kontrol (pemanggilan fungsi, loop, goto), karena instruksi tersebut beroperasi pada Instruction Pointer, dan yang termasuk ke utas tertentu. Utas sering dijadwalkan menurut beberapa skema prioritas (meskipun dimungkinkan untuk merancang sistem dengan satu utas per inti prosesor, dalam hal ini setiap utas selalu berjalan dan tidak ada penjadwalan yang diperlukan).

Sebenarnya nilai Instruction Pointer dan instruksi yang disimpan di lokasi itu sudah cukup untuk menentukan nilai baru untuk Instruction Pointer. Untuk sebagian besar instruksi, ini hanya meningkatkan IP dengan ukuran instruksi, tetapi instruksi aliran kontrol mengubah IP dengan cara lain yang dapat diprediksi. Urutan nilai yang diambil IP membentuk jalur eksekusi yang ditenun melalui kode program, sehingga memunculkan nama "utas".

Ben Voigt
sumber
10
+1. Sebuah utas bukanlah sesuatu yang lebih "konkret" daripada satu set nilai register.
Greg Hewgill
6
Apa "set nilai"? Apakah mereka? Bagaimana mereka mendefinisikan utas ?
richard
20
@ Richard: Daftar register CPU yang tepat tergantung pada arsitektur, tetapi penunjuk instruksi dan penumpukan stack cukup universal. Mereka mendefinisikan utas sejauh ketika utas ini (set nilai register) dimuat dalam inti prosesor, utas sedang berjalan . Prosesor mengambil instruksi yang diminta oleh utas dan memperbarui register utas. Ketika saklar konteks diperlukan, prosesor menyimpan set nilai register ini ke dalam memori dan memuat set milik thread yang berbeda, biasanya sebagai bagian dari logika servis interupsi.
Ben Voigt
4
Ben terima kasih. Itu sangat membantu.
richard
2
Hai, @BenVoigt. Beberapa klarifikasi bahwa noobs seperti saya mungkin tersandung: apa yang dimaksud dengan "register prosesor"? Apa yang dimaksud dengan "instruksi pointer" dan "stack pointer"?
BKSpurgeon
215

Utas adalah konteks eksekusi, yang merupakan semua informasi yang dibutuhkan CPU untuk menjalankan aliran instruksi.

Misalkan Anda sedang membaca buku, dan Anda ingin beristirahat sekarang, tetapi Anda ingin dapat kembali dan melanjutkan membaca dari titik tepat di mana Anda berhenti. Salah satu cara untuk mencapainya adalah dengan mencatat nomor halaman, nomor baris, dan nomor kata. Jadi konteks eksekusi Anda untuk membaca buku adalah 3 angka ini.

Jika Anda memiliki teman sekamar, dan dia menggunakan teknik yang sama, dia dapat mengambil buku itu saat Anda tidak menggunakannya, dan melanjutkan membaca dari tempat dia berhenti. Kemudian Anda dapat mengambilnya kembali, dan melanjutkannya dari tempat Anda berada.

Thread bekerja dengan cara yang sama. Sebuah CPU memberi Anda ilusi bahwa ia melakukan banyak komputasi pada saat yang bersamaan. Itu dilakukan dengan menghabiskan sedikit waktu pada setiap perhitungan. Itu dapat melakukannya karena ia memiliki konteks eksekusi untuk setiap perhitungan. Sama seperti Anda dapat berbagi buku dengan teman Anda, banyak tugas dapat berbagi CPU.

Pada tingkat yang lebih teknis, konteks eksekusi (oleh karena itu utas) terdiri dari nilai-nilai register CPU.

Terakhir: utas berbeda dari proses. Utas adalah konteks eksekusi, sedangkan proses adalah sekelompok sumber daya yang terkait dengan perhitungan. Suatu proses dapat memiliki satu atau banyak utas.

Klarifikasi: sumber daya yang terkait dengan suatu proses termasuk halaman memori (semua utas dalam suatu proses memiliki pandangan yang sama dari memori), deskriptor file (misalnya, soket terbuka), dan kredensial keamanan (misalnya, ID pengguna yang memulai proses).

pwnall
sumber
20
Analogi yang lebih baik akan menyamakan orang dengan CPU (keduanya melakukan sesuatu), dan menyamakan buku dengan ruang alamat (keduanya hanya ada). Dengan begitu, bookmark di buku yang berbeda seperti utas dalam proses yang berbeda. Satu buku dengan lebih dari satu bookmark akan menjadi analog dari proses multi-utas, yang biasanya orang maksud ketika mereka mengatakan "utas." Ini bekerja untuk mesin prosesor tunggal, tetapi agak rusak ketika Anda berbicara tentang multi-pemrosesan. Tidak ada yang peduli CPU mana yang menjalankan fungsi f (), tetapi tidak masalah orang yang membaca bab 11.
Solomon Slow
@pwnall, terima kasih banyak untuk mencerna konsep sulit untuk orang lain seperti saya! Apakah multithreading terlibat dalam multiprocessing (atau menjalankan proses secara paralel pada banyak CPU, kalau-kalau saya menggunakan istilah yang salah)?
aerijman
51

Untuk mendefinisikan utas secara formal, pertama-tama kita harus memahami batasan di mana utas beroperasi.

Program komputer menjadi suatu proses ketika dimuat dari beberapa toko ke dalam memori komputer dan memulai eksekusi. Suatu proses dapat dieksekusi oleh prosesor atau serangkaian prosesor. Deskripsi proses dalam memori berisi informasi penting seperti penghitung program yang melacak posisi saat ini dalam program (yaitu instruksi yang sedang dijalankan), register, toko variabel, file menangani, sinyal, dan sebagainya.

Sebuah benang adalah urutan instruksi tersebut dalam sebuah program yang dapat dieksekusi secara independen dari kode lain. Angka tersebut menunjukkan konsep: masukkan deskripsi gambar di sini

Thread berada dalam ruang alamat proses yang sama , dengan demikian, banyak informasi yang ada dalam deskripsi memori proses dapat dibagikan di seluruh thread.

Beberapa informasi tidak dapat direplikasi, seperti tumpukan (penunjuk tumpukan ke area memori berbeda per utas), register dan data khusus utas. Informasi ini cukup untuk memungkinkan utas dijadwalkan secara independen dari utas utama program dan mungkin satu atau lebih utas lain dalam program.

Dukungan sistem operasi eksplisit diperlukan untuk menjalankan program multithreaded. Untungnya, sebagian besar sistem operasi modern mendukung utas seperti Linux (via NPTL), varian BSD, Mac OS X, Windows, Solaris, AIX, HP-UX, dll. Sistem operasi dapat menggunakan mekanisme berbeda untuk mengimplementasikan dukungan multithreading.

Di sini, secara grafis, konsep diwakili.

Di sini , Anda dapat menemukan informasi lebih lanjut tentang topik tersebut. Itu juga sumber informasi saya.

Izinkan saya menambahkan kalimat yang berasal dari Pendahuluan ke Sistem Tertanam oleh Edward Lee dan Seshia :

Utas adalah program penting yang berjalan secara bersamaan dan berbagi ruang memori. Mereka dapat mengakses variabel satu sama lain. Banyak praktisi di lapangan menggunakan istilah "utas" lebih sempit untuk merujuk pada cara-cara khusus membangun program yang berbagi memori, [yang lain] untuk merujuk secara luas pada mekanisme apa pun di mana program penting dijalankan secara bersamaan dan berbagi memori. Dalam pengertian luas ini, utas ada dalam bentuk interupsi pada hampir semua mikroprosesor, bahkan tanpa sistem operasi sama sekali (bare iron).

Leos313
sumber
45

Prosesnya seperti dua orang menggunakan dua komputer yang berbeda, yang menggunakan jaringan untuk berbagi data saat diperlukan. Utas seperti dua orang yang menggunakan komputer yang sama, yang tidak harus berbagi data secara eksplisit tetapi harus hati-hati bergiliran.

Secara konseptual, utas hanyalah beberapa lebah pekerja yang berdengung di ruang alamat yang sama. Setiap utas memiliki tumpukan sendiri, penghitung programnya sendiri, dll., Tetapi semua utas dalam suatu proses berbagi memori yang sama. Bayangkan dua program berjalan pada saat yang sama, tetapi keduanya dapat mengakses objek yang sama.

Bandingkan ini dengan proses. Proses masing-masing memiliki ruang alamat sendiri, yang berarti pointer dalam satu proses tidak dapat digunakan untuk merujuk ke objek di yang lain (kecuali jika Anda menggunakan memori bersama).

Saya kira hal-hal kunci untuk dipahami adalah:

  • Baik proses dan utas dapat "berjalan pada saat yang sama".
  • Proses tidak berbagi memori (secara default), tetapi utas membagi semua memorinya dengan utas lain dalam proses yang sama.
  • Setiap utas dalam suatu proses memiliki tumpukan sendiri dan penunjuk instruksi sendiri.
Joey Adams
sumber
Anda mengatakan bahwa "proses tidak berbagi apa pun (secara default)" tetapi dalam analogi Anda, Anda menyatakan bahwa "proses seperti dua orang menggunakan dua komputer yang berbeda, yang menggunakan jaringan untuk berbagi data bila diperlukan" Jadi mereka berbagi sesuatu?
berkomitmen dan
@committedandroider: Panggilan bagus. Saya mengedit jawaban saya untuk mengatakan bahwa proses tidak berbagi memori (secara default), tetapi utas berbagi semua memori.
Joey Adams
36

Saya akan menggunakan banyak teks dari buku Konsep Sistem Operasi oleh ABRAHAM SILBERSCHATZ, PETER BAER GALVIN dan GREG GAGNE bersama dengan pemahaman saya sendiri tentang berbagai hal.

Proses

Aplikasi apa pun berada di komputer dalam bentuk teks (atau kode).

Kami menekankan bahwa program itu sendiri bukanlah proses. Suatu program adalah entitas pasif, seperti file yang berisi daftar instruksi yang disimpan dalam disk (sering disebut file yang dapat dieksekusi).

Saat kami memulai aplikasi, kami membuat instance eksekusi. Contoh eksekusi ini disebut proses. EDIT: (Sesuai interpretasi saya, analog dengan kelas dan instance kelas, instance kelas menjadi sebuah proses.)

Contoh proses adalah Google Chrome. Saat kami memulai Google Chrome, 3 proses muncul:

• Proses browser bertanggung jawab untuk mengelola antarmuka pengguna serta I / O disk dan jaringan. Proses browser baru dibuat saat Chrome dimulai. Hanya satu proses browser yang dibuat.

• Proses renderer mengandung logika untuk merender halaman web. Dengan demikian, mereka mengandung logika untuk menangani HTML, Javascript, gambar, dan sebagainya. Sebagai aturan umum, proses renderer baru dibuat untuk setiap situs web yang dibuka di tab baru, dan beberapa proses renderer mungkin aktif pada saat yang sama.

• Proses plug-in dibuat untuk setiap jenis plug-in (seperti Flash atau QuickTime) yang digunakan. Proses plug-in berisi kode untuk plug-in serta kode tambahan yang memungkinkan plug-in untuk berkomunikasi dengan proses renderer terkait dan proses browser.

Benang

Untuk menjawab ini saya pikir Anda harus tahu dulu apa itu prosesor. Sebuah Prosesor adalah bagian dari perangkat keras yang benar-benar melakukan perhitungan. EDIT: (Komputasi seperti menambahkan dua angka, mengurutkan array, pada dasarnya mengeksekusi kode yang telah ditulis)

Sekarang beralih ke definisi utas.

Utas adalah unit dasar pemanfaatan CPU ; itu terdiri dari ID utas, penghitung program, set register, dan tumpukan.

EDIT: Definisi utas dari situs web intel:

Thread, atau thread eksekusi, adalah istilah perangkat lunak untuk urutan instruksi dasar yang dapat dilalui atau diproses oleh satu inti CPU.

Jadi, jika proses Renderer dari aplikasi Chrome mengurutkan array angka, pengurutan akan dilakukan pada utas / utas eksekusi. (Tata bahas tentang utas tampaknya membingungkan bagi saya)

Interpretasi Saya terhadap Berbagai Hal

Suatu proses adalah contoh eksekusi. Utas adalah pekerja aktual yang melakukan perhitungan melalui akses CPU. Ketika ada beberapa utas yang berjalan untuk suatu proses, proses tersebut menyediakan memori umum.

EDIT: Informasi lain yang saya temukan berguna untuk memberikan lebih banyak konteks

Semua komputer modern memiliki lebih dari satu utas. Jumlah utas di komputer tergantung pada jumlah inti di komputer.

Komputasi Bersamaan :

Dari Wikipedia:

Komputasi serentak adalah suatu bentuk komputasi di mana beberapa komputasi dieksekusi selama periode waktu yang tumpang tindih — secara bersamaan — alih-alih secara berurutan (satu menyelesaikan sebelum yang berikutnya dimulai). Ini adalah properti sistem — ini bisa berupa program individual, komputer, atau jaringan — dan ada titik eksekusi atau "utas kontrol" yang terpisah untuk setiap perhitungan ("proses").

Jadi, saya bisa menulis sebuah program yang menghitung jumlah dari 4 angka:

(1 + 3) + (4 + 5)

Dalam program untuk menghitung jumlah ini (yang akan menjadi satu proses yang berjalan pada utas eksekusi) saya dapat memotong proses lain yang dapat berjalan pada utas yang berbeda untuk menghitung (4 + 5) dan mengembalikan hasilnya ke proses semula, sedangkan proses asli menghitung jumlah (1 + 3).

chatuur
sumber
5
itulah jawaban real deal
Suhail Mumtaz Awan
1
Banyak membantu. Begini penjelasannya.
Dinesh Kumar
Nilai besar dari jawaban ini yaitu memberikan buku referensi di mana Anda dapat menemukan rincian lebih lanjut jika diperlukan. @Chatuur terima kasih!
desa
7

Sayangnya, utas memang ada. Utas adalah sesuatu yang nyata. Anda dapat membunuh satu, dan yang lainnya masih akan berjalan. Anda dapat menelurkan utas baru .... meskipun setiap utas bukan prosesnya sendiri, mereka berjalan secara terpisah di dalam proses. Pada mesin multi-core, 2 utas dapat berjalan secara bersamaan.

http://en.wikipedia.org/wiki/Simultaneous_multithreading

http://www.intel.com/intelpress/samples/mcp_samplech01.pdf

Orbit
sumber
1
Apa yang membuatnya "sesuatu yang nyata"? Apakah hanya data yang disimpan dalam TLS dan tumpukan panggilannya?
richard
Bahwa itu bukan hanya abstraksi untuk memahami ... Jika itu benar-benar hanya satu utas yang berjalan bolak-balik menyamar sebagai beberapa utas, OP akan benar, tapi ya, saya akan mengatakan bahwa data ini akan membuatnya menjadi nyata .
Orbit
Cerahkan saya. . . jadi apa jawabannya?
richard
@ Richard tidak ingin berdebat tentang semantik, hanya mengatakan jawaban saya untuk mencoba mengklarifikasi secara konseptual kepada OP.
Orbit
@ Richard apa TLS?
berkomitmen dan
6

Utas tidak lebih dari konteks memori (atau bagaimana Tanenbaum menempatkannya dengan lebih baik, pengelompokan sumber daya) dengan aturan eksekusi. Ini adalah konstruksi perangkat lunak. CPU tidak tahu apa itu thread (beberapa pengecualian di sini, beberapa prosesor memiliki thread perangkat keras), itu hanya menjalankan instruksi.

Kernel memperkenalkan konsep utas dan proses untuk mengelola memori dan urutan instruksi dengan cara yang bermakna.

Valentin Radu
sumber
5

Ini diambil dari Yahoo Answer:

Thread adalah konstruk pengkodean yang tidak terlindungi oleh arsitektur aplikasi. Suatu proses tunggal seringkali dapat berisi banyak utas. Utas juga dapat berkomunikasi secara langsung satu sama lain karena mereka berbagi variabel yang sama.

Proses adalah unit eksekusi independen dengan informasi negara mereka sendiri. Mereka juga menggunakan ruang alamat mereka sendiri dan hanya dapat berinteraksi dengan proses lain melalui mekanisme komunikasi antarproses.

Namun, untuk memasukkan istilah yang lebih sederhana, utas seperti "tugas" yang berbeda. Jadi pikirkan ketika Anda melakukan sesuatu, misalnya Anda menuliskan formula pada satu kertas. Itu bisa dianggap satu utas. Kemudian utas lainnya adalah Anda menulis sesuatu yang lain di selembar kertas lain. Di situlah multitasking masuk.

Prosesor Intel dikatakan memiliki "hyper-threading" (AMD memilikinya juga) dan ini dimaksudkan untuk dapat melakukan beberapa "utas" atau multitask jauh lebih baik.

Saya tidak yakin tentang logistik cara penanganan utas. Saya ingat pernah mendengar tentang prosesor bolak-balik di antara mereka, tetapi saya tidak 100% yakin tentang ini dan mudah-mudahan orang lain bisa menjawabnya.

Sirip
sumber
Bagaimana prosesor Intel menangani banyak utas dengan lebih baik? Dengan satu inti, hanya satu utas yang harus dijalankan sekaligus. Saya setuju dengan prosesor bolak-balik. Anda tidak dapat benar-benar melakukannya dengan lebih baik, bukan?
berkomitmen dan
Ini merupakan pengoptimalan yang memberikan kinerja yang lebih baik untuk beberapa kasus penggunaan. Anda dapat membaca tentang hyper threading di sini: en.wikipedia.org/wiki/Hyper-threading
Jeremy Friesner
5

Jawabannya sangat bervariasi di berbagai sistem dan implementasi yang berbeda, tetapi bagian yang paling penting adalah:

  1. Sebuah utas memiliki utas eksekusi independen (yaitu, Anda dapat mengubah konteks dari itu, lalu kembali, dan itu akan melanjutkan berjalan di tempat itu sebelumnya).
  2. Sebuah utas memiliki masa pakai (itu dapat dibuat oleh utas lain, dan utas lain dapat menunggu sampai selesai).
  3. Mungkin memiliki lebih sedikit bagasi yang dilampirkan daripada "proses".

Di luar itu: utas bisa diimplementasikan dalam satu proses tunggal oleh runtime bahasa, utas bisa jadi coroutine, utas bisa diimplementasikan dalam satu proses oleh pustaka threading, atau utas bisa jadi kernel build.

Dalam beberapa sistem Unix modern, termasuk Linux yang paling saya kenal, semuanya adalah utas - sebuah proses hanyalah jenis utas yang berbagi relatif sedikit hal dengan induknya (yaitu mendapat pemetaan memori sendiri, tabel file sendiri dan izin, dll.) Membaca man 2 clone, terutama daftar bendera, sangat instruktif di sini.

hobbs
sumber
Apakah konteks beralih ketika prosesor beralih dari satu utas ke utas lainnya (baik dalam proses yang sama atau yang lain)?
berkomitmen dan
-1

Saya tidak benar-benar senang dengan jawaban-jawaban itu, jadi saya akan menambahkan jawaban saya sendiri di sini :) Utas adalah abstraksi kernel untuk penjadwalan pekerjaan pada prosesor, utas adalah apa yang diberikan kernel kepada Anda untuk mengatur waktu prosesor dan berbagi pekerjaan dengan orang lain

Ion Todirel
sumber
1
-1 Utas tidak perlu dibuat oleh kernel. Utas dengan dukungan level kernel memang dijadwalkan oleh kernel (di mana semacam syscall dikeluarkan). Tetapi ada juga utas dengan dukungan tingkat pustaka pengguna, dengan tabel utas berada di ruang pengguna.
AleksandrH
-1

Izinkan saya menjelaskan perbedaan antara proses dan utas terlebih dahulu.

Suatu proses dapat memiliki jumlah utas {1..N}. Penjelasan kecil tentang memori virtual dan prosesor virtual.

Memori virtual

Digunakan sebagai ruang swap sehingga proses berpikir bahwa itu duduk di memori utama untuk dieksekusi.

Prosesor virtual

Konsep yang sama dengan memori virtual kecuali ini untuk prosesor. Untuk suatu proses, akan terlihat bahwa itu adalah satu-satunya hal yang menggunakan prosesor.

OS akan mengatur alokasi memori virtual dan prosesor virtual ke suatu proses dan melakukan pertukaran antar proses dan melakukan eksekusi.

Semua utas dalam suatu proses akan berbagi memori virtual yang sama. Tetapi, setiap utas akan memiliki prosesor virtual masing-masing yang ditugaskan untuk mereka sehingga mereka dapat dieksekusi secara individual.

Sehingga menghemat memori sekaligus memanfaatkan CPU untuk potensinya.

Balaji Radhakrishnan
sumber