1.5 阻塞与非阻塞I/O
创始人
2024-02-06 16:54:09

文章目录

  • 1、阻塞I/O
  • 2、非阻塞I/O
  • 3、异步I/O
  • 4、同步I/O
  • 5、epoll原理函数
    • 5.1、int epoll_create(int size)
    • 5.2、int epoll_ctl(int epfd,int op,int fd,struct epoll_event* event)
    • 5.3、int epoll_wait(int epfd,struct epoll_event* events,int maxevents,int timeout)
    • 5.4、内核向双向链表增加节点
  • 6、Linux命令

1、阻塞I/O

在这里插入图片描述

阻塞和非阻塞主要是指这个函数,是否会导致我们这个进程进入sleep休眠。
阻塞:这种函数,会导致进程进入休眠,在等待一个动作发生才会继续走下去,这种阻塞不好,效率很低

2、非阻塞I/O

在这里插入图片描述

不会卡住,充分利用CPU时间片,不断的调用accept和recvfrom函数来查看有没有数据到来,通过标记来进行判断,如果数据到来,那么就会卡着,将内核缓存区的数据拷贝到用户缓存区。

3、异步I/O

在这里插入图片描述

调用一个异步I/O函数,要给这个函数指定一个缓存区,还需要一个回调函数,其他事情交给操作系统,调用完一个异步I/O函数会立即返回,操作系统会判断数据是否到来,来了就会将数据拷贝到缓存区中,调用指定回调函数来通知你。

和非阻塞的差别:需要不停的调用I/O函数,如果数据来就会卡在I/O函数这,就会将数据从内核缓存区复制到用户缓存区,异步I/O不需要不停的调用,只需要调用一次,然后可以去执行其他事情,通过内核检查数据是否到来,在整个过程中没有卡顿

4、同步I/O

在这里插入图片描述

1、select先判断数据有没有,没数据卡在那里,有数据返回之后,用recvfrom去读取数据(还是会卡一下,取数据的时候,将内核缓存区拷贝到用户缓存区),更麻烦,需要调用两个函数才能拿到数据,所谓I/O复用,就是我可以同步等待多个socket的数据,任意一个socket上面有数据了我就去recvfrom去读

5、epoll原理函数

在这里插入图片描述

5.1、int epoll_create(int size)

1、int epoll_create(int size);
参数:size 创建的红黑树的监听数据节点(数目最大有多大,从Linux 2.6.8开始,max_size参数将被忽略,但必须大于零。)
返回值:成功 指向新创建的红黑树的根节点fd失败 -1 errno
作用:创建一颗空红黑树和一个双向空链表流程:
1、开辟了一块eventpoll结构类型的内存结构中成员rbr指向,一颗红黑树的根节点结构中成员rdlist指向,双向链表的头指针

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

2、int epoll_ctl(int epfd,int op,int fd,struct epoll_event* event);
参数:epfd: epoll_create 函数的返回值op: 对该监听的红黑树操作EPOLL_CTL_ADD   添加fd到 监听红黑树EPOLL_CTL_MOD   修改fd在监听红黑树上的监听事件EPOLL_CTL_DEL   将一个fd从监听红黑树上摘下(取消监听)fd:待监听的fd文件描述符event:结构体的地址struct epoll_event {uint32_t     events;      // EPOLLIN / EPOLLOUT / EPOLLERRepoll_data_t data;    // fd 对应监听事件的fd// void* ptr// u32// u64};typedef union epoll_data {void        *ptr;int          fd;uint32_t     u32;uint64_t     u64;} epoll_data_t;
返回值:成功 0失败 -1 errno
作用:把一个socket以及这个socket相关的事件添加到epoll对象描述符中,目的通过epoll来监听这个socket,有感兴趣的事件来了通知我们流程:
1、EPOLL_CTL_ADD   添加
生成红黑树的节点,epitem结构体,将socket保存到节点中、作为红黑树的key,添加的事件也保存进去成员:rbn结构体包含三个指针,左、右、父节点的指针成员:rblist结构体包含:指向前一个元素,后元素的指针2、EPOLL_CTL_DEL  删除
a)通过socket到红黑树中进行查找,
b)有就把这个节点删除3、EPOLL_CTL_DEL  修改
a)通过socket到红黑树中进行查找
b)找到红黑树节点修改红黑树事件

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

int epoll_wait(int epfd,struct epoll_event* events,int maxevents,int timeout);
参数:epfd:epoll_create 函数返回值 epfdevents:传出参数【数组】,满足监听条件的maxevents:数组 元素的总个数1024timeout:毫秒-1 阻塞0 不阻塞>0  超时事件(毫秒)
返回值:>0 满足监听的总个数,可以用作循环上限0 没有fd满足条件-1 errno
作用:阻塞一小段时间,等待事件发生,返回事件集合,也就是获取内核的事件通知(遍历双向链表,把双向链表数据拷贝出去,拷贝完毕,移除)

5.4、内核向双向链表增加节点

总结:红黑树的节点是通过EPOLL_CTL_ADD添加进去的。
一般用四种情况,操作系统会把节点添加到红黑树上:
1、客户端完成三次握手,服务端要accept()
2、客户端关闭连接时候,服务器调用close()
3、到客户端发送数据,服务器调用read()
4、当可以发送数据时,服务器调用write()

6、Linux命令

# 查看有哪些进程监听80端口
lsof -i:80 

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...