正文開始前給大家推薦個(gè)網(wǎng)站,前些天發(fā)現(xiàn)了一個(gè)巨牛的人工智能學(xué)習(xí)網(wǎng)站,通俗易懂,風(fēng)趣幽默,忍不住分享一下給大家。點(diǎn)擊跳轉(zhuǎn)到網(wǎng)站。
進(jìn)程切換
進(jìn)程并發(fā)就需要做到進(jìn)程切換,一個(gè)CPU一套寄存器但是需要運(yùn)行的進(jìn)程有很多,CPU內(nèi)是內(nèi)置的有時(shí)間片的,當(dāng)時(shí)間片到之后,上面的進(jìn)程就會(huì)被從CPU上剝離下來(lái),開始調(diào)度下一個(gè)進(jìn)程,所以被剝離下來(lái)的進(jìn)程就需要保存CPU中寄存器的內(nèi)容,然后等到下一次被調(diào)度的時(shí)候再把內(nèi)容放上去,接著執(zhí)行,寄存器上的內(nèi)容不需要清零,直接進(jìn)行覆蓋就行,因?yàn)橄乱粋€(gè)進(jìn)程來(lái)的時(shí)候,這時(shí)寄存器的內(nèi)容是上一個(gè)進(jìn)程的并且已經(jīng)保存帶走了。所以進(jìn)程在被調(diào)度的時(shí)候是會(huì)進(jìn)行上下文保護(hù)的,不然下一次調(diào)度就會(huì)不知道從哪里開始。這就是進(jìn)程切換。
O(1)調(diào)度算法
我們可以看到運(yùn)行隊(duì)列有140個(gè)位置,每個(gè)位置就表示一個(gè)優(yōu)先級(jí),0 ~ 99我們不用考慮,而100 ~ 139是普通優(yōu)先級(jí),正好對(duì)用我們普通用戶可以修改的40個(gè)優(yōu)先級(jí)。每一個(gè)需要運(yùn)行的進(jìn)程都會(huì)被放在運(yùn)行隊(duì)列中,我們會(huì)發(fā)現(xiàn)其中有兩個(gè)運(yùn)行隊(duì)列,這是怎么回事?
兩個(gè)運(yùn)行隊(duì)列我們分為活躍隊(duì)列和過(guò)期隊(duì)列,其中void* active 指向的是活躍隊(duì)列,void* expired指向的是過(guò)期隊(duì)列,CPU只調(diào)度活躍隊(duì)列,這樣做有什么好處,因?yàn)镃PU要保證每個(gè)進(jìn)程較為公平的都能夠得到調(diào)度,如果只有一個(gè)隊(duì)列的話,如果已經(jīng)在調(diào)度100位置的優(yōu)先級(jí)了,此時(shí)如果前面插入了一個(gè)優(yōu)先級(jí)高的進(jìn)程,那CPU就得拐回去調(diào)度它,如果加入的優(yōu)先級(jí)高的進(jìn)程很多的話,會(huì)導(dǎo)致優(yōu)先級(jí)低的一直無(wú)法導(dǎo)致調(diào)度,從而導(dǎo)致進(jìn)程饑餓問(wèn)題,所以當(dāng)一個(gè)進(jìn)程沒(méi)有別調(diào)度完,就去過(guò)期隊(duì)列排隊(duì),所以活躍隊(duì)列的進(jìn)程一定會(huì)越來(lái)越少,如果CPU把活躍隊(duì)列中的所有優(yōu)先級(jí)的進(jìn)程都調(diào)度完了,就進(jìn)行swap(active,expired)操作,然后持續(xù)進(jìn)行這樣的操作,來(lái)保證每個(gè)進(jìn)程進(jìn)行較為公平的調(diào)度。
我們看到還有一個(gè)bitmap的東西,它其實(shí)是一個(gè)int的數(shù)組,可以表示160個(gè)比特位,所以就可以映射每個(gè)優(yōu)先級(jí)是否有進(jìn)程,利用這樣的位圖可以大大的提高查找非空隊(duì)列的效率。
nr_active就表示這個(gè)整個(gè)隊(duì)列queue總共有多少個(gè)運(yùn)行狀態(tài)的進(jìn)程。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-794647.html
那么今天的分享就到這里了,有什么不懂得可以私信博主,或者添加博主的微信,歡迎交流。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-794647.html
到了這里,關(guān)于進(jìn)程切換和是Linux2.6內(nèi)核中進(jìn)程調(diào)度的算法的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!