2017-2018-1 20155301 《信息安全系統設計基礎》第14周學習總結
2017-2018-1 20155301 《信息安全系統設計基礎》第14周學習總結
教材第八章內容學習內容總結
異常
- 異常是控制流中的突變,用來響應處理器狀態中的某些變化。
- 控制流是指控制轉移序列,就是從一條指令到下一條指令
- 異常控制流:現代操作系統通過使控制流發生突變來對系統狀態做出反應,這些突變稱為異常控制流,異常控制流,其實講的是控制各種狀態,狀態變化了,肯定有一定的方法可以檢測,檢測之後,就對應的轉移控制。其實就是設置了一些條件,如果條件觸發了,就做一些事情。核心就是這樣的。
異常處理
- 異常表:當處理器監測到有事件發生時,通過一張叫做異常表的跳轉表,進行一個間接過程調用,到一個專門設計用來處理這類事件的操作系統子程序(異常處理程序),而這裏所謂的事件就是在處理器中,狀態被編碼為不同的位和信號,狀態變化就是事件。
- 異常號:系統中可能的某種類型的異常都分配了一個唯一的非負整數的異常號。異常號是到異常表中的索引。
- 當異常處理程序完成處理後,根據引起異常的事件的類型,會發生以下三種情況的一種: 1)處理程序將控制返回給當前指令Icurr,即當事件發生時正在執行的指令。
2)處理程序將控制返回給Inext,即如果沒有發生異常將會執行的下一條指令。
3)處理程序終止被中斷的程序。
- 異常表基址寄存器:異常表的起始地址存放的位置。
- 異常與過程調用的不同之處 1)過程調用時,在跳轉到處理器之前,處理器將返回地址壓入棧中。然而,根據異常的類型,返回地址要麽是當前指令,要麽是下一條指令。
2)處理器把一些額外的處理器狀態壓入棧裏,在處理程序返回時,重新開始被中斷的程序會需要這些狀態。
3)如果控制從一個用戶程序轉移到內核,那麽所有這些項目都被壓到內核棧中,而不是壓到用戶棧中。
4)異常處理程序運行在內核模式下,意味著它們對所有的系統資源都有完全的訪問權限。
異常的類別
- 中斷:異步發生,是來自處理器外部的I/O設備的信號的結果。
1)硬件異常中斷處理程序通常稱為中斷處理程序。
2)異步異常是有處理器外部的I/O設備中的時間產生的,同步異常是執行一條指令的直接產物。
3)陷阱、故障、終止時同步發生的,是執行當前指令的結果,我們把這類指令叫做故障指令。
- 陷阱和系統調用,陷阱最重要的用途是在用戶程序和內核之間提供一個像過程一樣的接口,叫做系統調用
1)普通的函數運行在用戶模式中,用戶模式限制了函數可以執行的指令的類型,而且它們只能訪問與調用函數相同的棧。系統調用運行在內核模式中,內核模式允許系統調用執行指令,並訪問定義在內核中的棧。
2)陷阱是有意的異常,最重要的用途是在用戶程序和內核之間提供一個向過程一樣的接口。
3)為了允許內核服務的受控訪問,使用“syscall n”指令,跳轉到一個異常處理程序的陷阱,處理程序對參數解碼並調用適當的內核程序。
- 故障,是由錯誤情況引起的故障
- 終止,不可恢復的致命錯誤造成的結果,通常是一些硬件錯誤。
1)終止處理程序從不將控制返回給應用程序。
2)終止處理程序將控制直接返回給abort例程,直接終止該應用程序。
進程
- 進程,就是一個執行中的程序的實例,系統中的每個程序都是定義在運行在某個進程的上下文中的。異常是允許操作系統提供進程的概念所需要的基的本構造塊。
- 進程提供給應用程序的關鍵抽象:
1)一個獨立的邏輯控制流,獨占地使用處理器
2)一個私有的地址空間,獨占地使用存儲器系統
- 邏輯控制流,程序計數器(PC)的值唯一地對應於包含在程序可執行目標文件中的指令,或者是包含在運行時動態鏈接到程序的共享對象中的指令。這個PC值的序列叫做邏輯控制流
- 進程輪流使用處理器,每個進程執行流的一部分,然後被搶占(暫時掛起)。
- 並發流:一個邏輯流的執行在時間上與另一個流重疊。
1)並發:多個流並發地執行的一般現象。
2)多任務:一個進程和其他進程輪流運行的概念。
3)時間片:一個進程執行它的控制流的一部分的每一時間段。
4)多任務也叫時間分片。
- 私有地址空間,一個進程為每個程序提供他自己的私有地址空間,一般而言,和這個空間中某個地址相關聯的存儲器字節不能被其他程序讀或寫,地址空間底部是保留給用戶程序的,頂部保留給保留給內核,用來存放內核在代表進程執行時的指令。
上下文切換
- 上下文切換操作系統內核使用叫上下文切換的異常控制流來實現多任務。
- 上下文切換機制: 1)保存當前進程的上下文
2)恢復某個先前被搶占的進程被保存的上下文
3)將控制傳遞給這個新恢復的進程
- 引起上下文切換的情況
1)當內核代表用戶執行系統調用時
2)中斷時
系統調用錯誤
- 系統調用錯誤:當UNIX系統級函數遇到錯誤時,它們典型地會返回-1,並設置全局整數變量errno來表示什麽出錯了。
進程控制
- 每個進程有一個唯一的非零正數進程ID(PID)。
#include <sys/types.h>
#include <unistd.h>
pid_t getpid(void); 返回調用進程的PID
pid_t getppid(void); 返回父進程的PID(創建調用進程的進程)
- 創建和終止進程
從程序員的角度,我們可以認為進程總處於下面三種狀態之一:
1)運行:進程要麽在CPU上執行,要麽在等待被執行且最終會被內核調度。
2)停止:程序的執行被掛起,,且不會被調度。
3)終止:進程用永遠停止了。終止原因是收到一個信號,默認行為是終止進程、從主進程返回、調用exit函數。
- 父進程通過調用fork創建一個新的運行子進程:父進程與子進程有相同(但是獨立的)地址空間
子進程和父進程的異同: 1)不同之處就是有不同的PID
2)相同之處就是用戶級虛擬地址空間,包括:文本、數據和bss段、堆以及用戶棧。任何打開文件描述符,子進程可以讀寫父進程中打開的任何文件。
- fork函數定義如下:
#include <sys/types.h>
#include <unistd.h>
pid_t fork(void);
- fork函數的特點
1)調用一次,返回兩次
2)並發執行
3)相同的但是獨立的地址空間
4)共享文件
回收子進程
- 當一個進程由於某種原因終止,內核不會將他馬上清除,而是將進程保持在已終止的狀態中,直到被他的父進程回收。
- 當父進程回收已終止的子進程時,內核將子進程的退出狀態傳遞給父進程,然後拋棄已終止的進程。一個終止了但還未被回收的進程稱為僵死進程。
- 一個進程可以通過調用waitpid函數來等待它的子進程終止或者停止。默認地,當option=0時,waitpid掛起調用進程的執行,直到它的等待集合中的一個子進程終止。
#include <sys/types.h>
#include <sys/wait.h>
pid_t waitpid(pid_t pid,int *status,int options);
//返回:若成功,返回子進程的PID;若WNOHANG,返回0;若其他錯誤,返回-1。
當options=0時,調用這個函數的進程掛起,也就是這個進程處於函數中什麽也不做,等待著,等待什麽呢,等待其子進程終止,如果終止了一個,那麽函數就返回了,返回的,就是終止的子進程的pid,並且將這個子進程從系統中除去。
- 有哪些等待的子進程?
1)pid=-1,那麽就是所有的子進程
2)pid>0,那麽就是一個子進程,當前pid表示的那個子進程。
-修改默認行為
1)options=WNOHANG時,如果沒有終止的子進程,那麽函數立即返回,返回0。
2)options=WUNTRACED時,和options=0類似,但這裏還檢測停止的子進程。
3)options=0只檢測終止的子進程。且,本options不會將子進程從系統中除去。
4)options=WNOHANG|WNUNTRACED時,立即返回,返回值要麽是停止或者終止的pid,要麽是0。
- 錯誤條件
1)如果調用進程沒有子進程,那麽waitpid返回-1,並設置errno為ECHILD
2)如果函數被一個信號中斷,那麽返回-1,並設置errno為EINTR。
- wait函數:調用wai等價於調用waitpid(-1.&status,0),wait函數是waitpid函數的簡單版本
#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int *status);
//返回:若成功,返回子進程的PID;若錯誤,返回-1。
讓進程休眠
- sleep函數:將進程掛起一段指定的時間
#include <unistd.h>
unsigned int sleep(unsigned int secs);
//返回:還要休眠的秒數
- pause函數:讓調用函數休眠,直到該進程收到一個信號
#include <unistd.h>
int pause(void);
//返回:總是-1
加載並運行程序
- execve函數:在當前進程的上下文中加載並運行一個新程序。
#include <unistd.h>
int execve(const char *filename, const char *argv[], const char *envp[]);
成功不返回,錯誤返回-1。 execve的參數相關說明:
1)filename:可執行目標文件
2)argv:帶參數列表
3)envp:環境變量列表
execve函數調用一次,從不返回。
- getenv函數:在環境數組中搜素字符串“name =VALUE”,若找到了,就返回一個指向value的指針,否則它就返回NULL
#include <stdlib.h>
char *getenv(const char *name);
//返回:存在,返回指向name的指針,若無匹配的,為NULL
- fork函數和execve函數的區別:
1)fork函數在新的子進程中運行相同的程序,新的子進程是父進程的一個復制品。
2)execve函數在當前進程的上下文中加載並運行一個新的程序,它會覆蓋當前進程的地址空間,但並沒有創建一個新進程。
3)新的程序仍然有相同的pid,並且繼承了調用execve函數時已打開的所有文件描述符。
信號
- 信號就是一條小消息,通知進程系統中發生了一個某種類型的事件。
- 發送信號:內核通過更新目的進程上下文中的某個狀態,發送一個信號給目的進程。
- 接收信號:當目的進程被內核強迫以某種方式對信號的發送做出反應時,目的進程就接收了信號。通過信號處理程序捕獲信號。
- 發送信號的方式
1)/bin/kill
2)鍵盤發送信號
3)kill函數
4)alarm函數
- 接收信號的默認行為
1)進程終止
2)進程終止並轉儲存儲器
3)進程停止直到被SIGCONT信號重啟
4)進程忽略該信號。
- 信號處理問題
1)待處理信號被阻塞
2)待處理信號不會排隊等待
3)系統調用可以被中斷
- 可移植的信號處理,信號處理語義的差異,是UNIX信號處理的一個缺陷。
教材學習中的問題和解決過程
(一個模板:我看了這一段文字 (引用文字),有這個問題 (提出問題)。 我查了資料,有這些說法(引用說法),根據我的實踐,我得到這些經驗(描述自己的經驗)。 但是我還是不太懂,我的困惑是(說明困惑)。【或者】我反對作者的觀點(提出作者的觀點,自己的觀點,以及理由)。 )
- 問題1:XXXXXX
- 問題1解決方案:XXXXXX
- 問題2:XXXXXX
- 問題2解決方案:XXXXXX
- ...
代碼調試中的問題和解決過程
- 問題1:XXXXXX
- 問題1解決方案:XXXXXX
- 問題2:XXXXXX
- 問題2解決方案:XXXXXX
- ...
代碼托管
(statistics.sh腳本的運行結果截圖)
上周考試錯題總結
- 錯題1及原因,理解情況
- 錯題2及原因,理解情況
- ...
結對及互評
點評模板:
- 博客中值得學習的或問題:
- xxx
- xxx
- ...
- 代碼中值得學習的或問題:
- xxx
- xxx
- ...
- 其他
本周結對學習情況
- [結對同學學號1](博客鏈接)
- 結對照片
- 結對學習內容
- XXXX
- XXXX
- ...
其他(感悟、思考等,可選)
xxx xxx
學習進度條
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 | |
第一周 | 200/200 | 2/2 | 20/20 | |
第二周 | 300/500 | 2/4 | 18/38 | |
第三周 | 500/1000 | 3/7 | 22/60 | |
第四周 | 300/1300 | 2/9 | 30/90 |
嘗試一下記錄「計劃學習時間」和「實際學習時間」,到期末看看能不能改進自己的計劃能力。這個工作學習中很重要,也很有用。 耗時估計的公式 :Y=X+X/N ,Y=X-X/N,訓練次數多了,X、Y就接近了。
參考:軟件工程軟件的估計為什麽這麽難,軟件工程 估計方法
計劃學習時間:XX小時
實際學習時間:XX小時
改進情況:
(有空多看看現代軟件工程 課件 軟件工程師能力自我評價表)
參考資料
- 《深入理解計算機系統V3》學習指導
- ...
2017-2018-1 20155301 《信息安全系統設計基礎》第14周學習總結