91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

信號驅(qū)動(dòng)IO與異步IO的區(qū)別

科技綠洲 ? 來源:Linux開發(fā)架構(gòu)之路 ? 作者:Linux開發(fā)架構(gòu)之路 ? 2023-11-08 15:32 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一. 談信號驅(qū)動(dòng)IO (對比異步IO來看)

信號驅(qū)動(dòng)IO 對比 異步 IO進(jìn)行理解

圖片

信號驅(qū)動(dòng)IO: 內(nèi)核將數(shù)據(jù)準(zhǔn)備好的時(shí)候, 使用SIGIO信號通知應(yīng)用程序進(jìn)行IO操作

通知應(yīng)用程序處理IO, 是開始處理IO, 這個(gè)時(shí)候還是存在阻塞的,將數(shù)據(jù)從內(nèi)核態(tài)拷貝進(jìn)入到用戶態(tài)的過程至少是阻塞住的 (應(yīng)用程序?qū)?shù)據(jù)從內(nèi)核態(tài)拷貝到用戶態(tài)的過程是阻塞等待的, 和異步IO的區(qū)別) (此處是區(qū)分信號驅(qū)動(dòng)IO和異步IO的關(guān)鍵所在)

信號驅(qū)動(dòng)IO, 我們提前在信號集合中設(shè)置好IO信號等待, 注冊好對應(yīng)的IO處理函數(shù) handler,IO數(shù)據(jù)準(zhǔn)備就緒后,會(huì)遞交SIGIO信號,通知應(yīng)用程序中斷然后開始進(jìn)行對應(yīng)的IO處理邏輯. 但是通知處理IO的時(shí)候存在將數(shù)據(jù)從 內(nèi)核空間拷貝到用戶空間的過程,(而異步IO是數(shù)據(jù)拷貝完成之后內(nèi)核再通知應(yīng)用程序直接開始處理, 應(yīng)用程序直接處理,不需要拷貝數(shù)據(jù)阻塞等待)

圖片

異步IO: 由內(nèi)核在數(shù)據(jù)拷貝完成時(shí), 通知應(yīng)用程序(而信號驅(qū)動(dòng)是告訴應(yīng)用程序何時(shí)可以開始拷貝數(shù)據(jù))

真正的做到了完完全全的非阻塞,發(fā)起aio_read之后應(yīng)用程序立即可以去做其他的事情了. 調(diào)用了aio_read之后會(huì)立即進(jìn)行返回繼續(xù)向下執(zhí)行應(yīng)用程序,由kernel內(nèi)核進(jìn)行等待數(shù)據(jù)準(zhǔn)備,只有當(dāng)數(shù)據(jù)準(zhǔn)備好了且拷貝到來用戶空間,一切完成后,kernel給應(yīng)用程序發(fā)送一個(gè)signal,告知它read完成了, 沒有任何的阻塞,你直接處理就是

異步IO由于它不會(huì)對用戶進(jìn)程,應(yīng)用程序產(chǎn)生任何的阻塞,所以他對于高并發(fā)網(wǎng)絡(luò)服務(wù)器的實(shí)現(xiàn)至關(guān)緊要.

小結(jié):

  • 任何IO操作都是存在 等待數(shù)據(jù)準(zhǔn)備完成 和 將 數(shù)據(jù)從內(nèi)核態(tài)拷貝到用戶態(tài)兩個(gè)過程的
  • 兩個(gè)過程中等待數(shù)據(jù)消耗的時(shí)間一般遠(yuǎn)超于拷貝數(shù)據(jù)所花費(fèi)的時(shí)間,所以一般我們進(jìn)行IO的優(yōu)化,都是想辦法盡量降低等待時(shí)間
  • 所以信號驅(qū)動(dòng)IO 因?yàn)槭峭ㄖ_始處理數(shù)據(jù),應(yīng)用程序需要將數(shù)據(jù)從內(nèi)核拷貝進(jìn)入到用戶態(tài) (數(shù)據(jù)拷貝阻塞等待) 和異步IO的區(qū)別
  • 異步IO 是完全不存在應(yīng)用程序的阻塞等待,平時(shí)應(yīng)用程序干自己的事情,當(dāng)數(shù)據(jù)完全準(zhǔn)備好了 (數(shù)據(jù) 完成了拷貝 ),直接通知應(yīng)用程序回調(diào)處理數(shù)據(jù)
  • 所以我們之前介紹的 blocking io non-blocking io io multiplexing (IO多路復(fù)用) 本質(zhì)上都是屬于 synchronous IO (同步IO) 都是存在有阻塞的,有人說不對吧: 哪 non-blocking IO 呢? 非阻塞IO僅僅只是在數(shù)據(jù)準(zhǔn)備階段上來說是非阻塞的,數(shù)據(jù)沒準(zhǔn)備好立馬返回,可是數(shù)據(jù)拷貝階段還是阻塞住的,所以本質(zhì)還是同步IO. (大大的狡猾,忘記了阻塞除了準(zhǔn)備數(shù)據(jù)的時(shí)候存在,拷貝數(shù)據(jù)也是阻塞住的)
  • 只有異步IO asynchronous 是完全做到了整個(gè)過程非阻塞的 , 當(dāng)進(jìn)程發(fā)起IO操作之后,就直接返回再也不必理睬,直kernel 發(fā)送一個(gè)信號,告訴進(jìn)程說IO完成(涵蓋數(shù)據(jù)拷貝完成), 在這個(gè)過程中,是完全避免了阻塞進(jìn)程了的

UDP + SIGIO信號注冊模擬實(shí)現(xiàn)一下信號驅(qū)動(dòng)IO

流程:

1、注冊SIGIO的處理函數(shù) (回調(diào)函數(shù))

2、設(shè)置該套接口的屬主,通常使用fcntl的F_SETOWN命令設(shè)置

fcntl(fd, F_SETOWN, getpid());

3、開啟該套接口的信號驅(qū)動(dòng)I/O,通常使用fcntl的F_SETFL命令打開O_ASYNC標(biāo)志完成

實(shí)現(xiàn)代碼 (簡單的信號驅(qū)動(dòng)服務(wù)端)

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

typedef struct sockaddr SA;

#define BUFFSIZE 512
int sockfd = 0; //定義全局的sockfd

//信號處理
void do_sigio(int signo) {
char buff[512] = {0};
struct sockaddr_in cli_addr;
socklen_t clilen = sizeof(cli_addr);
int rlen = recvfrom(sockfd, buff, 512, 0,
(SA*)&cli_addr, &clilen); //獲取cli_addr, 為后面send做準(zhǔn)備

printf("Recvfrom message: %sn", buff);
int slen = sendto(sockfd, buff, rlen, 0, (SA*)&cli_addr, clilen);
}


int main() {
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (-1 == sockfd) {
perror("socket");
return 2;
}
signal(SIGIO, do_sigio);//注冊信號處理函數(shù)

//確定協(xié)議地址簇
struct sockaddr_in serv_addr;
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(8080);
serv_addr.sin_addr.s_addr = INADDR_ANY;

//設(shè)置套接口屬主
fcntl(sockfd, F_SETOWN, getpid());

//然后設(shè)置O_ASYNC 開啟信號驅(qū)動(dòng)IO
int flags = fcntl(sockfd, F_GETFL);
if (-1 == fcntl(sockfd, F_SETFL, flags | O_NONBLOCK | O_ASYNC)) {
return 4;
}

if (-1 == bind(sockfd, (SA*)&serv_addr, sizeof(serv_addr))) {
return 3;
}

while (1) sleep(1);
close(sockfd);

return 0;
}

客戶端代碼:

#include
#include
#include
#include
#include
#include
#include
#include
#include

typedef struct sockaddr SA;
#defien BUFFSIZE 512
int sockfd = 0; //定義全局的listenfd


int main(int argc, char* argv[]) {
if (argc != 3) {
fprintf(stderr, "usage: argv[0]n", argv[0]);
return 1;
}
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (-1 == sockfd) {
perror("socket");
return 2;
}

short port = atoi(argv[2]);
const char* ip = argv[1];

//獲取服務(wù)器協(xié)議地址簇
struct sockaddr_in serv_addr;
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(port);

inet_pton(AF_INET, ip, &serv_addr.sin_addr);
//然后就是循環(huán)發(fā)送數(shù)據(jù)
char buffer[BUFFSIZE];
while (1) {
printf("請說>>: ");
scanf("%s", buffer);
sendto(sockfd, buffer, strlen(buffer), 0
(SA*)&serv_addr, sizeof(serv_addr));
}

return 0;
}

二. 生活的角度理解select poll epoll三種IO多路復(fù)用技術(shù)的工作模式

生活實(shí)例理解select 和 poll 工作原理

先抽象一個(gè)具體的場景出來:

假如說有這樣一家餐廳。 一桌餐對應(yīng)著一個(gè)服務(wù)員 (生活化IO事件),服務(wù)員只是負(fù)責(zé)服務(wù),這個(gè)時(shí)候老板需要安排一個(gè) (跑堂伙計(jì) 管理收集服務(wù)員獲取的服務(wù)信息)

select 便是這個(gè)跑堂伙計(jì)了

由于服務(wù)事件的類型可能不盡相同:所以跑堂伙計(jì) 開始的時(shí)候帶著三個(gè)本子,分別記錄不同的事件類型

圖片

select(ionum, rfds, wfds, efds, timeout);

rfds: 讀事件集合 wfds寫事件集合 efds異常事件集合

ionum = maxfd + 1; fds {0, 1, 2, 3, 4 .....} fdsnum = maxfd + 1;

以上是一個(gè)生活中的一個(gè)小小栗子便于理解 select 工作模式,實(shí)際實(shí)現(xiàn)存在部分偏差

對應(yīng)真實(shí)情景: select 之后是內(nèi)核檢測IO事件的發(fā)生,內(nèi)核輪詢所有的fd,內(nèi)核重新設(shè)置底層的 fd_set :傳入內(nèi)核的時(shí)候 (內(nèi)核如果知曉fd是否需要監(jiān)視???) FD_SET: 然后內(nèi)核會(huì)對于傳入進(jìn)去的fd_set 進(jìn)行重新覆蓋,沒有IO事件發(fā)生的就像FD_CLR一樣 將對應(yīng)集合位圖 位置上標(biāo)記為0 有IO事件發(fā)生的就將對應(yīng)位圖位置標(biāo)記為1 這樣回到用戶態(tài)之后從新進(jìn)行輪詢所有的 fd 就可以根據(jù)內(nèi)核從新標(biāo)記的發(fā)生IO事件的 位 來處理IO (select 內(nèi)核 用戶態(tài)兩次輪詢) 定時(shí)輪詢,效率低下

int poll(struct pollfd *fds, nfds_t nfds, int timeout);

poll的本質(zhì)還是輪詢。只不過破除了位圖的限制,采取結(jié)構(gòu)體存儲(chǔ)IO事件,將三個(gè)本子合成一個(gè)本子了,而且破除了位圖限制之后可以使用鏈?zhǔn)浇Y(jié)構(gòu)連接所有事件的結(jié)構(gòu)體,沒有了最大監(jiān)視IO事件的限制了 (位圖的fd_set的話大小是由內(nèi)核開始確定的,如果修改大小比較麻煩,所以是存在fdnum上的限制的)

poll 雖然理論上是沒有了fdnum的限制了,但是隨著fd的數(shù)量上升到一定程度,性能會(huì)急劇下降

生活理解epoll工作原理

還是先抽象場景出來:

存在這樣一個(gè)小區(qū)的管理,小區(qū)里面很多的用戶都存在寄快遞的需求,每一次需要寄出快遞的時(shí)候大家都統(tǒng)一的放入門衛(wèi)室里面

快遞員每一次來收取快遞的時(shí)候不再需要挨家挨戶的詢問,收取,而是直接去門衛(wèi)室將所有的快遞放進(jìn)自己的車子中帶走處理即可 (門衛(wèi)室相當(dāng)于是readylist,不再需要輪詢所有的IO事件是否發(fā)生,提高了效率)

epoll_wait就是這個(gè)快遞員:

epoll_wait(管理的小區(qū), 快遞員存儲(chǔ)快遞包裹的容器, 容器可以容納的快遞數(shù)目,定時(shí));

epoll_wait(epfd, events, eventscap, timeout);

epoll_create(size); //早期size標(biāo)識最大居民數(shù)目,現(xiàn)在已經(jīng)沒有限制了,只有0和1的區(qū)別了, 因?yàn)榭梢赃M(jìn)行鏈?zhǔn)酱鎯?chǔ),也就沒有容量限制這一說了

epoll_ctl(管理的小區(qū), 小區(qū)居民搬入搬出修改的不同行為,新搬入居民的信息(標(biāo)識), 描述需要寄出快遞的類型信息 );

epoll_ctl(epfd, op, fd, event); //epfd, epoll句柄,底層是紅黑樹 op:作何操作, fd : IO事件句柄, event:IO事件類型 (功能,向IO事件監(jiān)視的紅黑樹上掛載新的監(jiān)視IO事件,或者是刪除監(jiān)視,或者是修改監(jiān)視事件類型)

epoll對比poll select優(yōu)勢出現(xiàn)小結(jié):

將監(jiān)視IO事件進(jìn)行提前注冊,掛載在內(nèi)核的監(jiān)視IO事件紅黑樹上,每一次調(diào)用epoll_wait 獲取IO觸發(fā)事件的時(shí)候不再需要傳入待檢測IO的事件,接口分離,功能分離,而且內(nèi)核中采取了使用就緒隊(duì)列存儲(chǔ)紅黑樹上發(fā)生的IO事件結(jié)點(diǎn)的方式,這樣每一次僅僅需要將就緒隊(duì)列從內(nèi)核中拷貝至用戶空間拿取事件即可。。。

readylist放置觸發(fā)IO事件, 使其不需要輪詢獲知IO觸發(fā)的事件了, 提前注冊掛載監(jiān)視IO事件結(jié)點(diǎn)到紅黑樹上,也使得不需要每一次都從新拷貝監(jiān)視事件進(jìn)入內(nèi)核空間,降低了拷貝消耗, 正是由于epoll的這兩點(diǎn)優(yōu)勢好處使其成為穩(wěn)定高效的多路復(fù)用技術(shù),在高并發(fā)服務(wù)器的設(shè)計(jì)中隨處可見epoll的身影

三. 細(xì)談一下epoll的ET和LT

ET : edge tigger邊沿觸發(fā) LT : level tigger水平觸發(fā)

簡單理解一下兩種觸發(fā)模式:

LT : 指的是 內(nèi)核recv_buffer緩沖區(qū)中存在數(shù)據(jù)就一直會(huì)進(jìn)行觸發(fā),處理數(shù)據(jù), 讀事件一直觸發(fā). 或者是 內(nèi)核send_buffer緩沖區(qū)沒有滿,就一直觸發(fā)寫事件. 直到寫滿send_buffer

ET : 指的是緩沖區(qū)狀態(tài)發(fā)生變化之后引發(fā)觸發(fā),而且核心關(guān)鍵,僅僅只會(huì)觸發(fā)一次 (邊沿觸發(fā))

接收緩沖區(qū)recv_buffer 發(fā)生變化,數(shù)據(jù)從無到有,會(huì)觸發(fā)一次讀事件,核心,不論一次是否可以將數(shù)據(jù)完全處理,都只會(huì)觸發(fā)一次

或者發(fā)送緩沖區(qū)send_buffer狀態(tài)發(fā)生變化,也會(huì)觸發(fā)寫事件 (核心關(guān)鍵還在于觸發(fā)一次)

上述的觸發(fā)都指的是對于 epoll_wait 的觸發(fā).

總結(jié):針對便于理解的讀事件的觸發(fā), recv_buffer來理解, 如果說recv_buffer中有數(shù)據(jù),如果是LT 就會(huì)不斷地不停地觸發(fā), 如果是ET, 不管數(shù)據(jù)能不能處理完,都僅僅只會(huì)觸發(fā)一次

光說不練是假把式,我們還是來一個(gè)實(shí)際地案例來解釋一下:


#include
#include
#include
#include
#include
#include
#include
#include
#include


typedef struct sockaddr SA;

int main(int argc, char* argv[]) {

if (argc != 2) {
fprintf(stderr, "usage: %s ", argv[0]);
return 1;
}

int sockfd = socket(AF_INET, SOCK_STREAM, 0);

if (sockfd < 0) {
perror("socket");
return 2;
}

struct sockaddr_in serv_addr;
//確定協(xié)議地址簇

int port = atoi(argv[1]);
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;

serv_addr.sin_port = htons(port);

if (-1 == bind(sockfd, (SA*)&serv_addr, sizeof(serv_addr))) {
perror("bind");
return 3;
}

if (-1 == listen(sockfd, 5)) {
perror("listen");
return 4;
}

//至此可以開始IO多路復(fù)用監(jiān)視IO了

//創(chuàng)建出來內(nèi)核紅黑樹地根結(jié)點(diǎn)(epoll句柄)
int epfd = epoll_create(1);

struct epoll_event ev, evs[512];

//監(jiān)視新的連接到來IO事件
ev.events = EPOLLIN;
ev.data.fd = sockfd;

//將其掛載到紅黑樹上
epoll_ctl(epfd, EPOLL_CTL_ADD, sockfd, &ev);

while (1) {
//epoll_wait(epfd, 存儲(chǔ)觸發(fā)事件地容器傳出參數(shù), 容器大小size, timeout)
int nready = epoll_wait(epfd, evs, 512, -1);
if (nready < -1) {
break; //出錯(cuò)
}
int i = 0;
for (i = 0; i < nready; ++i) {
//處理各種IO事件, 存在各種封裝形式
if (evs[i].events & EPOLLIN) {
if (evs[i].data.fd == sockfd) {
//新的連接到來
struct sockaddr_in cli_addr;
socklen_t clilen;
int clifd = accept(sockfd, (SA*)&cli_addr, &clilen);
if (clifd < 0) return 5;//出錯(cuò)了嘛
char str[INET_ADDRSTRLEN] = {0};
//獲取一下信息
printf("recv from %s at %d connectionn", inet_ntop(AF_INET, &cli_addr.sin_addr, str, sizeof(str))
, ntohs(cli_addr.sin_port));

//從新設(shè)置一下ev, 將新的監(jiān)視IO事件掛載到紅黑樹上
ev.events = EPOLLIN | EPOLLET;//關(guān)鍵哈, EPOLLET使用地是邊沿觸發(fā)
ev.data.fd = clifd;
epoll_ctl(epfd, EPOLL_CTL_ADD, clifd , &ev);
continue;
}
//處理真正地讀事件, 將緩沖區(qū)給小一點(diǎn),等下才好看見效果
char buff[5] = {0};
int ret = recv(evs[i].data.fd, buff, 5, 0);
if (ret < 0) {
if (errno == EAGAIN || errno == EWOULDBLOCK)
continue;
else {
//出錯(cuò)了
}
//出錯(cuò)了將其從內(nèi)核紅黑樹上移除,避免僵尸結(jié)點(diǎn)
ev.events = EPOLLIN;
ev.data.fd = evs[i].data.fd;
epoll_ctl(epfd, EPOLL_CTL_DEL, evs[i].data.fd, &ev);
close(evs[i].data.fd);
} else if (ret == 0) {
printf("%d disconnectionn", evs[i].data.fd);
//斷開連接,從內(nèi)核紅黑樹中移除監(jiān)視
ev.events = EPOLLIN;
ev.data.fd = evs[i].data.fd;
epoll_ctl(epfd, EPOLL_CTL_DEL, evs[i].data.fd, &ev);
close(evs[i].data.fd); //對端斷開連接

} else {

printf("recv %s, %d Bytesn", buff, ret);
//修改事件類型為寫事件
}

}
if (evs[i].events & EPOLLOUT) {
//此處暫時(shí)不寫,僅僅只是測試一下讀即可
}
}
}
return 0;
}

圖片

如上是使用ET地時(shí)候點(diǎn)一下地結(jié)果,沒有設(shè)置非阻塞哈,結(jié)果是啥,我發(fā)送了這么一段話,它僅僅只是觸發(fā)了一次,打印了一個(gè)Hello, why ? 我故意將緩沖區(qū)設(shè)置如此小,緩沖區(qū)狀態(tài)改變,但是最多緩沖區(qū)僅僅存儲(chǔ)5個(gè)數(shù)據(jù),全發(fā)送了,后面再次循環(huán)過來,不觸發(fā)了我去

如果需要一直觸發(fā)直到recv_buffer內(nèi)核緩沖區(qū)中沒有數(shù)據(jù),咋辦。使用LT水平觸發(fā),如何設(shè)置,easy默認(rèn)就是呀

圖片

我僅僅只是做了如此一個(gè)小小改動(dòng),默認(rèn)LT觸發(fā),讓我們康康效果

圖片

點(diǎn)了一次發(fā)送,他就一直觸發(fā),直到recv_buffer中沒了數(shù)據(jù)

四. 總結(jié)本文

  • 本文主要還是進(jìn)行了IO地理解實(shí)戰(zhàn), 信號驅(qū)動(dòng)IO 異步IO究竟區(qū)別在哪里?
  • 異步IO 是完全不存在任何地應(yīng)用程序掛起等待地, 其他哪些IO多多少少要么數(shù)據(jù)準(zhǔn)備階段要么數(shù)據(jù)拷貝階段存在掛起等待阻塞
  • 然后就是IO多路復(fù)用地生活化理解精進(jìn)
  • 最終介紹分析了epoll地ET 和 LT問題,這個(gè)超級重要好吧。大塊數(shù)據(jù)使用 LT一次讀,小塊數(shù)據(jù)使用ET + 循環(huán)讀(設(shè)置非阻塞) 出自大佬地結(jié)論
  • LT: 水平觸發(fā),recv_buffer內(nèi)核緩沖區(qū)中存在數(shù)據(jù),則讀事件一直不停地觸發(fā)
  • ET : 邊沿觸發(fā),recv_buffer中數(shù)據(jù)從無到有,狀態(tài)發(fā)生改變地時(shí)候進(jìn)行觸發(fā),且關(guān)鍵是僅僅只會(huì)觸發(fā)一次,不論你數(shù)據(jù)是不是一次可以讀完,都只是觸發(fā)一次
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • IO
    IO
    +關(guān)注

    關(guān)注

    0

    文章

    510

    瀏覽量

    42471
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7335

    瀏覽量

    94744
  • 服務(wù)器
    +關(guān)注

    關(guān)注

    14

    文章

    10250

    瀏覽量

    91474
  • 應(yīng)用程序
    +關(guān)注

    關(guān)注

    38

    文章

    3344

    瀏覽量

    60243
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    Linux驅(qū)動(dòng)學(xué)習(xí)筆記:異步IO

    前幾篇介紹了幾種IO模型,今天介紹另一種IO模型——異步IO。
    發(fā)表于 06-12 16:24 ?1278次閱讀

    IO與NIO有何區(qū)別

    NON-blocking IO。 那么這套新的IO庫與之前的有何區(qū)別?為什么需要提供這樣一套IO庫呢? IO與NIO Java NIO相比與
    的頭像 發(fā)表于 09-25 11:00 ?1665次閱讀
    <b class='flag-5'>IO</b>與NIO有何<b class='flag-5'>區(qū)別</b>

    三格電子一體式io和分體式io區(qū)別#

    IO
    jf_68793483
    發(fā)布于 :2026年02月27日 14:15:48

    異步IO是什么

    python 異步ioAsync IO is a concurrent programming design that has received dedicated support
    發(fā)表于 09-06 07:26

    《Linux設(shè)備驅(qū)動(dòng)開發(fā)詳解》第9章、Linux設(shè)備驅(qū)動(dòng)中的異步通知與異步IO

    《Linux設(shè)備驅(qū)動(dòng)開發(fā)詳解》第9章、Linux設(shè)備驅(qū)動(dòng)中的異步通知與異步IO
    發(fā)表于 10-27 11:33 ?0次下載
    《Linux設(shè)備<b class='flag-5'>驅(qū)動(dòng)</b>開發(fā)詳解》第9章、Linux設(shè)備<b class='flag-5'>驅(qū)動(dòng)</b>中的<b class='flag-5'>異步</b>通知與<b class='flag-5'>異步</b><b class='flag-5'>IO</b>

    Linux驅(qū)動(dòng)技術(shù)中的異步通知技術(shù)

    異步通知的全稱是"信號驅(qū)動(dòng)異步IO",通過"信號"的方式,期望獲取的資源可用時(shí),
    發(fā)表于 05-12 09:24 ?992次閱讀
    Linux<b class='flag-5'>驅(qū)動(dòng)</b>技術(shù)中的<b class='flag-5'>異步</b>通知技術(shù)

    遠(yuǎn)程IO和分布式IO之間的區(qū)別是什么

    人們經(jīng)常討論遠(yuǎn)程IO和分布式IO區(qū)別。然而,有些人認(rèn)為它們是相同的,術(shù)語可以交換,而另一些人認(rèn)為相反。遠(yuǎn)程I/O和分布式I/O有什么區(qū)別?以下是遠(yuǎn)程
    發(fā)表于 06-01 17:26 ?1.2w次閱讀

    以太網(wǎng)遠(yuǎn)程IO模塊與工控機(jī)IO板卡的區(qū)別

    以太網(wǎng)遠(yuǎn)程IO模塊與工控機(jī)IO板卡的區(qū)別
    發(fā)表于 12-01 14:49 ?3990次閱讀

    一文詳細(xì)了解五種IO模型

    五種IO模型包括:阻塞IO、非阻塞IO、IO多路復(fù)用、信號驅(qū)動(dòng)
    的頭像 發(fā)表于 02-14 14:38 ?6558次閱讀
    一文詳細(xì)了解五種<b class='flag-5'>IO</b>模型

    簡要敘述分布式IO和遠(yuǎn)程IO區(qū)別

    遠(yuǎn)程IO與分布式IO區(qū)別是什么?讓很多人糊涂,到底什么是遠(yuǎn)程IO,什么是分布式IO,網(wǎng)上包括各種聲音,連行內(nèi)有經(jīng)驗(yàn)的老師們也可能把分布式
    的頭像 發(fā)表于 12-29 11:59 ?1.3w次閱讀
    簡要敘述分布式<b class='flag-5'>IO</b>和遠(yuǎn)程<b class='flag-5'>IO</b>的<b class='flag-5'>區(qū)別</b>

    多路IO復(fù)用模型和異步IO模型介紹

    多路 IO 復(fù)用模型 多路 IO 復(fù)用,有時(shí)也稱為事件驅(qū)動(dòng) IO。它的基本原理就是有個(gè)函數(shù)會(huì)不斷地輪詢所負(fù)責(zé)的所有 socket ,當(dāng)某個(gè) socket有數(shù)據(jù)到達(dá)了,就通知用戶進(jìn)程。
    的頭像 發(fā)表于 10-08 17:21 ?1573次閱讀
    多路<b class='flag-5'>IO</b>復(fù)用模型和<b class='flag-5'>異步</b><b class='flag-5'>IO</b>模型介紹

    linux異步io框架iouring應(yīng)用

    Linux內(nèi)核5.1支持了新的異步IO框架iouring,由Block IO大神也即Fio作者Jens Axboe開發(fā),意在提供一套公用的網(wǎng)絡(luò)和磁盤異步
    的頭像 發(fā)表于 11-08 15:39 ?1704次閱讀
    linux<b class='flag-5'>異步</b><b class='flag-5'>io</b>框架iouring應(yīng)用

    異步IO框架iouring介紹

    前言 Linux內(nèi)核5.1支持了新的異步IO框架iouring,由Block IO大神也即Fio作者Jens Axboe開發(fā),意在提供一套公用的網(wǎng)絡(luò)和磁盤異步
    的頭像 發(fā)表于 11-09 09:30 ?5278次閱讀
    <b class='flag-5'>異步</b><b class='flag-5'>IO</b>框架iouring介紹

    PLC與IO卡之間的區(qū)別

    在工業(yè)自動(dòng)化系統(tǒng)中扮演著不同的角色,具有不同的功能和應(yīng)用場景。本文將從定義、功能、結(jié)構(gòu)、應(yīng)用等多個(gè)方面詳細(xì)闡述PLC與IO卡之間的區(qū)別。
    的頭像 發(fā)表于 06-11 14:42 ?4331次閱讀

    遠(yuǎn)程IO與分布式IO區(qū)別

    在工業(yè)自動(dòng)化和控制系統(tǒng)設(shè)計(jì)中,遠(yuǎn)程IO(Input/Output)和分布式IO是兩個(gè)重要的概念。它們各自具有獨(dú)特的特點(diǎn)和優(yōu)勢,適用于不同的應(yīng)用場景。本文將詳細(xì)探討遠(yuǎn)程IO與分布式IO
    的頭像 發(fā)表于 06-15 15:57 ?5171次閱讀