Seperti yang kita sedia maklum, Linux ialah sistem pengendalian yang menyokong multitasking Bilangan tugas yang boleh dijalankan pada masa yang sama jauh melebihi bilangan CPU. Sudah tentu, tugas-tugas ini sebenarnya tidak berjalan pada masa yang sama (untuk satu CPU), tetapi kerana sistem memperuntukkan CPU kepada tugas-tugas ini secara bergilir-gilir untuk tempoh masa yang singkat, mewujudkan ilusi berbilang tugas yang berjalan pada masa yang sama .
Sebelum setiap tugasan dijalankan, CPU perlu tahu di mana untuk memuatkan dan memulakan tugas itu. Ini bermakna sistem perlu menetapkan mendaftar dan pembilang program CPU terlebih dahulu.
Daftar CPU ialah kepingan memori yang kecil tetapi sangat pantas dibina ke dalam CPU. Kaunter program digunakan untuk menyimpan lokasi arahan yang sedang dilaksanakan oleh CPU atau lokasi arahan seterusnya yang akan dilaksanakan.
Kedua-dua ini adalah persekitaran yang diperlukan untuk CPU sebelum ia boleh melaksanakan sebarang tugas, jadi ia dipanggil "konteks CPU". Sila rujuk gambar di bawah:
Sekarang anda tahu apa itu konteks CPU, saya rasa mudah untuk anda fahami Penukaran konteks CPU. "Suis konteks CPU" merujuk kepada menyimpan konteks CPU (daftar CPU dan pembilang program) tugas sebelumnya, kemudian memuatkan konteks tugas baharu ke dalam daftar dan pembilang program ini, dan akhirnya melompat ke pembilang program.
Konteks yang disimpan ini disimpan dalam kernel sistem dan dimuatkan semula apabila pelaksanaan tugas dijadualkan semula. Ini memastikan bahawa keadaan asal tugasan tidak terjejas dan tugasan kelihatan berjalan secara berterusan.
Anda mungkin mengatakan bahawa penukaran konteks CPU tidak lebih daripada mengemas kini daftar CPU dan nilai pembilang program, dan daftar ini direka bentuk untuk menjalankan tugas dengan cepat, jadi mengapa ia menjejaskan prestasi CPU?
Sebelum menjawab soalan ini, pernahkah anda terfikir apakah "tugas" ini? Anda mungkin mengatakan bahawa tugas ialah proses atau benang. Ya, proses dan utas adalah tugas yang paling biasa, tetapi terdapat jenis tugas lain selain itu.
Jangan lupaGangguan perkakasan juga merupakan tugas biasa Isyarat pencetus perkakasan akan menyebabkan pengendali gangguan dipanggil.
Oleh itu, terdapat sekurang-kurangnya tiga jenis suis konteks CPU yang berbeza:
Jom tengok satu persatu.
Linux membahagikan ruang proses proses kepada ruang kernel dan ruang pengguna mengikut tahap keistimewaan, yang sepadan dengan tahap keistimewaan CPU Ring 0
和 Ring 3
dalam rajah di bawah.
Ring 0
) mempunyai kebenaran tertinggi dan boleh terus mengakses semua sumberRing 3
) hanya boleh mengakses sumber terhad dan tidak boleh mengakses terus peranti perkakasan seperti memori. Ia mesti terperangkapke dalam kernel melalui panggilan sistemuntuk mengakses sumber istimewa ini. Melihatnya dari perspektif lain, proses boleh berjalan dalam ruang pengguna dan ruang kernel. Apabila proses berjalan dalam ruang pengguna, ia dipanggil keadaan pengguna proses tersebut Apabila ia jatuh ke dalam ruang kernel, ia dipanggil keadaan kernel proses.
Penukaran daripada mod pengguna kepada mod kernel perlu diselesaikan melalui panggilan sistem. Sebagai contoh, apabila kami melihat kandungan fail, kami memerlukan panggilan sistem berikut:
open()
: Buka fail read()
: Baca kandungan failwrite()
: Tulis kandungan fail ke fail output (termasuk output standard) close()
: Tutup fail Jadi adakah penukaran konteks CPU akan berlaku semasa panggilan sistem di atas? Sudah tentu ya.
Ini memerlukan menyimpan lokasi arahan mod pengguna asal dalam daftar CPU terlebih dahulu. Seterusnya, untuk melaksanakan kod mod kernel, daftar CPU perlu dikemas kini ke lokasi baharu arahan mod kernel. Akhir sekali, lompat ke keadaan kernel untuk menjalankan tugas kernel.
Kemudian selepas panggilan sistem tamat, daftar CPU perlu memulihkankeadaan pengguna yang disimpan asal, dan kemudian beralih ke ruang pengguna untuk meneruskan proses tersebut.
Jadi, semasa panggilan sistem, sebenarnya terdapat dua suis konteks CPU.
Tetapi perlu diingatkan bahawa proses panggilan sistem tidak akan melibatkan penukaran proses, dan juga tidak akan melibatkan penukaran sumber sistem seperti memori maya. Ini berbeza daripada apa yang biasa kita panggil "penukaran konteks proses". Penukaran konteks proses merujuk kepada penukaran daripada satu proses ke proses yang lain, manakala proses yang sama sentiasa berjalan semasa panggilan sistem
Proses panggilan sistem selalunya dipanggil suis mod keistimewaan, bukannya suis konteks. Tetapi sebenarnya, semasa proses panggilan sistem, penukaran konteks CPU juga tidak dapat dielakkan.
Jadi apakah perbezaan antara penukaran konteks proses dan panggilan sistem? Pertama sekali, proses diuruskan oleh kernel, dan penukaran proses hanya boleh berlaku dalam mod kernel. Oleh itu, konteks proses bukan sahaja termasuk sumber ruang pengguna seperti memori maya, stack dan pembolehubah global, tetapi juga termasuk keadaan ruang kernel seperti kernel stack dan registers.
Jadi proses penukaran konteks mempunyai satu langkah lagi daripada panggilan sistem:
Sebelum menyimpan keadaan kernel dan daftar CPU proses semasa, anda perlu menyimpan memori maya, tindanan, dll. proses dan memuatkan keadaan kernel proses seterusnya.
Menurut laporan ujian Tsuna, setiap suis konteks memerlukan berpuluh-puluh nanosaat hingga mikrosaat masa CPU. Masa ini agak besar, terutamanya dalam kes sejumlah besar suis konteks proses, yang boleh menyebabkan CPU menghabiskan banyak masa untuk menyimpan dan memulihkan sumber seperti daftar, tindanan kernel dan memori maya dengan mudah. Inilah yang kita bincangkan dalam artikel lepas, faktor penting yang menyebabkan purata beban meningkat.
Jadi, bilakah proses tersebut akan dijadualkan/ditukar untuk dijalankan pada CPU? Sebenarnya, terdapat banyak senario, biar saya ringkaskan untuk anda di bawah:
sleep
, ia secara semula jadi akan dijadualkan semula.
Apabila proses dengan keutamaan yang lebih tinggi sedang berjalan, untuk memastikan perjalanan proses keutamaan tinggi, proses semasa akan digantung oleh proses keutamaan tinggiPenukaran konteks benang
pemerolehan sumber. Secara terang-terangan, apa yang dipanggil penjadualan tugas dalam kernel sebenarnya menjadualkan utas dan proses hanya menyediakan sumber seperti memori maya dan pembolehubah global untuk utas. Jadi, untuk urutan dan proses, kita boleh memahaminya dengan cara ini:
Apabila satu proses hanya mempunyai satu utas, ia boleh dianggap bahawa satu proses adalah sama dengan satu utas
Pertama sekali, dua utas sebelum dan selepas tergolong dalam proses yang berbeza. Pada masa ini, kerana sumber tidak dikongsi, proses penukaran adalah sama seperti penukaran konteks proses.
Ganggu penukaran konteks
Untuk bertindak balas dengan cepat kepada acara, gangguan perkakasan akan mengganggu proses penjadualan dan pelaksanaan biasa dan kemudian memanggil pengendali gangguan
.Apabila mengganggu proses lain, keadaan semasa proses perlu disimpan supaya proses masih boleh dipulihkan daripada keadaan asal selepas gangguan.
Tidak seperti konteks proses, penukaran konteks gangguan tidak melibatkan keadaan pengguna proses tersebut. Oleh itu, walaupun proses gangguan mengganggu proses dalam mod pengguna, tidak perlu menyimpan dan memulihkan sumber mod pengguna seperti memori maya dan pembolehubah global proses tersebut.Selain itu, seperti penukaran konteks proses, penukaran konteks gangguan juga menggunakan CPU. Masa penukaran yang berlebihan akan menggunakan banyak sumber CPU dan malah mengurangkan prestasi keseluruhan sistem secara serius. Oleh itu, apabila anda mendapati bahawa terdapat terlalu banyak gangguan, anda perlu memberi perhatian untuk menyemak sama ada ia akan menyebabkan masalah prestasi yang serius untuk sistem anda.
Kesimpulan
Walau bagaimanapun, penukaran konteks yang berlebihan akan menggunakan masa CPU untuk menyimpan dan memulihkan data seperti daftar, susunan kernel, memori maya, dll., sekali gus memendekkan masa berjalan sebenar proses dan menyebabkan penurunan ketara dalam prestasi sistem keseluruhan.
Atas ialah kandungan terperinci Meneroka pensuisan konteks pada CPU Linux. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!