1. 程式人生 > ># 2017-2018-1 20155319 課堂實踐及補充

# 2017-2018-1 20155319 課堂實踐及補充

集合 blog 實現 dset 驅動 套接字 事件驅動 null 生命周期

教材學習內容總結
第11章 網絡編程

網絡應用隨處可見。任何時候你瀏覽Web、發送Email或者彈出一個X window,你就正在使用一個網絡應用程序。有趣的是,所有的網絡應用都是基於相同的基本編程模型有著相似的整體邏輯結構,並且依賴相同的編程接口。
網絡應用依賴於很多在系統研究中已經學習過的概念,例如,進程、信號、字節器映射以及動態存儲分配,都扮演著重要的角色。還有一些新概念要掌握。我們需要理解基本的客戶端-服務器編程模型,以及如何編寫使用因特網提供的服務的客戶端―服務器程序。最後,我們將把所有這些概念結合起來,開發一個小的但功能齊全的Web的服務器,能夠為真實的Web,瀏覽器提供靜態和動態的文本和圖形內容。
第十二章 並發編程
三種基本的構造並發程序的方法:

1.進程

每個邏輯控制流是一個進程,由內核進行調度,進程有獨立的虛擬地址空間

2.I/O多路復用

邏輯流被模型化為狀態機,所有流共享同一個地址空間

3.線程

運行在單一進程上下文中的邏輯流,由內核進行調度,共享同一個虛擬地址空間

12.1 基於進程的並發編程

12.1.1 基於進程的並發服務器
?
使用SIGCHLD處理程序來回收僵死子進程的資源。

?
父進程必須關閉他們各自的connfd拷貝(已連接的描述符),避免存儲器泄露。

?
因為套接字的文件表表項中的引用計數,直到父子進程的connfd都關閉了,到客戶端的連接才會終止。

12.1.2 關於進程的優劣

1.優點:防止虛擬存儲器被錯誤覆蓋

2.缺點:開銷高,共享狀態信息才需要IPC機制

12.2 基於i/o多路復用的並發編程

使用select函數,要求內核掛起進程,只有在一個或多個I/O事件發生後,才將控制返回給應用程序。

int select(int n,fd_set *fdset,NULL,NULL,NULL);
返回已經準備好的描述符的非0的個數,若出錯則為-1。

select函數處理類型為fd_set的集合,叫做描述符集合,看做一個大小為n位的向量:

bn-1,......,b1,b0

12.2.1 基於i/o多路復用的並發事件驅動服務器
?
I/O多路復用可以用作事件並發驅動程序的基礎。

?
狀態機:一組狀態、輸入事件、輸出事件和轉移。

?
自循環:同一輸入和輸出狀態之間的轉移。

註意:

init_pool:初始化客戶端池
add_client:添加一個新的客戶端到活動客戶端池中
check_clients:回送來自每個準備好的已連接描述符的一個文本行

12.2.2 i/o多路復用技術的優劣

1.優點
?
相較基於進程的設計,給了程序員更多的對程序程序的控制

?
運行在單一進程上下文中,所以每個邏輯流都可以訪問該進程的全部地址空間,共享數據容易實現

?
可以使用GDB調試

?
高效

2.缺點
?
編碼復雜

?
不能充分利用多核處理器

12.3 基於線程的並發編程

每個線程都有自己的線程上下文,包括一個線程ID、棧、棧指針、程序計數器、通用目的寄存器和條件碼。所有的運行在一個進程裏的線程共享該進程的整個虛擬地址空間。由於線程運行在單一進程中,因此共享這個進程虛擬地址空間的整個內容,包括它的代碼、數據、堆、共享庫和打開的文件。

1.線程執行模型

每個進程開始生命周期時都是單一線程(主線程),在某一時刻創建一個對等線程,從此開始並發地運行,最後,因為主線程執行一個慢速系統調用,或者被中斷,控制就會通過上下文切換傳遞到對等線程。

2.Posix線程

Posix線程是C語言中處理線程的一個標準接口,允許程序創建、殺死和回收線程,與對等線程安全的共享數據。

線程的代碼和本地數據被封裝在一個線程例程中。

# 2017-2018-1 20155319 課堂實踐及補充