互聯(lián)網(wǎng)絡(luò)程序設(shè)計第6章.ppt

上傳人:xin****828 文檔編號:15502215 上傳時間:2020-08-13 格式:PPT 頁數(shù):37 大?。?05.50KB
收藏 版權(quán)申訴 舉報 下載
互聯(lián)網(wǎng)絡(luò)程序設(shè)計第6章.ppt_第1頁
第1頁 / 共37頁
互聯(lián)網(wǎng)絡(luò)程序設(shè)計第6章.ppt_第2頁
第2頁 / 共37頁
互聯(lián)網(wǎng)絡(luò)程序設(shè)計第6章.ppt_第3頁
第3頁 / 共37頁

下載文檔到電腦,查找使用更方便

9.9 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《互聯(lián)網(wǎng)絡(luò)程序設(shè)計第6章.ppt》由會員分享,可在線閱讀,更多相關(guān)《互聯(lián)網(wǎng)絡(luò)程序設(shè)計第6章.ppt(37頁珍藏版)》請在裝配圖網(wǎng)上搜索。

1、第六章、I/O復(fù)用的服務(wù)器與客戶端,I/O模型 select函數(shù) IO復(fù)用客戶端 IO復(fù)用服務(wù)器 select函數(shù)總結(jié)(poll與pselcet函數(shù)) 測試用例,1. I/O模型,I/O復(fù)用技術(shù)的引入 第3章,迭代服務(wù)器的低效率主要原因是串行執(zhí)行 第4、5章,采用并行的思路來解決這個問題 從這一章開始,換一個思路 仔細分析迭代服務(wù)器模型 串行化還不是造成低效率主要原因 真正的原因是阻塞 程序阻塞在read、accept等系統(tǒng)調(diào)用上,不能為其它客戶端服務(wù),串行的迭代服務(wù)器,,,socket(),bind(),listen(),accept(),read(),write(),close(),,,,

2、,,,,,,,socket(),connect(),write(),read(),close(),,,,,阻塞直到接收 到客戶連接請求,,,,,,,TCP服務(wù)器端,TCP客戶端,,網(wǎng)絡(luò)操縱函數(shù)最終被抽象成文件的IO操作,著重對慢系統(tǒng)調(diào)用觀察,會發(fā)現(xiàn)這些函數(shù)基本上分成兩個階段: 等待事件發(fā)生 程序與系統(tǒng)內(nèi)核交互,獲取發(fā)生的事件 根據(jù)這兩個階段的不同操作,可以分為五種IO模型 阻塞I/O 非阻塞I/O I/O復(fù)用(select、epoll、kqueue) 信號驅(qū)動I/O 異步I/O,Blocking I/O Model,The most prevalent I/O model 。By defaul

3、t, all sockets are blocking,,Process blocks in recvfrom,recvfrom,appliction,,kernel,No data ready,System call,Process data,Copy complete,System call,,Data ready Copy data,,,,,Wait for data,Copy data from kernel to user,Nonblocking I/O Model,When a socket is nonblocking, telling kernel: “ when an I/O

4、 operation that I request cannot be completed without putting the process th sleep, do not put the process to sleep”. It is called polling, waste of CPU time.,,Process blocks in recvfrom,recvfrom,Appliction,,Kernel,No data ready,System call,Process data,Copy complete,System call,,Data ready Copy

5、data,,,,Wait for data,Copy data from kernel to user,,EWOULDBLOCK,recvfrom,,No data ready,System call,,EWOULDBLOCK,recvfrom,,System call,recvfrom,recvfrom,,,,,No data ready,,,,,No data ready,,,,,,No data ready,,,,System call,,,No data ready,,,,EWOULDBLOCK,System call,,,No data ready,,,,recvfrom,Syste

6、m call,EWOULDBLOCK,No data ready,recvfrom,System call,EWOULDBLOCK,I/O multiplexing Model,When I/O multiplexing, we call select or poll and block in one of these two system call, instead of blocking in the actual I/O system call.,,Process blocks while data copied into application buffer,select,applic

7、ation,,kernel,No data ready,System call,Process data,Copy complete,System call,,Data ready Copy data,,,,,Wait for data,Process blocks in select wait for one of possibly many sockets to become readable,,Return readable,recvfrom,,System call,,Copy data from kernel to user,Notes:in fact there is a slig

8、ht disadvantage because using select require two system calls. But the advantage in using select is that we can wait for more than one descriptor to be ready.,Signal Driven I/O Model,Telling the kernel to notify us with the SIGIO signal when the descriptor is ready. Advantage: process is not bloc

9、ked while waiting for the datagram to arrive.,Asynchronous I/O Model,Asynchronous I/O tell the kernel to start the operation and to notify us when the entire operation is complete.,Main difference with signal-driven I/O?,Comparison of the I/O Model,,,,,,,,Wait for data,Copy data from kernel to user,

10、五種IO模型回顧,同步與異步IO Posix定義這兩個術(shù)語如下 同步I/O操作引起請求進程阻塞,知道I/O操作完成; 異步I/O操作不引起請求進程阻塞; IO的兩個階段都沒有被阻塞,才能被稱為異步IO 因此,阻塞I/O模型、非阻塞I/O模型、 I/O復(fù)用模型和信號驅(qū)動模型都是同步I/O模型;最后一種才是異步IO 實際編程中,這幾種IO模型經(jīng)常根據(jù)需要混用 首先要避免被阻塞,但是阻塞都不好? 在事件的檢查點要阻塞 避免采用信號機制,主要原因是信號是異步的,將使程序變得很難編寫。即使寫成了這樣的代碼,也會由于引入防止異步干擾的代碼,抵消掉信號帶來的優(yōu)勢。,2. I/O Multiplexing,W

11、hat we need is the capability to tell the kernel that we want to be notified if one or more I/O conditions are ready (i.e., input is ready to be read, or the descriptor is capable of taking more output). This capability is called I/O multiplexing and is provided by the select and poll functions.,Sce

12、narios of I/O multiplexing,When a client is handling multiple descriptors (normally interactive input and a network socket). If a TCP server handles both a listening socket and its connected sockets. If a server handles both TCP and UDP. If a server handlers multiple services and perhaps multiple pr

13、otocols. etc.,Select函數(shù),#include int select(int maxfdp1, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); RETURN:0, 發(fā)生的事件數(shù)目;-1, 出錯;=0,輪詢 readfds、writefds、exceptfds分別是讀、寫、錯誤的描述符集合。例如 readfds可能是0, 3 writefds可能是1, 3 timeout表示超時 struct timeval long tv_sec;/* seconds */ long

14、tv_usec;/* microseconds */ ,,返回值 當(dāng)timeout指針為NULL時,如果沒有事件發(fā)生,則select將一直阻塞下去; 當(dāng)timeout指針為NULL時,如果事件發(fā)生,則返回發(fā)生事件的個數(shù); 當(dāng)timeout指向的結(jié)構(gòu)非0時,如果事件沒有發(fā)生,則返回0; 如果timeout指向的結(jié)構(gòu)為0,則select會立即返回,此時select用于輪詢; 當(dāng)出錯、或者被信號打斷時,select返回-1,具體的出錯信息放在errno中,,fd_set /usr/include/bits/typesizes.h: #define __FD_SETSIZE 1024 /usr/in

15、clude/sys/select.h: typedef long int __fd_mask; #define __NFDBITS (8 * (int) sizeof (__fd_mask)) typedef struct __fd_mask fds_bits__FD_SETSIZE / __NFDBITS; fd_set; 為節(jié)省空間,fd_set采用bit位圖的形式表示文件描述符,,對fd_set的操縱宏 #define FD_SET(fd, fdsetp) __FD_SET (fd, fdsetp) #define FD_CLR(fd, fdsetp) __FD_CLR (fd, fds

16、etp) #define FD_ISSET(fd, fdsetp) __FD_ISSET (fd, fdsetp) #define FD_ZERO(fdsetp) __FD_ZERO (fdsetp) maxfdp1=max(readfd, writefd, excepfd)+1,這里為什么要帶入maxfdp1到select函數(shù)? 如果對writefd,exceptfd不感興趣,可以以NULL帶入select函數(shù) 需要注意: 第1次使用select函數(shù)之前,一定要用FD_ZERO清文件描述符集合 由于select函數(shù)返回前會修改這些描述符集合,所以再次調(diào)用select函數(shù)時,要用FD_SET

17、重新填寫這些描述符集合,select函數(shù)的能夠檢測的事件,讀事件 The number of bytes of data in the socket receive buffer is greater than or equal to the current size of the low-water mark. The read-half of the connection is closed. The socket is a listening socket and the number of completed connections is nonzero. A socket error

18、 is pending.,,寫事件 The number of bytes of available space in the socket send buffer is greater than or equal to the current size of the low-water mark; 非阻塞connect連接成功 The write-half of the connection is closed. A write operation one the socket will generate SIGPIPE. A socket error is pending. 異常事件 帶外

19、數(shù)據(jù)需要處理,Linux的擴展,自linux 2.6.28開始,以下事件可以通過select來檢測 signalfd,建立一個信號的文件描述符,檢測信號是否發(fā)生 timerfd,建立定時器的文件描述符,檢測定時器 eventfd,建立事件的文件描述符,用于進程間的事件通知,以取代pipe inotifyfd,建立對文件inode節(jié)點的檢測描述符,觀察文件的狀態(tài)變化,,select函數(shù)的例子 fd_set rfds; struct timeval tv; FD_ZERO(,3. I/O復(fù)用客戶端,IO復(fù)用編程是一種基于事件的編程,程序在select函數(shù)上阻塞等待事件的發(fā)生 通過對比讀、寫、異常類

20、別的文件描述符,判斷事件是否發(fā)生 進行相關(guān)處理 如果事件不再需要,則從事件集合中刪除,,客戶端需要哪些事件? connect? 讀stdin 寫socket 讀socket 寫stdout 退出時機 讀stdin,長度為0,迭代式客戶端代碼 ... socket connect read(stdin) write(socket) read(socket) write(stdout) ...,,write函數(shù)的含義 將應(yīng)用程序用戶空間的數(shù)據(jù)拷貝到內(nèi)核socket的buffer內(nèi),然后返回 write并不理會數(shù)據(jù)是否發(fā)送完畢 socket的buffer數(shù)目一般是固定的 如果socket的buffe

21、r并不足以容納用戶數(shù)據(jù),該怎么辦?通常是阻塞到socket的buffer有足夠的空間為止 Linux的man有問題?這里采納教材中的說法,,linux:man 2 write The number of bytes written may be less than count if, for example, there is insufficient space on the underlying physical medium, or the RLIMIT_FSIZE resource limit is encountered (see setrlimit(2)), or the call

22、 was interrupted by a signal handler after having written less than count bytes. (See also pipe(7).) FreeBSD: When using non-blocking I/O on objects such as sockets that are subject to flow control, write() and writev() may write fewer bytes than requested; the return value must be noted, and the re

23、mainder of the oper- ation should be retried when possible.,,因此,阻塞的write有流控的功能,這正是我們所需要的。 如果write(socket)阻塞,說明網(wǎng)絡(luò)線路可能出現(xiàn)問題。此時,如果再繼續(xù)從stdin接受數(shù)據(jù),這些數(shù)據(jù)該放在何處? write(stdout)也是同樣的道理,stdout可能被重定向到一個文件,如果磁盤IO的速度難以跟上網(wǎng)絡(luò)傳輸?shù)乃俣?,此時流控正是我們所需要的。,IO復(fù)用客戶端代碼,gettimeofday( ,,else if (io.isReadEventSet(sock.getFd())) // chec

24、king socket if ((length = sock.read(rbuf, BUFFER_SIZE)) == 0) io.clearReadEvent(sock.getFd()); break; length = sout.write(rbuf, length); else// error throw EXCEPTION(); gettimeofday(,4. I/O復(fù)用服務(wù)器,服務(wù)器代碼中,等待事件的程序結(jié)構(gòu)與客戶端相同。 事件有哪些? accept read write,迭代式服務(wù)器代碼 ... socket bind listen accept read write ...,

25、,accept事件的處理 accept返回了一個新的套接字,這個套接字代表與客戶端的一個新進連接 服務(wù)器應(yīng)該在這個新socket上繼續(xù)偵聽事件 因此,accept的動作包括向read集中添加新客戶端讀事件 還有一個問題,客戶端只需觀測兩個描述符,而服務(wù)器需要觀測未知個文件描述符,如何管理這些新進連接?這里采用std::set來管理accept的文件描述符,IO復(fù)用服務(wù)器流程,IO復(fù)用服務(wù)器代碼,while (true) io.waitEvent(); // // listen socket // if (io.isReadEventSet(lsock.getFd())) lsock.accep

26、t(asock); io.addReadEvent(asock.getFd()); sockets.insert(asock); ,,// // serve the client // for (set::iterator it = sockets.begin(); it != sockets.end(); ++it) size_t length; if (io.isReadEventSet(it-getFd())) length = it-read(); if (length == 0) io.clearReadEvent(it-getFd()); sockets.erase(it);

27、break;// do not continue; it-write(length); ,5. select與poll/pselect函數(shù)總結(jié),poll與pselect函數(shù) select的主要問題 FD_SETSIZE有限 fd_set需要拷貝到內(nèi)核 更關(guān)鍵的是:fd_set將進程的所有描述符都羅列出來,內(nèi)核與應(yīng)用程序需要逐個檢查相應(yīng)的bit位。這個復(fù)雜度為O(N) fd_set至少要經(jīng)過三次這種枚舉才能完成遍歷 select關(guān)注的事件類型較少,其它類型的事件呢?如文件刪除、進程啟動 select是每進程的,也就是說進程只能擁有一次select,,poll呢? 情況好點,它沒有FD_SETSIZE的限制,但是效率仍然很低 綜上,select、poll對于重負荷的服務(wù)器而言,效率比較低 進程并發(fā)、線程并發(fā)呢?調(diào)度的開銷是免不了的。Linux的O(1)調(diào)度算法,6. 測試用例,利用第5章的測試用例回歸,作業(yè),利用select函數(shù)編寫IO復(fù)用的echo客戶端與服務(wù)器 如何利用C++封裝select? 閱讀文獻Scalable Network Programming Or: The Quest For A Good Web Server (That Survives Slashdot),了解C10K問題及其解決方案,

展開閱讀全文
溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號:ICP2024067431-1 川公網(wǎng)安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!