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 .
sumber
Jawaban:
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".
sumber
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).
sumber
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:
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 , 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 :
sumber
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:
sumber
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).
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:
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.
EDIT: Definisi utas dari situs web intel:
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:
Jadi, saya bisa menulis sebuah program yang menghitung jumlah dari 4 angka:
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).
sumber
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
sumber
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.
sumber
Ini diambil dari Yahoo Answer:
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.
sumber
Jawabannya sangat bervariasi di berbagai sistem dan implementasi yang berbeda, tetapi bagian yang paling penting adalah:
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.sumber
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
sumber
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.
sumber