學號20145332 《資訊保安系統設計基礎》第十三週學習總結
教材學習內容總結
十一章總結:
·客戶端-伺服器程式設計模型:
①基本操作:事務
②當一個客戶端需要服務時,向伺服器傳送一個請求,發起一個事務。
③伺服器收到請求後,解釋它,並以適當的方式操作它的資源。
④伺服器給客戶端傳送一個相應,並等待下一個請求。
⑤客戶端收到響應並處理它。
·網路
①對主機而言:網路是一種I/O裝置
從網路上接收到的資料從介面卡經過I/O和儲存器匯流排拷貝到儲存器,典型地是通過DMA(直接儲存器存取方式)傳送。
②物理上:網路是一個按照地理遠近組成的層次系統
最底層:LAN(區域網),最流行的是乙太網,
乙太網段:
包括一些電纜和集線器。每根電纜都有相同的最大位頻寬,集線器不加分辯地將一個埠上收到的每個位複製到其他所有的埠上,因此每臺主機都能看到每個位。
每個乙太網介面卡都有一個全球唯一的48位地址,儲存在介面卡的非易失性儲存器上。
一臺主機可以傳送一段位:幀,到這個網段內其它任何主機。每個幀包括一些固定數量的頭部位(標識此幀的源和目的地址及幀長)和資料位(有效載荷)。每個主機都能看到這個幀,但是隻有目的主機能讀取。
使用電纜和網橋,多個乙太網段可以連線成較大的區域網,稱為橋接乙太網。這些電纜的頻寬可以是不同的。
多個不相容的區域網可以通過叫做路由器的特殊計算機連線起來,組成一個internet網際網路絡。
③協議
網際網路重要特性:由採用不同技術,互不相容的區域網和廣域網組成,並能使其相互通訊。其中不同網路相互通訊的解決辦法是一層執行在每臺主機和路由器上的協議軟體,消除不同網路的差異。
協議提供的兩種基本能力
命名機制:唯一的標示一臺主機
傳送機制:定義一種把資料位捆紮成不連續的片的同一方式
·全球IP因特網
TCP/IP協議族
混合使用套接字介面函式和UnixI/O函式進行通訊
世界範圍的主機集合
特性:
主機集合被對映為一組32位的IP地址
這組IP地址被對映為一組稱為因特網域名的識別符號
因特網主機上的程式能夠通過連線和任何其他主機上的程式
·套接字介面
函式:
socket函式
connect函式
open_clientfd函式
bind函式
listen函式
open_listenfd函式
accept函式
·Web伺服器
Web基礎:
Web 客戶端和伺服器之間的互動用的是一個基於文字的應用級協議,叫做 HTTP (Hypertext Transfer Protocol,超文字傳輸協議). HTTP 是一個簡單的協議。一個Web 客戶端(即瀏覽器) 開啟一個到伺服器的因特網連線,並且請求某些內容。伺服器響應所請求的內容,然後關閉連線。瀏覽器讀取這些內容,並把它顯示在螢幕上。
Web內容:
Web內容可以用一種叫做 HTML(Hypertext Markup Language,超文字標記語言)的語言來編寫。一個 HTML 程式(頁)包含指令(標記),它們告訴瀏覽器如何顯示這頁中的各種文字和圖形物件。
Web伺服器以兩種不同的方式向客戶端提供內容:
①取一個磁碟檔案,並將它的內容返回給客戶端。磁碟檔案稱為靜態內容 (static content), 而返回檔案給客戶端的過程稱為服務靜態內容 (serving staticcontent)。
②執行一個可執行檔案,並將它的輸出返回給客戶端。執行時可執行檔案產生的輸出稱為態內容 (dynamic content),而執行程式並返回它的輸出到客戶端的過程稱為服務動態內容 (serving dynamic content)。
十二章總結:
現在作業系統提供了三種基本的構造併發程式的方法:
①程式。每個邏輯控制流都是一個程式,由核心來排程和維護。
②I/O多路複用。
③執行緒。
·基於程式的併發程式設計
在接受連線請求之後,伺服器派生出一個子程式,這個子程式獲得伺服器描述表完整的拷貝。子程式關閉它的拷貝中監聽描述符3,父程式關閉它的已連線描述符4的拷貝,因為不需要這些描述符了。
通常伺服器會執行很長時間,所以需要一個SIGCHLD處理程式,來回收僵死程式。因為當SIGCHLD執行時,訊號是阻塞的,而UNIX訊號是不排隊的,所以SIGCHLD必須準備好回收多個僵死程式。
迴圈中的父程式和子程式關閉各自需要關閉的描述符。
程式能夠共享檔案表,但不共享使用者地址空間。
·基於I/O多路複用的併發程式設計
面對困境——伺服器必須響應兩個互相獨立的I/O事件:
①網路客戶端發起的連線請求
②使用者在鍵盤上鍵入的命令 ,解決的辦法是I/O多路複用技術。基本思想是,使用select函式,要求核心掛起程式,只有在一個或多個I/O事件發生後,才將控制返回給應用程式。
·基於I/O多路複用的併發事件驅動伺服器
①I/O多路複用可以用做併發事件驅動程式的基礎,在事件驅動程式中,流是因為某種事件而前進的,一般概念是把邏輯流模型化為狀態機。一個狀態機就是一組狀態、輸入事件和轉移。
②併發事件驅動程式中echo伺服器中邏輯流的狀態機
·基於執行緒的併發程式設計
執行緒執行模型:
①執行緒執行在程式上下文中的邏輯流。執行緒由核心自動排程,每個執行緒都有它自己的執行緒上下文。
②執行緒執行模型。多執行緒的執行模型在某些方面和多程式的執行模型相似。每個程式開始生命週期時都是單一執行緒,這個執行緒稱為主執行緒。在某一時刻,主執行緒建立一個對等執行緒,從在此刻開始,兩個執行緒就併發地執行。
·Posix執行緒
①建立執行緒 ②獲取自身ID ③終止執行緒
·回收已終止執行緒的資源:
pthread_join函式會終止,直到執行緒tid終止。和wait不同,該函式只能回收指定id的執行緒,不能回收任意執行緒。
·分離執行緒:
一個可結合的執行緒能夠被其他執行緒回收其資源和殺死,在被其他執行緒回收之前,它的儲存其資源是沒有被釋放的;相反,一個分離的執行緒是不能被其他執行緒回收或殺死的。它的儲存器資源是在它終止時系統自動釋放的。預設情況下,執行緒被建立成可結合的。
·初始化執行緒:該函式用來初始化多個執行緒共享的全域性變數。
·多執行緒程式中的共享變數
每個執行緒都有它自己獨自的執行緒上下文,包括執行緒ID、棧、棧指標、程式計數器、條件碼和通用目的暫存器值。
每個執行緒和其他執行緒一起共享程式上下文的剩餘部分。暫存器是從不共享的,而虛擬儲存器總是共享的。
執行緒化的c程式中變數根據它們的儲存器型別被對映到虛擬儲存器:全域性變數,本地自動變數(不共享),本地靜態變數。
·用訊號量同步執行緒
訊號量:用訊號量解決同步問題,訊號量s是具有非負整數值的全域性變數,有兩種特殊的操作來處理(P和V):
·使用訊號量實現互斥
·利用訊號量排程共享資源
①生產者——消費者問題
保證對緩衝區的訪問是互斥的;還需要排程對緩衝區的訪問,即,如果緩衝區是滿的(沒有空的槽位),那麼生產者必須等待直到有一個空的槽位為止,如果緩衝區是空的(即沒有可取的專案),那麼消費者必須等待直到有一個專案變為可用。
②讀者——寫者問題
修改物件的執行緒叫做寫者;只讀物件的執行緒叫做讀者。
寫者必須擁有對物件的獨佔訪問,而讀者可以和無限多個其他讀者共享物件。
讀者——寫者問題基本分為兩類:
第一類:讀者優先,要求不要讓讀者等待,除非已經把使用物件的許可權賦予了一個寫者。換句話說,讀者不會因為有一個寫者等待而等待;
第二類:寫者優先,要求一定能寫者準備好可以寫,它就會盡可能地完成它的寫操作。同第一類問題不同,在一個寫者後到達的讀者必須等待,即使這個寫者也是在等待。
·基於預執行緒的併發伺服器
·其他併發問題
不安全函式;
(1)可重入函式。可重入函式是執行緒安全函式的一個真子集,它不訪問任何共享資料。可重入安全函式通常比不可重入函式更有效,因為它們不需要任何同步原語。
(2)競爭。當程式設計師錯誤地假設邏輯流該如何排程時,就會發生競爭。為了消除競爭,通常我們會動態地分配記憶體空間。
(3)死鎖。當一個流等待一個永遠不會發生的事件時,就會發生死鎖。
程式碼除錯中的問題和解決過程
·在執行習題11.2的程式碼時,剛開始缺少標頭檔案,程式碼執行不成功,加上需要的標頭檔案之後成功:
·習題11.3中,編譯程式碼時會出現如下錯誤:
課後作業中的問題和解決過程
·11.1,通過程式碼得到結果:
·11.4中程式碼:
修改多次這裡依然未成功
本週程式碼託管
http://git.oschina.net/20145332/linux
其他
對併發的理解更深刻,學習了三種不同的構建併發程式的機制:程式、I/O多路重複和執行緒。
學習進度條
程式碼行數(新增/累積) | 部落格量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 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 |