1. 程式人生 > >2017-2018-1 20155208 《信息安全系統設計基礎》第六周學習總結

2017-2018-1 20155208 《信息安全系統設計基礎》第六周學習總結

序列 特權 ec2 fork函數 cti 資料 訪問權限 hang 一次

2017-2018-1 20155208 《信息安全系統設計基礎》第六周學習總結

學習目標

  • 了解異常及其種類
  • 理解進程和並發的概念
  • 掌握進程創建和控制的系統調用及函數使用:fork,exec,wait,waitpid,exit,getpid,getppid,sleep,pause,setenv,unsetenv,
  • 理解數組指針、指針數組、函數指針、指針函數的區別
  • 理解信號機制:kill,alarm,signal,sigaction
  • 掌握管道和I/O重定向:pipe, dup, dup2

教材學習內容總結

8.1 異常

  • 異常就是控制流中的突變,用來響應處理器狀態中的某些變化。

  • 異常控制流:現代系統通過使控制流發生突變來對這些情況作出反應。

  • 8.1.1 異常處理

  • 系統中可能的每種類型的異常都分配了一個唯一的非負整數的異常號。

  • 異常號的分配:

    1、處理器的設計者:被除零、缺頁、存儲器訪問違例、斷點以及算數溢出。

    2、操作系統內核的設計者分配的:系統調用和來自意外的I/O設備的信號。

  • 異常號:到異常表中的索引異常表基址寄存器:異常表的起始地址存放的位置。3、異常與過程調用的異同:

    1、過程調用時,在跳轉到處理器之前,處理器將返回地址壓入棧中。然而,根據異常的類型,返回地址要麽是當前指令,要麽是下一條指令。

    2、處理器把一些額外的處理器狀態壓入棧裏,在處理程序返回時,重新開始被中斷的程序會需要這些狀態。

    3、如果控制從一個用戶程序轉移到內核,那麽所有這些項目都被壓到內核棧中,而不是壓到用戶棧中。

    4、異常處理程序運行在內核模式下,意味著它們對所有的系統資源都有完全的訪問權限。

  • 8.1.2異常的類別

  • 中斷: 來自I/O設備的信號,異步,總是返回到下一條指令

  • 陷阱: 有意的異常,同步,總是返回到下一條指令

  • 故障: 潛在可恢復的錯誤,同步,可能返回到當前指令

  • 終止: 不可恢復的錯誤,同步,不會返回

8.2 進程

  • 異常是允許操作系統提供進程的概念所需要的基本構造塊。

  • 進程:一個執行中的程序的實例。

  • 上下文是由程序正確運行所需要的狀態組成的,這個狀態包括存放在存儲器中的程序的代碼和數據,它的棧、通用目的寄存器的內容、程序計數器、環境變量以及打開文件描述符的集合。

  • 進程提供給應用程序的關鍵抽象:一個獨立的邏輯控制流,獨占地使用處理器;一個私有的地址空間,獨占地使用存儲器系統。

  • 8.2.1 邏輯控制流

    程序計數器:唯一的對應於包含在程序的可執行目標文件中的指令,或者是包含在運行時動態鏈接到程序的共享對象中的指令。這個PC值的序列叫做邏輯控制流,簡稱邏輯流。

  • 8.2.2 並發流

  • 並發流:一個邏輯流的執行在時間上與另一個流重疊。

並發:多個流並發地執行的一般現象。

多任務:一個進程和其他進程輪流運行的概念。

時間片:一個進程執行它的控制流的一部分的每一時間段。

多任務也叫時間分片。

  • 並行流:如果兩個流並發的運行在不同的處理器核或者計算機上

  • 8.2.3 私有地址空間

  • 這個空間中某個地址相關聯的那個存儲器字節是不能被其他進程讀或者寫的

  • 8.2.4 用戶模式和內核模式

  • 當設置了模式位時,進程就運行在內核模式中

  • 沒有設置模式位時,進程就運行在用戶模式中。用戶模式中的進程不允許執行特權指令。

  • 進程從用戶模式變位內核模式的唯一方法是通過諸如中斷、故障或者陷入系統調用這樣的異常。 /proc文件系統允許用戶模式進程訪問內核數據結構的內容

  • 8.2.5 上下文切換

  • 上下文切換:是較高形式的異常控制流來實現多任務

  • 調度:在進程執行的某些時刻,內核可以決定搶占當前進程,並重新開始一個先前被搶占的進程。這種決定叫做調度

  • 當內核代表用戶執行系統調用時,可能會發生上下文切換。如果系統調用因為等待某個事件發生阻塞,那麽內核可以讓當前進程休眠,切換到另一個進程

  • 中斷也可能引發上下文切換

8.3 系統調用錯誤處理

  • 錯誤處理包裝函數:包裝函數調用基本函數,檢查錯誤,如果有任何問題就終止。 8.4 進程控制

  • 8.4.1獲取進程ID

    每個進程都有一個唯一的正數進程ID gitpid函數返回調用進程的PID,getppid函數返回它的父進程的PID(創建調用進程的進程)

  • 8.4.2 創建和終止進程

    進程狀態:運行、停止、終止 exit函數以status退出狀態來終止進程 fork函數

    父進程通過調用fork函數創建一個新的運行子進程

    當父進程調用fork時,子進程可以讀寫父進程中打開的任何文件

    父進程和子進程之間最大的區別在於有不同的PID

    調用一次,返回兩次

    並發執行

    相同但是獨立的地址空間

    共享文件

  • 8.4.3 回收子進程 僵死進程沒有運行,他們仍然消耗系統的存儲器資源 一個進程可以通過調用waitpid函數來等待它的子進程終止或停止

1、判定等待集合的成員(由參數pid確定) pid>0,等待集合就是一個單獨的子進程,它的進程ID等於pid pid=-1,等待集合就是由父進程所有的子進程組成的

2、修改默認行為 WNOHANG:默認行為是掛起調用進程,直到有子進程終止 WUNTRCED:默認行為是只返回已經終止的子進程 WNOHANG|WUNTRCED:立即返回

3、檢查已回收子進程的退出狀態

4、錯誤條件 如果調用進程沒有子進程,那麽waitpid返回-1,設置errno為ECHILD 如果waidpid函數被一個信號中斷,那麽它返回-1,並設置errno為EINTR

5、wait函數

6、使用waitpid的示例

  • 8.4.4 讓進程休眠

sleep函數將一個進程掛起一段指定的時間 pause函數讓調用函數休眠,直到該進程收到一個信號

  • 8.4.5 加載並運行程序

execve函數在當前進程的上下文中加載並運行一個新程序,execve調用一次並從不返回 argv參數列表,envp環境變量getenv函數

8.5 信號

  • 底層的硬件異常是由內核異常處理程序處理的,正常情況下,對用戶進程而言是不可見的。

  • 其他信號對應於內核或者其他用戶進程中較高層的軟件事件

  • 8.5.1 信號術語

    發送信號的兩個不同步驟:

1、發送信號:內核通過更新目的進程上下文中的某個狀態,發送(遞送)一個信號給目的進程。

2、接收信號:信號處理程序捕獲信號的基本思想。

發送信號的兩個原因:

1、內核監測到一個系統事件,比如被零除錯誤或者子進程終止。

2、一個進程調用了kill函數,顯式地要求內核發送一個信號給目的進程。一個進程可以發送信號給它自己。

待處理信號:一個只發出而沒有被接收的信號

1、一個進程可以有選擇性地阻塞接收某種信號。

2、待處理信號不會被接收,直到進程取消對這種信號的阻塞。

一個待處理信號最多只能被接受一次,pending位向量:維護著待處理信號集合,blocked向量:維護著被阻塞的信號集合。

代碼調試中的問題和解決過程

exec

exec1

  • exec1.c中execvp()會從PATH 環境變量所指的目錄中查找符合參數file 的文件名,找到後便執行該文件,然後將第二個參數argv傳給該欲執行的文件 如果執行成功則函數不會返回,執行失敗則直接返回-1,失敗原因存於errno中 編譯運行結果如下,沒有返回“* * * man is done. bye”
  • 技術分享

exec2

  • 將exevp函數傳入的arglist[0]改為arglist[1],此時exevp函數沒有調用成功,於是打印出“* * * ls is done. bye”這句話
  • 運行截圖如下:
  • 技術分享

exec3

  • 函數中execlp()會從PATH 環境變量所指的目錄中查找符合參數file的文件名,找到後便執行該文件,然後將第二個以後的參數當做該文件的argv[0]、argv[1]……最後一個參數必須用空指針(NULL)作結束
  • 運行截圖如下:
  • 技術分享
  • 技術分享

fork

forkdemo1

  • 打印進程pid,然後調用fork函數生成子進程,休眠一秒後再次打印進程id,這時父進程打印子進程pid,子進程返回0。

forkdemo2

  • 調用兩次fork,一共產生四個子進程,所以會打印四個aftre輸出。
  • 運行截圖如下:技術分享

forkdemo3

  • fork產生子進程,父進程返回子進程pid,不為0,所以輸出父進程的那句話,子進程返回0,所以會輸出子進程那句話。
  • 運行截圖如下:
  • 技術分享

forkdemo4

  • 先打印進程pid,然後fork創建子進程,父進程返回子進程pid,所以輸出parent一句,休眠十秒;子進程返回0,所以輸出child與之後一句。
  • 運行截圖如下:
  • 技術分享

forkgdb

  • 父進程打印是先打印兩句,然後休眠一秒,然後打印一句,子進程先打印一句,然後休眠一秒,然後打印兩句。並且這兩個線程是並發的,所以可以看到在一個線程休眠的那一秒,另一個線程在執行,並且線程之間相互獨立互不幹擾
  • 運行截圖如下:
  • 技術分享

psh

psh1

  • 輸入要執行的指令,回車表示輸入結束,然後輸入的每個參數對應到函數中,再調用對應的指令。
  • 運行截圖:
  • 技術分享

psh2

  • 比起1來,多了循環判斷,不退出的話就會一直要你輸入指令,並且對於子程序存在的狀態條件。
  • 運行截圖:
  • 技術分享

testbuf

testbuf

  • 用到了fflush(stdout),目的是清空緩沖,強制結果馬上顯示到屏幕上
  • 運行截圖:
  • 技術分享

代碼托管

代碼上傳截圖:

技術分享

技術分享

技術分享

碼雲鏈接

學習進度條

代碼行數(新增/積累)博客量(新增/積累學習時間(新增/累積)
目標 5000行 30篇 400小時
第一周 5/5 1/1 8/8
第二周 120/120 1/1 12/12
第三周 100/100 1/1 15/15
第四周 80/80 1/1 9/9
第五周 50/50 1/1 6/6
第六周 350/350 1/1 12/12

參考資料

《深入理解計算機系統V3》學習指導

2017-2018-1 20155208 《信息安全系統設計基礎》第六周學習總結