成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

淺談操作系統(tǒng) IO 模式

系統(tǒng) Linux
IO (Input/Output,輸入/輸出)即數(shù)據(jù)的讀取(接收)或?qū)懭耄òl(fā)送)操作,通常用戶進(jìn)程中的一個完整IO分為兩階段:用戶進(jìn)程空間<-->內(nèi)核空間、內(nèi)核空間<-->設(shè)備空間(磁盤、網(wǎng)絡(luò)等)。IO有內(nèi)存IO、網(wǎng)絡(luò)IO和磁盤IO三種,通常我們說的IO指的是后兩者。

[[285850]]

 IO

 

淺談操作系統(tǒng) IO 模式

 

IO (Input/Output,輸入/輸出)即數(shù)據(jù)的讀取(接收)或?qū)懭?發(fā)送)操作,通常用戶進(jìn)程中的一個完整IO分為兩階段:用戶進(jìn)程空間<-->內(nèi)核空間、內(nèi)核空間<-->設(shè)備空間(磁盤、網(wǎng)絡(luò)等)。IO有內(nèi)存IO、網(wǎng)絡(luò)IO和磁盤IO三種,通常我們說的IO指的是后兩者。

LINUX中進(jìn)程無法直接操作I/O設(shè)備,其必須通過系統(tǒng)調(diào)用請求kernel來協(xié)助完成I/O動作;內(nèi)核會為每個I/O設(shè)備維護(hù)一個緩沖區(qū)。

對于一個輸入操作來說,進(jìn)程IO系統(tǒng)調(diào)用后,內(nèi)核會先看緩沖區(qū)中有沒有相應(yīng)的緩存數(shù)據(jù),沒有的話再到設(shè)備中讀取,因?yàn)樵O(shè)備IO一般速度較慢,需要等待;內(nèi)核緩沖區(qū)有數(shù)據(jù)則直接復(fù)制到進(jìn)程空間。

所以,對于一個網(wǎng)絡(luò)輸入操作通常包括兩個不同階段:

(1)等待網(wǎng)絡(luò)數(shù)據(jù)到達(dá)網(wǎng)卡→讀取到內(nèi)核緩沖區(qū),數(shù)據(jù)準(zhǔn)備好;

(2)從內(nèi)核緩沖區(qū)復(fù)制數(shù)據(jù)到進(jìn)程空間。

 

關(guān)鍵概念理解

  • 同步:發(fā)起一個調(diào)用,得到結(jié)果才返回。
  • 異步:調(diào)用發(fā)起后,調(diào)用直接返回;調(diào)用方主動詢問被調(diào)用方獲取結(jié)果,或被調(diào)用方通過回調(diào)函數(shù)。
  • 阻塞:調(diào)用是指調(diào)用結(jié)果返回之前,當(dāng)前線程會被掛起。調(diào)用線程只有在得到結(jié)果之后才會返回。
  • 非阻塞:調(diào)用指在不能立刻得到結(jié)果之前,該調(diào)用不會阻塞當(dāng)前線程。

同步才有阻塞和非阻塞之分;

阻塞與非阻塞關(guān)乎如何對待事情產(chǎn)生的結(jié)果(阻塞:不等到想要的結(jié)果我就不走了)

明確進(jìn)程狀態(tài)

理解進(jìn)程的狀態(tài)轉(zhuǎn)換

  • 就緒狀態(tài) -> 運(yùn)行狀態(tài):處于就緒狀態(tài)的進(jìn)程被調(diào)度后,獲得CPU資源(分派CPU時間片),于是進(jìn)程由就緒狀態(tài)轉(zhuǎn)換為運(yùn)行狀態(tài)。
  • 運(yùn)行狀態(tài) -> 就緒狀態(tài):處于運(yùn)行狀態(tài)的進(jìn)程在時間片用完后,不得不讓出CPU,從而進(jìn)程由運(yùn)行狀態(tài)轉(zhuǎn)換為就緒狀態(tài)。此外,在可剝奪的操作系統(tǒng)中,當(dāng)有更高優(yōu)先級的進(jìn)程就 、 緒時,調(diào)度程度將正執(zhí)行的進(jìn)程轉(zhuǎn)換為就緒狀態(tài),讓更高優(yōu)先級的進(jìn)程執(zhí)行。
  • 運(yùn)行狀態(tài) -> 阻塞狀態(tài):當(dāng)進(jìn)程請求某一資源(如外設(shè))的使用和分配或等待某一事件的發(fā)生(如I/O操作的完成)時,它就從運(yùn)行狀態(tài)轉(zhuǎn)換為阻塞狀態(tài)。進(jìn)程以系統(tǒng)調(diào)用的形式請求操作系統(tǒng)提供服務(wù),這是一種特殊的、由運(yùn)行用戶態(tài)程序調(diào)用操作系統(tǒng)內(nèi)核過程的形式。
  • 阻塞狀態(tài) -> 就緒狀態(tài):當(dāng)進(jìn)程等待的事件到來時,如I/O操作結(jié)束或中斷結(jié)束時,中斷處理程序必須把相應(yīng)進(jìn)程的狀態(tài)由阻塞狀態(tài)轉(zhuǎn)換為就緒狀態(tài)。

 

淺談操作系統(tǒng) IO 模式

 

從操作系統(tǒng)層面執(zhí)行應(yīng)用程序理解 IO 模型

阻塞IO模型:

  • 簡介:進(jìn)程會一直阻塞,直到數(shù)據(jù)拷貝完成應(yīng)用程序調(diào)用一個IO函數(shù),導(dǎo)致應(yīng)用程序阻塞,等待數(shù)據(jù)準(zhǔn)備好。 如果數(shù)據(jù)沒有準(zhǔn)備好,一直等待….數(shù)據(jù)準(zhǔn)備好了,從內(nèi)核拷貝到用戶空間,IO函數(shù)返回成功指示。 我們 第一次接觸到的網(wǎng)絡(luò)編程都是從 listen()、send()、recv()等接口開始的。使用這些接口可以很方便的構(gòu)建服務(wù)器 /客戶機(jī)的模型。
  • 阻塞I/O模型圖:在調(diào)用recv()/recvfrom()函數(shù)時,發(fā)生在內(nèi)核中等待數(shù)據(jù)和復(fù)制數(shù)據(jù)的過程。

 

淺談操作系統(tǒng) IO 模式

 

當(dāng)調(diào)用recv()函數(shù)時,系統(tǒng)首先查是否有準(zhǔn)備好的數(shù)據(jù)。如果數(shù)據(jù)沒有準(zhǔn)備好,那么系統(tǒng)就處于等待狀態(tài)。當(dāng)數(shù)據(jù)準(zhǔn)備好后,將數(shù)據(jù)從系統(tǒng)緩沖區(qū)復(fù)制到用戶空間,然后該函數(shù)返回。在套接應(yīng)用程序中,當(dāng)調(diào)用recv()函數(shù)時,未必用戶空間就已經(jīng)存在數(shù)據(jù),那么此時recv()函數(shù)就會處于等待狀態(tài)。

阻塞模式給網(wǎng)絡(luò)編程帶來了一個很大的問題,如在調(diào)用 send()的同時,線程將被阻塞,在此期間,線程將無法執(zhí)行任何運(yùn)算或響應(yīng)任何的網(wǎng)絡(luò)請求。這給多客戶機(jī)、多業(yè)務(wù)邏輯的網(wǎng)絡(luò)編程帶來了挑戰(zhàn)。這時,我們可能會選擇多線程的方式來解決這個問題。

應(yīng)對多客戶機(jī)的網(wǎng)絡(luò)應(yīng)用,最簡單的解決方式是在服務(wù)器端使用多線程(或多進(jìn)程)。多線程(或多進(jìn)程)的目的是讓每個連接都擁有獨(dú)立的線程(或進(jìn)程),這樣任何一個連接的阻塞都不會影響其他的連接。

具體使用多進(jìn)程還是多線程,并沒有一個特定的模式。傳統(tǒng)意義上,進(jìn)程的開銷要遠(yuǎn)遠(yuǎn)大于線程,所以,如果需要同時為較多的客戶機(jī)提供服務(wù),則不推薦使用多進(jìn)程;如果單個服務(wù)執(zhí)行體需要消耗較多的 CPU 資源,譬如需要進(jìn)行大規(guī)模或長時間的數(shù)據(jù)運(yùn)算或文件訪問,則進(jìn)程較為安全。

非阻塞IO模型

  • 簡介:非阻塞IO通過進(jìn)程反復(fù)調(diào)用IO函數(shù)(多次系統(tǒng)調(diào)用,并馬上返回);在數(shù)據(jù)拷貝的過程中,進(jìn)程是阻塞的; 我們把一個SOCKET接口設(shè)置為非阻塞就是告訴內(nèi)核,當(dāng)所請求的I/O操作無法完成時,不要將進(jìn)程睡眠,而是返回一個錯誤。這樣我們的I/O操作函數(shù)將不斷的測試數(shù)據(jù)是否已經(jīng)準(zhǔn)備好,如果沒有準(zhǔn)備好,繼續(xù)測試,直到數(shù)據(jù)準(zhǔn)備好為止。在這個不斷測試的過程中,會大量的占用CPU的時間。

 

淺談操作系統(tǒng) IO 模式

 

IO復(fù)用模型:

 

  • 簡介:IO multiplexing就是我們說的select,poll,epoll,有些地方也稱這種IO方式為event driven IO。select/epoll的好處就在于單個process就可以同時處理多個網(wǎng)絡(luò)連接的 IO。它的基本原理就是select,poll,epoll這個function會不斷的輪詢所負(fù)責(zé)的所有socket,當(dāng)某個socket有數(shù)據(jù)到達(dá)了,就通知用戶進(jìn)程。

 

淺談操作系統(tǒng) IO 模式

 

 

 

當(dāng)用戶進(jìn)程調(diào)用了select,那么整個進(jìn)程會被block,而同時,kernel會“監(jiān)視”所有select負(fù)責(zé)的socket,當(dāng)任何一個socket中的數(shù)據(jù)準(zhǔn)備好了,select就會返回。這個時候用戶進(jìn)程再調(diào)用read操作,將數(shù)據(jù)從kernel拷貝到用戶進(jìn)程。

所以,I/O 多路復(fù)用的特點(diǎn)是通過一種機(jī)制一個進(jìn)程能同時等待多個文件描述符,而這些文件描述符(套接字描述符)其中的任意一個進(jìn)入讀就緒狀態(tài),select()函數(shù)就可以返回。

異步IO模型

  • 簡介:用戶進(jìn)程發(fā)起read操作之后,立刻就可以開始去做其它的事。而另一方面,從kernel的角度,當(dāng)它受到一個asynchronous read之后,首先它會立刻返回,所以不會對用戶進(jìn)程產(chǎn)生任何block。然后,kernel會等待數(shù)據(jù)準(zhǔn)備完成,然后將數(shù)據(jù)拷貝到用戶內(nèi)存,當(dāng)這一切都完成之后,kernel會給用戶進(jìn)程發(fā)送一個signal,告訴它read操作完成了。

 

淺談操作系統(tǒng) IO 模式

 

區(qū)別IO多路復(fù)用中的select poll epoll

select

int select (int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); select 函數(shù)監(jiān)視的文件描述符分3類,分別是writefds、readfds、和exceptfds。調(diào)用后select函數(shù)會阻塞,直到有描述符就緒(有數(shù)據(jù) 可讀、可寫、或者有except),或者超時(timeout指定等待時間,如果立即返回設(shè)為null即可),函數(shù)返回。當(dāng)select函數(shù)返回后,可以 通過遍歷fdset,來找到就緒的描述符

poll

int poll (struct pollfd *fds, unsigned int nfds, int timeout); 不同與select使用三個位圖來表示三個fdset的方式,poll使用一個 pollfd的指針實(shí)現(xiàn)。pollfd并沒有最大數(shù)量限制(但是數(shù)量過大后性能也是會下降)。 和select函數(shù)一樣,poll返回后,需要輪詢pollfd來獲取就緒的描述符。

epoll

epoll是通過事件的就緒通知方式,調(diào)用epoll_create創(chuàng)建實(shí)例,調(diào)用epoll_ctl添加或刪除監(jiān)控的文件描述符,調(diào)用epoll_wait阻塞住,直到有就緒的文件描述符,通過epoll_event參數(shù)返回就緒狀態(tài)的文件描述符和事件。

epoll操作過程需要三個接口,分別如下: int epoll_create(int size);//創(chuàng)建一個epoll的句柄,size用來告訴內(nèi)核這個監(jiān)聽的數(shù)目一共有多大 生成一個 epoll 專用的文件描述符,其實(shí)是申請一個內(nèi)核空間,用來存放想關(guān)注的 socket fd 上是否發(fā)生以及發(fā)生了什么事件。

int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);

控制某個 epoll 文件描述符上的事件:注冊、修改、刪除。其中參數(shù) epfd 是 epoll_create() 創(chuàng)建 epoll 專用的文件描述符。

int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);

等待 I/O 事件的發(fā)生;返回發(fā)生事件數(shù)。參數(shù)說明:

epfd: 由 epoll_create() 生成的 Epoll 專用的文件描述符;

epoll_event: 用于回傳代處理事件的數(shù)組;

maxevents: 每次能處理的事件數(shù);

timeout: 等待 I/O 事件發(fā)生的超時值;

區(qū)別總結(jié)

(1)select,poll實(shí)現(xiàn)需要自己不斷輪詢所有fd集合,直到設(shè)備就緒,期間可能要睡眠和喚醒多次交替。而epoll其實(shí)也需要調(diào)用epoll_wait不斷輪詢就緒鏈表,期間也可能多次睡眠和喚醒交替,但是它是設(shè)備就緒時,調(diào)用回調(diào)函數(shù),把就緒fd放入就緒鏈表中,并喚醒在epoll_wait中進(jìn)入睡眠的進(jìn)程。雖然都要睡眠和交替,但是select和poll在“醒著”的時候要遍歷整個fd集合,而epoll在“醒著”的時候只要判斷一下就緒鏈表是否為空就行了,這節(jié)省了大量的CPU時間。這就是回調(diào)機(jī)制帶來的性能提升。

(2)select,poll每次調(diào)用都要把fd集合從用戶態(tài)往內(nèi)核態(tài)拷貝一次,epoll 通過 mmap 把內(nèi)核空間和用戶空間映射到同一塊內(nèi)存,省去了拷貝的操作。

應(yīng)用舉例

  • Tornado:
  • 使用單線程的方式,避免線程切換的性能開銷,同時避免在使用一些函數(shù)接口時出現(xiàn)線程不安全的情況
  • 支持異步非阻塞網(wǎng)絡(luò)IO模型,避免主進(jìn)程阻塞等待。

tornado 的 IOLoop 模塊 是異步機(jī)制的核心,它包含了一系列已經(jīng)打開的文件描述符和每個描述符的處理器 (handlers)。這些 handlers 就是對 select, poll , epoll等的封裝。(所以本質(zhì)上說是 IO 復(fù)用)

  • Django

沒有用異步,通過使用多進(jìn)程的WSGI server(比如uWSGI)來實(shí)現(xiàn)并發(fā),這也是WSGI普遍的做法。

Linux后端服務(wù)器開發(fā)要學(xué)關(guān)于IO的哪些知識點(diǎn)

網(wǎng)絡(luò)IO是網(wǎng)絡(luò)通信的血管,數(shù)據(jù)是血液。血液的流動是不能離開血管的。

源碼實(shí)現(xiàn)

  • 服務(wù)器IO核心— epoll編程實(shí)戰(zhàn)
  • 客戶端多網(wǎng)絡(luò)連接機(jī)制poll
  • 文件IO管理select實(shí)戰(zhàn)

框架實(shí)戰(zhàn)

  • 高性能的時間循環(huán) libev
  • 跨平臺異步I/O libuv
  • 跨平臺的C++庫 Boost.Asio
  • 事件通知庫 libevent

理論詳解

  • 阻塞型 BIO
  • 異步IO AIO
  • 非阻塞型IO NIO

 

責(zé)任編輯:華軒 來源: 今日頭條
相關(guān)推薦

2012-08-29 13:39:29

2009-12-23 10:38:08

Linux操作系統(tǒng)

2010-04-16 18:15:11

Unix操作系統(tǒng)

2021-06-30 15:25:13

操作系統(tǒng)Java

2010-04-28 18:24:11

2021-07-01 11:56:35

操作系統(tǒng)Java IO

2013-03-20 10:10:50

數(shù)據(jù)中心網(wǎng)絡(luò)操作系統(tǒng)網(wǎng)絡(luò)設(shè)備商

2009-12-09 17:25:19

Linux操作系統(tǒng)

2022-06-01 08:16:12

CPU實(shí)模式操作系統(tǒng)

2011-07-25 16:50:24

Windows安全模式

2013-02-28 14:51:01

2010-04-15 14:40:26

Unix操作系統(tǒng)

2010-04-29 14:08:38

Unix操作系統(tǒng)

2011-04-13 17:31:33

2021-04-19 11:23:29

操作系統(tǒng)計(jì)算機(jī)DOS

2011-06-23 15:26:49

操作系統(tǒng)認(rèn)證權(quán)限

2021-11-15 06:56:46

操作系統(tǒng)U盤

2012-06-08 15:35:21

2023-04-26 08:50:23

IO模型操作系統(tǒng)Java

2011-12-21 11:11:33

筆記本常見問題
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 国产成人影院 | 欧美精品国产一区二区 | 午夜精品一区二区三区在线 | 国产一区二区三区四区hd | 国产精品一区二区在线免费观看 | 天天射美女 | 欧美性tv | 亚洲精品视频观看 | 中文字幕日韩一区 | 久久精品手机视频 | 欧美日韩精品亚洲 | 亚洲一区二区在线免费观看 | 毛片免费看 | 国产一区久久 | 日韩一区二 | 成人超碰 | 亚洲第一av | 久久精品中文字幕 | 一色桃子av一区二区 | 涩涩操 | 亚洲欧美日韩精品 | 91精品国产91久久久久久最新 | 日韩午夜 | 美日韩精品 | 欧美黄色一级毛片 | 国产乱码一二三区精品 | 狠狠入ady亚洲精品经典电影 | 在线免费观看色 | 草草视频在线播放 | 国产精品免费一区二区三区 | 久久草在线视频 | 一区在线观看 | 黄色免费在线观看 | 国产精品日韩一区 | 毛片99| 在线成人 | 91av在线影院 | 成人三级av| 国内91在线 | 色一阁| 国产欧美精品一区二区色综合 |