本篇內(nèi)容介紹了“Linux系統(tǒng)下的進(jìn)程切換過程”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
目前成都創(chuàng)新互聯(lián)公司已為近1000家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)絡(luò)空間、網(wǎng)站托管維護(hù)、企業(yè)網(wǎng)站設(shè)計(jì)、蘇仙網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。Linux內(nèi)核下進(jìn)程切換
Linux切換并沒有使用X86CPU的切換方法,Linux切換的實(shí)質(zhì)就是cr3切換(內(nèi)存空間切換,在switch_mm函數(shù)中)+ 寄存器切換(包括EIP,ESP等,均在switch_to函數(shù)中)。這里我們講述下switch_to主流程:
1、 在switch_mm函數(shù)中將new_task->pgd設(shè)置到cr3寄存器中,實(shí)現(xiàn)頁表切換,由于每個(gè)進(jìn)程3-4G的頁表映射機(jī)制完全一樣(從內(nèi)核頁表中直接復(fù)制過來的),故這里雖然切換了pgd,但是并無影響,只是在任務(wù)回到用戶空 間中時(shí),才會(huì)發(fā)生變化,因?yàn)槊總€(gè)任務(wù)在0-3G中的頁表映射都是各自獨(dú)立的;
2、 壓入esi edi ebp到cur_task堆棧中;
3、 將esp寄存器中的值保存到cur_task.task_struct.thread.esp中,也就是將cur_task切換時(shí)的堆棧指針保存起來;
4、 將new_task.task_struct.thread.esp中的值設(shè)置到esp寄存器中,這里的new_task.task_struct.thread.esp中的值就是new_task上一次被換出時(shí)的堆棧指針,現(xiàn)在被恢復(fù)了,2和3結(jié)合實(shí)現(xiàn)了從cur_task到new_task的堆棧切換;
5、 將1f地址設(shè)置到cur_task.task_struct.thread.eip中,當(dāng)下次cur_task恢復(fù)運(yùn)行時(shí),將會(huì)從1f處開始運(yùn)行,下面闡述了這種原理;
6、 將new_task.task_struct.thread.eip壓入到new_task的堆棧中,這里new_task.task_struct.thread.eip的值就是1f,因?yàn)閺?中可知,new_task上一次被換出時(shí),其也是和現(xiàn)在的cur_task類似,1f地址被設(shè)置到new_task.task_struct.thread.eip中;
7、 隨后CPU跳轉(zhuǎn)到__switch_to函數(shù)中開始執(zhí)行,注意這里使用的是jmp,不是call,call會(huì)pusheip,而jmp不會(huì),由于__switch_to是函數(shù),當(dāng)CPU執(zhí)行完該函數(shù)后,最后一條指令必然為iret,該指令會(huì)popeip,從5中可以知道,此時(shí)new_task堆棧中的鏡像為[......., esi,edi,ebp,eip(&1f)],故popeip將值eip(&1f)設(shè)置到eip寄存器中,這樣當(dāng)iret執(zhí)行完畢后,CPU將從eip處繼續(xù)執(zhí)行,也就是從1f處繼續(xù)執(zhí)行;
8、 此時(shí)已經(jīng)在new_task的執(zhí)行環(huán)境中了,pop ebp, pop edi, popesi,回到schedule函數(shù)中,當(dāng)返回用戶空間中時(shí),由于new_task用戶空間的eip,ss,esp等均被從new_task的堆棧中彈出到對(duì)應(yīng)寄存器中,從而new_task得以順利執(zhí)行。
Linux 前后臺(tái)進(jìn)程切換
當(dāng)你用shell啟動(dòng)一個(gè)程序時(shí),往往他是在前臺(tái)工作的。 例如經(jīng)常用PUTTY連接到遠(yuǎn)程服務(wù)器執(zhí)行腳本的時(shí)候,如果本地網(wǎng)絡(luò)中斷后,這個(gè)時(shí)候前臺(tái)進(jìn)程就結(jié)束了,比較的懊惱,必須重新執(zhí)行。因此有必要進(jìn)行前后臺(tái)進(jìn)程的切換。
例如直接在終端里輸入firefox,那么會(huì)打開firefox,但當(dāng)你關(guān)閉此終端或者ctrl+c強(qiáng)制終止時(shí),firefox也隨機(jī)關(guān)閉了。
你可以在執(zhí)行時(shí)后面加一個(gè)&,這樣就在后臺(tái)工作了。Shell支持作用控制,有以下命令:
(1). command &讓進(jìn)程在后臺(tái)運(yùn)行
(2). jobs –l 查看后臺(tái)運(yùn)行的進(jìn)程
(3). fg %n 讓后臺(tái)運(yùn)行的進(jìn)程n到前臺(tái)來
(4). bg %n 讓進(jìn)程n到后臺(tái)去;
PS:"n"為jobs查看到的進(jìn)程編號(hào)。
1、執(zhí)行命令&切換至后臺(tái)
在Linux終端運(yùn)行命令的時(shí)候,在命令末尾加上&符號(hào),就可以讓程序在后臺(tái)運(yùn)行
代碼如下:
root@Ubuntu$ ./tcpserv01&
2、切換正在運(yùn)行的程序到后臺(tái)
如果程序正在前臺(tái)運(yùn)行,可以使用Ctrl+z 選項(xiàng)把程序暫停,然后用 bg %[number]命令把這個(gè)程序放到后臺(tái)運(yùn)行,這個(gè)步驟分為3步,如下:
2.1暫停程序運(yùn)行CTRL+Z
ctrl + z跟系統(tǒng)任務(wù)有關(guān)的,ctrl + z可以將一個(gè)正在前臺(tái)執(zhí)行的命令放到后臺(tái),并且暫停。
代碼如下:
[Oracle@linuxidc ~]$ sh ins.sh
[1]+Stopped ins.sh
2.2查看暫停的程序
察看jobs使用jobs或ps命令可以察看正在執(zhí)行的jobs。
代碼如下:
[oracle@linuxidc ~]$ jobs -l
[1]+ 4524Stopped ins.sh
jobs命令執(zhí)行的結(jié)果,+表示是一個(gè)當(dāng)前的作業(yè),減號(hào)表是是當(dāng)前作業(yè)之后的一個(gè)作業(yè)。
jobs -l選項(xiàng)可顯示所有任務(wù)的PID,jobs的狀態(tài)可以是running, stopped,Terminated
2.3切換程序至后臺(tái)
bg將一個(gè)在后臺(tái)暫停的命令,變成繼續(xù)執(zhí)行如果后臺(tái)中有多個(gè)命令,可以用bg %jobnumber將選中的命令調(diào)出.
代碼如下:
[oracle@linuxidc ~]$ bg %1
[oracle@linuxidc ~]$ jobs -l
[1]+ 4524Running ins.sh
2.4切換程序至前臺(tái)
也可以用 fg %[number]指令把一個(gè)程序掉到前臺(tái)運(yùn)行
代碼如下:
[oracle@linuxidc ~]$ fg %1
./tcpserv01
2.5終止后臺(tái)程序
也可以直接終止后臺(tái)運(yùn)行的程序,使用 kill 命令
代碼如下:
[oracle@linuxidc ~]$ kill %1
但是如果任務(wù)被終止了(kill),shell 從當(dāng)前的shell環(huán)境已知的列表中刪除任務(wù)的進(jìn)程標(biāo)識(shí);也就是說,jobs命令顯示的是當(dāng)前shell環(huán)境中所起的后臺(tái)正在運(yùn)行或者被掛起的任務(wù)信息。
“Linux系統(tǒng)下的進(jìn)程切換過程”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
分享名稱:Linux系統(tǒng)下的進(jìn)程切換過程-創(chuàng)新互聯(lián)
當(dāng)前網(wǎng)址:http://jinyejixie.com/article16/csdidg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作、建站公司、ChatGPT、云服務(wù)器、用戶體驗(yàn)、網(wǎng)站營銷
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容