




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、1,Socket I/O,2,Introduction,討論在網(wǎng)路連接上進行資料讀寫的系統(tǒng)呼叫 分成三部分來討論 1. 傳送資料(write, writev, sendto, sendmsg)的系統(tǒng)呼叫 2. 接收資料(read, readv, recvfrom, recvmsg)的系統(tǒng)呼叫 3. select系統(tǒng)呼叫,用來監(jiān)看descriptor,3,Code Introduction,4,Socket Buffer,sockbuf data structure,5,6,7,Socket Buffer,每一個緩衝區(qū)中,除了指向儲存資料的mbuf chain外,還含有控制資訊 sb_mb: 指
2、向mbuf chain中的第一個mbuf sb_cc: 紀錄包含在mbuf中的資料總位元數(shù) sb_hiwat/ sb_lowat : 拿來調(diào)節(jié)socket的流量控制演算法 sb_mbcnt: 在這一個mbuf中,總共配置了多少記憶體空間給mbuf sb_mbmax: 在每一個socket緩衝區(qū)裡面,要配置給mbuf之記憶體空間的上限值。系統(tǒng)核心的絕對極限值(sb_max: 262144 bytes),8,Socket Buffer,sb_sel: 用來實作select系統(tǒng)呼叫的selinfo資料結(jié)構(gòu) sb_timeo: 限制一個行程在進行讀取、或是寫入之呼叫,所能被停頓的時間(ticks)。預(yù)
3、設(shè)值是0(無限期的等待),9,Socket Buffer,sb_flags:,10,write, writev, sendto, and sendmsg System Call,寫入系統(tǒng)呼叫 write, writev, sendto, and sendmsg 負責在一個網(wǎng)路連接上傳送資料 會直接或間接的呼叫sosend函式 sosend會從行程中複製資料到系統(tǒng)核心中,並將資料遞交給相關(guān)的通訊協(xié)定,11,12,writev, sendmsg可以接受來自多重緩衝區(qū)的資料 從多重緩衝區(qū)進行寫入稱為收集(gathering) 系統(tǒng)核心會從iovec資料結(jié)構(gòu)陣列所指定的各種緩衝區(qū)當中依序去接收資料,1
4、3,Iov_base: 指向一個長度為iov_len個位元的緩衝區(qū)開頭 如果沒有這一種型態(tài)的介面 行程得先將各緩衝區(qū)的資料複製到一個較大的緩衝區(qū) 得呼叫多次的寫入系統(tǒng)呼叫 以上兩種都較沒有效率,14,15,sendmsg支援控制資訊 控制資訊、以及一些要傳遞給sendmsg的參數(shù),都是在一個msghdr資料結(jié)構(gòu)中被指定的,16,sendmsg System Call,sendmsg, sendit會負責準備sosend函式呼叫所需要的資料結(jié)構(gòu),sosend會把這一些訊息交給適當?shù)耐ㄓ崊f(xié)定 SOCK_DGRAM: 一份訊息就是一個資料包 SOCK_STREAM: 一份訊息就是一連串的位元組 co
5、py iov array sendit and cleanup,17,sendit Function Call,被sendto, sendmsg這二個system call呼叫 sendit會去初始化一個uio資料結(jié)構(gòu) 將control, address 資訊從行程中複製到系統(tǒng)核心 Initial auio 會去呼叫g(shù)etsock函式,取得descriptors 相關(guān)的file資料結(jié)構(gòu) 初始化uio資料結(jié)構(gòu),把行程所指定的輸出緩衝區(qū)收集到系統(tǒng)核心當中的mbufs 把各個緩衝區(qū)的長度大小加總,並且存在uio_resid Copy address and control information f
6、rom the process Send data and cleanup,18,sosend Function Call,5個寫入系統(tǒng)呼叫,最後會呼叫sosend sosend要將資料、控制資訊,根據(jù)通訊協(xié)定以及socket指定的緩衝區(qū)限制值,遞交給與這一個socket相關(guān)的通訊協(xié)定的pr_usrreq函式 sosend不會將資料放到緩衝區(qū),通訊協(xié)定要自行儲存、移除這一些資料 sosend會根據(jù)相關(guān)的通訊協(xié)定是否有實作可信賴或是不可信賴的資料傳輸語意,來定義緩衝區(qū)的sb_hiwat以及sb_lowat,19,sosend Function Call,可靠通訊協(xié)定緩衝區(qū)處理 緩衝區(qū)中儲存了還沒
7、有被送出去的資料、以及已經(jīng)傳送出去但是還沒被ACK的資料 sb_cc: 緩衝區(qū)中所儲存的資料位元數(shù)目0 = sb_cc = sb_hiwat 如果有任何資料要透過pr_usrreq傳遞給通訊協(xié)定,sosend會確保緩衝區(qū)中有足夠的空間,通訊協(xié)定層會把資料添加到傳送緩衝區(qū),20,sosend會根據(jù)以下兩種方式當中一種,把資料傳輸給通訊協(xié)定 PR_ATOMIC被設(shè)定: sosend必須在行程和通訊協(xié)定之間保留訊息的邊界。sosend會去等待足夠的空間來儲存整個訊息,當有足夠空間可使用,一條包含整個訊息的mbuf chain就會建造出來,並透過pr_usereq在單一次呼叫中遞交給通訊協(xié)定,RDP便
8、是這一類的通訊協(xié)定。 PR_ATOMIC沒被設(shè)定: sosend就會把訊息一次遞交一個mbuf給通訊協(xié)定,也有可能遞交部分的mbuf,避免超出高水位標,TCP這一類的SOCK_STREAM通訊協(xié)定所使用。,21,sosend Function Call,不可靠通訊協(xié)定緩衝區(qū)處理 沒有任何資料會儲存在傳送緩衝區(qū),也不會預(yù)期去收任何的ACK 每一份訊息,都是直接被遞交給通訊協(xié)定,放到適合的網(wǎng)路裝置佇列等候傳送 sb_cc永遠為0,sb_hiwat則是指出每一次最大寫入的長度大小也間接指出資料包的最大長度 UDP來說,sb_hiwat的預(yù)設(shè)值是9216,除非用SO_SNDBUF這一個socket選項
9、去修改,22,sosend Function Call,流程 初始化 錯誤與資源的檢查 資料傳輸 通訊協(xié)定分發(fā),23,sosend Function Call,uiomove Function int uiomove(cassr_t cp, int n, struct uio *uio) uiomove會在cp所參考到的單一一個緩衝區(qū),與uio裡頭iovec陣列所指定的多重緩衝區(qū)之間,搬移n個位元,24,sosend Function Call,25,sosend Function Call,26,sosend Function Call,發(fā)出pr_usrreq (PRU_SEND) tcp_
10、usrreq() 將要送的資料添加到so_snd緩衝區(qū)中 呼叫tcp_output,27,28,29,read, readv, recvfrom, and recvmsg System Call,讀取系統(tǒng)呼叫 read, readv, recvfrom, and recvmsg 負責在一個網(wǎng)路連接上接收資料 會直接或間接的呼叫soreceive函式,30,31,read, readv可以和任何型態(tài)的descriptor搭配使用,其他的便只能搭配socket descriptor使用 像寫入系統(tǒng)呼叫一樣,多重的緩衝區(qū)是由一個iovec資料結(jié)構(gòu)的矩陣來指定的,32,和寫入系統(tǒng)呼叫一樣,讀取系統(tǒng)呼叫
11、都會去使用一個共通的函式呼叫(soreceive)來進行所有的工作,33,recvmsg System Call,recvmsg是最一般化的讀取系統(tǒng)呼叫 copy iov array 會將msghdr資料結(jié)構(gòu)複製到系統(tǒng)核心,如果自動配置的aiov太小的話將配置一個較大的iovec矩陣,並且從行程裡複製矩陣的紀錄項到iov所指向的系統(tǒng)核心的矩陣當中 recvit and cleanup recvit接收到資料之後,msghdr資料結(jié)構(gòu)會連同更新的緩衝區(qū)長度以及旗標被複製回行程中,34,recvit Function Call,被recv, recvfrom, recvmsg所呼叫 依據(jù)recvx
12、xx系統(tǒng)呼叫所準備的msghdr資料結(jié)構(gòu),去準備uio給sorecvive去進行處理,35,recvit Function Call,執(zhí)行過程 利用getsock函式呼叫回傳descriptor s的File資料結(jié)構(gòu) 初始化一個uio來描述一個從系統(tǒng)核心到行程的讀取傳送 呼叫soreceive 實作了從socket緩衝區(qū)接收資料 傳送的位元組總數(shù)會被儲存在*retsize中,並回傳給行程 複製位址以及資訊到行程裡 如果行程為位址或是控制資訊提供了緩衝區(qū),那麼這一些緩衝區(qū)就會被填寫,長度也會依據(jù)soreceive的傳回值加以調(diào)整 清除,36,soreceive Function Call,從so
13、cket的接收緩衝區(qū)傳送資料到行程所指定的緩衝區(qū)當中 遞交給系統(tǒng)核心的flag值 MSG_DONTWAIT: 再這一次系統(tǒng)呼叫中,不要等待資源 MSG_OOB: 接收頻外資料,而非一般資料 MSG_PEEK: 接收資料的副本,並且不去消耗資料本身 MSG_WAITALL: 在返回之前,先等待資料填入緩衝區(qū),37,soreceive Function Call,系統(tǒng)核心傳回的flag值 MSG_CTRUNC: 所收到的控制訊息長度,筆所提供的緩衝區(qū)長度還大 MSG_EOR: 所接收到的資料標記了一筆邏輯紀錄的尾端 MSG_OOB: 在緩衝區(qū)當中,包含了頻外資料 MSG_TRUNC: 所收到的訊息
14、長度,比提供的緩衝區(qū)長度還要大,38,soreceive Function Call,頻外資料(Out-of-Band),39,soreceive Function Call,接收緩衝區(qū)的組織架構(gòu):訊息邊界,40,soreceive Function Call,接收緩衝區(qū)的組織架構(gòu):沒有訊息邊界,41,soreceive Function Call,發(fā)出pr_usrreq (PRU_RECV) tcp_usrreq() 行程從緩衝區(qū)將資料讀走 呼叫tcp_output 判斷是否需要把窗口大小更新資訊傳送出去,42,select System Call,socket事件,43,select Sy
15、stem Call,selscan Function Call 找出要監(jiān)看的descriptor 登記descriptor descriptor已經(jīng)準備好了 當一個descriptor已經(jīng)準備好,相對應(yīng)的位元就會在輸出descriptor集合中設(shè)立 當所有descriptor都登記了之後,會放在*retval回傳,44,select System Call,soo_select Function Call 每一次soo_select被呼叫只會檢查一個descriptor的狀態(tài) 如果相關(guān)聯(lián)的descriptor準備好之後,便會回傳1,若還沒有準備好,則selrecord便會去標記這一個socke
16、t的接收或是傳送緩衝區(qū),表示行程正在使用這一個緩衝區(qū),再回傳0 檢查socket可否讀取 檢查socket可否寫入 檢查是否有例外的情形懸宕未決,45,select System Call,selrecord Function Call selinfo資料結(jié)構(gòu) struct selinfo pid_t si_pid; shout si_flags; 這一個資料結(jié)構(gòu)會和每一個接收以及傳送緩衝區(qū)儲存在一起(sb_sel) 當socket緩衝區(qū)只有被一個行程select呼叫所指定時,si_pid就是在等待的行程ID 當有額外的行程在同一個緩衝區(qū)上面執(zhí)行select系統(tǒng)呼叫,SI_COLL=就會在si
17、_flags中設(shè)立,稱之為collision,46,select System Call,當soo_select呼叫發(fā)現(xiàn)還沒準備好descriptor時,selrecord便會被呼叫,會紀錄下足夠的資訊,使這一個緩衝區(qū)改變時,這一個行程可以被通訊協(xié)定處理層喚醒,47,select System Call,selwakeup Function Call 當通訊協(xié)定處理改變了socket緩衝區(qū)的狀態(tài),且只有一個行程選擇了這一個緩衝區(qū),系統(tǒng)可以根據(jù)selinfo中找到的資訊,將行程放到執(zhí)行佇列中 當狀態(tài)改變且有超過一個行程選擇了這一個緩衝區(qū)時(SI_COLL設(shè)立),系統(tǒng)沒有辦法判斷到底哪一些行程會對這一次緩衝區(qū)的改變有興趣 相對應(yīng)的wakeup函式將會去喚醒所有被系統(tǒng)停頓的行程,即使對緩衝區(qū)活動沒有興趣的行程也一樣,48,49,select System Call,驗證以及準備 nd: 不可以大於這一個行程相關(guān)聯(lián)的描述子最大數(shù)目 ni: 用來儲存一個nd位元長的位元遮罩所需要的位元數(shù)目 從行程複製檔案描述子集合 從行程傳輸檔案描述子集合,50,select System Call,設(shè)定時限值 如果tv是一個空指標,timo會被設(shè)成0,select會無限期的等待。如果tv不是空指標,時限值就會被複製到系統(tǒng)核心中 掃描檔案描述
溫馨提示
- 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)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 小班漂流活動方案
- 小班春季入園活動方案
- 少兒誦讀大賽活動方案
- 居家美工活動方案
- 工廠周末活動方案
- 鞏義標準工具活動方案
- 小班重陽藝術(shù)活動方案
- 小孩栗子活動方案
- 工會演講比賽活動方案
- 小班冰燈活動方案
- GB/T 45610-2025煤矸石回填塌陷區(qū)復(fù)墾技術(shù)規(guī)程
- 不寐的中醫(yī)護理常規(guī)
- 中醫(yī)基礎(chǔ)執(zhí)業(yè)醫(yī)師考試試題及答案
- 《能源的科普講解》課件
- 天一大聯(lián)考·天一小高考2024-2025學年(下)高三第四次考試政治試題及答案
- 2025年安慶桐城經(jīng)開區(qū)建設(shè)投資集團有限公司招聘12人筆試參考題庫附帶答案詳解
- 2025-2030中國藥食同源行業(yè)市場運行分析及市場前景預(yù)測研究報告
- 2024年杭州地鐵科技有限公司招聘筆試真題
- 診所托管合同協(xié)議
- 信息必刷卷04(廣東省卷專用)2025年中考數(shù)學(解析版)
- 餐飲服務(wù)與管理課件 菜單的設(shè)計與制作
評論
0/150
提交評論