1. 程式人生 > >2018-2019-1 20165330 《資訊安全系統設計基礎》第七週學習總結

2018-2019-1 20165330 《資訊安全系統設計基礎》第七週學習總結

學習目標

  • 瞭解異常及其種類
  • 理解程序和併發的概念
  • 掌握程序建立和控制的系統呼叫及函式使用:fork,exec,wait,waitpid,exit,getpid,getppid,sleep,pause,setenv,unsetenv
  • 理解陣列指標、指標陣列、函式指標、指標函式的區別
  • 理解訊號機制:kill,alarm,signal,sigaction
  • 掌握管道和I/O重定向:pipe, dup,dup2

學習內容

異常
  1. 是控制流中的突變,一部分由硬體實現,一部分由作業系統實現,用來響應處理器狀態中的某些變化。
  2. 異常處理
    • 異常表:在系統啟動時(當計算機重啟或者加電時),作業系統分配和初始化一張稱為異常表的跳轉表
    • 異常表基址暫存器:存放異常表的起始地址
      image
    • 非本地跳轉

        #include <setjmp.h>
      
        int setjmp(jmp_buf env);
        int sigsetjmp(sigjmp_buf env,int savesigs);
  3. 類別
類別 原因 非同步/同步 返回行為
中斷 來自I/O裝置的訊號 非同步 總是返回到下一條指令
陷阱 有意的異常 同步 總是返回到下一條指令
故障 潛在可恢復的錯誤 同步 可能返回到當前指令
終止 不可恢復的錯誤 同步 不會返回
程序
  1. 系統中的每個程式都執行在某個程序的上下文中。
  2. 上下文:是由程式正確執行所需的狀態組成的,包括記憶體中的程式碼和資料、它的棧、通用暫存器的內容、程式計數器、環境變數以及開啟檔案描述符的集合。
  3. 關鍵抽象
    • 邏輯控制流:提供一個假象,好像我們的程式獨佔地使用處理器
      image
    • 私有的地址空間:提供一個假象,好像我們的程式獨佔地使用記憶體系統
      image
  4. 併發流
    • 一個邏輯流的執行在時間上與另一個流重疊
    • 併發:多個流併發的執行的一般現象
    • 多工(時間片):一個程序和其他程序輪流執行
  5. 上下文切換控制多工
    • image
    • 發生時機:
      • 核心排程新的程序時
      • 核心代表使用者執行系統呼叫時
      • 中斷也可引發上下文切換
程序控制
  1. 獲取程序ID
    ```
    #include <sys/types.h>
    #include <unistd.h>

    pid_t getpid(void);
    pid_t getppid(void);
    ```
  2. 程序狀態
    • 執行
    • 停止:程序的執行被掛起,且不會被排程。
    • 終止
      • 收到一個訊號,該訊號的預設行為是終止程序
      • 從主程式返回
      • 呼叫exit函式

           #include <stdlib.h>
        
           void exit(int status);
  3. 回收子程序
    • 當一個程序由於某種原因終止時,程序被保持在一種已終止的狀態中,直到被它的父程序回收。
    • 一個程序呼叫waitpid函式等待它的子程序終止或停止
      #include <sys/types.h>
      #include <wait.h>
    
      pid_t waitpid(pid_t pid,int *statusp,int options);
  4. 載入並執行程式
    • execve函式在當前程序的上下文中載入並執行一個新程式
      #include <unistd.h>
    
      int execve(const char *filename,const char *argv[],const char *envp[]);
訊號
  1. 一個訊號就是一條小訊息,它通知程序系統中發生了一個某種型別的事件
  2. Linux訊號
    image
  3. 傳送訊號
    • 用/bin/kill程式傳送:/bin/kill -9 -15213
    • 從鍵盤傳送:ls / sort
    • kill函式傳送

        #include <sys/types.h>
        #include <signal.h>
      
        int kill(pid_t pid,int sig);
    • alarm函式傳送

        #include <unistd.h>
      
        unsigned int alarm(unsigned int secs);
  4. 接收訊號
    • 當目的程序被核心強迫以某種方式對訊號的傳送做出反應時,它就接收了訊號。
    • 程序可以忽略這個訊號,終止或者執行下一個稱為訊號處理程式的使用者層函式捕獲這個訊號。
      image
  5. 待處理訊號
    • 一個發出而沒有被接收的訊號
    • 在任何時刻,一種型別至多隻有一個待處理訊號