国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Linux搭建Web服務(wù)器(一)——阻塞與非阻塞、同步與異步、Linux五種IO模型

這篇具有很好參考價值的文章主要介紹了Linux搭建Web服務(wù)器(一)——阻塞與非阻塞、同步與異步、Linux五種IO模型。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

目錄

0x01 阻塞與非阻塞、同步與異步

阻塞與非阻塞

同步與異步

總結(jié)

0x02 Unix、Linux上的五種IO模型

阻塞(blocking)

非阻塞(non-blocking——NIO)

IO復(fù)用(IO multiplexing)

信號驅(qū)動(signal-driven)

異步(asynchronous)


0x01 阻塞與非阻塞、同步與異步

為了理清楚這幾個概念,我們可以從數(shù)據(jù)就緒以及數(shù)據(jù)讀寫層面來看待這個問題。

阻塞與非阻塞

在數(shù)據(jù)就緒層面,需要考慮阻塞與非阻塞的問題。比如我們需要在操作系統(tǒng)中調(diào)用一個網(wǎng)絡(luò)層的recv函數(shù),這個函數(shù)可以設(shè)置為阻塞以及非阻塞,阻塞顧名思義是我們需要等待這個消息的傳入到TCP數(shù)據(jù)緩沖區(qū),否則我們將一直把這個線程掛起。如果設(shè)置為非阻塞,那么我們不管數(shù)據(jù)是否已經(jīng)讀取到,我們都會不斷的去讀取這個TCP緩沖區(qū)是否有數(shù)據(jù)到達(dá),這個時候程序一直處于不斷地去判斷這個函數(shù)的返回值的狀態(tài)中,這個時候一直在消耗著CPU的資源

ssize_t recv(int sockfd,void *buf,size_t len,int flags);
int size = recv(sockfd,buf,1024,0);

對于recv函數(shù),這兩種狀態(tài)不一樣在于其返回值的判斷:如果這個時候出現(xiàn)了出錯的狀態(tài),也就是變量size出現(xiàn)-1值得時候,這個時候我們需要去判斷出現(xiàn)這個-1的情況所對應(yīng)的類型,通過數(shù)據(jù)手冊說明可以得到這個狀態(tài)有如下:EINTR、EAGAIN、EWOULDBLOCK,對于非阻塞的情況,它會是處于一個EAGAIN的狀況,對于阻塞的情況,則是EINTTR,一個會讓線程繼續(xù)接收消息,一個則會讓線程直接退出狀態(tài)。(這個處理會在后面的講解中細(xì)說)

那么我們現(xiàn)在就可以很清楚的總結(jié)出阻塞與非阻塞的區(qū)別:

  • 阻塞和非阻塞這兩個概念與程序(線程)等待消息通知(無所謂同步或者異步)時的狀態(tài)有關(guān)。也就是說阻塞與非阻塞主要是程序(線程)等待消息通知時的狀態(tài)角度來說的。

  • 阻塞和非阻塞關(guān)注的是程序在等待調(diào)用結(jié)果(消息,返回值)時的狀態(tài)。

  • 阻塞調(diào)用是指調(diào)用結(jié)果返回之前,當(dāng)前線程會被掛起。調(diào)用線程只有在得到結(jié)果之后才會返回。

  • 非阻塞調(diào)用指在不能立刻得到結(jié)果之前,不會改變線程的狀態(tài),可以通過返回值判斷當(dāng)前是否有數(shù)據(jù)可以進(jìn)行讀寫。

同步與異步

  • 所謂同步,就是發(fā)出一個功能調(diào)用時,在沒有得到結(jié)果之前,該調(diào)用就不返回或繼續(xù)執(zhí)行后續(xù)操作。

  • 異步與同步相對,當(dāng)一個異步過程調(diào)用發(fā)出后,調(diào)用者在沒有得到結(jié)果之前,就可以繼續(xù)執(zhí)行后續(xù)操作。

舉個例子,在我們應(yīng)用程序中,我們現(xiàn)在需要讀取TCP緩沖區(qū)中的數(shù)據(jù),這個時候我們需要自己調(diào)用一些接口去自行讀取數(shù)據(jù)(具體實(shí)現(xiàn)取決于底層),當(dāng)這些數(shù)據(jù)還未讀取完時,我們不可以去進(jìn)行下一步操作,這個過程我們稱之為同步,這個時候數(shù)據(jù)的處理一直是應(yīng)用程序在處理的。那么對于異步,這個時候我們設(shè)置一個異步接口,傳入了我們需要讀取的文件描述符、數(shù)據(jù)存儲地址、通知方式(如signal信號等),之后我們就可以繼續(xù)執(zhí)行我們的程序了,直到有通知出現(xiàn),我們才去取數(shù)據(jù),這種無需我們自行等待數(shù)據(jù)的方式我們可以稱之為異步,在數(shù)據(jù)處理的時候消耗的并非應(yīng)用程序的時間,在異步的處理中,應(yīng)用程序可以自己處理自己的事情。異步IO諸如:aio_read()/aio_write()(Linux異步IO接口)。

總結(jié)

在處理IO的時候,阻塞和非阻塞都是同步IO,只有使用了特殊的API才是異步IO。注意:IO多路復(fù)用技術(shù)都是同步。

Linux搭建Web服務(wù)器(一)——阻塞與非阻塞、同步與異步、Linux五種IO模型

一個典型的網(wǎng)絡(luò)IO接口調(diào)用,分為兩個階段,分別是“數(shù)據(jù)就緒”和“數(shù)據(jù)讀寫”,數(shù)據(jù)就緒分為阻塞和非阻塞,表現(xiàn)的到的結(jié)果就是阻塞當(dāng)前線程或直接返回。

同步表示A向B請求調(diào)用一個網(wǎng)絡(luò)的IO接口時(或者調(diào)用某個業(yè)務(wù)邏輯API接口時),數(shù)據(jù)的讀寫都是由請求方A自己來完成的(不管是阻塞還是非阻塞);異步表示A向B請求調(diào)用一個網(wǎng)絡(luò)接口時(或者調(diào)用某個業(yè)務(wù)邏輯API接口時),向B傳入請求事件以及事件發(fā)生時通知的方式,A就可以處理其他邏輯了,當(dāng)B監(jiān)聽到事件處理完成后,會用事先約定好的通知方式,通知A處理結(jié)果。

0x02 Unix、Linux上的五種IO模型

阻塞(blocking)

調(diào)用者調(diào)用了某個函數(shù),等待這個函數(shù)返回,期間什么也不做,不停的去檢查這個函數(shù)有沒有返回,必須等這個函數(shù)返回才能進(jìn)行下一步動作。

Linux搭建Web服務(wù)器(一)——阻塞與非阻塞、同步與異步、Linux五種IO模型

比如函數(shù)read、recv,這與文件描述符有關(guān),直接可以去文件描述符中設(shè)置其阻塞或者非阻塞。這也是個同步IO的接口。以上這種方式只能一次檢測一個事件,相當(dāng)于是單線程。

非阻塞(non-blocking——NIO)

非阻塞等待,每隔一段時間就去檢測IO事件是否就緒。沒有就緒就可以做其他事。非阻塞I/O執(zhí)行系統(tǒng)調(diào) 用總是立即返回,不管事件是否已經(jīng)發(fā)生,若事件沒有發(fā)生,則返回-1,此時可以根據(jù) errno 區(qū)分這兩種情況,對于accept,recv 和 send,事件未發(fā)生時,errno 通常被設(shè)置成 EAGAIN/EWOULDBLOCK。

Linux搭建Web服務(wù)器(一)——阻塞與非阻塞、同步與異步、Linux五種IO模型?

這也是一個同步的IO,數(shù)據(jù)處理等待還是在用戶態(tài)。以上這種方式只能一次檢測一個事件,相當(dāng)于是單線程。

IO復(fù)用(IO multiplexing)

Linux 用 select/poll/epoll 函數(shù)實(shí)現(xiàn) IO 復(fù)用模型,這些函數(shù)也會使進(jìn)程阻塞,但是和阻塞IO所不同的是這些函數(shù)可以同時阻塞多個IO操作。而且可以同時對多個讀操作、寫操作的IO函數(shù)進(jìn)行檢測。直到有數(shù)據(jù)可讀或可寫時,才真正調(diào)用IO操作函數(shù)。

Linux搭建Web服務(wù)器(一)——阻塞與非阻塞、同步與異步、Linux五種IO模型

?這種類似于多進(jìn)程多線程的處理。但是也是同步的機(jī)制。

信號驅(qū)動(signal-driven)

Linux 用套接口進(jìn)行信號驅(qū)動 IO,安裝一個信號處理函數(shù),進(jìn)程繼續(xù)運(yùn)行并不阻塞,當(dāng)IO事件就緒,進(jìn)程收到SIGIO 信號,然后處理 IO 事件。

Linux搭建Web服務(wù)器(一)——阻塞與非阻塞、同步與異步、Linux五種IO模型

?內(nèi)核在第一個階段是異步,在第二個階段是同步,因?yàn)檫@個時候的數(shù)據(jù)拷貝還是在用戶空間進(jìn)行的;與非阻塞IO的區(qū)別在于它提供了消息通知機(jī)制,不需要用戶進(jìn)程不斷的輪詢檢查,減少了系統(tǒng)API的調(diào)用次數(shù),提高了效率。

異步(asynchronous)

Linux中,可以調(diào)用 aio_read 函數(shù)告訴內(nèi)核描述字緩沖區(qū)指針和緩沖區(qū)的大小、文件偏移及通知的方式,然后立即返回,當(dāng)內(nèi)核將數(shù)據(jù)拷貝到緩沖區(qū)后,再通知應(yīng)用程序。

Linux搭建Web服務(wù)器(一)——阻塞與非阻塞、同步與異步、Linux五種IO模型

?內(nèi)核自動把數(shù)據(jù)傳到用戶空間所規(guī)定的存儲空間中,無需用戶自行拷貝數(shù)據(jù)。使用如下結(jié)構(gòu)體進(jìn)行設(shè)置:文章來源地址http://www.zghlxwxcb.cn/news/detail-409441.html

/* Asynchronous I/O control block. */
struct aiocb
{
    int aio_fildes; /* File desriptor. */
    int aio_lio_opcode; /* Operation to be performed. */
    int aio_reqprio; /* Request priority offset. */
    volatile void *aio_buf; /* Location of buffer. */
    size_t aio_nbytes; /* Length of transfer. */
    struct sigevent aio_sigevent; /* Signal number and value. */
    /* Internal members. */
    struct aiocb *__next_prio;
    int __abs_prio;
    int __policy;
    int __error_code;
    __ssize_t __return_value;
#ifndef __USE_FILE_OFFSET64
    __off_t aio_offset; /* File offset. */
    char __pad[sizeof (__off64_t) - sizeof (__off_t)];
#else
    __off64_t aio_offset; /* File offset. */
#endif
    char __glibc_reserved[32];
}

到了這里,關(guān)于Linux搭建Web服務(wù)器(一)——阻塞與非阻塞、同步與異步、Linux五種IO模型的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Linux下的WEB服務(wù)器的搭建實(shí)戰(zhàn)

    Linux下的WEB服務(wù)器的搭建實(shí)戰(zhàn)

    每次搭建一個服務(wù)器之前,比如MySQL、DNS、WEB等首先要掛載磁盤目錄文件 掛載就是當(dāng)要使用某個設(shè)備時(例如光盤或軟盤),必須先將它們對應(yīng)放到 Linux 系統(tǒng)中的某個目錄上。其中對應(yīng)的目錄就叫作掛載點(diǎn)。只有經(jīng)過操作之后,用戶或程序才能訪問到這些設(shè)備。這個操作過程

    2024年02月03日
    瀏覽(17)
  • Web服務(wù)器實(shí)現(xiàn)|基于阻塞隊(duì)列線程池的Http服務(wù)器|線程控制|Http協(xié)議

    Web服務(wù)器實(shí)現(xiàn)|基于阻塞隊(duì)列線程池的Http服務(wù)器|線程控制|Http協(xié)議

    代碼地址:WebServer_GitHub_Addr 摘要 本實(shí)驗(yàn)通過C++語言,實(shí)現(xiàn)了一個基于阻塞隊(duì)列線程池的多線程Web服務(wù)器。該服務(wù)器支持通過http協(xié)議發(fā)送報(bào)文,跨主機(jī)抓取服務(wù)器上特定資源。與此同時,該Web服務(wù)器后臺通過C++語言,通過原生系統(tǒng)線程調(diào)用 pthread.h ,實(shí)現(xiàn)了一個 基于阻塞隊(duì)列

    2024年02月07日
    瀏覽(20)
  • Linux—Web服務(wù)器(靜態(tài)、動態(tài)網(wǎng)站的搭建)

    Linux—Web服務(wù)器(靜態(tài)、動態(tài)網(wǎng)站的搭建)

    1.1www所用的協(xié)議 HTTP超文本傳輸協(xié)議,是互聯(lián)網(wǎng)上最廣泛的一種網(wǎng)絡(luò)協(xié)議,所有的www文件都必須遵守這個標(biāo)準(zhǔn) 它是建立在TCP上一種的無狀態(tài)連接,整個基本的工作流程是客戶端發(fā)送一個HTTP請求,說明客戶端想要訪問的資源和請求的動作,服務(wù)端收到請求之后,服務(wù)端開始處理

    2024年02月06日
    瀏覽(26)
  • 在 【Linux Centos】下搭建 【Nginx Web】 服務(wù)器

    系統(tǒng):Linux Centos 7.9 gcc 、c++、pcre、zlib、openssl等 添加內(nèi)容

    2024年01月16日
    瀏覽(28)
  • [云計(jì)算學(xué)習(xí)3] Linux基礎(chǔ) : 使用chrony搭建時間服務(wù)器并讓下游NTP同步時間

    [云計(jì)算學(xué)習(xí)3] Linux基礎(chǔ) : 使用chrony搭建時間服務(wù)器并讓下游NTP同步時間

    操作平臺 : centos 7 (虛擬機(jī)) 配置: 2H4G 情景 : 主機(jī)1(服務(wù)器)搭建時間服務(wù)器并讓主機(jī)2(客戶端)進(jìn)行NTP同步 在終端輸入以下命令安裝chrony 然后設(shè)置服務(wù)開機(jī)自啟動 完成上述操作后,我們就可以進(jìn)行下一步了 ? : 此操作請?jiān)?主機(jī)1 (服務(wù)器) 操作 我們關(guān)閉SELinux 輸入 vim /etc/selinu

    2024年02月15日
    瀏覽(25)
  • Linux -- Web服務(wù)器 快速搭建靜態(tài)網(wǎng)站,替換默認(rèn)網(wǎng)頁目錄

    Linux -- Web服務(wù)器 快速搭建靜態(tài)網(wǎng)站,替換默認(rèn)網(wǎng)頁目錄

    先簡單寫個 頁面? ? ? ? ? 我們給網(wǎng)頁寫了一行內(nèi)容 作為 靜態(tài)網(wǎng)頁的內(nèi)容 ( 當(dāng)然了,寫的相當(dāng)簡單,您先理解著看) ? ? ? ? 可以看到的是,我們將內(nèi)容 定向到了一個文件里, ????????這個文件的路徑 (? /var/www/html? )熟悉不熟悉??? ? ? ? ? === ? ? ? ? ? ?

    2023年04月19日
    瀏覽(31)
  • 無需租云服務(wù)器,Linux本地搭建web服務(wù),并內(nèi)網(wǎng)穿透發(fā)布公網(wǎng)訪問

    無需租云服務(wù)器,Linux本地搭建web服務(wù),并內(nèi)網(wǎng)穿透發(fā)布公網(wǎng)訪問

    轉(zhuǎn)載自cpolar文章:Linux CentOS本地搭建Web站點(diǎn),并實(shí)現(xiàn)公網(wǎng)訪問 在web項(xiàng)目中,部署的web站點(diǎn)需要被外部訪問,則需要一個媒介,通過把資源放在這個媒介中,再通過所暴露的端口指向這個站點(diǎn),當(dāng)外部訪問這個媒介所對應(yīng)的端口時,媒介指向站點(diǎn),完成訪問,像這種類似的媒介,常用的有

    2024年02月06日
    瀏覽(25)
  • 搭建FRP內(nèi)網(wǎng)穿透服務(wù)器來遠(yuǎn)程訪問本地windows/linux中的web服務(wù)

    搭建FRP內(nèi)網(wǎng)穿透服務(wù)器來遠(yuǎn)程訪問本地windows/linux中的web服務(wù)

    什么是FRP? FRP 是一個免費(fèi)開源的用于內(nèi)網(wǎng)穿透的反向代理應(yīng)用,它支持 TCP、UDP 協(xié)議, 也為 http 和 https 協(xié)議提供了額外的支持。 FRP有服務(wù)端和客戶端,你將服務(wù)端安裝在你買的便宜云服務(wù)器上,F(xiàn)RP客戶端安裝在你自己的電腦上,配置好暴露的端口,就可以實(shí)現(xiàn)你訪問服務(wù)器

    2024年02月05日
    瀏覽(32)
  • 無云服務(wù)器,Linux本地快速搭建web網(wǎng)站,并內(nèi)網(wǎng)穿透發(fā)布上線

    無云服務(wù)器,Linux本地快速搭建web網(wǎng)站,并內(nèi)網(wǎng)穿透發(fā)布上線

    轉(zhuǎn)載自cpolar文章:Linux CentOS本地搭建Web站點(diǎn),并實(shí)現(xiàn)公網(wǎng)訪問 在web項(xiàng)目中,部署的web站點(diǎn)需要被外部訪問,則需要一個媒介,通過把資源放在這個媒介中,再通過所暴露的端口指向這個站點(diǎn),當(dāng)外部訪問這個媒介所對應(yīng)的端口時,媒介指向站點(diǎn),完成訪問,像這種類似的媒介,常用的有

    2024年02月02日
    瀏覽(41)
  • Linux -- 進(jìn)階 Web服務(wù)器 搭建基于 https 協(xié)議的靜態(tài)網(wǎng)站 ( 預(yù)備知識 )

    Linux -- 進(jìn)階 Web服務(wù)器 搭建基于 https 協(xié)議的靜態(tài)網(wǎng)站 ( 預(yù)備知識 )

    ? ? ? ??????什么是 HTTPS??? ?HTTPS? 協(xié)議背景 ?? ? ? ?? ===? ? ? ? ? ? ? ? ? HTTP?協(xié)議? 即? 超文本傳輸協(xié)議 , ????????????????它出生的很早,在早期,網(wǎng)絡(luò)服務(wù)的相關(guān)攻擊呢,或者病毒啥的幾乎沒有,安全類的問 ? ? ? ? ? ? ? ? ?題也是少之又少。 ??

    2024年02月06日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包