版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、1,Socket I/O,2,Introduction,討論在網(wǎng)路連接上進(jìn)行資料讀寫的系統(tǒng)呼叫 分成三部分來(lái)討論 1. 傳送資料(write, writev, sendto, sendmsg)的系統(tǒng)呼叫 2. 接收資料(read, readv, recvfrom, recvmsg)的系統(tǒng)呼叫 3. select系統(tǒng)呼叫,用來(lái)監(jiān)看descriptor,3,Code Introduction,4,Socket Buffer,sockbuf data structure,5,6,7,Socket Buffer,每一個(gè)緩衝區(qū)中,除了指向儲(chǔ)存資料的mbuf chain外,還含有控制資訊 sb_mb: 指
2、向mbuf chain中的第一個(gè)mbuf sb_cc: 紀(jì)錄包含在mbuf中的資料總位元數(shù) sb_hiwat/ sb_lowat : 拿來(lái)調(diào)節(jié)socket的流量控制演算法 sb_mbcnt: 在這一個(gè)mbuf中,總共配置了多少記憶體空間給mbuf sb_mbmax: 在每一個(gè)socket緩衝區(qū)裡面,要配置給mbuf之記憶體空間的上限值。系統(tǒng)核心的絕對(duì)極限值(sb_max: 262144 bytes),8,Socket Buffer,sb_sel: 用來(lái)實(shí)作select系統(tǒng)呼叫的selinfo資料結(jié)構(gòu) sb_timeo: 限制一個(gè)行程在進(jìn)行讀取、或是寫入之呼叫,所能被停頓的時(shí)間(ticks)。預(yù)
3、設(shè)值是0(無(wú)限期的等待),9,Socket Buffer,sb_flags:,10,write, writev, sendto, and sendmsg System Call,寫入系統(tǒng)呼叫 write, writev, sendto, and sendmsg 負(fù)責(zé)在一個(gè)網(wǎng)路連接上傳送資料 會(huì)直接或間接的呼叫sosend函式 sosend會(huì)從行程中複製資料到系統(tǒng)核心中,並將資料遞交給相關(guān)的通訊協(xié)定,11,12,writev, sendmsg可以接受來(lái)自多重緩衝區(qū)的資料 從多重緩衝區(qū)進(jìn)行寫入稱為收集(gathering) 系統(tǒng)核心會(huì)從iovec資料結(jié)構(gòu)陣列所指定的各種緩衝區(qū)當(dāng)中依序去接收資料,1
4、3,Iov_base: 指向一個(gè)長(zhǎng)度為iov_len個(gè)位元的緩衝區(qū)開(kāi)頭 如果沒(méi)有這一種型態(tài)的介面 行程得先將各緩衝區(qū)的資料複製到一個(gè)較大的緩衝區(qū) 得呼叫多次的寫入系統(tǒng)呼叫 以上兩種都較沒(méi)有效率,14,15,sendmsg支援控制資訊 控制資訊、以及一些要傳遞給sendmsg的參數(shù),都是在一個(gè)msghdr資料結(jié)構(gòu)中被指定的,16,sendmsg System Call,sendmsg, sendit會(huì)負(fù)責(zé)準(zhǔn)備sosend函式呼叫所需要的資料結(jié)構(gòu),sosend會(huì)把這一些訊息交給適當(dāng)?shù)耐ㄓ崊f(xié)定 SOCK_DGRAM: 一份訊息就是一個(gè)資料包 SOCK_STREAM: 一份訊息就是一連串的位元組 co
5、py iov array sendit and cleanup,17,sendit Function Call,被sendto, sendmsg這二個(gè)system call呼叫 sendit會(huì)去初始化一個(gè)uio資料結(jié)構(gòu) 將control, address 資訊從行程中複製到系統(tǒng)核心 Initial auio 會(huì)去呼叫g(shù)etsock函式,取得descriptors 相關(guān)的file資料結(jié)構(gòu) 初始化uio資料結(jié)構(gòu),把行程所指定的輸出緩衝區(qū)收集到系統(tǒng)核心當(dāng)中的mbufs 把各個(gè)緩衝區(qū)的長(zhǎng)度大小加總,並且存在uio_resid Copy address and control information f
6、rom the process Send data and cleanup,18,sosend Function Call,5個(gè)寫入系統(tǒng)呼叫,最後會(huì)呼叫sosend sosend要將資料、控制資訊,根據(jù)通訊協(xié)定以及socket指定的緩衝區(qū)限制值,遞交給與這一個(gè)socket相關(guān)的通訊協(xié)定的pr_usrreq函式 sosend不會(huì)將資料放到緩衝區(qū),通訊協(xié)定要自行儲(chǔ)存、移除這一些資料 sosend會(huì)根據(jù)相關(guān)的通訊協(xié)定是否有實(shí)作可信賴或是不可信賴的資料傳輸語(yǔ)意,來(lái)定義緩衝區(qū)的sb_hiwat以及sb_lowat,19,sosend Function Call,可靠通訊協(xié)定緩衝區(qū)處理 緩衝區(qū)中儲(chǔ)存了還沒(méi)
7、有被送出去的資料、以及已經(jīng)傳送出去但是還沒(méi)被ACK的資料 sb_cc: 緩衝區(qū)中所儲(chǔ)存的資料位元數(shù)目0 = sb_cc = sb_hiwat 如果有任何資料要透過(guò)pr_usrreq傳遞給通訊協(xié)定,sosend會(huì)確保緩衝區(qū)中有足夠的空間,通訊協(xié)定層會(huì)把資料添加到傳送緩衝區(qū),20,sosend會(huì)根據(jù)以下兩種方式當(dāng)中一種,把資料傳輸給通訊協(xié)定 PR_ATOMIC被設(shè)定: sosend必須在行程和通訊協(xié)定之間保留訊息的邊界。sosend會(huì)去等待足夠的空間來(lái)儲(chǔ)存整個(gè)訊息,當(dāng)有足夠空間可使用,一條包含整個(gè)訊息的mbuf chain就會(huì)建造出來(lái),並透過(guò)pr_usereq在單一次呼叫中遞交給通訊協(xié)定,RDP便
8、是這一類的通訊協(xié)定。 PR_ATOMIC沒(méi)被設(shè)定: sosend就會(huì)把訊息一次遞交一個(gè)mbuf給通訊協(xié)定,也有可能遞交部分的mbuf,避免超出高水位標(biāo),TCP這一類的SOCK_STREAM通訊協(xié)定所使用。,21,sosend Function Call,不可靠通訊協(xié)定緩衝區(qū)處理 沒(méi)有任何資料會(huì)儲(chǔ)存在傳送緩衝區(qū),也不會(huì)預(yù)期去收任何的ACK 每一份訊息,都是直接被遞交給通訊協(xié)定,放到適合的網(wǎng)路裝置佇列等候傳送 sb_cc永遠(yuǎn)為0,sb_hiwat則是指出每一次最大寫入的長(zhǎng)度大小也間接指出資料包的最大長(zhǎng)度 UDP來(lái)說(shuō),sb_hiwat的預(yù)設(shè)值是9216,除非用SO_SNDBUF這一個(gè)socket選項(xiàng)
9、去修改,22,sosend Function Call,流程 初始化 錯(cuò)誤與資源的檢查 資料傳輸 通訊協(xié)定分發(fā),23,sosend Function Call,uiomove Function int uiomove(cassr_t cp, int n, struct uio *uio) uiomove會(huì)在cp所參考到的單一一個(gè)緩衝區(qū),與uio裡頭iovec陣列所指定的多重緩衝區(qū)之間,搬移n個(gè)位元,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 負(fù)責(zé)在一個(gè)網(wǎng)路連接上接收資料 會(huì)直接或間接的呼叫soreceive函式,30,31,read, readv可以和任何型態(tài)的descriptor搭配使用,其他的便只能搭配socket descriptor使用 像寫入系統(tǒng)呼叫一樣,多重的緩衝區(qū)是由一個(gè)iovec資料結(jié)構(gòu)的矩陣來(lái)指定的,32,和寫入系統(tǒng)呼叫一樣,讀取系統(tǒng)呼叫
11、都會(huì)去使用一個(gè)共通的函式呼叫(soreceive)來(lái)進(jìn)行所有的工作,33,recvmsg System Call,recvmsg是最一般化的讀取系統(tǒng)呼叫 copy iov array 會(huì)將msghdr資料結(jié)構(gòu)複製到系統(tǒng)核心,如果自動(dòng)配置的aiov太小的話將配置一個(gè)較大的iovec矩陣,並且從行程裡複製矩陣的紀(jì)錄項(xiàng)到iov所指向的系統(tǒng)核心的矩陣當(dāng)中 recvit and cleanup recvit接收到資料之後,msghdr資料結(jié)構(gòu)會(huì)連同更新的緩衝區(qū)長(zhǎng)度以及旗標(biāo)被複製回行程中,34,recvit Function Call,被recv, recvfrom, recvmsg所呼叫 依據(jù)recvx
12、xx系統(tǒng)呼叫所準(zhǔn)備的msghdr資料結(jié)構(gòu),去準(zhǔn)備uio給sorecvive去進(jìn)行處理,35,recvit Function Call,執(zhí)行過(guò)程 利用getsock函式呼叫回傳descriptor s的File資料結(jié)構(gòu) 初始化一個(gè)uio來(lái)描述一個(gè)從系統(tǒng)核心到行程的讀取傳送 呼叫soreceive 實(shí)作了從socket緩衝區(qū)接收資料 傳送的位元組總數(shù)會(huì)被儲(chǔ)存在*retsize中,並回傳給行程 複製位址以及資訊到行程裡 如果行程為位址或是控制資訊提供了緩衝區(qū),那麼這一些緩衝區(qū)就會(huì)被填寫,長(zhǎng)度也會(huì)依據(jù)soreceive的傳回值加以調(diào)整 清除,36,soreceive Function Call,從so
13、cket的接收緩衝區(qū)傳送資料到行程所指定的緩衝區(qū)當(dāng)中 遞交給系統(tǒng)核心的flag值 MSG_DONTWAIT: 再這一次系統(tǒng)呼叫中,不要等待資源 MSG_OOB: 接收頻外資料,而非一般資料 MSG_PEEK: 接收資料的副本,並且不去消耗資料本身 MSG_WAITALL: 在返回之前,先等待資料填入緩衝區(qū),37,soreceive Function Call,系統(tǒng)核心傳回的flag值 MSG_CTRUNC: 所收到的控制訊息長(zhǎng)度,筆所提供的緩衝區(qū)長(zhǎng)度還大 MSG_EOR: 所接收到的資料標(biāo)記了一筆邏輯紀(jì)錄的尾端 MSG_OOB: 在緩衝區(qū)當(dāng)中,包含了頻外資料 MSG_TRUNC: 所收到的訊息
14、長(zhǎng)度,比提供的緩衝區(qū)長(zhǎng)度還要大,38,soreceive Function Call,頻外資料(Out-of-Band),39,soreceive Function Call,接收緩衝區(qū)的組織架構(gòu):訊息邊界,40,soreceive Function Call,接收緩衝區(qū)的組織架構(gòu):沒(méi)有訊息邊界,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)準(zhǔn)備好了 當(dāng)一個(gè)descriptor已經(jīng)準(zhǔn)備好,相對(duì)應(yīng)的位元就會(huì)在輸出descriptor集合中設(shè)立 當(dāng)所有descriptor都登記了之後,會(huì)放在*retval回傳,44,select System Call,soo_select Function Call 每一次soo_select被呼叫只會(huì)檢查一個(gè)descriptor的狀態(tài) 如果相關(guān)聯(lián)的descriptor準(zhǔn)備好之後,便會(huì)回傳1,若還沒(méi)有準(zhǔn)備好,則selrecord便會(huì)去標(biāo)記這一個(gè)socke
16、t的接收或是傳送緩衝區(qū),表示行程正在使用這一個(gè)緩衝區(qū),再回傳0 檢查socket可否讀取 檢查socket可否寫入 檢查是否有例外的情形懸宕未決,45,select System Call,selrecord Function Call selinfo資料結(jié)構(gòu) struct selinfo pid_t si_pid; shout si_flags; 這一個(gè)資料結(jié)構(gòu)會(huì)和每一個(gè)接收以及傳送緩衝區(qū)儲(chǔ)存在一起(sb_sel) 當(dāng)socket緩衝區(qū)只有被一個(gè)行程select呼叫所指定時(shí),si_pid就是在等待的行程ID 當(dāng)有額外的行程在同一個(gè)緩衝區(qū)上面執(zhí)行select系統(tǒng)呼叫,SI_COLL=就會(huì)在si
17、_flags中設(shè)立,稱之為collision,46,select System Call,當(dāng)soo_select呼叫發(fā)現(xiàn)還沒(méi)準(zhǔn)備好descriptor時(shí),selrecord便會(huì)被呼叫,會(huì)紀(jì)錄下足夠的資訊,使這一個(gè)緩衝區(qū)改變時(shí),這一個(gè)行程可以被通訊協(xié)定處理層喚醒,47,select System Call,selwakeup Function Call 當(dāng)通訊協(xié)定處理改變了socket緩衝區(qū)的狀態(tài),且只有一個(gè)行程選擇了這一個(gè)緩衝區(qū),系統(tǒng)可以根據(jù)selinfo中找到的資訊,將行程放到執(zhí)行佇列中 當(dāng)狀態(tài)改變且有超過(guò)一個(gè)行程選擇了這一個(gè)緩衝區(qū)時(shí)(SI_COLL設(shè)立),系統(tǒng)沒(méi)有辦法判斷到底哪一些行程會(huì)對(duì)這一次緩衝區(qū)的改變有興趣 相對(duì)應(yīng)的wakeup函式將會(huì)去喚醒所有被系統(tǒng)停頓的行程,即使對(duì)緩衝區(qū)活動(dòng)沒(méi)有興趣的行程也一樣,48,49,select System Call,驗(yàn)證以及準(zhǔn)備 nd: 不可以大於這一個(gè)行程相關(guān)聯(lián)的描述子最大數(shù)目 ni: 用來(lái)儲(chǔ)存一個(gè)nd位元長(zhǎng)的位元遮罩所需要的位元數(shù)目 從行程複製檔案描述子集合 從行程傳輸檔案描述子集合,50,select System Call,設(shè)定時(shí)限值 如果tv是一個(gè)空指標(biāo),timo會(huì)被設(shè)成0,select會(huì)無(wú)限期的等待。如果tv不是空指標(biāo),時(shí)限值就會(huì)被複製到系統(tǒng)核心中 掃描檔案描述
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 旅游城市智能導(dǎo)覽系統(tǒng)設(shè)計(jì)方案
- 小學(xué)冬季主題班級(jí)活動(dòng)方案
- 鋼板樁施工專項(xiàng)方案技術(shù)要求
- 電子圍欄系統(tǒng)實(shí)施布設(shè)安裝方案
- 路基強(qiáng)夯地基施工方案設(shè)計(jì)
- 游泳池防水施工設(shè)備配置方案
- 盤扣式腳手架施工方案技術(shù)要求
- 虹吸排水舞臺(tái)搭建方案
- 橋梁護(hù)欄施工綠色施工方案
- 雜物電梯設(shè)備安裝施工方案
- 2025海康威視安檢機(jī)用戶手冊(cè)
- 【語(yǔ)文】西安高新一小小學(xué)四年級(jí)上冊(cè)期末試題
- GB/T 9439-2023灰鑄鐵件
- YY/T 0992-2023內(nèi)鏡清洗工作站
- 建筑工程材料見(jiàn)證取樣以及試驗(yàn)檢測(cè)內(nèi)容大全
- ADCOLE+操作手冊(cè)模版
- 餐飲部物品清單
- 碧桂園展示區(qū)品質(zhì)驗(yàn)收評(píng)分表(2017版)
- GB/T 25974.3-2010煤礦用液壓支架第3部分:液壓控制系統(tǒng)及閥
- FZ/T 81006-2017牛仔服裝
- 脊椎保養(yǎng)理療課件
評(píng)論
0/150
提交評(píng)論