传统I/O 数据拷贝
以讀操作為例:
當(dāng)應(yīng)用程序執(zhí)行read 系統(tǒng)調(diào)用讀取文件描述符(FD)的時(shí)候,如果這塊數(shù)據(jù)已經(jīng)存在于用戶(hù)進(jìn)程的頁(yè)內(nèi)存中,就直接從內(nèi)存中讀取數(shù)據(jù)。如果數(shù)據(jù)不存在,則先將數(shù)據(jù)從磁盤(pán)加載數(shù)據(jù)到內(nèi)核緩沖區(qū)中,再?gòu)膬?nèi)核緩沖區(qū)拷貝到用戶(hù)進(jìn)程的頁(yè)內(nèi)存中。(兩次
拷貝,兩次user 和kernel 的上下文切換)。
I/O 的阻塞到底阻塞在哪里?
Blocking I/O
當(dāng)使用read 或write 對(duì)某個(gè)文件描述符進(jìn)行過(guò)讀寫(xiě)時(shí),如果當(dāng)前FD 不可讀,系統(tǒng)就不會(huì)對(duì)其他的操作做出響應(yīng)。從設(shè)備復(fù)制數(shù)據(jù)到內(nèi)核緩沖區(qū)是阻塞的,從內(nèi)核緩沖區(qū)拷貝到用戶(hù)空間,也是阻塞的,直到copy complete,內(nèi)核返回結(jié)果,用戶(hù)進(jìn)程才解除block 的狀態(tài)。
為了解決阻塞的問(wèn)題,我們有幾個(gè)思路。
1、在服務(wù)端創(chuàng)建多個(gè)線程或者使用線程池,但是在高并發(fā)的情況下需要的線程會(huì)很多,系統(tǒng)無(wú)法承受,而且創(chuàng)建和釋放線程都需要消耗資源。
2、由請(qǐng)求方定期輪詢(xún),在數(shù)據(jù)準(zhǔn)備完畢后再?gòu)膬?nèi)核緩存緩沖區(qū)復(fù)制數(shù)據(jù)到用戶(hù)空間(非阻塞式I/O),這種方式會(huì)存在一定的延遲。
能不能用一個(gè)線程處理多個(gè)客戶(hù)端請(qǐng)求?
?
總結(jié)
以上是生活随笔為你收集整理的传统I/O 数据拷贝的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 文件描述符FD
- 下一篇: RDB 文件的优势和劣势