在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

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

Linux內(nèi)核IO多路復(fù)用之epoll簡(jiǎn)介

冬至配餃子 ? 來(lái)源:嵌入式軟件開發(fā)交流 ? 作者:young ? 2022-08-08 17:53 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

epoll簡(jiǎn)介

epoll是Linux內(nèi)核為處理大量句柄而改進(jìn)的poll,它能顯著的減少程序在大量并發(fā)連接中只有少量活躍的情況下的系統(tǒng)CPU利用率。

epoll的工作方式

LT(level triggered):水平觸發(fā),缺省方式,在這種方式中,內(nèi)核告訴我們一個(gè)文件描述符是否就緒了,如果就緒了,就可以對(duì)描述符進(jìn)行IO操作。如果不做任何操作,內(nèi)核還是會(huì)繼續(xù)通知。

ET(edge-triggered):邊沿觸發(fā),在這種方式下,當(dāng)描述符從未就緒變?yōu)榫途w狀態(tài)時(shí),內(nèi)核通知應(yīng)用。但是如果一直不對(duì)這個(gè)描述符做IO操作,內(nèi)核不會(huì)再發(fā)送通知。

區(qū)別: 邊沿觸發(fā)僅觸發(fā)一次,水平觸發(fā)會(huì)一直觸發(fā)。

epoll相關(guān)函數(shù)

epoll主要有epoll_create, epoll_ctl, epoll_wait 3個(gè)系統(tǒng)調(diào)用。

epoll_create

int epoll_create(int size)

創(chuàng)建一個(gè)epoll的句柄。自從linux2.6.8之后,size參數(shù)是被忽略的。

epoll_ctl

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

epoll的事件注冊(cè)函數(shù),在這里先注冊(cè)要監(jiān)聽的事件類型。

epfd: epoll句柄

op: 表示動(dòng)作,有如下三個(gè)動(dòng)作:

EPOLL_CTL_ADD:注冊(cè)新的fd到epfd中;
EPOLL_CTL_MOD:修改已經(jīng)注冊(cè)的fd的監(jiān)聽事件;
EPOLL_CTL_DEL:從epfd中刪除一個(gè)fd;
fd: 要監(jiān)聽的描述符。

event: 要監(jiān)聽的事件,struct epoll_event結(jié)構(gòu)如下:

struct epoll_event {
__uint32_t events; /* 監(jiān)聽的事件 */
epoll_data_t data; /* 用戶數(shù)據(jù)*/
};
typedef union epoll_data {
void *ptr;
int fd;
__uint32_t u32;
__uint64_t u64;
} epoll_data_t;

events可設(shè)置的值如下:

EPOLLIN :表示對(duì)應(yīng)的文件描述符可以讀;
EPOLLOUT:表示對(duì)應(yīng)的文件描述符可以寫;
EPOLLERR:表示對(duì)應(yīng)的文件描述符發(fā)生錯(cuò)誤;
EPOLLHUP:表示對(duì)應(yīng)的文件描述符被掛斷;
EPOLLET:將EPOLL設(shè)為邊緣觸發(fā)(Edge Triggered)模式
EPOLLONESHOT:只監(jiān)聽一次事件,當(dāng)監(jiān)聽結(jié)束之后,要繼續(xù)監(jiān)聽的話,需要再次加入到EPOLL隊(duì)列里

epoll_wait

int epoll_wait(int epfd, structepoll_event * events, int maxevents, int timeout)
等待事件的到來(lái)。

events: 分配好的epoll_event結(jié)構(gòu)體數(shù)組,epoll將會(huì)把發(fā)生的事件賦值到events數(shù)組中。

maxevents: events的大小。

timeout: 超時(shí)時(shí)間(毫秒,0會(huì)立即返回,-1將是永久阻塞)。

如果函數(shù)調(diào)用成功,返回對(duì)應(yīng)I/O上已準(zhǔn)備好的文件描述符數(shù)目,如返回0表示已超時(shí)。

使用例子


/* net_epoll.c */
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

#define PORT 4321
#define MAX_QUE_CONN_NM 5
#define EPOLL_SIZE 10 //epoll監(jiān)聽的客戶端的最大數(shù)目,Linux2.6.8之后該參數(shù)可以忽略
#define BUFFER_SIZE 1024

int main()
{
struct sockaddr_in server_sockaddr, client_sockaddr;
int sin_size, count;
int epfd;
struct epoll_event ev, events[EPOLL_SIZE];
int event_cnt;
int sockfd, client_fd;
char buf[BUFFER_SIZE];
//創(chuàng)建socket
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("socket");
exit(1);
}
//設(shè)置IP,端口號(hào)
server_sockaddr.sin_family = AF_INET;
server_sockaddr.sin_port = htons(PORT);
server_sockaddr.sin_addr.s_addr = INADDR_ANY; //任意地址,也就是表示本機(jī)的所有IP
bzero(&(server_sockaddr.sin_zero), 8);
int i = 1;/* 允許重復(fù)使用本地地址與套接字進(jìn)行綁定 */
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &i, sizeof(i));
//綁定
if (bind(sockfd, (struct sockaddr *)&server_sockaddr,
sizeof(struct sockaddr)) == -1)
{
perror("bind");
exit(1);
}
//開始監(jiān)聽
if(listen(sockfd, MAX_QUE_CONN_NM) == -1)
{
perror("listen");
exit(1);
}

printf("listening....\n");

//創(chuàng)建一個(gè)epoll描述符,并將監(jiān)聽socket加入epoll
if((epfd = epoll_create(EPOLL_SIZE)) == -1)
{
perror("epoll_create");
exit(1);
}
else
{
ev.events = EPOLLIN | EPOLLOUT | EPOLLET; //讀寫事件,邊沿觸發(fā)
ev.data.fd = sockfd;
epoll_ctl(epfd, EPOLL_CTL_ADD, sockfd, &ev);
}

while(1)
{
sin_size = sizeof(struct sockaddr_in);
memset(buf, 0, sizeof(buf));
/*調(diào)用 epoll_wait()等待事件到來(lái)*/
if ((event_cnt = epoll_wait(epfd, events, EPOLL_SIZE, -1)) <= 0)
{
perror("epoll_wait");
}

for (i = 0; i < event_cnt; i++)
{
//判斷來(lái)事件的是否是監(jiān)聽連接的socket
if (events[i].data.fd == sockfd)
{ /* 服務(wù)端接收客戶端的連接請(qǐng)求 */
if ((client_fd = accept(sockfd, (struct sockaddr *)&client_sockaddr, (socklen_t *)&sin_size))== -1)
{
perror("accept");
exit(1);
}
//將新連接的socket放進(jìn)去
ev.data.fd = client_fd;
epoll_ctl(epfd, EPOLL_CTL_ADD, client_fd, &ev);
printf("New connection from %d(socket)\n", client_fd);
}
else /* 處理從客戶端發(fā)來(lái)的消息 */
{
if ((count = recv(events[i].data.fd, buf, BUFFER_SIZE, 0)) > 0)
{
printf("Received a message from %d: %s\n",
events[i].data.fd, buf);
}
else
{
close(events[i].data.fd);
ev.data.fd = events[i].data.fd;
epoll_ctl(epfd, EPOLL_CTL_DEL, events[i].data.fd, &ev);
printf("Client %d(socket) has left\n", events[i].data.fd);
}
}
} /* end of for fd*/
} /* end if while while*/

close(sockfd);
exit(0);
}

總結(jié)

epoll的優(yōu)點(diǎn)是支持大數(shù)目的描述符,IO效率不隨描述符數(shù)目增加而線性下降。所以在高并發(fā)網(wǎng)絡(luò)中應(yīng)用比較多,一般是在服務(wù)端。



審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    11063

    瀏覽量

    216537
  • LINUX內(nèi)核
    +關(guān)注

    關(guān)注

    1

    文章

    317

    瀏覽量

    22306
  • epoll
    +關(guān)注

    關(guān)注

    0

    文章

    28

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    [6.4.1]--多路復(fù)用

    多路復(fù)用數(shù)字邏輯
    李開鴻
    發(fā)布于 :2022年11月13日 01:18:45

    一節(jié)課了解IO多路復(fù)用-2021.8.31-大海老師 - 第1節(jié) #硬聲創(chuàng)作季

    IO多路復(fù)用
    充八萬(wàn)
    發(fā)布于 :2023年09月01日 21:27:46

    一節(jié)課了解IO多路復(fù)用-2021.8.31-大海老師 - 第8節(jié) #硬聲創(chuàng)作季

    IO多路復(fù)用
    充八萬(wàn)
    發(fā)布于 :2023年09月01日 21:33:38

    一節(jié)課了解IO多路復(fù)用-2021.8.31-大海老師 - 第9節(jié) #硬聲創(chuàng)作季

    IO多路復(fù)用
    充八萬(wàn)
    發(fā)布于 :2023年09月01日 21:34:29

    一節(jié)課了解IO多路復(fù)用-2021.8.31-大海老師 - 第13節(jié) #硬聲創(chuàng)作季

    IO多路復(fù)用
    充八萬(wàn)
    發(fā)布于 :2023年09月01日 21:37:50

    多路復(fù)用技術(shù)

    2.3  多路復(fù)用技術(shù)2.3.1  頻分多路復(fù)用2.3.2  時(shí)分多路復(fù)用2.3.3  波分多路復(fù)用2.3.4  碼分
    發(fā)表于 06-27 21:46 ?0次下載

    復(fù)用器的多路復(fù)用

    復(fù)用器的多路復(fù)用  多路復(fù)用
    發(fā)表于 01-07 14:27 ?1271次閱讀

    Linuxepoll IO多路復(fù)用機(jī)制

    epollLinux內(nèi)核中的一種可擴(kuò)展IO事件處理機(jī)制,最早在 Linux 2.5.44內(nèi)核
    發(fā)表于 05-16 16:07 ?769次閱讀
    <b class='flag-5'>Linux</b>中<b class='flag-5'>epoll</b> <b class='flag-5'>IO</b><b class='flag-5'>多路復(fù)用</b>機(jī)制

    深度剖析Linuxepoll機(jī)制

    Linux 系統(tǒng)之中有一個(gè)核心武器:epoll 池,在高并發(fā)的,高吞吐的 IO 系統(tǒng)中常常見到 epoll 的身影。 IO
    的頭像 發(fā)表于 07-29 10:52 ?1560次閱讀

    網(wǎng)絡(luò)IO的弊端以及多路復(fù)用IO的優(yōu)勢(shì)

    為了講多路復(fù)用,當(dāng)然還是要跟風(fēng),采用鞭尸的思路,先講講傳統(tǒng)的網(wǎng)絡(luò) IO 的弊端,用拉踩的方式捧起多路復(fù)用 IO 的優(yōu)勢(shì)。 為了方便理解,以下所有代碼都是偽代碼,知道其表達(dá)的意思即可。
    的頭像 發(fā)表于 08-25 18:01 ?3279次閱讀
    網(wǎng)絡(luò)<b class='flag-5'>IO</b>的弊端以及<b class='flag-5'>多路復(fù)用</b><b class='flag-5'>IO</b>的優(yōu)勢(shì)

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

    完善的異步IO(網(wǎng)絡(luò)IO、磁盤IO)機(jī)制。 在網(wǎng)絡(luò)編程中,我們通常使用epoll IO多路復(fù)用來(lái)
    的頭像 發(fā)表于 11-08 15:39 ?990次閱讀
    <b class='flag-5'>linux</b>異步<b class='flag-5'>io</b>框架iouring應(yīng)用

    epoll來(lái)實(shí)現(xiàn)多路復(fù)用

    本人用epoll來(lái)實(shí)現(xiàn)多路復(fù)用epoll觸發(fā)模式有兩種: ET(邊緣模式) LT(水平模式) LT模式 是標(biāo)準(zhǔn)模式,意味著每次epoll_wait()返回后,事件處理后,如果之后還有
    的頭像 發(fā)表于 11-09 10:15 ?748次閱讀
    用<b class='flag-5'>epoll</b>來(lái)實(shí)現(xiàn)<b class='flag-5'>多路復(fù)用</b>

    IO多路復(fù)用基本概念

    一、IO多路復(fù)用基本概念 select、poll、epoll都是IO多路復(fù)用的機(jī)制。IO
    的頭像 發(fā)表于 11-10 16:34 ?1853次閱讀
    <b class='flag-5'>IO</b><b class='flag-5'>多路復(fù)用</b>基本概念

    什么是io多路復(fù)用IO多路復(fù)用的優(yōu)缺點(diǎn)

    IO多路復(fù)用是一種同步IO模型,它允許單個(gè)進(jìn)程/線程同時(shí)處理多個(gè)IO請(qǐng)求。具體來(lái)說(shuō),一個(gè)進(jìn)程/線程可以監(jiān)視多個(gè)文件句柄,一旦某個(gè)文件句柄就緒,就能夠通知應(yīng)用程序進(jìn)行相應(yīng)的讀寫操作。在沒(méi)
    的頭像 發(fā)表于 01-18 15:48 ?2105次閱讀

    Linux--IO多路復(fù)用(select,poll,epoll)

    :等待數(shù)據(jù)到達(dá):程序等待數(shù)據(jù)從IO設(shè)備傳輸?shù)?b class='flag-5'>內(nèi)核空間。在這個(gè)階段,IO多路復(fù)用的系統(tǒng)調(diào)用會(huì)阻塞,直到至少有一個(gè)描述符準(zhǔn)備好進(jìn)行IO操作。數(shù)據(jù)
    的頭像 發(fā)表于 11-06 16:13 ?966次閱讀
    主站蜘蛛池模板: 欧美3p精品三区 | 日韩精品无码一区二区三区 | 97国内精品久久久久久久影视 | 婷婷春色 | 日日摸夜夜爽夜夜爽出水 | 色天使在线观看 | 亚洲伊人精品综合在合线 | 1024你懂的国产欧美日韩在 | 日本美女黄网站 | 免费手机黄色网址 | 免费观看做网站爱 | 国产一级特黄高清免费大片 | a级黄色毛片三个搞一 | 国产成人啪午夜精品网站 | 涩多多在线观看 | 日韩一级一片 | 亚洲88av| 久久98精品久久久久久婷婷 | 欧美黄色免费网址 | 欧美特黄一级视频 | 成人特黄午夜性a一级毛片 成人网18免费下 | 综合色久七七综合七七蜜芽 | 四虎影永久地址www 四虎影永久在线观看精品 四虎影永久在线观看网址 四虎影院.com | 色播丁香 | 色依依视频视频在线观看 | 亚洲综合狠狠 | 色综合欧美综合天天综合 | 一级aa 毛片高清免费看 | 午夜爱爱毛片xxxx视频免费看 | 欧美一级色视频 | 天天夜夜爽| 最近2018中文字幕免费看在线 | 国产精品你懂的在线播放 | 国产精品嫩草影院一二三区入口 | 米奇777色狠狠8888影视 | 九九久久久久午夜精选 | 欧美草比 | 国产精品免费一级在线观看 | 俺来也俺去啦久久综合网 | 免费你懂的 | 男人午夜影院 |