新聞中心
在linux操作系統(tǒng)下,有多種狀態(tài)的進(jìn)程分布于用戶的操作中。其中最為常見的是D狀態(tài)的進(jìn)程,它位于 R(正在運(yùn)行)進(jìn)程與S(掛起)進(jìn)程之間,既不是正在運(yùn)行的進(jìn)程,也不是掛起的進(jìn)程。

D狀態(tài)進(jìn)程即為不可中斷的睡眠狀態(tài),該進(jìn)程就此進(jìn)入暫停狀態(tài),擁有被掛起進(jìn)程具備的所有權(quán)限,但不占用CPU資源,也不允許外部的中斷端口喚醒它。這是因?yàn)镈狀態(tài)的進(jìn)程正在等待IO操作的完成,而這需要一段時(shí)間,所以D狀態(tài)的進(jìn)程要一直保持暫停狀態(tài)直至IO的完成,才可被喚醒繼續(xù)運(yùn)行。
D狀態(tài)進(jìn)程的切換是通過“休眠(sleep)”和”喚醒(wake)”兩個(gè)操作實(shí)現(xiàn)的。在系統(tǒng)調(diào)度時(shí),進(jìn)程會(huì)根據(jù)不同情況進(jìn)入休眠狀態(tài),例如,當(dāng)進(jìn)程等待IO操作完成時(shí),會(huì)進(jìn)入休眠狀態(tài);當(dāng)IO操作完成時(shí),調(diào)度器會(huì)喚醒I/O等待進(jìn)程,給予它運(yùn)行的機(jī)會(huì)。這就說明:使用“休眠(sleep)”和”喚醒(wake)”,可以實(shí)現(xiàn)進(jìn)程從R(正在運(yùn)行)與S(掛起)間的切換,而當(dāng)進(jìn)程從R進(jìn)入休眠狀態(tài),系統(tǒng)內(nèi)的進(jìn)程狀態(tài)會(huì)從R變更為D,反之則從D變更為R。
代碼實(shí)現(xiàn)如下:
// 休眠(sleep)
int sleep(int seconds)
{
int ret;
// 先設(shè)定一個(gè)信號掛起的處理函數(shù)
handler my_handler = {.sa_handler = suspender};
sigaction(SIGALARM, &my_handler, NULL);
// 設(shè)置定時(shí)器,每seconds秒觸發(fā)一次SIGALARM信號
struct itimerval timer;
timer.it_interval.tv_sec = 0;
timer.it_interval.tv_usec = 0;
timer.it_value.tv_sec = seconds;
timer.it_value.tv_usec = 0;
ret = setitimer(ITIMER_REAL, &timer, NULL);
if (ret
return ret;
// 通過發(fā)送SIGALARM信號來調(diào)節(jié)進(jìn)程的狀態(tài)
sigaction(SIGALARM, &my_handler, NULL);
return 0;
}
// 喚醒(wake)
int wake(int seconds)
{
int ret;
// 設(shè)置定時(shí)器,每seconds秒觸發(fā)一次SIGALARM信號
struct itimerval timer;
timer.it_interval.tv_sec = 0;
timer.it_interval.tv_usec = 0;
timer.it_value.tv_sec = seconds;
timer.it_value.tv_usec = 0;
ret = setitimer(ITIMER_REAL, &timer, NULL);
if (ret
return ret;
// 再次設(shè)定一個(gè)喚醒的處理函數(shù)
Handler my_handler = {.sa_handler = waker};
sigaction(SIGALARM, &my_handler, NULL);
// 通過發(fā)送SIGALARM信號來恢復(fù)進(jìn)程的狀態(tài)
sigaction(SIGALARM, &my_handler, NULL);
return 0;
}
在Linux操作系統(tǒng)下,D狀態(tài)的進(jìn)程是運(yùn)行與掛起的中介,即不是正在運(yùn)行的進(jìn)程,又不是掛起的進(jìn)程。它的運(yùn)行與掛起切換是通過“休眠(sleep)”和”喚醒(wake)”兩個(gè)操作實(shí)現(xiàn)的,它不僅能夠更好地優(yōu)化系統(tǒng)調(diào)度,增強(qiáng)系統(tǒng)的吞吐量,而且還能有效地減少對CPU的資源消耗,從而提高系統(tǒng)的性能。
成都服務(wù)器租用選創(chuàng)新互聯(lián),先試用再開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)提供簡單好用,價(jià)格厚道的香港/美國云服務(wù)器和獨(dú)立服務(wù)器。物理服務(wù)器托管租用:四川成都、綿陽、重慶、貴陽機(jī)房服務(wù)器托管租用。
網(wǎng)站名稱:Linux下D狀態(tài)進(jìn)程:運(yùn)行與掛起間的切換(linuxd狀態(tài)的進(jìn)程)
文章出自:http://www.fisionsoft.com.cn/article/dhiieio.html


咨詢
建站咨詢
