Perintah penciptaan proses Linux: 1. Perintah fork boleh mencipta proses baharu daripada proses sedia ada Proses baharu ialah proses anak, dan proses asal ialah proses anak menyalin sepenuhnya sumber daripada proses induk. 2. Dengan arahan vfork, proses anak yang dibuat berkongsi ruang alamat dengan proses induk, yang bermaksud bahawa proses anak berjalan sepenuhnya dalam ruang alamat proses induk. 3. Perintah klon boleh secara terpilih menyalin sumber proses induk kepada proses anak, dan struktur data yang tidak disalin dikongsi oleh proses anak melalui penyalinan penunjuk.
Persekitaran pengendalian tutorial ini: sistem linux7.3, komputer Dell G3.
Terdapat tiga arahan yang tersedia untuk mencipta proses dalam sistem Linux: fork, vfork dan clone.
fork
Apabila fork mencipta proses, proses anak hanya menyalin sepenuhnya sumber proses induk Proses anak yang disalin mempunyai struktur tugas_struktur dan pid, tetapi Menyalin semua sumber lain proses induk. Contohnya, jika proses induk mempunyai lima fail terbuka, maka proses anak juga mempunyai lima fail terbuka, dan penunjuk baca dan tulis semasa bagi fail ini juga dihentikan di tempat yang sama. Jadi, apa yang dilakukan oleh langkah ini ialah menyalin. Proses anak yang diperoleh dengan cara ini adalah bebas daripada proses induk dan mempunyai kesesuaian yang baik Walau bagaimanapun, komunikasi antara kedua-duanya memerlukan mekanisme komunikasi khas, seperti paip, memori bersama dan mekanisme lain, untuk mencipta proses anak melalui garpu. anda perlu menggunakan penerangan di atas Buat salinan setiap sumber. Dari sudut pandangan ini, fork adalah panggilan sistem yang sangat mahal Overhed ini tidak diperlukan dalam semua kes menyalin ruang ingatan maya semasa proses garpu akan menjadi proses yang berlebihan. Tetapi memandangkan Linux kini menggunakan teknologi copy-on-write (COW copy-on-write), untuk mengurangkan overhead, fork sebenarnya tidak akan menghasilkan dua salinan yang berbeza pada mulanya, kerana pada masa itu, sejumlah besar data sebenarnya sama sepenuhnya . Copy-on-write menangguhkan salinan sebenar data. Jika penulisan berlaku kemudian, ini bermakna data ibu bapa dan anak tidak konsisten, jadi tindakan penyalinan berlaku, dan setiap proses mendapat salinannya sendiri, yang boleh mengurangkan overhed panggilan sistem. Jadi dengan copy-on-write, pelaksanaan vfork tidak begitu penting.
Panggilan fork() mengembalikan dua nilai setelah dilaksanakan Untuk proses induk, fungsi fork mengembalikan nombor proses subprogram, manakala untuk subprogram, fungsi fork mengembalikan sifar daripada fungsi kembali dua kali.
Selepas fork, kedua-dua proses anak dan proses induk akan terus melaksanakan arahan selepas panggilan fork. Proses anak adalah salinan proses ibu bapa. Ia akan memperoleh salinan ruang data, timbunan dan timbunan proses induk Ini adalah salinan Proses ibu bapa dan anak tidak berkongsi bahagian memori ini. Dalam erti kata lain, pengubahsuaian oleh proses anak kepada pembolehubah dengan nama yang sama dalam proses induk tidak akan menjejaskan nilainya dalam proses induk. Tetapi proses bapa dan anak berkongsi sesuatu, iaitu hanya bahagian teks program. Segmen teks menyimpan arahan mesin yang dilaksanakan oleh CPU dan biasanya dibaca sahaja.
vfork
Panggilan sistem vfork berbeza daripada fork Proses anak yang dibuat dengan vfork berkongsi ruang alamat dengan proses induk, yang bermaksud bahawa anak memproses sepenuhnya berjalan dalam proses induk Dalam ruang alamat, jika proses anak mengubah suai pembolehubah pada masa ini, ini akan menjejaskan proses induk.
Oleh itu, jika vfork() digunakan dalam contoh di atas, nilai a dan b yang dicetak dua kali akan sama, dan alamatnya akan sama.
Tetapi satu perkara yang perlu diperhatikan di sini ialah proses anak yang dibuat dengan vfork() mesti secara eksplisit memanggil exit() untuk tamat, jika tidak, proses anak tidak akan dapat ditamatkan, dan keadaan ini tidak wujud dengan fork ().
Vfork juga mengembalikan nombor proses proses anak dalam proses induk, dan mengembalikan 0 dalam proses anak.
Selepas menggunakan vfork untuk mencipta proses anak, proses induk akan disekat sehingga proses anak memanggil exec (exec, memuatkan fail boleh laku baharu ke dalam ruang alamat dan melaksanakannya.) atau keluar. Kelebihan vfork ialah selepas proses anak dicipta, selalunya hanya memanggil exec untuk melaksanakan program lain, kerana ia tidak akan mempunyai sebarang rujukan kepada ruang alamat proses induk, jadi salinan ruang alamat adalah berlebihan , jadi ia dikongsi melalui vfork Memori boleh mengurangkan overhed yang tidak perlu.
klon
Sistem memanggil fork() dan vfork() tidak mempunyai parameter, manakala clone() mempunyai parameter. fork() adalah untuk menyalin semua, vfork() adalah untuk berkongsi memori, dan clone() boleh secara selektif menyalin sumber proses induk kepada proses anak, dan struktur data yang tidak disalin dikongsi oleh proses anak melalui penyalinan penunjuk. Khususnya Sumber mana yang hendak disalin ke proses anak ditentukan oleh clone_flags dalam senarai parameter. Selain itu, clone() mengembalikan pid proses anak.
Ketahui lebih lanjut tentang arahan fork (penciptaan proses) di bawah.
Sedalam-dalamnya fungsi fork
Fungsi fork ialah fungsi yang sangat penting dalam Linux, ia mencipta proses daripada yang sedia ada. proses proses baru. Proses baharu ialah proses anak, dan proses asal ialah proses induk.
Nilai pulangan bagi fungsi garpu:
- Kembalikan pid proses anak kepada proses induk
- Kembalikan 0 kepada proses anak
Seterusnya, mari gunakan fungsi fork () sebagai contoh
Mari kita susun dan jalankan:
Penggunaan am garpu
- Proses induk ingin menyalin sendiri supaya proses ibu bapa dan anak melaksanakan segmen kod yang berbeza pada masa yang sama. Sebagai contoh, proses induk menunggu permintaan pelanggan dan melahirkan proses anak untuk mengendalikan permintaan tersebut.
- Satu proses ingin melaksanakan program yang berbeza. Sebagai contoh, selepas proses anak kembali dari fork, ia memanggil fungsi exec.
Sebab mengapa panggilan fork gagal
- Terlalu banyak proses dalam sistem
- Pengguna sebenar Bilangan proses melebihi had
Selepas menyemak penggunaan fungsi fork, mari kita kaji topik:
fork() creation Child proses, apakah operasi yang dilakukan oleh sistem pengendalian?
Proses memanggil fork Apabila kawalan dipindahkan ke kod fork dalam kernel, kernel melakukan perkara berikut:
Peruntukkan memori baharu. blok dan struktur data kernel kepada proses anak.
Salin beberapa kandungan struktur data proses induk ke proses anak.
Tambahkan proses anak pada senarai proses sistem.
fork kembali dan memulakan penjadualan penjadual.
Selepas proses induk melaksanakan kod sebelum fork (sebelumnya), ia memanggil fork untuk mencipta proses anak dan kedua-dua pelaksanaan aliran bapa dan anak dilaksanakan secara berasingan. Nota: Selepas fork, yang melaksanakan dahulu diputuskan sepenuhnya oleh penjadual.
Ada satu lagi soalan di sini Apabila melakukan forking, adakah perkongsian kod antara ibu bapa dan anak diproses selepas perkongsian, atau adakah semua kod dikongsi Mengapa proses anak sentiasa melaksanakan yang sepadan? kod selepas garpu?
Jawapan: Semua kod dikongsi kerana CPU menjejaki tempat proses itu dilaksanakan.
- Selepas kod dipasang, akan terdapat banyak baris kod dan setiap baris kod akan mempunyai alamat yang sepadan selepas ia dimuatkan ke dalam memori.
- Oleh kerana proses mungkin terganggu pada bila-bila masa (mungkin tidak selesai), pada kali seterusnya ia terus dilaksanakan, ia mesti diteruskan dari kedudukan sebelumnya (bukan permulaan program atau fungsi utama), yang memerlukan CPU mesti merekodkan kedudukan pelaksanaan proses semasa dalam masa nyata.
- Jadi, terdapat data daftar yang sepadan dalam CPU, yang digunakan untuk merekodkan kedudukan pelaksanaan proses semasa ini dipanggil EIP, juga dikenali sebagai pc (pembilang program kod mata), yang digunakan untuk merekod baris seterusnya kod pelaksana Alamat kod (data kontekstual).
- Apabila proses anak dibuat, EIPnya akan diubah suai. Pada masa ini, proses kanak-kanak akan berfikir bahawa data yang disimpan dalam EIP adalah kod yang akan dilaksanakan.
Apabila proses kanak-kanak dicipta, sistem pengendalian memperuntukkan struktur data yang sepadan kepada proses kanak-kanak dan proses kanak-kanak berjalan secara bebas kerana proses itu bebas.
Secara teorinya, proses anak juga harus mempunyai kod dan datanya sendiri, tetapi secara amnya, tiada proses pemuatan semasa membuat proses anak, dan proses anak itu sendiri tidak mempunyai kod dan datanya sendiri.
Jadi, proses anak hanya boleh "menggunakan" kod dan data proses induk, dan kod itu baca sahaja, dan perkongsian ibu bapa-anak tidak akan bercanggah manakala data mungkin diubah suai dan mesti berpisah.
Pada masa ini, sistem pengendalian menggunakan strategi salin atas tulis.
Copy-on-write
Mengapa OS menggunakan teknologi copy-on-write untuk memisahkan ibu bapa dan anak proses
Menyalin semasa menulis adalah manifestasi penggunaan ingatan yang cekap.
Meningkatkan kecekapan pengendalian sistem.
OS tidak boleh meramalkan ruang mana yang akan diakses sebelum pelaksanaan kod.
Pemberhentian proses
Apabila proses ditamatkan, sistem pengendalian mengeluarkan struktur data kernel yang berkaitan dan data kod yang sepadan yang diminta oleh proses itu adalah untuk melepaskan sumber sistem
1 >
Cara biasa penamatan proses:Kita boleh membezakan dengan jelas antara kes pertama dan kes kedua melalui kod keluar proses. Mengenai nilai pulangan fungsi utama dalam pembelajaran bahasa C, di mana nilai pulangan fungsi utama ialah kod keluar proses. Maksudnya adalah untuk kembali ke proses peringkat atas untuk menilai hasil pelaksanaan proses.Selepas kod dijalankan, hasilnya betul.
- Kod dijalankan dan hasilnya tidak betul.
- Kod tidak selesai dijalankan dan program ranap.
Kini kami menulis program C yang mudah.
Kemudian kita boleh mendapatkan kod keluar dari proses terkini melalui gema $ .
Nilai pulangan proses mempunyai dua situasi: 0 dan bukan 0 bermakna program berjalan dengan jayanya dan hasilnya betul, dan bukan 0 bermakna itu program berjalan dengan jayanya tetapi hasilnya tidak betul Terdapat banyak nilai sifar, dan nilai bukan sifar yang berbeza boleh mewakili ralat yang berbeza, menjadikannya lebih mudah bagi kita untuk menentukan punca ralat.
Apakah mesej ralat biasa?
Kita boleh menggunakan strerror untuk mencetaknya
Hasilnya adalah seperti berikut:
Menjumpai sejumlah 133 kod ralat di bawah Linux
当然,程序崩溃的时候,退出码没有意义。
Seperti yang kita semua tahu, Linux ditulis dalam bahasa C, dan perintah pada asasnya adalah program bahasa C, jadi kita boleh mengambil arahan ls sebagai contoh
dan mesej ralat yang sepadan dengan kod keluar No. 2:
2 keluar dan _keluar
Untuk menamatkan proses, anda boleh menggunakan penyata pulangan, dan anda juga boleh memanggil fungsi keluar dan _exit
fungsi keluar:
_fungsi keluar:
Terdapat banyak perbezaan antara kedua-dua fungsi ini . Mari kita berikan contoh kecil dahulu:
Kami seterusnya menggunakan printf untuk mencetak mesej, kemudian tidur selama tiga saat, kemudian gunakan exit untuk keluar, dan perhatikan hasilnya
Kerana kami membawa n, menambah n akan menyegarkan kawasan penimbal, kandungan yang kami cetak muncul pada skrin.
Jika kita tidak membawa n, kita perhatikan hasilnya:
Dijumpai: Kerana tiada n , printf Kandungan dalam tidak dicetak sebelum tidur, tetapi selepas keluar dipanggil, kandungan penimbal disegarkan dan dikeluarkan ke skrin.
Seterusnya kami menggunakan fungsi _exit
untuk menjalankan b boleh laku:
Discover Nothing is dicetak. Gunakan echo $? untuk mencetak kod keluar proses terkini dan mendapati bahawa fail b memang dilaksanakan.
Ini menunjukkan bahawa keluar ialah fungsi perpustakaan, dan _exit ialah panggilan sistem, yang tidak memuatkan semula kandungan penimbal apabila keluar daripada proses.
Pada ketika ini kita boleh membuat kesimpulan:
data printf disimpan dalam "penampan", keluar boleh menyegarkannya, dan Antara muka panggilan sistem _keluar tidak boleh menyegarkannya. Oleh itu, penimbal mestilah tidak berada di dalam sistem pengendalian, tetapi diselenggara oleh perpustakaan standard C.
Cadangan berkaitan: "Tutorial Video Linux"
Atas ialah kandungan terperinci Apakah arahan penciptaan proses linux?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!