深入理解异步I/O+epoll+协程,附上epoll原理解析以及协程现实与原理剖析视频

前言

同步和异步的概念描述的是用户线程与内核的交互方式:同步是指用户线程发起IO请求后需要等待或者轮询内核IO操作完成后才能继续执行;而异步是指用户线程发起IO请求后仍继续执行,当内核IO操作完成后会通知用户线程,或者调用用户线程注册的回调函数。
阻塞和非阻塞的概念描述的是用户线程调用内核IO操作的方式:阻塞是指IO操作需要彻底完成后才返回到用户空间;而非阻塞是指IO操作被调用后立即返回给用户一个状态值,无需等到IO操作彻底完成。

异步I/O

在理解异步I/O之前,我们先要知道什么是同步I/O
阻塞同步I/O模型下,用户线程向内核发起 recvfrom 系统调用,当数据没有准备好的时候,用户线程阻塞。
此外还有一种非阻塞同步I/O,此时用户线程不阻塞于 recvfrom,而是反复向系统查询数据状态。当数据准备好了,就对数据进行后续处理。

深入理解异步I/O+epoll+协程

Paste_Image.png

而在异步I/O模式下,用户线程在数据还没有准备好的时候既不阻塞也不反复查询,而是继续干自己该干的事情。内核会开启一个内核线程去读取数据,等到数据准备好了,内核给用户线程一个信号,用户线程中断去执行信号处理函数。

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我可以为您提供一个使用异步I/O的demo的思路: 1. 定义一个需要进行异步I/O操作的文件描述符fd,并定义一个缓冲区buf用于存储读取到的数据。 2. 创建一个epoll实例epfd,并将fd添加到epfd中进行事件监听。 3. 创建一个线程,用于进行异步I/O操作。该线程中使用epoll_wait函数阻塞等待事件发生,并在事件发生时调用read函数进行异步读取。读取完成后将读取到的数据存储到buf中,并使用信号量或者条件变量通知主线程数据已经读取完成。 4. 主线程可以在需要的时候使用信号量或条件变量等待异步读取操作完成,并使用读取到的数据进行后续操作。 下面是一个简单的demo代码,其中使用了信号量来进行线程同步和通信: ```c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/epoll.h> #include <pthread.h> #include <semaphore.h> #define MAX_EVENTS 5 int fd; char buf[1024]; sem_t sem; void* read_thread(void* arg) { int epfd = epoll_create(1); struct epoll_event ev, events[MAX_EVENTS]; ev.events = EPOLLIN | EPOLLET; ev.data.fd = fd; epoll_ctl(epfd, EPOLL_CTL_ADD, fd, &ev); while (1) { int nfds = epoll_wait(epfd, events, MAX_EVENTS, -1); for (int i = 0; i < nfds; ++i) { if (events[i].events & EPOLLIN) { int n = read(fd, buf, sizeof(buf)); if (n < 0) { perror("read"); exit(EXIT_FAILURE); } sem_post(&sem); } } } } int main() { fd = open("test.txt", O_RDONLY); if (fd < 0) { perror("open"); exit(EXIT_FAILURE); } pthread_t tid; sem_init(&sem, 0, 0); if (pthread_create(&tid, NULL, read_thread, NULL) != 0) { perror("pthread_create"); exit(EXIT_FAILURE); } // 等待异步读取完成 sem_wait(&sem); printf("%s", buf); sem_destroy(&sem); close(fd); return 0; } ``` 在这个demo中,我们使用了一个线程来进行异步I/O操作,当读取完成后通过信号量通知主线程,主线程在等待异步读取完成时会被阻塞,等待读取完成后输出读取到的数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值