Proses ialah abstraksi logik Kami tahu banyak tentang proses daripada buku sistem pengendalian, tetapi kami mungkin tidak tahu banyak tentang pelaksanaan proses Artikel ini menerangkan prinsip umum pelaksanaan proses.
Pelaksanaan proses sebenarnya sama seperti ketika kita biasanya menulis kod Contohnya, jika kita ingin mewakili sesuatu, kita akan menentukan struktur data. Proses tidak terkecuali. Jadi intipati proses ialah struktur data, yang menyimpan satu siri data. Sistem pengendalian menguruskan semua proses dalam bentuk tatasusunan atau senarai terpaut. Proses boleh dikatakan dibahagikan kepada dua jenis
1 Proses pertama apabila sistem dimulakan,
2 Kecuali proses pertama, proses lain dicipta melalui fork atau fork+execute system call.
Mari kita lihat dahulu maklumat yang terkandung dalam struktur proses.
Apabila sistem mencipta proses, ia akan menetapkan nilai daftar cs:ip Jika ia adalah fork, ip ialah pernyataan selepas fungsi fork. Jika ia dilaksanakan, alamat ip ditentukan oleh pengkompil. Walau apa pun, apabila proses mula dilaksanakan, CPU akan menghuraikan cs:ip dan mendapat arahan untuk dilaksanakan. Jadi bagaimana cs:ip dihuraikan?
Apabila proses dilaksanakan, pemilih tss (indeks GDT) dimuatkan ke dalam daftar tss, dan kemudian konteks dalam tss juga dimuatkan ke dalam daftar yang sepadan, seperti cr3, pemilih ldt. Menurut indeks ldt dalam maklumat tss, mula-mula cari alamat pertama data struktur ldt proses daripada GDT, dan kemudian dapatkan pemilih daripada cs mengikut atribut segmen semasa, seperti segmen kod alamat pertama ruang linear proses dari jadual ldt Alamat, had panjang, kebenaran dan maklumat lain. Gunakan alamat pertama alamat linear ditambah offset dalam IP untuk mendapatkan alamat linear, dan kemudian dapatkan alamat fizikal melalui direktori halaman dan jadual halaman Jika alamat fizikal belum diperuntukkan, pengecualian kesalahan halaman dan pemprosesan lain akan dilaksanakan.
Proses penggantungan, penyekatan dan pelbagai proses. Kita biasanya mendengar konsep ini agak kerap, sekarang mari kita lihat bagaimana ia dilaksanakan. Terdapat dua jenis penggantungan atau penyekatan proses.
1 Menggantung secara aktif. Biarkan proses itu tergantung sebentar-sebentar melalui tidur. Prinsip tidur telah dianalisis sebelum ini, jadi saya tidak akan menganalisisnya lagi. Prinsip umum
adalah untuk menetapkan pemasa dan membangunkan proses selepas tamat tempoh.
Ubah suai proses kepada keadaan yang digantung, menunggu untuk dikejutkan.
2 Penggantungan pasif.
Terdapat banyak senario penggantungan pasif, terutamanya apabila proses memohon sumber, tetapi sumber itu tidak memenuhi syarat, maka proses itu digantung oleh sistem pengendalian. Sebagai contoh, apabila kita membaca paip. Jika tiada data untuk dibaca daripada paip, proses itu digantung. Masukkan ke dalam barisan menunggu paip.
<code>// 当前进程挂载到睡眠队列p中,p指向队列头指针的地址<br>void sleep_on(struct task_struct **p)<br>{<br> struct task_struct *tmp;<br><br> if (!p)<br> return;<br> if (current == &(init_task.task))<br> panic("task[0] trying to sleep");<br> /*<br> *p为第一个睡眠节点的地址,即tmp指向第一个睡眠节点<br> 头指针指向当前进程,这个版本的实现没有采用真正链表的形式,<br> 他通过每个进程在栈中的临时变量形成一个链表,每个睡眠的进程,<br> 在栈里有一个变量指向后面一个睡眠节点,然后把链表的头指针指向当前进程,<br> 然后切换到其他进程执行,当被wake_up唤醒的时候,wake_up会唤醒链表的第一个<br> 睡眠节点,因为第一个节点里保存了后面一个节点的地址,所以他唤醒后面一个节点,<br> 后面一个节点以此类推,从而把整个链表的节点唤醒,这里的实现类似nginx的filter,<br> 即每个模块保存后面一个节点的地址,然后把全局指针指向自己。<br> */<br> tmp = *p;<br> *p = current;<br> // 不可中断睡眠只能通过wake_up唤醒,即使有信号也无法唤醒<br> current->state = TASK_UNINTERRUPTIBLE;<br> // 进程调度<br> schedule();<br> // 唤醒后面一个节点<br> if (tmp)<br> tmp->state=0;<br>}<br><br>// 唤醒队列中的第一个节点,并清空链表,因为第一个节点会向后唤醒其他节点<br>void wake_up(struct task_struct **p)<br>{<br> if (p && *p) {<br> (**p).state=0;<br> *p=NULL;<br> }<br>}</code>
Kami mendapati bahawa pelaksanaan proses adalah serupa dengan cara kami biasanya menulis kod, iaitu untuk mentakrifkan struktur data dan kemudian melaksanakan algoritma untuk mengendalikan struktur data. Sudah tentu, kerana ia melibatkan perkakasan asas, pelaksanaan sistem pengendalian adalah jauh lebih rumit daripada kod kami.
Atas ialah kandungan terperinci maksudnya? Sila berikan lebih banyak konteks.. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!