第11章 網絡編程編程
網絡應用依賴於不少在系統研究中已經學習過的概念,例如,進程、信號、字節器映射以及動態存儲分配,都扮演着重要的角色。還有一些新概念要掌握。咱們須要理解基本的客戶端-服務器編程模型,以及如何編寫使用因特網提供的服務的客戶端―服務器程序。最後,咱們將把全部這些概念結合起來,開發一個小的但功能齊全的Web的服務器,可以爲真實的Web,瀏覽器提供靜態和動態的文本和圖形內容。瀏覽器
11.1 客戶端-服務器編程模型服務器
每一個人網絡應用都是基於客戶端-服務器模型的。纔有陪你過這個模型,一個應用是由一個服務器進程和一個或者多個客戶端進程組成。網絡
服務器管理某種資源,而且經過操做這種資源來爲它的客戶端提供某種服務。多線程
客戶端-服務器模型中的基礎操做是事務。一個客戶端-服務器事務由四步組成:併發
1)當一個客戶端須要服務時,它向服務器發送一個請求,發起一個事務。函數
2)服務器收到請求後,解釋它,並以適當的方式操做它的資源。學習
3)服務器給客戶端發送一個響應,並等待下一個請求。編碼
4)客戶端收到響應並處理它。spa
11.2 網絡
客戶端和服務器一般運行在不一樣的主機上,而且經過計算機網絡的硬件和軟件資源來通訊。
對於一個主機而言,網絡只是又一種I/O設備,做爲數據源和數據接收方。
一個以太網段,包括電纜和集線器;每根電纜都有相同的最大位帶寬;集線器不加分辯地將一個端口上收到的每一個位複製到其餘全部的端口上。所以,每臺主機都能看到每一個位。
每一個以太網適配器都有—個全球惟一的48位地址,它存儲在這個適配器的非易失性存儲器上。每一個主機適配器都能看到這個幀,可是隻有目的主機實際讀取它。
橋接以太網 由 電纜和網橋 將多個以太網段鏈接起來,造成的較大的局域網。鏈接網橋的電纜傳輸速率能夠不一樣(例:網橋與網橋之間1GB/S, 網橋與集線器之間100MB/S)。
網橋做用:鏈接不一樣網段。同一網段內A向B傳輸數據時,幀到達網橋輸入端口,網橋將其丟棄,不予轉發。A向另外一網段內C傳輸數據時,網橋纔將幀拷貝到與相應網段鏈接的端口上。從而節省了網段的帶寬
在層次的更高級別中,多個不兼容的局域網能夠經過叫作路由器的特殊計算機鏈接起來,組成一個internet。
每臺路由器對於它所鏈接到的每一個網絡都有一個適配器(端口)。
11.3 全球IP因特網
每臺因特網主機都運行實現TCP/IP協議的軟件,幾乎每一個現代計算機系統都支持這個協議。因特網的客戶端和服務器混合使用套接字函數典型地是做爲會陷入內核的系統調用來實現的,並調用各類內核模式的TCP/IP函數。
一個IP地址就是一個32位無符號整數。
網絡程序將IP地址存放在下圖所示的IP地址結構中。
由於因特網主機能夠有不一樣的主機字節順序,TCP/IP爲任意整數數據項定義了統一的網絡字節順序(大端字節順序)例如IP地址,它放在包頭中跨過網絡被攜帶。在IP地址結構中存放的地址老是以(大端法)網絡字節順序存放的,即便主機字節順序是小端法。
因特網客戶端和服務器互相通訊時使用的是IP地址。然而,對於人們而言,大整數是很難記住的,因此因特網也定義了一組更加人性化的域名,以及一種將域名映射到IP地址的機制。域名是一串用句點分隔的單詞(字母、數字和破折號)。
域名集合造成了一個層次結構,每一個域名編碼了它在這個層次中的位置。經過一個示例你將很容易理解這點。下展現了域名層次結構的一部分。層次結構能夠表示爲一棵樹。樹的節點表示城名,反向到根的路徑造成了域名。子樹稱爲子域。層次結構中的第一層是個未命名的根節點。下一層是一組一級域名由非贏利組織(因特網分酒名字數字協會)定義。常見的第一層域名包括com、edu、gov、org、net,這些域名是由ICANN的各個受權代理按照先到先服務的基礎分配的的。一旦一個組織獲得了一個二級域名,那麼它就能夠在這個子域中建立任何新的域名了。
11.4 套接字接口
套接字接口是一組函數,它們和Unix I/O函數結合起來,用以建立網絡
第十二章 併發編程
1、基於進程的併發編程
構造併發進程最簡單的方法是用進程,使用像fork,exec和waitpid等函數。
例:一個構造併發服務器的天然方法就是在父進程中接受客戶端鏈接請求,而後建立一個新的子進程來爲每一個新客戶端提供服務。
一、 一般服務器運行很長的時間,因此咱們必需要包括一個SIGCHLD處理程序,來回收僵死子進程的資源。
二、 其次父進程必須關閉他們各自的connfd拷貝。
三、 最後,由於套接字的文件表選項中的引用計數,直到父子進程的connfd都關閉了,到客戶端的鏈接纔會終止。
2、基於I/O多路複用的併發進程
基本的思路就是使用select函數,要求內核掛起進程,只有在一個或多個I/O事件發生後,纔將控制返回給應用程序。
Select函數處理類型爲fd_set的集合,也叫作描述符集合。邏輯上,咱們將描述符集合當作一個大小爲n的位向量
I/O多路複用能夠用做併發事件驅動程序的基礎,在事件驅動程序中,流是由於某種事件而前進的。通常概念是將邏輯流模型轉換爲狀態機。
狀態機:就是一組狀態、輸入事件和轉移。
3、基於線程的併發編程
線程就是運行在進程上下文中的邏輯流。
多線程的執行模型在某些方面和多進程的執行模型是類似的。
每一個進程開始生命週期時都是單一線程,這個線程爲主線程。在某一時刻,主線程建立一個對等線程,從這個時間點開始,兩個線程就併發地與運行。
Posix線程是在C程序中處理線程的一個標準接口。
終止進程:
一、 當頂層的線程例程返回時,線程會隱式地終止
二、 經過調用pthread_exit函數,線程會顯示地終止。
三、 某個對等線程調用Unix的exit函數,該函數終止進程以及全部與該進程相關的線程
四、 另外一個對等線程經過以當前線程ID做爲參數調用pthread_cancle函數來終止當前線程
4、多線程程序中的共享變量
一組併發線程運行在一個進程的上下文中。每一個線程都有它本身獨立的線程上下文,包括線程ID、棧、棧指針、程序計數器、條件碼和通用目的寄存器值。每一個進程和其餘進程一塊兒分享線程上下文的剩餘部分。
將變量映射到存儲器:
線程化的C程序中變量根據它們的存儲類型被映射到虛擬存儲器:全局變量、本地自動變量和本地靜態變量。
----------------------------------------------------------------------------------
參考資料:
深刻理解計算機系統