Task Manager mengatakan sistem sedang berjalan dengan lebih dari seribu utas

17

Saya membuka Pengelola Tugas dan mencari di bawah area "Sistem" dan melihat:

Thread: 1337

Karena saya memiliki prosesor dual-core dengan hyper-threading yang tersedia (artinya empat utas), bagaimana mungkin memiliki 1000+ utas saat prosesor saya seharusnya hanya memiliki empat?

dpl47
sumber
3
Bukankah itu sebabnya mereka menyebutnya hyper- threading? :)
CVn
9
Astaga, apakah mereka akhirnya menemukan "multiprogramming" ??? (Ini tahun 1967, kan?)
Daniel R Hicks
10
Apakah seseorang baru saja mengubah nomor menjadi 1337?
Erty Seidohl
11
Bagaimana perusahaan dengan empat meja dapat memiliki 1.337 karyawan? Mudah; karyawan bergantian menggunakan meja.
Eric Lippert

Jawaban:

50

Jawaban sederhananya adalah tidak semua utas mengeksekusi secara bersamaan. Untuk penjelasan lebih lengkap, baca terus.

Penjadwal tugas sistem operasi umumnya dianggap untuk menjadwalkan aplikasi, dan dengan demikian memungkinkan Anda untuk melakukan satu tugas saat komputer sedang mengerjakan yang lain. Di masa lalu, tes lakmus multitasking adalah memformat floppy disk saat melakukan sesuatu yang lain. Jika Anda benar-benar ingin menguji OS, Anda akan memformat floppy disk saat mengunduh file melalui modem yang terhubung ke port serial. Karena perangkat keras menjadi cukup kuat untuk benar-benar melakukannya dengan cara yang bermakna, pemutaran video kadang-kadang juga ditampilkan dalam pengujian tersebut. Jika penjadwal tugas OS dapat menangani menjalankan tugas-tugas itu dengan lancar, maka itu dapat menangani apa pun.

Namun, penjadwal tugas tidak benar-benar menjadwalkan aplikasi (proses), itu menjadwalkan utas . Setiap aplikasi memiliki setidaknya satu utas, tetapi berpotensi dapat menggunakan sejumlah besar utas untuk membagi pekerjaan yang dilakukannya menjadi bagian terkait atau independen. Misalnya, adalah umum untuk aplikasi memiliki satu utas yang menangani antarmuka pengguna, dan untuk membuat utas lain ketika pengguna memulai operasi yang berpotensi berjalan lama (yang mungkin seperti mencetak, menghitung ulang spreadsheet, lingkungan pengembangan melakukan pencarian simbol, dll. dll). Beberapa lingkungan pemrograman memperkenalkan sejumlah utas tanpa terlihat ke programmer; misalnya, Java dan .NET mungkin melakukan pengumpulan sampahdi utas terpisah, yang berada di luar kendali langsung programmer. Beberapa program membuat sejumlah utas sejak awal dan menggabungkannya, karena membuat utas baru adalah operasi yang relatif mahal (jadi Anda tidak perlu harus membuat utas setiap kali Anda membutuhkannya). Apa pun yang melakukan pratinjau biasanya dilakukan di utas terpisah, sehingga sisa UI tetap responsif saat pratinjau sedang dibuat. Dan seterusnya. Secara keseluruhan, semua ini berarti bahwa jumlah utas pada sistem setiap saat dapat dengan mudah beberapa kali lipat dari jumlah proses.

Setiap utas dapat berada dalam salah satu dari beberapa keadaan yang mungkin, tetapi perbedaan yang paling penting adalah antara kondisi berlari , runnable , dan menunggu ; terminologinya bisa sedikit berbeda, tapi itulah ide umumnya. Pada suatu saat, hanya satu utas per virtual (karena teknologi hyperhreading dan sejenisnya) inti CPU dapat berjalan (yaitu, menjalankan instruksi kode mesin), tetapi sejumlah utas dapat runnable (artinya adalah kandidat untuk mendapatkan CPU waktu berikutnya penjadwal perlu membuat keputusan tentang utas yang harus dijalankan). Menunggu (juga dikenal sebagai diblokir) utas hanya itu, menunggu sesuatu - kasus yang paling umum mungkin adalah bahwa itu sedang menunggu pengguna, disk atau I / O jaringan (input pengguna khususnya sangat lambat).

Jumlah utas yang Anda lihat di pengelola tugas adalah jumlah total utas di salah satu dari status ini. Sebagai contoh, sistem Windows 7 yang saya ketikkan ini saat ini memiliki sekitar 70 proses dimulai tetapi hampir 900 utas. Dengan semua proses latar belakang untuk menangani berbagai tugas dan bagaimana masing-masing tugas dibagi menjadi banyak utas, ini bukan angka yang keterlaluan.

Melangkah lebih jauh ke kedalaman implementasi teknis, pada inti dari penjadwal tugas sistem operasi multitasking pre-emptively biasanya beberapa jenis kait interupsi perangkat keras. Ini berarti bahwa kernel dapat menghentikan CPU ketika tidak memiliki pekerjaan yang berguna untuk melakukan (ini hampir pasti salah satu alasan, jika tidak dengan alasan, mengapa Linux pemeriksaan yang HLTinstruksi pada boot pada IA-32CPU -compatible, dan mungkin melakukan pemeriksaan serupa pada arsitektur lain), aman dalam pengetahuan bahwa pada beberapa waktu yang cukup menentukan di masa depan, sebuah interupsi akan menyala dan penjadwal tugas akan dipanggil. Karena api interupsi terlepas dari pekerjaan apa yang dilakukan CPU (itulah ide di balik interupsi), penjadwal akan dieksekusi secara teratur dan mendapat kesempatan untuk menentukan utas mana yang harus dieksekusi selama irisan waktu berikut. Karena sakelar konteks relatif mahal, biasanya dimungkinkan (setidaknya melalui kode sumber) untuk menyesuaikan seberapa agresif penjadwal beralih di antara utas; switching threads lebih sering menyebabkan sistem menjadi lebih responsif, tetapi switching overhead berarti bahwa keseluruhan waktu untuk menyelesaikan serangkaian tugas yang diberikan lebih lama. The tercepatsistem akan menjadi salah satu yang hanya beralih di antara utas ketika utas yang berjalan tidak lagi dapat dijalankan (artinya ia diblokir menunggu sesuatu, atau telah menyelesaikan tugasnya) karena itu meminimalkan overhead, sedangkan sistem yang paling responsif akan beralih di antara utas setiap kali scheduler dipanggil karena meminimalkan waktu rata-rata untuk menunggu sebelum utas tertentu mendapat waktu CPU. Pengaturan yang ideal biasanya ada di antara keduanya, dan pertukaran antara pilihan-pilihan itu kemungkinan merupakan salah satu alasan utama mengapa Linux menawarkan beberapa penjadwal untuk dipilih dan juga beberapa parameter penyetelan melalui konfigurasi kernel.

Sebaliknya, OS dan lingkungan yang bekerja sama secara kooperatif ( Windows 3.x menjadi salah satu contoh), bergantung pada setiap aplikasi untuk secara teratur menyerahkan kontrol ke penjadwal. Biasanya ada fungsi API yang secara khusus dimaksudkan untuk melakukan itu, dan seringkali banyak fungsi API akan melakukannya sebagai bagian dari alur eksekusi internal mereka, karena itu membantu membuat pengalaman pengguna lebih lancar. Pendekatan desain itu bekerja dengan baik selama semua aplikasi berperilaku baik dan memberikan kontrol dengan interval pendek selama setiap operasi yang berjalan lama (arti berjalan lebih dari sepersekian detik), tetapi aplikasi yang tidak dapat menyumbat seluruh sistem. Ini adalah salah satu alasan utama mengapa Windows 3.x melakukannya dengan buruk pada tes multitasking yang saya sebutkan di atas, sementara OS / 2berjalan dengan riang sambil melakukan tugas yang sama pada perangkat keras yang sama: aplikasi dapat memberitahu floppy disk drive untuk menulis sektor tertentu, dan waktu yang dibutuhkan untuk melakukannya sebelum panggilan kembali sebenarnya dapat diukur (puluhan hingga ratusan milidetik atau lebih); sistem preemptively multitasking akan memiliki penjadwalan masuk pada jadwal doa berikutnya, perhatikan bahwa utas yang saat ini "berjalan" sebenarnya diblokir oleh panggilan tulis dan hanya beralih ke utas lain yang dapat dijalankan. (Dalam praktiknya itu sedikit lebih terlibat, tapi itu ide umum.)

Dalam lingkungan multitasking dan kooperatif yang preemptively, ada juga kemungkinan utas yang berbeda memiliki prioritas yang berbeda. Sebagai contoh, mungkin lebih penting untuk mengeksekusi secara tepat waktu utas yang menerima data melalui tautan komunikasi daripada yang memperbarui tampilan waktu sistem, sehingga utas penerima memiliki prioritas tinggi dan waktu yang menampilkan utas updater memiliki prioritas rendah . Prioritas utas berperan dalam keputusan penjadwal mana utas yang diizinkan untuk dieksekusi (misalnya, sangat disederhanakan, utas prioritas tinggi harus selalu dijalankan sebelum utas prioritas rendah, sehingga bahkan jika utas prioritas rendah masih berfungsi, jika utas prioritas tinggi menjadi runnable akan diutamakan), tetapi keputusan penjadwalan khusus tersebut tidak mempengaruhi desain mekanisme yang mendasarinya.

sebuah CVn
sumber
11
Saya suka "input pengguna khususnya sangat lambat"
John Dvorak
"Threads" a CPU "has" mengacu pada nomor yang dapat dieksekusi secara bersamaan pada saat tertentu. Ini beralih di antara utas aktif, memberikan masing-masing putaran, atau berbagi CPU untuk sepotong waktu, bila memungkinkan. Proses / utas "diblokir" atau menunggu di I / O (seperti disk, input keyboard / mouse, dll.) Atau sesuatu yang lain (seperti primitif sinkronisasi seperti mutex, dll.) Melompati giliran mereka.
LawrenceC
1
Komentar bagus untuk meminta klarifikasi, tetapi tidak cocok untuk diskusi panjang, dan pada beberapa titik menjadi sulit untuk dibaca. Bisakah Anda membawa ini ke Super User Chat saja? Terima kasih.
slhck
1
Sslhck Saya membuat sebuah ruangan, tetapi tidak dapat menemukan cara untuk memigrasi diskusi di komentar ini, yang akan menyenangkan. Apakah itu sesuatu yang dapat Anda lakukan secara manual sebagai moderator? chat.stackexchange.com/rooms/9547/…
a CVn
1
Sayangnya tidak ada. Ada proses migrasi otomatis yang tidak dapat dipicu secara manual, tetapi kami tidak dapat memindahkan komentar ke ruang obrolan. Kami akan membiarkan komentar di sini tetap untuk sementara waktu, tetapi saya mendorong orang lain untuk menindaklanjuti diskusi di ruang obrolan yang Anda buat.
slhck
18

Pikirkan tentang jalan raya empat lan dengan 1037 kendaraan.

OS Anda membutuhkan banyak proses yang berjalan untuk bekerja pada banyak layanan. Bahkan program grafis yang paling sederhana akan membutuhkan pemrograman multithreaded. Ketika Anda memikirkan banyak program Anda dibuka Anda melihat ada kebutuhan untuk berbagi sumber daya komputasi.

Apa yang ditunjukkan oleh pengelola tugas Anda adalah beban sistem saat ini. Apa yang diperlihatkan spesifikasi komputer Anda adalah berapa banyak utas (di frontend) yang diterima untuk dieksekusi secara paralel. Tanpa memasukkan banyak perbedaan antara fitur hyperthreading dan multicore, dengan penerimaan frontend thread yang lebih logis, sistem umumnya akan berkinerja lebih baik.

174140
sumber
8
"Bahkan program grafis yang paling sederhana pun akan membutuhkan pemrograman multithreaded." Salah. Sangat mungkin untuk menulis aplikasi GUI single-threaded; hingga Windows 95, untuk semua maksud dan tujuan semua orang melakukannya dengan cara itu. Itu membuat tugas-tugas tertentu lebih rumit (misalnya, pencetakan latar belakang sepele dengan banyak utas tetapi jelas non-sepele dalam aplikasi berulir tunggal, terutama jika Anda juga dibatasi memori seperti halnya pada saat itu), tetapi ada perbedaan besar antara " X dipermudah oleh Y "dan" X membutuhkan Y ".
CVn
8
@ MichaelKjörling: "hingga Windows 95, untuk semua maksud dan tujuan semua orang melakukannya dengan cara itu" * - benarkah? Bahkan pada sistem * nix menjalankan Motif di tahun 80-an?
LarsH
@LarsH Poin yang bagus, dan yang saya pikir sudah terlambat untuk mengedit komentar. Tapi itu tidak meniadakan intinya: yaitu, bahwa sangat mungkin untuk menulis aplikasi GUI single-threaded. Anda tidak perlu melakukan multithreading untuk itu, meskipun itu membuat beberapa tugas (lebih banyak) lebih mudah pada programmer.
CVn
@ MichaelKjörling: Saya setuju, itu tidak meniadakan poin Anda, yang merupakan poin yang valid. (Saya tidak berpikir pernyataan salah uprego meniadakan poinnya juga.)
LarsH
Sebagai contoh untuk apa yang dikatakan @ MichaelKjörling, Visual Basic (sebelum .NET) sebagai bahasa pemrograman tidak memiliki dukungan multi-threading. Semuanya dijalankan pada satu utas. Jika Anda ingin memproses input pengguna di tengah operasi yang berjalan lama, Anda akan menelepon DoEvents, yang akan memproses antrian pesan - tapi itu dilakukan pada utas yang sama dan akan memblokir operasi yang berjalan lama itu sampai semua pesan diproses . (Tentu saja, Anda dapat memanggil fungsi Win32 API dan / atau membuat proses tambahan, tetapi pada saat itu Anda juga dapat menggunakan salah satu bahasa tingkat rendah.)
Bob
5

Kita harus melangkah mundur dan bertanya pada diri sendiri: Bagaimana komputer dengan CPU tunggal dapat memiliki dua utas?

Utas adalah entitas perangkat lunak, bukan perangkat keras. Untuk memiliki utas lain, Anda hanya perlu memori untuk objek-objek yang membentuk utas, seperti struktur deskriptor dan tumpukan.

Sistem operasi beralih di antara utas pada berbagai waktu, seperti di dalam interupsi tertentu (seperti penghenti waktu) atau ketika utas membuat panggilan ke sistem operasi.

Dari semua utas yang ada dalam sistem, hanya sebagian yang biasanya dalam keadaan yang biasa disebut "runnable". Utas runnable sangat ingin dijalankan: mereka menjalankan, atau duduk di "run antrian", menunggu untuk dikirim oleh penjadwal. Utas yang tidak dapat dijalankan "diblokir", menunggu untuk mendapatkan sumber daya atau menerima input, atau "tidur" yang seperti diblokir pada input, di mana "input" adalah perjalanan waktu. "Sakelar konteks" terjadi ketika fungsi penjadwal dalam sistem operasi memperhatikan antrian proses suatu prosesor, dan memilih utas yang berbeda untuk dieksekusi.

Jangan bingung dengan "hyperthreading" , yang merupakan nama Intel untuk fitur perangkat keras tertentu.

Kaz
sumber