流 I\O操作 阻塞
流
那么当一个流中再没有数据,read的时候,或者说 在流中已经写满了数据,再write,我们的IO操作就 会出现一种现象,就是阻塞现象
阻塞

非堵塞

阻塞等待: 空出大脑可以安心睡觉。(不占用CPU宝贵的时间片)
非阻塞,忙轮询: 浪费时间,浪费电话费,占用快递员时间(占用CPU,系统资源)
解决阻塞死等待的办法
办法一:非阻塞、忙轮询


办法二:select

select 代收员 比较懒,她只会告诉你快递到了,但是是谁到的,你需要挨个快递员问一遍
办法三:epoll(主角出场)

epoll特点好处:
epoll API
int epoll_create(int size); int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); struct epoll_event {
__uint32_t events; /* epoll 事件 */ epoll_data_t data; /* 用户传递的数据 */ } / * @param epfd 用epoll_create所创建的epoll句柄 * @param op 表示对epoll监控描述符控制的动作 * * EPOLL_CTL_ADD(注册新的fd到epfd) * EPOLL_CTL_MOD(修改已经注册的fd的监听事件) * EPOLL_CTL_DEL(epfd删除一个fd) * * @param fd 需要监听的文件描述符 * * /* * events : {EPOLLIN, EPOLLOUT, EPOLLPRI, EPOLLHUP, EPOLLET, EPOLLONESHOT} */ typedef union epoll_data {
void *ptr; int fd; uint32_t u32; uint64_t u64; } epoll_data_t; struct epoll_event new_event; new_event.events = EPOLLIN | EPOLLOUT; new_event.data.fd = 5; epoll_ctl(epfd, EPOLL_CTL_ADD, 5, &new_event);
触发模式
水平触发与边缘触发
水平触发


水平触发优点:
边缘触发


select poll epoll的区别参考这个博客
https://blog.csdn.net/_/article/details/
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/208721.html原文链接:https://javaforall.net
