国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 語(yǔ)言 > PHP > 正文

淺談socket同步和異步、阻塞和非阻塞、I/O模型

2024-05-04 23:53:42
字體:
供稿:網(wǎng)友

在進(jìn)行網(wǎng)絡(luò)編程時(shí),常常見到同步(Sync)/異步(Async),阻塞(Block)/非阻塞(Unblock)四種調(diào)用方式

同步/異步主要針對(duì)C端:

同步:c端發(fā)出一個(gè)功能調(diào)用時(shí),在沒有得到結(jié)果之前,c端死等結(jié)果

例如:普通B/S模式(同步):提交請(qǐng)求->等待服務(wù)器處理->處理完畢返回 這個(gè)期間客戶端瀏覽器不能干任何事

異步:c端一個(gè)異步過程調(diào)用發(fā)出后,調(diào)用者不會(huì)立刻得到結(jié)果。實(shí)際處理這個(gè)調(diào)用的部件在完成后,通過狀態(tài)、通知和回調(diào)來通知調(diào)用者。

例如:ajax請(qǐng)求(異步): 事件觸發(fā)->服務(wù)器處理(瀏覽器可做其他的)->處理完畢,ajax回調(diào)函數(shù)處理結(jié)果

阻塞/非阻塞主要針對(duì)S端:

阻塞(等待):阻塞調(diào)用是指調(diào)用結(jié)果返回之前,當(dāng)前線程會(huì)被掛起。函數(shù)只有在得到結(jié)果之后才會(huì)返回,效率低

<?php$fp = fopen("lock.txt", "w+");if(flock($fp,LOCK_EX)){//..處理訂單flock($fp,LOCK_UN);}fclose($fp);?>

非阻塞(立即返回):指在不能立刻得到結(jié)果之前,該函數(shù)不會(huì)阻塞當(dāng)前線程,而會(huì)立刻返回,效率高,適合高并發(fā)

<?php$fp = fopen("lock.txt", "w+");if(flock($fp,LOCK_EX | LOCK_NB)){//..處理訂單flock($fp,LOCK_UN);}else{echo "系統(tǒng)繁忙,請(qǐng)稍后再試";}fclose($fp);?>

同步、異步和阻塞、非阻塞是組合關(guān)系,因此有4種方式:

同步阻塞、同步非阻塞、異步阻塞、異步非阻塞

linux有五種I/O模型

1)阻塞I/O(blocking I/O)

2)非阻塞I/O (nonblocking I/O)

3)I/O復(fù)用(select 和poll) (I/O multiplexing)

4)信號(hào)驅(qū)動(dòng)I/O (signal driven I/O (SIGIO))

5)異步I/O (asynchronous I/O (the POSIX aio_functions))

前四種都是同步,只有最后一種才是異步IO

select、poll、epoll 區(qū)別總結(jié):

1、單進(jìn)程最大連接數(shù):

select:?jiǎn)蝹€(gè)進(jìn)程所能打開的最大連接數(shù)有FD_SETSIZE宏定義

poll:poll本質(zhì)上和select沒有區(qū)別,但是它沒有最大連接數(shù)的限制,原因是它是基于鏈表來存儲(chǔ)的

epoll:雖然連接數(shù)有上限,但是很大,1G內(nèi)存的機(jī)器上可以打開10萬(wàn)左右的連接,2G內(nèi)存的機(jī)器可以打開20萬(wàn)左右的連接

2、文件描述符(FD)劇增后帶來的IO效率問題

select:每次調(diào)用文件描述符(FD)時(shí)都會(huì)對(duì)連接進(jìn)行線性遍歷,所以隨著FD的增加會(huì)造成遍歷速度慢的"線性下降性能問題"

poll:同上

epoll:根據(jù)每個(gè)fd上的callback函數(shù)來實(shí)現(xiàn)的,只有活躍的socket才會(huì)主動(dòng)調(diào)用callback,所以在活躍socket較少的情況下,使用epoll沒有前面兩者的線性下降的性能問題,但是所有socket都很活躍的情況下,可能會(huì)有性能問題。

3、 消息傳遞方式

select:內(nèi)核需要將消息傳遞到用戶空間,都需要內(nèi)核拷貝動(dòng)作

poll:同上

epoll:epoll通過內(nèi)核和用戶空間共享一塊內(nèi)存來實(shí)現(xiàn)的。

總結(jié):

綜上,在選擇select,poll,epoll時(shí)要根據(jù)具體的使用場(chǎng)合以及這三種方式的自身特點(diǎn)。

1、表面上看epoll的性能最好,但是在連接數(shù)少并且連接都十分活躍的情況下,select和poll的性能可能比epoll好,畢竟epoll的通知機(jī)制需要很多函數(shù)回調(diào)。

2、select低效是因?yàn)槊看嗡夹枰喸儭5托б彩窍鄬?duì)的,視情況而定,也可通過良好的設(shè)計(jì)改善

以上這篇淺談socket同步和異步、阻塞和非阻塞、I/O模型就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持VeVb武林網(wǎng)。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到PHP教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 桂林市| 灵寿县| 蒙山县| 宕昌县| 河南省| 溧水县| 廊坊市| 分宜县| 博乐市| 临洮县| 萨迦县| 镇雄县| 星座| 乳山市| 安庆市| 松原市| 托克逊县| 彭阳县| 炎陵县| 广东省| 额尔古纳市| 霍城县| 黄浦区| 叙永县| 同德县| 寻乌县| 嘉定区| 锡林浩特市| 平远县| 南雄市| 上高县| 宝丰县| 芦溪县| 宜昌市| 永安市| 丹棱县| 南宁市| 达州市| 内丘县| 旬阳县| 越西县|