Apa yang terjadi pada konten cache pada sakelar konteks?

50

Dalam prosesor multicore, apa yang terjadi pada isi cache inti (katakanlah L1) ketika saklar konteks terjadi pada cache itu?

Apakah perilaku tergantung pada arsitektur atau apakah itu perilaku umum yang diikuti oleh semua produsen chip?

Ankit
sumber

Jawaban:

42

Itu tergantung pada prosesor (tidak hanya seri prosesor, itu dapat bervariasi dari model ke model) dan sistem operasi, tetapi ada prinsip-prinsip umum. Apakah prosesor multicore tidak memiliki dampak langsung pada aspek ini; proses yang sama bisa dijalankan pada banyak core secara bersamaan (jika multithreaded), dan memori dapat dibagi antara proses, sehingga sinkronisasi cache tidak dapat dihindari terlepas dari apa yang terjadi pada konteks switch.

Ketika prosesor mencari lokasi memori dalam cache, jika ada MMU , ia dapat menggunakan alamat fisik atau virtual lokasi itu (kadang-kadang bahkan kombinasi keduanya, tetapi itu tidak benar-benar relevan di sini).

Dengan alamat fisik, tidak masalah proses mana yang mengakses alamat, konten dapat dibagikan. Jadi tidak perlu membatalkan konten cache selama pergantian konteks. Jika kedua proses memetakan halaman fisik yang sama dengan atribut yang berbeda, ini ditangani oleh MMU (bertindak sebagai MPU (unit perlindungan memori)). Kelemahan dari cache yang dialamatkan secara fisik adalah bahwa MMU harus duduk di antara prosesor dan cache, sehingga pencarian cache menjadi lambat. L1 cache hampir tidak pernah alamat fisik; cache tingkat yang lebih tinggi mungkin.

Alamat virtual yang sama dapat menunjukkan lokasi memori yang berbeda dalam proses yang berbeda. Oleh karena itu, dengan cache yang ditangani secara virtual, prosesor dan sistem operasi harus bekerja sama untuk memastikan bahwa suatu proses akan menemukan memori yang tepat. Ada beberapa teknik umum. Kode switching konteks yang disediakan oleh sistem operasi dapat membatalkan seluruh cache; ini benar tetapi sangat mahal. Beberapa arsitektur CPU memiliki ruang di baris cache mereka untuk ASID (address space identifier) ​​versi perangkat keras dari ID proses, juga digunakan oleh MMU. Ini secara efektif memisahkan entri cache dari proses yang berbeda, dan berarti bahwa dua proses yang memetakan halaman yang sama akan memiliki pandangan tidak koheren dari halaman fisik yang sama (biasanya ada nilai ASID khusus yang menunjukkan halaman bersama, tetapi ini harus disiram jika mereka tidak dipetakan ke alamat yang sama di semua proses di mana mereka dipetakan). Jika sistem operasi berhati-hati bahwa proses yang berbeda menggunakan ruang alamat yang tidak tumpang tindih (yang mengalahkan beberapa tujuan menggunakan memori virtual, tetapi kadang-kadang dapat dilakukan), maka garis cache tetap valid.

Sebagian besar prosesor yang memiliki MMU juga memiliki TLB . TLB adalah cache pemetaan dari alamat virtual ke alamat fisik. TLB dikonsultasikan sebelum mencari di cache yang dialamatkan secara fisik, untuk menentukan alamat fisik dengan cepat bila memungkinkan; prosesor dapat memulai pencarian cache sebelum pencarian TLB selesai, karena seringkali jalur cache kandidat dapat diidentifikasi dari bit tengah alamat, antara bit yang menentukan offset dalam garis cache dan bit yang menentukan halaman. Cache yang dialamati secara virtual mem-bypass TLB jika ada cache hit, meskipun prosesor dapat memulai pencarian TLB ketika sedang menanyakan cache, jika terjadi kesalahan.

TLB itu sendiri harus dikelola selama pergantian konteks. Jika entri TLB berisi ASID, mereka dapat tetap di tempatnya; sistem operasi hanya perlu mem-flush entri TLB jika ASID-nya telah mengubah makna (misalnya karena suatu proses telah keluar). Jika entri TLB bersifat global, entri tersebut harus tidak valid saat beralih ke konteks yang berbeda.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
2
Sangat informatif. Jika Anda dapat menambahkan beberapa contoh bagaimana ini dilakukan dalam arsitektur nyata, itu akan lebih baik.
JohnTortugo
2
@JohnTortugo Apa yang saya tulis berhubungan cukup dekat dengan apa yang dapat Anda lakukan pada ARMv7 (mis. CPU dari ponsel cerdas Anda) (satu-satunya arsitektur di mana saya pernah menulis kode penanganan MMU). Saya berharap platform lain seperti x86 cukup mirip tetapi saya tidak bisa menulis tentang mereka. Jika Anda mencari informasi konkret tentang platform nyata, Ilmu Komputer bukan situs yang tepat, Anda bisa bertanya tentang Stack Overflow atau Teknik Listrik atau Embeddedd (diusulkan) .
Gilles 'SO- stop being evil'
10

Cache biasanya tidak menyadari adanya sakelar konteks. Hanya urutan alamat memori yang diakses yang menentukan garis cache yang diganti.

Kebijakan penggantian biasanya tergantung heuristik pada pabrikan dan arsitektur mikro tertentu. Masalahnya adalah heuristik tidak dapat memprediksi masa depan, yang alamat dan oleh karena itu garis cache akan diakses selanjutnya.

Heuristik dapat menjadi sederhana seperti LRU (paling baru digunakan). Tetapi dengan CPU modern heuristik lebih rumit.

Lihatlah Manual Pengembang Perangkat Lunak Arsitektur Intel® 64 dan IA-32 Volume 3 Bab 11 menjelaskan cache memori dan mekanisme kontrol cache. AMD memiliki ini dalam Bab 7 dari Manual Arsitektur AMD64 Programmer Volume 2: Pemrograman sistem . Untuk CPU berbasis ARM, tampaknya PDF hanya tersedia untuk pelanggan terdaftar.

uli
sumber
Bisakah Anda memberikan referensi untuk paragraf pertama? Atau apakah dokumen tertaut merujuk pada masalah ini?
Raphael
Perilaku ini sangat bergantung pada apakah cache ditangani secara fisik atau virtual. Kebijakan penggantian tidak relevan di sini. Untuk ARM, ada informasi dalam manual teknis prosesor, yang bersifat publik, misalnya L1 pada Cortex-A9 (apa yang Anda dapatkan di ponsel generasi terbaru), meskipun mungkin sulit untuk dipahami tanpa manual referensi arsitektur non-publik .
Gilles 'SO- stop being evil'
1
@Raphael saya menulis "biasanya" karena dengan prosesor yang saya temui, cache itu sendiri tidak memiliki pengetahuan tentang utas, proses, konteks, dll. Itu hanya bereaksi terhadap akses memori. Jika cache data memerah dan cache instruksi tidak valid pada switch konteks, maka OS yang memicu tindakan ini bukan cache. Jika Anda menginstal OS yang berbeda, perilaku ini mungkin berubah.
uli
@Gilles Sekali saya mencoba memberikan jawaban singkat dan memutuskan untuk tidak menulis tentang memori virtual, karena ini langsung melibatkan OS. Dan ada skala waktu untuk dipertimbangkan juga. "Tidak ada yang berubah" bisa menjadi jawaban untuk waktu antara sakelar konteks dan akses memori berikutnya, karena konten cache mungkin tidak valid tetapi tidak diubah sama sekali.
uli