2018-2019-1 20165226 《資訊安全系統設計基礎》第7周學習總結
阿新 • • 發佈:2018-11-12
2018-2019-1 20165226 《資訊安全系統設計基礎》第7周學習總結
目錄
一、教材學習內容總結
1、瞭解異常及其種類
異常
- 異常是異常控制流的一種形式,它一部分是由硬體實現的,一部分是有作業系統實現的。
- 異常:控制流中的突變,用來響應處理器狀態中的某些變化。
- 當異常處理程式完成處理後,根據引起異常的事件的型別,會發生以下三種情況的一種:
- 處理程式將控制返回給當前指令Icurr,即當事件發生時正在執行的指令。
- 處理程式將控制返回給Inext,即如果沒有發生異常將會執行的下一條指令。
- 處理程式終止被中斷的程式。
異常類別
- 中斷(非同步)
- 陷阱(同步)
- 故障(同步)
- 終止(同步)
類別 | 原因 | 非同步/同步 | 返回行為 |
---|---|---|---|
中斷 | 來自I/O裝置的訊號 | 非同步 | 總是返回到下一條指令 |
陷阱 | 有意的異常 | 同步 | 總是返回到下一條指令 |
故障 | 潛在可恢復的錯誤 | 同步 | 可能返回到當前的指令 |
終止 | 不可恢復的錯誤 | 同步 | 不會返回 |
異常處理
- 異常表基址暫存器:異常表的起始地址存放的位置。
- 異常與過程呼叫的異同:
- 過程呼叫時,在跳轉到處理器之前,處理器將返回地址壓入棧中。然而,根據異常的型別,返回地址要麼是當前指令,要麼是下一條指令。
- 處理器把一些額外的處理器狀態壓入棧裡,在處理程式返回時,重新開始被中斷的程式會需要這些狀態。
- 如果控制從一個使用者程式轉移到核心,那麼所有這些專案都被壓到核心棧中,而不是壓到使用者棧中。
- 異常處理程式執行在核心模式下,意味著它們對所有的系統資源都有完全的訪問許可權。
2、理解程序和併發的概念
程序
- 是一個執行中的程式的例項,系統中的每個程式都是定義在執行在某個程序的上下文中的。異常是允許作業系統提供程序的概念所需要的基的本構造塊。
- 程序提供給應用程式的關鍵抽象:
- 一個獨立的邏輯控制流,獨佔地使用處理器;
- 一個私有的地址空間,獨佔地使用儲存器系統。
併發
- 併發流:一個邏輯流的執行在時間上與另一個流重疊。
- 併發:多個流併發地執行的一般現象。
- 多工:一個程序和其他程序輪流執行的概念。
- 時間片:一個程序執行它的控制流的一部分的每一時間段。
- 多工也叫時間分片。
- 並行流:如果兩個流併發的執行在不同的處理器核或者計算機上
3、掌握程序建立和控制的系統呼叫及函式使用:fork,exec,wait,waitpid,exit,getpid,getppid,sleep,pause,setenv,unsetenv,
程序建立
- 父程序通過呼叫fork函式建立一個新的執行的子程序。
- 子程序和父程序的異同:
- 異:有不同的PID
- 同:使用者級虛擬地址空間,包括:文字、資料和bss段、堆以及使用者棧。任何開啟檔案描述符,子程序可以讀寫父程序中開啟的任何檔案。
- fork函式: 因為父程序的PID總是非零的,返回值就提供一個明確的方法來分辨程式是在父程序還是在子程序中執行。
- fork函式的特點:
- 呼叫一次,返回兩次
- 併發執行
- 相同的但是獨立的地址空間
- 共享檔案
**回收子程序
- 一個程序可以通過呼叫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。
- 判定等待集合的成員,通過引數pid來確定的:
- pid>0:等待集合是一個單獨的子程序,程序ID等於pid。
- pid=-1:等待結合就是由父程序所有的子程序組成的。
- 錯誤條件
- 如果呼叫程序沒有子程序,那麼waitpid返回-1,並設定errno為ECHILD
- 如果函式被一個訊號中斷,那麼返回-1,並設定errno為EINTR。
- wait函式:呼叫wait(&status)等價於呼叫waitpid(-1.&status,0)
#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函式:在當前程序的上下文中載入並執行一個新程式。引數相關說明:
- filename:可執行目標檔案
- argv:帶引數列表
- envp:環境變數列表
特點:execve呼叫一次從不返回
include <unistd.h>
int execve(const char filename,const char argv[],const char *envp[]);
//返回:若成功,則不返回,若錯誤,返回-1
- getenv函式:在環境陣列中搜素字串“name =VALUE”,若找到了,就返回一個指向value的指標,否則它就返回NULL。
include <stdlib.h>
char getenv(const char name);
//返回:存在,返回指向name的指標,若無匹配的,為NULL
4、理解訊號機制:kill,alarm,signal,sigaction
- 程序組
- 每個程序都只屬於一個程序組,程序組是由一個正整數程序組ID來標識的。getpgrp函式返回當前程序的程序組ID:預設地,一個子程序和它的父程序同屬於一個程序組。
- 用/bin/kill/程式傳送訊號 一個為負的PID會導致訊號被髮送到程序組PID中的每個程序。
- 從鍵盤傳送訊號
- 作業:表示對一個命令列求值而建立的程序。外殼為每個作業建立一個獨立的程序組。
- 用kill函式傳送訊號
- 程序通過呼叫kill函式傳送訊號給其他的程序。父程序用kill函式傳送SIGKILL訊號給它的子程序。
- 用alarm函式傳送訊號
- 在任何情況下,對alarm的呼叫都將取消任何待處理的鬧鐘,並且返回任何待處理的鬧鐘在被髮送前還剩下的秒數。
5、掌握管道和I/O重定向:pipe, dup, dup2
- 重定向I/O的是shell而不是程式。
- 管道是一個佇列,當從管道讀走資料後,資料就不存在了。如果兩個程序都對管道進行讀操作,當一個程序讀走一些資料後,另一個程序讀到的是後面的內容。
- dup 和 dup2 是用來複制一個檔案描述符,dup只有一個引數,dup2有兩個引數。通常用來重定向程序的stdin(檔案描述符0),stdout(檔案描述符1), stderr(檔案描述符2)。
二、課堂測試補做
練習題
參考虛擬碼實現ls的功能,提交程式碼的編譯,執行結果截圖,碼雲程式碼連結。
開啟目錄檔案- 程式碼
#include<sys/types.h>
#include <stdio.h>
#include<dirent.h>
#include<unistd.h>
int main(int argc,char **argv)
{
DIR * dir;
struct dirent * ptr;
int i;
if(argc==1)
dir=opendir("./");
else
dir=opendir(argv[1]);
while((ptr=readdir(dir))!=NULL)
{
printf("d_name: %s\n",ptr->d_name);
}
closedir(dir);
return 0;
}
三、程式碼託管與統計
****
程式碼託管
四、學習進度條
程式碼行數(新增/累積) | 部落格量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 | |
第一週 | 87/87 | 2/2 | 20/20 | |
第二週 | 71/158 | 1/3 | 12/32 | |
第三週 | 100/258 | 2/5 | 13/45 | |
第四周 | 3265/9750 | 2/7 | 15/60 | |
第五週 | 282/9786 | 1/8 | 8/68 | |
第六週 | 1980/13996 | 2/10 | 8/76 | |
第七週 | 488/14484 | 1/11 | 8/84 |
嘗試一下記錄「計劃學習時間」和「實際學習時間」,到期末看看能不能改進自己的計劃能力。這個工作學習中很重要,也很有用。
耗時估計的公式
:Y=X+X/N ,Y=X-X/N,訓練次數多了,X、Y就接近了。
計劃學習時間:8小時
實際學習時間:8小時
改進情況:
(有空多看看現代軟體工程 課件
軟體工程師能力自我評價表)