Bagaimana saya dapat memiliki 1805 utas saat saya hanya memiliki 4 CPU virtual?

10

Saya bertanya-tanya apakah seseorang dapat menjelaskan kepada saya bagaimana di Monitor Aktivitas saya mengatakan bahwa saya saat ini memiliki 1805 utas Cuplikan layar Monitor Aktivitas X OS

Tetapi saya hanya memiliki 4 core virtual di komputer saya (yang berarti saya hanya dapat memiliki 4 thread). Apakah thread dihitung berarti semua utas yang sedang ditangani oleh CPU ketika mereka memutuskan utas mana yang akan dieksekusi?

EDIT: Alasan saya berpikir bahwa hanya ada 4 utas pada mesin saya berasal dari jawaban ini . Saya percaya bahwa kesalahpahaman saya berasal dari kata 'utas' yang digunakan dalam konteks yang berbeda.

YellowPillow
sumber
Komentar bukan untuk diskusi panjang; percakapan ini telah dipindahkan ke obrolan .
bmike

Jawaban:

24

Penjadwalan

1.805 utas Anda tidak berjalan secara bersamaan . Mereka menukar. Satu core menjalankan sedikit utas, lalu menyisihkannya untuk menjalankan sedikit utas lainnya. Inti lainnya melakukan hal yang sama. Berputar-putar, utas mengeksekusi sedikit demi sedikit, tidak sekaligus.

Tanggung jawab utama sistem operasi (Darwin dan macOS) adalah penjadwalan utas mana yang akan dieksekusi pada inti yang berapa lama.

Banyak utas tidak memiliki pekerjaan yang harus dilakukan, sehingga dibiarkan tidak aktif dan tidak terjadwal. Demikian juga, banyak utas mungkin menunggu pada beberapa sumber daya seperti data yang akan diambil dari penyimpanan, atau koneksi jaringan yang harus diselesaikan, atau data yang akan diambil dari database. Dengan hampir tidak ada yang bisa dilakukan selain memeriksa status sumber daya yang ditunggu-tunggu, utas semacam itu dijadwalkan secara singkat jika memang ada.

Pemrogram aplikasi dapat membantu operasi penjadwalan ini dengan tidur utangnya selama beberapa waktu ketika dia tahu menunggu sumber daya eksternal akan memakan waktu. Dan jika menjalankan loop "ketat" yang merupakan CPU-intensif tanpa alasan untuk menunggu sumber daya eksternal, programmer dapat memasukkan panggilan ke sukarelawan untuk dikesampingkan secara singkat agar tidak memakan inti dan dengan demikian memungkinkan utas lainnya untuk mengeksekusi.

Untuk detail lebih lanjut, lihat halaman Wikipedia untuk multithreading .

Multi-Threading Simultan

Sedangkan untuk Pertanyaan Anda yang ditautkan , utas memang ada yang sama dengan di sini.

Satu masalah ada biaya overhead untuk beralih antar utas saat dijadwalkan oleh OS. Ada biaya yang signifikan dalam waktu untuk membongkar instruksi dan data utas saat ini dari inti dan kemudian memuat petunjuk dan data utas yang dijadwalkan berikutnya. Bagian dari tugas sistem operasi adalah mencoba menjadi pintar dalam menjadwalkan utas untuk mengoptimalkan biaya overhead ini.

Beberapa pembuat CPU telah mengembangkan teknologi untuk memotong waktu ini sehingga membuat peralihan di antara sepasang utas lebih cepat. Intel menyebut teknologi mereka Hyper-Threading . Dikenal secara umum sebagai multi-threading simultan (SMT) .

Sementara sepasang utas tidak benar-benar dieksekusi secara bersamaan, pergantian sangat halus dan cepat sehingga kedua utas tersebut tampak secara simultan. Ini bekerja sangat baik sehingga masing-masing inti menampilkan dirinya sebagai sepasang core virtual ke OS. Jadi CPU yang diaktifkan SMT dengan empat inti fisik, misalnya, akan menampilkan dirinya ke OS sebagai CPU delapan inti.

Meskipun ada optimasi ini, masih ada beberapa overhead untuk beralih antara core virtual tersebut. Terlalu banyak utas intensif-CPU yang semuanya menuntut waktu eksekusi yang dijadwalkan pada sebuah inti dapat membuat sistem tidak efisien, tanpa ada satu utas yang mendapatkan banyak pekerjaan. Seperti tiga bola di taman bermain yang dibagi antara sembilan anak, versus berbagi antara sembilan ratus anak di mana tidak ada anak yang benar-benar mendapatkan waktu bermain yang serius dengan bola.

Jadi ada opsi dalam firmware CPU di mana sysadmin dapat mematikan mesin untuk menonaktifkan SMT jika dia memutuskan akan menguntungkan penggunanya yang menjalankan aplikasi yang biasanya terikat CPU dengan sedikit peluang untuk menjeda.

Dalam kasus seperti itu, kami kembali ke Pertanyaan awal Anda: Dalam situasi khusus ini Anda tentu ingin membatasi operasi agar tidak memiliki lebih dari utas hiperaktif ini daripada Anda memiliki inti fisik. Tetapi saya ulangi: ini adalah situasi yang sangat tidak biasa yang mungkin terjadi dalam sesuatu seperti proyek penguraian data ilmiah khusus tetapi hampir tidak akan pernah berlaku untuk skenario bisnis / perusahaan / perusahaan umum.

Basil Bourque
sumber
Komentar bukan untuk diskusi panjang; percakapan ini telah dipindahkan ke obrolan .
bmike
Juga, tidak ada yang memasukkan yield()panggilan sistem ke utas intensif CPU mereka (kecuali itu kode warisan dari multi-tasking kooperatif pada MacOS Klasik). Pre-emptive penjadwalan ulang multi-tugas setelah utas menggunakan waktu kutu nya.
Peter Cordes
Deskripsi hiphreading Anda salah. Utas perangkat keras! = Utas perangkat lunak, semuanya adalah konteks eksekusi / inti logis. Kedua inti logis pada inti fisik benar-benar menjalankan instruksi mereka pada saat yang sama. Front-end berganti-ganti antara utas (setiap siklus), tetapi inti eksekusi yang tidak berurutan dapat menjalankan instruksi / uops dari kedua utas dalam siklus yang sama. Ini memperlihatkan paralelisme tingkat instruksi dari dua utas ke eksekusi OoO untuk menjaga agar unit eksekusi tetap bekerja dengan baik (ini pada dasarnya adalah titik SMT). Ini bukan hanya "pengalihan konteks yang dioptimalkan".
Peter Cordes
7

Di masa lalu - memori tidak divirtualisasi atau dilindungi dan kode apa pun bisa menulis di mana saja. Pada masa itu desain satu utas ke satu CPU masuk akal. Dalam beberapa dekade sejak itu, memori pertama dilindungi dan kemudian divirtualisasikan. Pikirkan utas sebagai inti virtual - semacam janji bahwa pada suatu saat ketika data dan kode Anda siap, utas itu didorong ( atau dijadwalkan sebagai insinyur PHD dan ahli matematika yang melakukan penelitian tentang penjadwalan algoritma menyebutnya ) ke CPU yang sebenarnya untuk lakukan pekerjaan yang sebenarnya.

masukkan deskripsi gambar di sini

Sekarang - karena besarnya perbedaan waktu - CPU dan cache beroperasi sangat cepat dibandingkan dengan mendapatkan data dari penyimpanan atau jaringan - sehingga ribuan utas dapat datang dan pergi sementara satu utas sedang menunggu www.google.com untuk mengirimkan paket atau dua data sehingga itulah alasan mengapa Anda melihat begitu banyak utas daripada CPU sebenarnya.

Jika Anda mengonversi operasi utas yang terjadi pada skala waktu hitam / biru dan mengubahnya menjadi satu detik = 1 ns, hal-hal yang kami pedulikan lebih seperti disk IO, 100 mikrodetik seperti 4 hari dan perjalanan pulang-pergi internet 200 ms adalah Penundaan 20 tahun jika Anda menghitung detik pada skala waktu CPU. Seperti banyak kekuatan dari sepuluh latihan , dalam hampir semua kasus - CPU duduk diam selama "bulan" menunggu pekerjaan yang bermakna dari dunia eksternal yang sangat, sangat lambat.

Sepertinya tidak ada yang salah pada gambar yang Anda poskan jadi mungkin kami salah memahami apa yang Anda maksud dengan bertanya tentang utas.

Jika Anda mengklik kanan (klik kontrol) pada utas kata di baris tajuk di bagian atas, tambahkan status aplikasi dan Anda akan melihat sebagian besar utas cenderung menganggur, tidur, tidak berjalan pada saat tertentu.

bmike
sumber
Komentar bukan untuk diskusi panjang; percakapan ini telah dipindahkan ke obrolan .
bmike
1

Anda tidak mengajukan pertanyaan yang lebih mendasar, "Bagaimana saya bisa memiliki 290 proses ketika CPU saya hanya memiliki empat core?" Jawaban ini sedikit sejarah, yang mungkin membantu Anda memahami gambaran besarnya, meskipun pertanyaan spesifik telah dijawab. Karena itu, saya tidak akan memberikan versi TL; DR.

Sekali waktu (pikirkan, tahun 1950-an -60-an), komputer hanya bisa melakukan satu hal pada satu waktu. Kamar-kamar itu sangat mahal, memenuhi seluruh ruangan, dan kami membutuhkan cara untuk memanfaatkannya secara efisien dengan membagikannya di antara banyak orang. Cara pertama untuk melakukan ini adalah pemrosesan batch , di mana pengguna akan mengirimkan tugas ke komputer dan mereka akan antri, dieksekusi satu demi satu dan hasilnya akan dikirim kembali ke pengguna. Itu baik-baik saja tetapi itu berarti bahwa, jika Anda ingin melakukan perhitungan yang akan memakan waktu beberapa hari, tidak ada orang lain yang dapat menggunakan komputer selama waktu itu.

Inovasi berikutnya (pikirkan, 1960-an-70-an) adalah pembagian waktu . Sekarang, alih-alih menjalankan seluruh satu tugas, lalu seluruh tugas berikutnya, komputer akan menjalankan sedikit satu tugas, lalu menjeda dan menjalankan sedikit tugas berikutnya, dan seterusnya. Dengan demikian, komputer akan memberi kesan bahwa ia menjalankan beberapa proses secara bersamaan. Keuntungan besar dari ini adalah bahwa sekarang Anda dapat menjalankan perhitungan yang akan memakan waktu beberapa hari dan, meskipun sekarang akan memakan waktu lebih lama, karena terus terputus, orang lain masih dapat menggunakan mesin selama waktu itu.

Semua ini untuk komputer besar gaya mainframe. Ketika komputer pribadi mulai menjadi populer, mereka pada awalnya tidak terlalu kuat dan, hei, karena mereka pribadi sepertinya OK bagi mereka untuk hanya dapat melakukan satu hal & nbdp; - menjalankan satu aplikasi - sekaligus (pikirkan, 1980-an). Tetapi, ketika mereka menjadi lebih kuat (pikirkan, tahun 1990-an untuk mempresentasikan), orang-orang menginginkan komputer pribadi mereka untuk berbagi waktu juga.

Jadi kami berakhir dengan komputer pribadi yang memberikan ilusi menjalankan beberapa proses secara bersamaan dengan benar-benar menjalankannya satu per satu untuk periode yang singkat dan kemudian menghentikannya. Utas pada dasarnya adalah hal yang sama: pada akhirnya, orang menginginkan bahkan proses individual untuk memberikan ilusi melakukan banyak hal secara bersamaan. Pada awalnya, penulis aplikasi harus mengatasinya sendiri: menghabiskan sedikit waktu memperbarui grafik, berhenti sebentar, menghabiskan sedikit waktu menghitung, berhenti sebentar, menghabiskan sedikit saat melakukan sesuatu yang lain, ...

Namun, sistem operasi sudah baik dalam mengelola beberapa proses, masuk akal untuk memperluasnya untuk mengelola sub-proses ini, yang disebut utas. Jadi, sekarang, kami memiliki model di mana setiap proses (atau aplikasi) berisi setidaknya satu utas, tetapi beberapa berisi beberapa atau banyak. Masing-masing utas ini berhubungan dengan subtugas yang agak independen.

Namun, pada level teratas, CPU masih hanya memberikan ilusi bahwa semua thread ini berjalan pada saat yang bersamaan. Pada kenyataannya, ini menjalankan satu untuk sedikit, menjeda, memilih yang lain untuk berjalan sedikit, dan seterusnya. Kecuali bahwa CPU modern dapat menjalankan lebih dari satu utas sekaligus. Jadi, dalam kenyataan yang sebenarnya , sistem operasi memainkan permainan "lari sebentar, berhenti sebentar, jalankan sesuatu yang lain sebentar, berhenti sebentar" pada semua inti secara bersamaan. Jadi, Anda dapat memiliki utas sebanyak yang Anda (dan perancang aplikasi) inginkan tetapi, setiap saat, semua kecuali beberapa dari mereka akan dijeda.

David Richerby
sumber