信息安全系統設計基礎第十二週學習總結

第十二章 併發編程

併發指邏輯控制流在時間上是重疊的
進程程序員

  • 每一個控制流都是一個進程
  • 是由內核來調度維護
  • 有獨立的虛擬地址空間
  • 在與其餘流進行通訊時,控制流必須使用某種顯式的進程間通訊機制
    I/O多用復路
  • 在併發編程中,應用程序在一個進程的上下文中顯式的調度它們本身的邏輯流
  • 全部流都共享同一個地址空間
    線程
  • 是運行在單一進程上下文中的邏輯流
  • 由內核進行調度
  • 是進程和I/O多用復路的混合體

基於進程的併發編程

基於進程的併發服務器

因爲服務器運行時間長,因此要包括一個SIGCHLD進程程序,用來回收僵死子進程的資源
編程

關於進程的優劣

對於父,子進程:共享文件表,但不共享用戶地址空間數組

基於I/O多用復路的併發編程

基本思路:使用select函數,要求內核掛起進程,只有在一個或多個I/O事件發生後,纔將控制返回應用的程序
例如:
安全

select函數處理類型爲fd_set的集合
被容許對描述符集合作的三件事:服務器

  1. 分配他們
  2. 將一個此種類型的變量賦值給另外一個變量
  3. 用FD_ZERO,FD_SET,FD_CLR和FD_ISSET宏指令來修改和檢查他們
    select的兩個輸入:
  4. 讀集合的描述輸入(fdset)
  5. 讀集合的基數(n)
    反作用:select修改了參數fdset指向的fd_set,指明讀集合中一個稱爲準備好集合的子集

利用select實現一個迭代echo服務器:
多線程


一旦select返回,就用FD_ISSET宏指令來判斷哪一個能夠進行讀了併發

基於I/O多用復路的併發事件驅動服務器

一個狀態機就是一組狀態輸入事件轉移,其中轉移就是將狀態和輸入事件映射到狀態
自循環同一個輸入和輸出之間的轉換
函數

  • select函數檢測到輸入事件
  • add_client函數建立一個新的邏輯流
  • check_clients函數經過回送輸入行來執行狀態轉移

服務器使用I/O多用復,藉助select函數檢測輸入事件的發生

clientfd數組表示已鏈接描述符的集合,其中整數-1表示一個可用的槽位

編碼

I/O多用復路技術的優劣:

優勢:操作系統

  1. 它比基於進程的設計給程序員更多的對程序行爲的控制
  2. 一個基於I/O多用復路用事件驅動服務器是運行在一個單一進程上下文,並每一個邏輯流都能訪問該進程的所有地址空間
    缺點:
  • 編碼複雜

基於線程的併發編程

每一個線程都有它本身的線程上下文,包括一個惟一的整數線程ID,棧,棧指針,程序計數器,通用目的寄存器和條件碼

線程執行模型

主線程:每一個進程開始生命週期都是單一線程
某時刻,主線程建立一個對等線程,今後時開始,兩個線程併發運行

線程和進程的區別:

  • 一個線程的上下文比一個進程的上下文小不少
  • 線程上下文的切換要比進程上下文的切換快不少
  • 進程是按照嚴格的父子層次來組織的,線程則是對等的池

    Posix線程

  • 建立線程

  • 終止線程
  1. 當頂層的線程例程返回時,線程會隱式地終止
  2. 經過調用pthread_exit函數,線程會顯式地終止
  3. 某個對等線程調用Unix的exit函數,該函數終止進程以及與該進程相關的全部線程
  4. 另外一個對等線程經過當前線程ID做爲參數調用pthread_cancle函數來終止當前線程
  • 回收已終止線程的資源

    pthread_join函數會堵塞,直到線程tid終止,將線程例程返回的(void)指針賦值爲pthread_return指向的位置,而後回收*已終止線程佔用的全部儲存器資源

  • 分離線程
    在任意一個時間點上,線程是可結合的或者是分離的

  • 初始化線程

多線程程序中的共享變量

一般,線程的寄存器是從不共享的,而虛擬儲存器老是共享的

將變量映射到存儲器

  • 全局變量:是定義在函數以外的變量,任何線程均可以引用
  • 本地自動變量:是定義在函數內部可是沒有static屬性的變量
  • 本地靜態變量:是定義在函數內部並有static屬性的變量

共享變量

若說變量v是共享的,當且僅當它的一個實例被一個以上的線程引用

用信號量同步線程

在共享變量的同時引入了同步錯誤的可能性
通常而言,沒有辦法預測操做系統是否能爲你的線程選擇一個正確的順序

進度圖

進度圖將n個併發線程的執行模型化爲一條n維笛卡爾空間中的軌跡線

圖的原點對應於沒有任何線程完成一條指令的初始狀態


在進度圖中,兩個臨界區的交集造成的狀態空間區域稱爲不安全區

信號量

  • P(s):若是s是非零的,那麼P將s減1,而且當即返回。若s爲零,則掛起這個線程,直到s非零
  • V(s):V操做將s加1

使用信號量來實現互斥

基本思想:將每一個共享變量與一個信號量s聯繫起來,而後用P(s)和V(s)操做將相應的臨界區包圍起來

利用信號量來調度共享資源

生產者-消費者問題

基於預線程化的併發服務器

使用線程提升並行性

最簡單的方法:將序列劃分紅t個不相交區域,而後給t個不一樣的線程每一個分配一個區域

並行程序的加速比:


其餘併發問題

線程安全

四個線程不安全函數類:

  • 不保護共享變量的函數
  • 保持跨越多個調用的狀態的函數
  • 返回指向靜態變量指針的函數
  • 調用線程不安全函數的函數

可重入性

在線程化的程序中使用已存在的函數庫

競爭

當一個程序的正確性一個線程要在另外一個線程到達y點以前到達它的控制流中的x點時,就會發生競爭

死鎖


避免死鎖的規則:
互斥鎖加鎖順序規則:若是對於程序中每對互斥鎖(s,t),每一個同時佔用s和t的線程都按照相同的順序對它們加鎖,那這個程序是無死鎖的

相關文章
相關標籤/搜索