day1 io模型
i/o即数据的读取或写入发送
通常用户进程中的一个完整io分两个阶段
用户进程空间->内核空间
内核空间->设备空间(网卡,c磁盘)
io分为内存io,网络io,磁盘io三种
同步异步
对一个线程请求调用来讲,同步和一部的区别是否要等这个请求出最终结果
对于多个线程来讲,同步异步就是线程间的步调是否一致,是否需要协商
同步也经常在一个线程内先后两个函数的调用上
一部就是请求返回的时候一定不知道结果,还得通过其他的机制来获知结果例如主动轮询或被动通知。
阻塞与非阻塞
阻塞与非阻塞与等到消息时的状态有关
阻塞和同步是完全不同的概念,同步是对于消息的通知机制而言,阻塞是针对状态
进程五个状态 新建,运行,就绪,运行,阻塞及死亡
线程在什么状态下会进入阻塞状态
sleep函数
io上的被阻塞操作
线程试图得到一个所,但是该锁正被其他线程持有,进入阻塞状态
线程在等待某个触发条件
阻塞套接字的linux sockets api调用分为以下四种
输入
输出
接收连接 accept
外出链接 connect
五种io模型
阻塞io
非阻塞io
多路复用io
信号驱动式io
异步io
阻塞io
非阻塞io模型
多路复用io模型
select和之前的read,等不一样 select同时监听多个文件描述符 这里数据包没准备好,是所有的文件描述符都没有数据
信号驱动式io模型
异步io模型
总结
day2 io多路复用select函数
64个比特位 文件描述符的集合
select函数用于监视文件描述符的那个集合,当有数据产生,系统会传回一个返回值 系统在进行recvfrom去读取文件
day 3 poll函数
day4 epoll函数族
Linux中高级IO多路转接中select、poll和epoll的优缺点,这里主要谈select和poll的缺点以及epoll的优点。
一、select的缺点:
1、编写难度大
2、同时处理的文件描述符是有上限的
3、每次需要重新设定fd集合
4、性能会随用户的增多而效率降低
5、输入输出参数在一起
二、poll的缺点
poll是对select的一种改良,最突出的改良有两点:
1、文件描述符数量没有上限
2、将输入输出参数进行分离,不用每次设定
那么poll的缺点是:
poll中监听的文件描述符数目增多时:
1、和select一样,poll返回后,需要轮询pollfd来获取就绪的描述符
2、每次调用poll都需要大把大量客户端在一时刻可能只有很少的处于就绪状态,因此随着监视的描述符数量的增长,其效率也会线性下降。
三、epoll的优点:
1、文件描述符数目没有上限:通过epoll_ctl()来注册一个文件描述符,内核中使用红黑树的数据结构来管理所有需要监控的文件描述符。
2、基于事件就绪通知方式:一旦被监听的某个文件描述符就绪,内核会采用类似于callback的回调机制,迅速激活这个文件描述符,这样随着文件描述符数量的增加,也不会影响判定就绪的性能。
3、维护就绪队列:当文件描述符就绪,就会被放到内核中的一个就绪队列中,这样调用epoll_weit获取就绪文件描述符的时候,只要取队列中的元素即可,操作的时间复杂度恒为O(1)。
4、关于有些地方说:epoll还有内存映射机制,即内核将就绪队列通过mmap的方式映射到用户态,避免了拷贝内存这样的额外性能开销。关于这一点,我并不认为这是epoll的优点,因为他和epoll底层工作方式相悖。mmap是一种共享内存,但是我们都知道共享内存中一旦有数据,用户就能直接看到,并且使用,但是epoll_wait在取数据时传入了一块缓存区这是和贡献内存相悖的其一;其二是操作系统并不相信任何人,尤其是用户,它不会让用户直接去取内核中的数据。
————————————————
版权声明:本文为CSDN博主「jgm20475」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/jgm20475/article/details/81083529
day5 套接字的属性
day6 广播与组播
day7 域名解析