Ketika Anda memulai beberapa utas pada prosesor multi-inti, apakah dijamin akan diproses oleh inti yang berbeda?


24

Saya memiliki prosesor Pentium core i5, yang memiliki 4 core. Jika saya melakukan ini di program konsol C #

var t1 = new Thread(Thread1);
var t2 = new Thread(Thread2);
t1.Start();
t2.Start();

apakah t1 dan t2 thread dijamin berjalan pada core yang terpisah?


1
Dengan asumsi bahwa runtime C # menggunakan panggilan sistem asli yang setara untuk menelurkan utas lainnya (dan dengan demikian benar-benar paralel; ini bukan kasus untuk semuanya, seperti Kunci Penerjemah Global CPython yang terkenal ), ini hanya akan bergantung pada proses / penjadwal tugas sistem operasi . Secara umum, kode benar-benar aman jika Anda berasumsi t1dan t2dieksekusi pada waktu yang berbeda dalam urutan acak (misalnya, mungkin t2dimulai sebelumnya t1 dalam beberapa model).
Terobosan

2
Saya tidak tahu bahwa ada prosesor Pentium i5. Mungkin maksud Anda Core i5? Pilih-pilih Saya tahu: D
JosephGarrone

Jawaban:


18

Anda tidak dapat menjamin dalam .Net bahwa dua Threaddijalankan pada dua core yang terpisah. Bahkan, Anda juga tidak dapat menjamin bahwa seseorang hanya Threadakan berjalan pada satu inti (!) .

Ini karena utas yang dikelola tidak sama dengan utas OS - satu utas yang dikelola dapat menggunakan beberapa utas OS untuk mendukungnya. Dalam C #, Anda hanya pernah berhubungan langsung dengan berhasil Threads (setidaknya, tanpa menggunakan P / Invoke untuk memanggil fungsi WinAPI threading, yang Anda tidak harus lakukan) .

Namun, penjadwal .Net dan Windows sangat bagus dalam hal apa yang mereka lakukan - mereka tidak akan menjalankan dua utas pada satu inti sementara inti kedua duduk sepenuhnya menganggur. Jadi, secara umum, Anda tidak perlu khawatir.


Dalam prakteknya, Net Threads adalah OS benang. Tapi bukan itu sebabnya tidak ada jaminan bahwa satu utas akan selalu dijalankan pada inti yang sama.
svick

2
@vick: Dalam prakteknya, pada x86 , itu benar. Namun, standar secara eksplisit menyatakan bahwa Anda tidak bisa mengandalkan perilaku ini, sehingga bisa berubah di masa depan. Bahkan, itu tidak benar pada versi lain dari. CLR Net, seperti XBox 360.
BlueRaja - Danny Pflughoeft

@BlueRaja - Pertanyaan khusus tentang versi CLR yang sedang kita bicarakan. Anda dapat menjamin sesuatu akan ada pada dua core yang terpisah dengan menggunakan async threads karena itu berarti mereka akan terjadi async dari satu sama lain. Contoh kode saat ini adalah panggilan sinkronisasi secara teknis. Tentu saja sistem operasi memutuskan core apa yang akan digunakan.
Ramhound

@Ramhound "Anda dapat menjamin sesuatu akan ada pada dua core terpisah dengan menggunakan async threads" - itu salah. Kata asynckunci (yang saya anggap Anda bicarakan, karena "async threads" berlebihan) hanyalah gula sintaksis untuk menggunakan BackgroundWorkerutas, yang seperti utas lainnya. Utas bersih - Anda tidak dapat menjamin apakah itu akan berjalan pada inti yang terpisah atau tidak.
BlueRaja - Danny Pflughoeft

@BlueRaja - Jika dua async thread dimulai mereka berdua akan berjalan pada saat yang sama asalkan ada 2 core CPU. Jika hanya ada satu maka sistem operasi akan menjadwalkan ketika setiap utas akan mendapat prioritas dan berjalan dan situasi meronta-ronta tipikal tunggal Anda akan terjadi. Ini adalah bagaimana saya diajarkan bagaimana sebuah CPU menangani multi-threads.
Ramhound

15

Tidak, OS dan CPU akan memutuskan apa yang akan dijalankan dan kapan. dalam contoh sederhana yang telah Anda tunjukkan, dengan mengesampingkan tugas-tugas lain, ya itu kemungkinan besar akan berjalan secara paralel pada core yang terpisah, tetapi jarang ada jaminan bahwa itu akan menjadi kasusnya.

Anda dapat menggunakan afinitas utas untuk mencoba mengambil kendali atas alokasi inti ke utas yang diberikan.

Juga pertimbangkan prioritas penjadwalan untuk menumpuk dek dalam hal thread mana yang sepenuhnya paralel, dan mana yang bisa menunggu.


1
Saya juga ingin menambahkan, bahwa dengan teknologi virtualisasi ada lapisan lain antara program Anda dan perangkat keras. Apa yang disajikan OS untuk aplikasi mungkin tidak akurat secara fisik.
Keltari

1
Itu adalah fungsi WinAPI untuk utas OS, bukan untuk utas yang dikelola. Mereka tidak boleh dipanggil dari C #, karena mereka bisa sangat mengganggu penjadwal thread Net.
BlueRaja - Danny Pflughoeft
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.