Untuk menganalisis sebab proses Linux memasuki mod tidur, contoh kod khusus diperlukan
Dalam sistem Linux, proses akan memasuki mod tidur atas banyak sebab. Mod tidur termasuk menunggu sumber, menunggu isyarat dan menunggu acara. Artikel ini akan menganalisis secara terperinci mengapa proses Linux memasuki mod tidur dari aspek ini dan menerangkannya melalui contoh kod tertentu.
Menunggu sumber
Semasa pelaksanaan, proses mungkin perlu mengakses beberapa sumber yang dikongsi, seperti fail, sambungan rangkaian, memori, dsb. Apabila sumber diduduki oleh proses lain atau dikunci, proses semasa akan memasuki mod tidur dan menunggu sumber dikeluarkan atau dibuka kuncinya.
Berikut ialah contoh kod yang menunjukkan proses utas menunggu untuk memperoleh sumber kunci:
#include <stdio.h> #include <pthread.h> pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; int shared_resource = 0; void* thread_function(void* arg) { pthread_mutex_lock(&mutex); shared_resource++; pthread_mutex_unlock(&mutex); return NULL; } int main() { pthread_t thread; pthread_create(&thread, NULL, thread_function, NULL); pthread_mutex_lock(&mutex); while (shared_resource == 0) { pthread_mutex_unlock(&mutex); sched_yield(); // 主动让出CPU,避免忙等待 pthread_mutex_lock(&mutex); } pthread_mutex_unlock(&mutex); pthread_join(thread, NULL); return 0; }
Dalam kod di atas, utas utama menunggu urutan anak memperoleh sumber kunci sebelum ia boleh meneruskan pelaksanaan Bila benang kanak-kanak memperoleh sumber kunci, Benang utama akan keluar dari keadaan tidur.
Menunggu isyarat
Proses boleh berkomunikasi dengan kernel dan proses lain melalui isyarat. Apabila proses menunggu isyarat tiba, ia memasuki keadaan tidur. Isyarat boleh diproses melalui sigwait()
atau fungsi pemprosesan isyarat. sigwait()
或者信号处理函数等方式来处理信号。
下面是一个使用sigwait()
函数等待信号的示例代码:
#include <stdio.h> #include <signal.h> int main() { sigset_t set; int sig_no; sigemptyset(&set); sigaddset(&set, SIGUSR1); sigprocmask(SIG_BLOCK, &set, NULL); sigwait(&set, &sig_no); printf("Received signal SIGUSR1 "); return 0; }
在上面的代码中,进程阻塞SIGUSR1信号,当接收到该信号时,就会退出睡眠状态,并执行相应操作。
等待事件
进程有时候需要等待某些事件的发生,比如定时器超时、IO事件就绪等。进程会因为等待事件而进入睡眠状态,直到事件发生并且唤醒进程。
下面是一个使用IO多路复用等待事件的示例代码:
#include <stdio.h> #include <sys/select.h> int main() { fd_set rfds; struct timeval tv; int retval; FD_ZERO(&rfds); FD_SET(0, &rfds); tv.tv_sec = 5; tv.tv_usec = 0; retval = select(1, &rfds, NULL, NULL, &tv); if (retval == -1) { perror("select()"); } else if (retval) { printf("Data is available now. "); } else { printf("No data within five seconds. "); } return 0; }
在上面的代码中,进程使用select()
sigwait()
untuk menunggu isyarat: rrreee
Dalam kod di atas, proses menyekat isyarat SIGUSR1, ia akan keluar dari keadaan tidur dan melakukan tindakan yang sesuai. 🎜🎜🎜Menunggu acara🎜🎜🎜Proses kadangkala perlu menunggu peristiwa tertentu berlaku, seperti tamat masa pemasa, kesediaan acara IO, dsb. Proses akan tidur menunggu acara sehingga acara itu berlaku dan membangunkan proses itu. 🎜🎜Berikut ialah contoh kod menggunakan pemultipleksan IO untuk menunggu acara: 🎜rrreee🎜Dalam kod di atas, proses menggunakan fungsiselect()
untuk menunggu input standard untuk melihat sama ada terdapat data untuk membaca. Apabila data Apabila boleh dibaca atau menunggu tamat masa, proses akan dibangkitkan. 🎜🎜Ringkasnya, proses Linux akan memasuki mod tidur kerana menunggu sumber, menunggu isyarat dan menunggu acara. Tingkah laku tidur sesuatu proses boleh difahami dengan lebih baik melalui contoh kod konkrit. 🎜Atas ialah kandungan terperinci Analisis sebab proses Linux memasuki mod tidur. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!