好湿?好紧?好多水好爽自慰,久久久噜久噜久久综合,成人做爰A片免费看黄冈,机机对机机30分钟无遮挡

主頁 > 知識庫 > 深入解析Linux系統下的進程切換

深入解析Linux系統下的進程切換

熱門標簽:拉薩銷售外呼系統軟件 常熟外呼系統 百度地圖標注未成功 文山外呼營銷系統 江蘇小型外呼系統軟件 地圖上標注點位的圖標 中山防封卡電銷卡辦理 電話機器人服務器部署 電銷語音機器人哪個好

Linux內核下進程切換
Linux切換并沒有使用X86CPU的切換方法,Linux切換的實質就是cr3切換(內存空間切換,在switch_mm函數中)+ 寄存器切換(包括EIP,ESP等,均在switch_to函數中)。這里我們講述下switch_to主流程:
1、 在switch_mm函數中將new_task->pgd設置到cr3寄存器中,實現頁表切換,由于每個進程3-4G的頁表映射機制完全一樣(從內核頁表中直接復制過來的),故這里雖然切換了pgd,但是并無影響,只是在任務回到用戶空 間中時,才會發生變化,因為每個任務在0-3G中的頁表映射都是各自獨立的;
2、 壓入esi edi ebp到cur_task堆棧中;
3、 將esp寄存器中的值保存到cur_task.task_struct.thread.esp中,也就是將cur_task切換時的堆棧指針保存起來;
4、 將new_task.task_struct.thread.esp中的值設置到esp寄存器中,這里的new_task.task_struct.thread.esp中的值就是new_task上一次被換出時的堆棧指針,現在被恢復了,2和3結合實現了從cur_task到new_task的堆棧切換;
5、 將1f地址設置到cur_task.task_struct.thread.eip中,當下次cur_task恢復運行時,將會從1f處開始運行,下面闡述了這種原理;
6、 將new_task.task_struct.thread.eip壓入到new_task的堆棧中,這里new_task.task_struct.thread.eip的值就是1f,因為從4中可知,new_task上一次被換出時,其也是和現在的cur_task類似,1f地址被設置到new_task.task_struct.thread.eip中;
7、 隨后CPU跳轉到__switch_to函數中開始執行,注意這里使用的是jmp,不是call,call會pusheip,而jmp不會,由于__switch_to是函數,當CPU執行完該函數后,最后一條指令必然為iret,該指令會popeip,從5中可以知道,此時new_task堆棧中的鏡像為[......., esi,edi,ebp,eip(1f)],故popeip將值eip(1f)設置到eip寄存器中,這樣當iret執行完畢后,CPU將從eip處繼續執行,也就是從1f處繼續執行;
8、 此時已經在new_task的執行環境中了,pop ebp, pop edi, popesi,回到schedule函數中,當返回用戶空間中時,由于new_task用戶空間的eip,ss,esp等均被從new_task的堆棧中彈出到對應寄存器中,從而new_task得以順利執行。


Linux 前后臺進程切換
當你用shell啟動一個程序時,往往他是在前臺工作的。 例如經常用PUTTY連接到遠程服務器執行腳本的時候,如果本地網絡中斷后,這個時候前臺進程就結束了,比較的懊惱,必須重新執行。因此有必要進行前后臺進程的切換。

例如直接在終端里輸入firefox,那么會打開firefox,但當你關閉此終端或者ctrl+c強制終止時,firefox也隨機關閉了。

你可以在執行時后面加一個,這樣就在后臺工作了。Shell支持作用控制,有以下命令:

(1). command  讓進程在后臺運行
(2). jobs –l 查看后臺運行的進程
(3). fg %n 讓后臺運行的進程n到前臺來
(4). bg %n 讓進程n到后臺去;
PS:"n"為jobs查看到的進程編號。

1、執行命令切換至后臺
在Linux終端運行命令的時候,在命令末尾加上符號,就可以讓程序在后臺運行

復制代碼
代碼如下:
root@Ubuntu$ ./tcpserv01

2、切換正在運行的程序到后臺
如果程序正在前臺運行,可以使用Ctrl+z 選項把程序暫停,然后用 bg %[number]命令把這個程序放到后臺運行,這個步驟分為3步,如下:
2.1暫停程序運行CTRL+Z
ctrl + z跟系統任務有關的,ctrl + z可以將一個正在前臺執行的命令放到后臺,并且暫停。

復制代碼
代碼如下:
[Oracle@linuxidc ~]$ sh ins.sh
[1]+Stopped ins.sh

2.2查看暫停的程序
察看jobs使用jobs或ps命令可以察看正在執行的jobs。

復制代碼
代碼如下:
[oracle@linuxidc ~]$ jobs -l
[1]+ 4524Stopped ins.sh

jobs命令執行的結果,+表示是一個當前的作業,減號表是是當前作業之后的一個作業。
jobs -l選項可顯示所有任務的PID,jobs的狀態可以是running, stopped,Terminated
2.3切換程序至后臺
bg將一個在后臺暫停的命令,變成繼續執行如果后臺中有多個命令,可以用bg %jobnumber將選中的命令調出.
復制代碼
代碼如下:

[oracle@linuxidc ~]$ bg %1
[oracle@linuxidc ~]$ jobs -l
[1]+ 4524Running ins.sh

2.4切換程序至前臺
也可以用 fg %[number]指令把一個程序掉到前臺運行

復制代碼
代碼如下:
[oracle@linuxidc ~]$ fg %1
./tcpserv01

2.5終止后臺程序
也可以直接終止后臺運行的程序,使用 kill 命令
復制代碼
代碼如下:

[oracle@linuxidc ~]$ kill %1

但是如果任務被終止了(kill),shell 從當前的shell環境已知的列表中刪除任務的進程標識;也就是說,jobs命令顯示的是當前shell環境中所起的后臺正在運行或者被掛起的任務信息。

標簽:河南 威海 黔南 海北 天門 鶴壁 欽州 景德鎮

巨人網絡通訊聲明:本文標題《深入解析Linux系統下的進程切換》,本文關鍵詞  深入,解析,Linux,系統,下,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《深入解析Linux系統下的進程切換》相關的同類信息!
  • 本頁收集關于深入解析Linux系統下的進程切換的相關信息資訊供網民參考!
  • 推薦文章