Jawaban:
Perbedaan utama antara sakelar utas dan sakelar proses adalah bahwa selama sakelar utas, ruang memori virtual tetap sama, sementara itu tidak selama sakelar proses. Kedua jenis ini melibatkan penyerahan kontrol ke kernel sistem operasi untuk menjalankan pengalih konteks. Proses peralihan masuk dan keluar dari kernel OS bersama dengan biaya peralihan register adalah biaya tetap terbesar untuk melakukan peralihan konteks.
Biaya yang lebih kabur adalah bahwa sakelar konteks mengacaukan mekanisme cache prosesor. Pada dasarnya, ketika Anda beralih konteks, semua alamat memori yang "diingat" oleh prosesor dalam cache-nya secara efektif menjadi tidak berguna. Satu perbedaan besar di sini adalah ketika Anda mengubah ruang memori virtual, Translation Lookaside Buffer (TLB) prosesor atau yang setara akan memudar sehingga akses memori jauh lebih mahal untuk sementara waktu. Ini tidak terjadi selama peralihan utas.
Proses pengalihan konteks melibatkan pengalihan ruang alamat memori. Ini termasuk alamat memori, pemetaan, tabel halaman, dan sumber daya kernel — operasi yang relatif mahal. Pada beberapa arsitektur, ini bahkan berarti membuang berbagai cache prosesor yang tidak dapat dibagikan di seluruh ruang alamat. Misalnya, x86 harus membersihkan TLB dan beberapa prosesor ARM harus membersihkan keseluruhan cache L1!
Peralihan utas adalah peralihan konteks dari satu utas ke utas lain dalam proses yang sama (beralih dari utas ke utas melintasi proses hanyalah proses beralih). Beralih status prosesor (seperti penghitung program dan isi register) umumnya sangat efisien.
Pertama-tama, sistem operasi membawa utas keluar dalam mode kernel jika belum ada, karena peralihan utas hanya dapat dilakukan antar utas, yang berjalan dalam mode kernel. Kemudian penjadwal dipanggil untuk membuat keputusan tentang utas yang akan dilakukan pengalihan. Setelah keputusan dibuat, kernel menyimpan bagian dari konteks utas yang terletak di CPU (register CPU) ke dalam tempat khusus di memori (sering kali di atas tumpukan kernel dari utas keluar). Kemudian kernel melakukan peralihan dari tumpukan kernel dari utas keluar ke tumpukan kernel dari utas masuk. Setelah itu, kernel memuat konteks thread masuk yang disimpan sebelumnya dari memori ke register CPU. Dan akhirnya mengembalikan kontrol kembali ke mode pengguna, tetapi dalam mode pengguna utas baru. Jika OS telah menentukan bahwa thread masuk berjalan masukproses lain , kernel melakukan satu langkah tambahan: menetapkan ruang alamat virtual aktif baru.
Biaya utama dalam kedua skenario terkait dengan polusi cache. Dalam kebanyakan kasus, set kerja yang digunakan oleh thread keluar akan berbeda secara signifikan dari set kerja yang digunakan oleh thread masuk. Akibatnya, thread yang masuk akan memulai hidupnya dengan longsoran cache yang terlewat, sehingga menghapus data lama dan tidak berguna dari cache dan memuat data baru dari memori. Hal yang sama berlaku untuk TLB (Translation Look Aside Buffer, yang ada di CPU). Dalam kasus pengaturan ulang ruang alamat virtual (utas berjalan dalam proses yang berbeda) hukumannya lebih buruk, karena pengaturan ulang ruang alamat virtual menyebabkan pembilasan seluruh TLB, bahkanjika utas baru sebenarnya hanya perlu memuat beberapa entri baru. Akibatnya, utas baru akan memulai kuantum waktunya dengan banyak TLB meleset dan sering berjalan halaman. Biaya langsung switch thread juga tidak dapat diabaikan (dari ~ 250 dan hingga ~ 1500-2000 siklus) dan bergantung pada kompleksitas CPU, status thread dan rangkaian register yang sebenarnya mereka gunakan.
PS: Posting bagus tentang overhead pengalihan konteks: http://blog.tsunanet.net/2010/11/how-long-does-it-take-to-make-context.html
Dalam Pengalihan Konteks Utas, ruang memori virtual tetap sama meskipun tidak dalam kasus Peralihan Konteks Proses. Selain itu, Sakelar Konteks Proses lebih mahal daripada Sakelar Konteks Benang.
Saya pikir perbedaan utama adalah ketika memanggil switch_mm()
yang menangani deskriptor memori dari tugas lama dan baru. Dalam kasus utas, ruang alamat memori virtual tidak berubah (utas berbagi memori virtual), jadi sangat sedikit yang harus dilakukan, dan karena itu lebih murah.
Meskipun pengalihan konteks utas perlu mengubah konteks eksekusi (register, penunjuk tumpukan, penghitung program), mereka tidak perlu mengubah ruang alamat seperti yang dilakukan oleh sakelar konteks proses. Ada biaya tambahan saat Anda mengganti ruang alamat, lebih banyak akses memori (paging, segmentasi, dll) dan Anda harus menghapus TLB saat masuk atau keluar dari proses baru ...
Singkatnya, sakelar konteks utas tidak menetapkan satu set memori dan pid baru, ia menggunakan yang sama dengan induk karena berjalan dalam proses yang sama. Sebuah proses yang memunculkan proses baru dan dengan demikian menetapkan mem dan pid baru.
Ada lebih dari itu. Mereka telah menulis buku tentang itu.
Mengenai biaya, utas sakelar konteks proses >>>> karena Anda harus mengatur ulang semua penghitung tumpukan, dll.
Dengan asumsi bahwa CPU yang dijalankan OS memiliki Beberapa Perangkat Latensi Tinggi Terlampir,
Masuk akal untuk menjalankan utas lain Ruang Alamat Proses, sementara perangkat latensi tinggi merespons kembali.
Tetapi, jika Perangkat Latensi Tinggi merespons lebih cepat daripada waktu yang diperlukan untuk melakukan pengaturan tabel + terjemahan memori Virtual Ke Fisik untuk Proses BARU, maka dipertanyakan apakah sakelar itu penting sama sekali.
Selain itu, cache HOT (data yang dibutuhkan untuk menjalankan proses / utas dapat dijangkau dalam waktu yang lebih singkat) adalah pilihan yang lebih baik.