Rumah  >  Artikel  >  Operasi dan penyelenggaraan  >  Terdapat beberapa keadaan proses linux

Terdapat beberapa keadaan proses linux

青灯夜游
青灯夜游asal
2023-03-13 10:11:248380semak imbas

Proses Linux mempunyai 6 keadaan: 1. R keadaan boleh laku, hanya proses dalam keadaan ini boleh berjalan pada CPU; 2. S keadaan tidur terganggu, proses dalam keadaan ini sedang menunggu sesuatu Peristiwa berlaku dan digantung; 3. D keadaan tidur tidak terganggu, proses berada dalam keadaan tidur, tetapi proses tidak terganggu pada masa ini 4. T keadaan jeda atau keadaan penjejakan, hantar isyarat SIGSTOP kepada proses, dan ia akan Memasuki keadaan T sebagai tindak balas kepada isyarat ini; 5. Z keadaan zombie, menunjukkan bahawa proses hampir mati;

Terdapat beberapa keadaan proses linux

Persekitaran pengendalian tutorial ini: sistem linux7.3, komputer Dell G3.

Di Linux, proses mempunyai 6 keadaan, iaitu: keadaan boleh laku, keadaan tidur terganggu, keadaan tidur tidak terganggu, keadaan digantung atau keadaan penjejakan, keadaan zombi dan keadaan kematian.

Penjelasan terperinci status proses Linux

Status boleh laku R(TASK_RUNNING)

Hanya dalam ini Hanya proses dalam keadaan ini boleh dijalankan pada CPU. Mungkin terdapat berbilang proses dalam keadaan boleh laku pada masa yang sama, dan struktur task_struct (blok kawalan proses) proses ini dimasukkan ke dalam baris gilir boleh laku CPU yang sepadan (proses hanya boleh muncul dalam baris gilir boleh laku satu CPU pada kebanyakan). Tugas penjadual proses adalah untuk memilih proses daripada baris gilir boleh laku setiap CPU untuk dijalankan pada CPU tersebut.

Banyak buku teks sistem pengendalian mentakrifkan proses yang dilaksanakan pada CPU sebagai keadaan RUNNING dan proses yang boleh dilaksanakan tetapi belum lagi dijadualkan untuk pelaksanaan sebagai keadaan READY kedua-dua keadaan ini disatukan ke dalam keadaan TASK_RUNNING di bawah Linux.

S(TASK_INTERRUPTIBLE) Keadaan tidur terganggu

Proses dalam keadaan ini sedang menunggu peristiwa tertentu berlaku (seperti menunggu sambungan soket, menunggu semaphore), Dan telah digantung. Struktur task_struct proses ini dimasukkan ke dalam baris gilir menunggu peristiwa yang sepadan. Apabila peristiwa ini berlaku (dicetuskan oleh gangguan luaran atau dicetuskan oleh proses lain), satu atau lebih proses dalam baris gilir menunggu yang sepadan akan dibangkitkan.

Melalui arahan ps kita akan melihat bahawa dalam keadaan biasa, sebahagian besar proses dalam senarai proses berada dalam keadaan TASK_INTERRUPTIBLE (melainkan beban pada mesin sangat tinggi). Lagipun, terdapat hanya satu atau dua CPU, dan selalunya terdapat berpuluh-puluh atau beratus-ratus proses Jika tidak kebanyakan proses sedang tidur, bagaimana CPU boleh bertindak balas?

D(TASK_UNINTERRUPTIBLE) Keadaan tidur tidak terganggu

Sama seperti keadaan TASK_INTERRUPTIBLE, proses berada dalam keadaan tidur, tetapi proses tidak terganggu pada masa ini. Tidak boleh terganggu tidak bermakna CPU tidak bertindak balas terhadap gangguan daripada perkakasan luaran, tetapi proses itu tidak bertindak balas kepada isyarat tak segerak.

Dalam kebanyakan kes, proses harus sentiasa dapat bertindak balas kepada isyarat tak segerak apabila ia dalam keadaan tidur. Jika tidak, anda akan terkejut apabila mendapati pembunuhan -9 tidak boleh membunuh proses tidur! Jadi kita juga boleh memahami dengan mudah mengapa proses yang dilihat oleh arahan ps jarang muncul dalam keadaan TASK_UNINTERRUPTIBLE, tetapi sentiasa dalam keadaan TASK_INTERRUPTIBLE.

Kepentingan keadaan TASK_UNINTERRUPTIBLE ialah aliran pemprosesan tertentu kernel tidak boleh diganggu. Jika anda bertindak balas kepada isyarat tak segerak, proses untuk memproses isyarat tak segerak akan dimasukkan ke dalam proses pelaksanaan program (proses yang dimasukkan ini mungkin hanya wujud dalam mod kernel, atau boleh dilanjutkan ke mod pengguna), jadi proses asal akan tergendala.

Apabila proses beroperasi pada perkakasan tertentu (contohnya, proses memanggil panggilan sistem baca untuk membaca fail peranti tertentu, dan panggilan sistem baca akhirnya melaksanakan kod pemacu peranti yang sepadan dan berkomunikasi dengan yang sepadan interaksi peranti fizikal), anda mungkin perlu menggunakan keadaan TASK_UNINTERRUPTIBLE untuk melindungi proses bagi mengelakkan interaksi antara proses dan peranti daripada terganggu, menyebabkan peranti jatuh ke dalam keadaan tidak terkawal. Keadaan TASK_UNINTERRUPTIBLE dalam kes ini sentiasa sangat singkat dan pada dasarnya mustahil untuk ditangkap melalui arahan ps.

Terdapat juga keadaan TASK_UNINTERRUPTIBLE yang mudah ditangkap dalam sistem Linux. Selepas melaksanakan panggilan sistem vfork, proses induk akan memasuki keadaan TASK_UNINTERRUPTIBLE sehingga proses anak memanggil exit atau exec.

T(TASK_STPPED atau TASK_TRACED) keadaan jeda atau keadaan surih

Hantar isyarat SIGSTOP kepada proses dan ia akan memasuki keadaan TASK_STOPPED sebagai tindak balas kepada isyarat ( melainkan proses itu sendiri berada dalam keadaan TASK_UNINTERRUPTIBLE dan tidak bertindak balas kepada isyarat). (SIGSTOP, seperti isyarat SIGKILL, adalah sangat wajib. Proses pengguna tidak dibenarkan untuk menetapkan semula fungsi pemprosesan isyarat yang sepadan melalui panggilan sistem siri isyarat.)

Menghantar isyarat SIGCONT kepada proses boleh menjadikannya berubah daripada keadaan TASK_STOPPED Pulihkan kepada keadaan TASK_RUNNING.

Apabila sesuatu proses sedang dikesan, ia berada dalam keadaan khas TASK_TRACED. "Dijejaki" bermakna proses dijeda dan menunggu proses yang menjejakinya beroperasi padanya. Sebagai contoh, jika anda menetapkan titik putus pada proses yang dijejaki dalam gdb, proses tersebut akan berada dalam keadaan TASK_TRACED apabila ia berhenti pada titik putus. Pada masa lain, proses yang dijejaki masih di negeri-negeri yang dinyatakan sebelum ini.

Untuk proses itu sendiri, keadaan TASK_STOPPED dan TASK_TRACED adalah sangat serupa, kedua-duanya menunjukkan bahawa proses itu digantung.

Keadaan TASK_TRACED adalah bersamaan dengan lapisan perlindungan tambahan di atas TASK_STOPPED Proses dalam keadaan TASK_TRACED tidak boleh dibangkitkan sebagai tindak balas kepada isyarat SIGCONT. Proses penyahpepijatan hanya boleh kembali kepada keadaan TASK_RUNNING sehingga proses penyahpepijatan menjalankan operasi seperti PTRACE_CONT dan PTRACE_DETACH melalui panggilan sistem ptrace (operasi ditentukan melalui parameter panggilan sistem ptrace), atau proses penyahpepijatan keluar.

Z(TASK_DEAD - EXIT_ZOMBIE) Keadaan zombi, proses menjadi proses zombi

Proses berada dalam keadaan TASK_DEAD semasa proses keluar.

Semasa proses keluar ini, semua sumber yang diduduki oleh proses akan dikitar semula, kecuali untuk struktur task_struct (dan beberapa sumber). Jadi proses itu ditinggalkan hanya dengan cangkang kosong task_struct, jadi ia dipanggil zombi.

Sebab mengapa task_struct dikekalkan adalah kerana task_struct menyimpan kod keluar proses dan beberapa maklumat statistik. Dan proses induknya mungkin mengambil berat tentang maklumat ini. Sebagai contoh, dalam shell, pembolehubah $? menyimpan kod keluar proses latar depan terakhir yang keluar, dan kod keluar ini sering digunakan sebagai syarat penghakiman pernyataan if.

Sudah tentu, kernel juga boleh menyimpan maklumat ini di tempat lain dan melepaskan struktur task_struct untuk menjimatkan ruang. Walau bagaimanapun, adalah lebih mudah untuk menggunakan struktur task_struct, kerana hubungan carian dari pid ke task_struct telah diwujudkan dalam kernel, serta hubungan ibu bapa-anak antara proses. Untuk melepaskan task_struct, anda perlu mencipta beberapa struktur data baharu supaya proses induk boleh mencari maklumat keluar dari proses anaknya.

Proses induk boleh menunggu untuk keluar dari satu atau beberapa proses anak melalui siri tunggu panggilan sistem (seperti wait4, waitid) dan mendapatkan maklumat keluarnya. Kemudian siri tunggu panggilan sistem juga akan melepaskan badan proses anak (task_struct).

Apabila proses anak keluar, kernel akan menghantar isyarat kepada proses induknya untuk memberitahu proses induk untuk "mengumpul mayat". Isyarat ini lalai kepada SIGCHLD, tetapi boleh ditetapkan semasa membuat proses anak melalui panggilan sistem klon.

Selagi proses induk tidak keluar, proses anak dalam keadaan zombie ini akan sentiasa wujud. Jadi jika proses ibu bapa keluar, siapa yang akan "mengutip mayat" proses anak?

Apabila proses keluar, semua proses anak akan dihoskan oleh proses lain (menjadikan proses anak proses lain). Siapa yang diamanahkan? Ini mungkin proses seterusnya dalam kumpulan proses proses keluar (jika ada), atau proses nombor 1. Jadi setiap proses dan setiap saat mempunyai proses induk. Melainkan proses nombor 1.

Proses No. 1, proses dengan pid 1, juga dipanggil proses init. Selepas sistem Linux bermula, proses mod pengguna pertama yang dibuat ialah proses init. Ia mempunyai dua misi:

  • Laksanakan skrip pemulaan sistem dan buat satu siri proses (semuanya adalah turunan daripada proses init); 🎜> Tunggu acara keluar dari proses anaknya dalam gelung tak terhingga, dan panggil panggilan sistem tunggu untuk menyelesaikan kerja "pengumpulan mayat"; dibunuh (Ini dijamin oleh kernel). Ia berada dalam keadaan TASK_INTERRUPTIBLE sementara menunggu proses anak keluar dan berada dalam keadaan TASK_RUNNING semasa proses "pemulihan".

  • X(TASK_DEAD - EXIT_DEAD) keadaan kematian, proses akan dimusnahkan

  • Dan proses mungkin tidak mengekalkan task_struct semasa proses keluar. Sebagai contoh, proses ini ialah proses boleh tanggal dalam program berbilang benang.

Atau proses induk secara eksplisit mengabaikan isyarat SIGCHLD dengan menetapkan pengendali isyarat SIGCHLD kepada SIG_IGN. (Ini ialah spesifikasi POSIX, walaupun isyarat keluar proses anak boleh ditetapkan kepada isyarat selain SIGCHLD.)

Pada ketika ini, proses akan diletakkan dalam status keluar EXIT_DEAD, yang bermaksud perkara berikut kod segera Proses akan dikeluarkan sepenuhnya. Jadi keadaan EXIT_DEAD adalah sangat singkat dan hampir mustahil untuk ditangkap dengan arahan ps.

Keadaan awal proses

Proses dicipta melalui siri fork panggilan sistem (fork, klon, vfork), kernel (atau modul Kernel) juga boleh mencipta proses kernel melalui fungsi kernel_thread. Fungsi yang mencipta subproses ini pada asasnya melaksanakan fungsi yang sama - salin proses panggilan untuk mendapatkan subproses. (Anda boleh memutuskan sama ada pelbagai sumber dikongsi atau peribadi melalui parameter pilihan.)

Jadi oleh kerana proses panggilan berada dalam keadaan TASK_RUNNING (jika tidak, jika ia tidak berjalan, bagaimanakah ia boleh dipanggil?), proses anak juga berada dalam keadaan TASK_RUNNING secara lalai. Di samping itu, klon panggilan sistem dan fungsi kernel kernel_thread juga menerima pilihan CLONE_STOPPED, dengan itu menetapkan keadaan awal proses anak kepada TASK_STOPPED.

Perubahan status proses

Selepas proses dibuat, status mungkin mengalami beberapa siri perubahan sehingga proses keluar. Walaupun terdapat beberapa keadaan proses, terdapat hanya dua arah untuk perubahan keadaan proses - daripada keadaan TASK_RUNNING kepada keadaan bukan-TASK_RUNNING, atau daripada keadaan bukan-TASK_RUNNING kepada keadaan TASK_RUNNING.

Maksudnya, jika isyarat SIGKILL dihantar ke proses dalam keadaan TASK_INTERRUPTIBLE, proses itu akan dibangkitkan terlebih dahulu (masukkan keadaan TASK_RUNNING), dan kemudian keluar sebagai tindak balas kepada isyarat SIGKILL (tukar kepada keadaan TASK_DEAD). Ia tidak akan keluar terus dari keadaan TASK_INTERRUPTIBLE.

Proses berubah daripada keadaan bukan-TASK_RUNNING kepada keadaan TASK_RUNNING oleh proses lain (yang mungkin juga pengendali sampuk) yang menjalankan operasi bangun tidur. Proses yang melakukan kebangkitan menetapkan status proses yang dibangkitkan kepada TASK_RUNNING, dan kemudian menambah struktur task_structnya pada baris gilir boleh laku CPU. Kemudian proses yang dibangkitkan akan mempunyai peluang untuk dijadualkan untuk pelaksanaan.

Terdapat dua cara untuk proses menukar daripada keadaan TASK_RUNNING kepada keadaan bukan-TASK_RUNNING:

  • Sebagai tindak balas kepada isyarat, ia memasuki keadaan TASK_STOPED atau keadaan TASK_DEAD;

  • Melaksanakan panggilan sistem secara aktif memasuki keadaan TASK_INTERRUPTIBLE (seperti panggilan sistem nanosleep), atau keadaan TASK_DEAD (seperti keluar dari panggilan sistem); atau memasuki keadaan TASK_INTERRUPTIBLE atau kerana sumber yang diperlukan untuk melaksanakan panggilan sistem tidak dapat dipenuhi status TASK_UNINTERRUPTIBLE (seperti pilih panggilan sistem).

Jelas sekali, kedua-dua situasi ini hanya boleh berlaku jika proses itu dilaksanakan pada CPU.

Penerangan status proses Linux

状态符 状态全称 描 述
R TASK_RUNNING 可执行状态&运行状态(在 run_queue 队列里的状态)
S TASK_INTERRUPTIBLE 可中断的睡眠状态, 可处理 signal
D TASK_UNINTERRUPTIBLE 不可中断的睡眠状态, 可处理 signal, 有延迟
T TASK_STOPPED or TASK_TRACED 暂停状态或跟踪状态, 不可处理 signal, 因为根本没有时间片运行代码
Z TASK_DEAD - EXIT_ZOMBIE 退出状态,进程成为僵尸进程。不可被 kill, 即不响应任务信号, 无法用 SIGKILL 杀死

Pengetahuan lanjutan: Apakah itu giliran menunggu, apakah itu giliran berjalan, apakah adalah hang Memulakan/menyekat, apakah itu proses bangun tidur

Kami meletakkan task_struct (run_queue) dari keadaan berjalan ke dalam baris gilir menunggu, yang dipanggil menangguhkan menunggu (menyekat) daripada baris gilir menunggu ke baris gilir berjalan , yang dijadualkan oleh CPU dipanggil proses bangun

Apabila proses sedang berjalan, kerana beberapa keadaan operasinya belum sedia (contohnya, rangkaian diperlukan tetapi kad rangkaian tidak tersedia, atau ia perlu menunggu IO, iaitu, ia perlu menggunakan luaran (set), ia akan diletakkan dalam baris gilir menunggu, dan bit status dalam task_struct juga akan ditukar kepada S/D.

Apabila proses berada dalam keadaan S/D, ia sedang menunggu dalam baris gilir menunggu untuk menggunakan peranti (seperti kad rangkaian, monitor cakera, dll.)

Baris gilir menunggu untuk CPU dipanggil baris gilir larian Peranti dipanggil gilir menunggu

Proses yang dipanggil, apabila berjalan, mungkin berada dalam baris gilir yang berbeza kerana keperluan operasi

Dalam baris gilir yang berbeza, status adalah Ia berbeza

Apabila proses berada dalam keadaan R, jika ia memerlukan beberapa jenis persisian, tetapi persisian sedang digunakan, saya akan menukar keadaan anda kepada S/D, dan kemudian menukar task_struct anda Masukkan ia barisan menunggu

Cadangan berkaitan: "Tutorial Video Linux"

Atas ialah kandungan terperinci Terdapat beberapa keadaan proses linux. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn