教育网站建设的策划方案,常见的c2c平台有,网站的数据库怎么做,阿里云搭载wordpress预备知识
文件描述符file descriptor
文件描述符是Linux系统中对文件、套接字等I/O资源的抽象#xff0c;每个打开的文件或套接字都有一个唯一的文件描述符。应用程序可以使用文件描述符来读写文件或进行网络通信。
epoll允许程序监控多个文件描述符#xff0c;以便在这些…预备知识
文件描述符file descriptor
文件描述符是Linux系统中对文件、套接字等I/O资源的抽象每个打开的文件或套接字都有一个唯一的文件描述符。应用程序可以使用文件描述符来读写文件或进行网络通信。
epoll允许程序监控多个文件描述符以便在这些描述符中的任何一个上发生I/O事件时进行处理。在epoll中文件描述符通常被标记为“可读”、“可写”或“就绪”状态
就绪可读 并且 可写。这种状态通常在使用epoll的边缘触发模式时使用它只会通知程序发生了状态改变的文件描述符而不是所有可读或可写的文件描述符。
套接字socket
定义套接字通常指的是网络套接字它包括一个IP地址和一个端口号用于标识网络上的一台计算机上的一个进程。可以用于在不同进程之间传输数据无论这些进程在同一台计算机上还是在不同的计算机上
方法在套接字通信中一个进程可以创建一个套接字并将其绑定到一个IP地址和端口号上。然后它可以通过这个套接字向另一个套接字发送数据或者从另一个套接字接收数据。
例Web浏览器使用套接字向Web服务器请求网页邮件客户端使用套接字向邮件服务器发送和接收电子邮件。
分类阻塞与非阻塞socket
阻塞 当试图对该文件描述符进行读写时如果当时没有数据可读或者暂时不可写程序就进入等待状态直到有东西可读或者可写为止。非阻塞 如果没有数据可读或者不可写读写函数马上返回而不会等待。
epoll机制
(21条消息) 多路复用机制_坠金的博客-CSDN博客 epoll
epoll工作模式
边缘触发只会通知程序发生了状态改变的文件描述符水平触发会一直通知程序文件描述符可读或可写直到程序明确地告诉内核它不再关注该文件描述符。
区别
前者会在文件描述符就绪状态下一直通知应用程序进行I/O操作后者仅在从未就绪状态转换为就绪状态时通知应用程序进行I/O操作。
应用
需要注意的是使用 level triggered 模式可能会增加应用程序的负载因为内核需要不断地向应用程序发送通知而使用 edge triggered 模式可以更高效地利用 CPU 资源。因此在一般情况下推荐使用 edge triggered 模式因为它能更高效地处理事件。
然而在以下几种情况下使用 level triggered 可能更为合适
数据库或磁盘操作较慢的情况下使用 edge triggered 模式可能会出现事件丢失的情况而 level triggered 模式可以持续不断地通知应用程序。在应用程序中使用了多个线程或进程并且每个线程或进程都需要处理同一个文件描述符的情况下使用 level triggered 模式会更方便管理。在使用 epoll 时如果你不确定应该使用哪种模式可以先使用 level triggered 模式进行测试以确保应用程序正确处理了所有的事件。epoll实例
epoll实例可以看作是一个事件集合它包含多个事件。每个事件描述了一个文件描述符上的一种特定事件类型例如可读、可写、出错等等以及当该事件发生时应该采取的操作。应用程序可以使用epoll实例来等待这些事件的发生并且在它们发生时进行处理。
epoll句柄
当应用程序使用epoll时它需要创建一个epoll句柄epoll file descriptor这个句柄类似于一个文件描述符用于标识和操作epoll实例。
epoll事件注册函数
epoll提供了三个事件注册函数epoll_create()、epoll_ctl()和epoll_wait()。
epoll_create()
创建一个epoll实例返回一个文件描述符。
int epoll_create(int size)
其中size参数指定epoll实例支持的文件描述符数量
epoll_ctl()
将一个文件描述符添加到epoll实例的事件集合中或者从事件集合中删除一个文件描述符。
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event)
epfd参数是epoll实例的文件描述符op参数指定操作类型添加或删除fd参数是要添加或删除的文件描述符event参数描述要注册的事件类型和相关操作
epoll_wait()
等待文件描述符上的事件发生返回所有发生事件的文件描述符。
int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout)
与其他I/O多路复用技术相比epoll机制具有更高的效率和更好的扩展性。因为epoll_wait()函数仅会返回就绪的文件描述符而不会返回所有的文件描述符从而减少了内核态和用户态之间的数据复制。而且epoll机制允许应用程序一次性监视大量的文件描述符因此可以有效地支持高并发的网络应用。
服务端使用epoll步骤
调用epoll_create函数在Linux内核中创建一个事件表然后将文件描述符监听套接字listener添加到所创建的事件表中在主循环中调用epoll_wait等待返回就绪的文件描述符集合分别处理就绪的事件集合本项目中一共有两类事件新用户连接事件和用户发来消息事件epoll还有很多其他事件本项目为简洁明了不介绍。