- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
讨论在网路连接上进行资料读写的系统呼叫
Socket I/O Introduction 討論在網路連接上進行資料讀寫的系統呼叫 分成三部分來討論 1. 傳送資料(write, writev, sendto, sendmsg)的系統呼叫 2. 接收資料(read, readv, recvfrom, recvmsg)的系統呼叫 3. select系統呼叫,用來監看descriptor Code Introduction Socket Buffer sockbuf data structure Socket Buffer 每一個緩衝區中,除了指向儲存資料的mbuf chain外,還含有控制資訊 sb_mb: 指向mbuf chain中的第一個mbuf sb_cc: 紀錄包含在mbuf中的資料總位元數 sb_hiwat/ sb_lowat : 拿來調節socket的流量控制演算法 sb_mbcnt: 在這一個mbuf中,總共配置了多少記憶體空間給mbuf sb_mbmax: 在每一個socket緩衝區裡面,要配置給mbuf之記憶體空間的上限值。系統核心的絕對極限值(sb_max: 262144 bytes) Socket Buffer sb_sel: 用來實作select系統呼叫的selinfo資料結構 sb_timeo: 限制一個行程在進行讀取、或是寫入之呼叫,所能被停頓的時間(ticks)。預設值是0(無限期的等待) Socket Buffer sb_flags: write, writev, sendto, and sendmsg System Call 寫入系統呼叫 write, writev, sendto, and sendmsg 負責在一個網路連接上傳送資料 會直接或間接的呼叫sosend函式 sosend會從行程中複製資料到系統核心中,並將資料遞交給相關的通訊協定 writev, sendmsg可以接受來自多重緩衝區的資料 從多重緩衝區進行寫入稱為收集(gathering) 系統核心會從iovec資料結構陣列所指定的各種緩衝區當中依序去接收資料 Iov_base: 指向一個長度為iov_len個位元的緩衝區開頭 如果沒有這一種型態的介面 行程得先將各緩衝區的資料複製到一個較大的緩衝區 得呼叫多次的寫入系統呼叫 以上兩種都較沒有效率 sendmsg支援控制資訊 控制資訊、以及一些要傳遞給sendmsg的參數,都是在一個msghdr資料結構中被指定的 sendmsg System Call sendmsg, sendit會負責準備sosend函式呼叫所需要的資料結構,sosend會把這一些訊息交給適當的通訊協定 SOCK_DGRAM: 一份訊息就是一個資料包 SOCK_STREAM: 一份訊息就是一連串的位元組 copy iov array sendit and cleanup sendit Function Call 被sendto, sendmsg這二個system call呼叫 sendit會去初始化一個uio資料結構 將control, address 資訊從行程中複製到系統核心 Initial auio 會去呼叫getsock函式,取得descriptors 相關的file資料結構 初始化uio資料結構,把行程所指定的輸出緩衝區收集到系統核心當中的mbufs 把各個緩衝區的長度大小加總,並且存在uio_resid Copy address and control information from the process Send data and cleanup sosend Function Call 5個寫入系統呼叫,最後會呼叫sosend sosend要將資料、控制資訊,根據通訊協定以及socket指定的緩衝區限制值,遞交給與這一個socket相關的通訊協定的pr_usrreq函式 sosend不會將資料放到緩衝區,通訊協定要自行儲存、移除這一些資料 sosend會根據相關的通訊協定是否有實作可信賴或是不可信賴的資料傳輸語意,來定義緩衝區的sb_hiwat以及sb_lowat sosend Function Call 可靠通訊協定緩衝區處理 緩衝區中儲存了還沒有被送出去的資料、以及已經傳送出去但是還沒被ACK的資料 sb_cc: 緩衝區中所儲存的資料位元數目0 = sb_cc = sb_hiwat 如果有任何資料要透過pr_usrreq傳遞給通訊協定,sosend會確保緩衝區中有足夠的空間,通訊協定層會把資料添加到傳送緩衝區 sosend會根據以下兩種方式當中一種,把資料傳輸給通訊協定 PR_ATOMIC被設定: sosend必須在行程和通訊協定之間保留訊息的邊界。sosend會去等待足夠的
文档评论(0)