当前位置: 首页 > news >正文

速贝cms建站系统alexa排名什么意思

速贝cms建站系统,alexa排名什么意思,网店推广方案,wordpress防止f12文章目录 1. pollpoll函数参数解析代码解析PollServer代码 poll 特点 2. epoll认识接口epoll_createepoll_ctlepoll_wait 基本原理红黑树就绪队列 1. poll poll函数参数解析 输入 man poll poll的第一个参数是文件描述符 poll的第二个参数为 等待的多个文件描述符(fd)数字层面… 文章目录 1. pollpoll函数参数解析代码解析PollServer代码 poll 特点 2. epoll认识接口epoll_createepoll_ctlepoll_wait 基本原理红黑树就绪队列 1. poll poll函数参数解析 输入 man poll poll的第一个参数是文件描述符 poll的第二个参数为 等待的多个文件描述符(fd)数字层面 最大的1 poll函数中的最后一个参数 timeout 是一个 纯输入型参数单位是毫秒 若 timeout 为-1则表示永久阻塞直到文件描述符就绪 若 timeout为0则表示 非阻塞 若timeout 大于0则表示 在timeout事件以内 以阻塞等待超时则进行非阻塞等待 poll的返回值的含义与select 相同 第一种 大于0表示有几个文件描述符 是就绪的 第二种 等于0进入timeout状态 即 5s以内没有任何一个文件描述符 就绪 第三种 小于0等待失败 返回-1如想要等待下标为1 和2的文件描述符但是下标为2的文件描述符根本不存在就会等待失败 在pollfd 结构体 中 fd 表示 文件描述符 events 用户告诉内核需要关心那些文件描述符上的那些事件 revents 内核会告诉用户关心的那些文件描述符上的那些事件已经就绪 poll将 输入参数 和输出参数进行分离 poll就有对应的事件 常用的有 POLLIN 表示 有数据可以读 POLLOUT 表示 当前写的时候不会被阻塞 POLLIN 表示第一个比特位为1 POLLOUT 表示 第三个比特位为1 代码解析 主要将第一个初始版本的select代码进行修改 由于poll 自带结构体内部包含 fd (文件描述符) events (用户告诉操作系统 那些文件描述符上的事件需要关心) revents (操作系统告诉用户 关心的那些文件描述符上的事件已经就绪) 此时的fdaaray作为结构体指针可以通过该指针 去指向 pollfd结构体成员 当想要使用 数组当前元素表示对应的文件描述符时需指向对应的fd成员 想要表示 (用户告诉操作系统 那些文件描述符上的事件需要关心) 需要通过指针去指向对应的成员 events 想要表示 (操作系统告诉用户 关心的那些文件描述符上的事件已经就绪) 需要通过指针去指向对应的成员 revents PollServer代码 #includeiostream #includestring #includesys/poll.h #includecstring #includeSock.hpp #includeLog.hpp #includeErr.hpp using namespace std;const static int gport8888; const static int N4096;const static short defaultevent0;typedef pollfd type_t;class PollServer {public:PollServer(uint16_t portgport):port_(port),fdarray_(nullptr){}void InitServer()//初始化{listensock_.Socket();//创建套接字listensock_.Bind(port_);//绑定listensock_.Listen();//设置监听状态fdarray_new type_t[N];//对fdarray数组进行初始化for(int i0;iN;i){fdarray_[i].fd defaultfd;fdarray_[i].events defaultevent;fdarray_[i].reventsdefaultevent;}}void Accepter()//获取新连接的动作{//这里再使用accept 就不会阻塞了//listen套接字底层一定有就绪的事件 即连接已经到来了string clientip;uint16_t clientport;int socklistensock_.Accept(clientip,clientport);//获取客户端IP和端口号if(sock0){return;}//当得到对应新连接的sock套接字是不能进行read/recv//并不知道sock上的数据是否就绪的//所以需要将sock交给select,由select进行管理logMessage(Debug,[%s:%d],sock:%d,clientip.c_str(),clientport,sock );//只需把新获取的sock 添加到 数组中int pos1;for(;posN;pos){if(fdarray_[pos].fddefaultfd)//说明没有被占用{break;}}if(posN)//整个数组中的位置全被占用了{//由于fdarray_是动态开辟空间的所以可以动态扩容//若扩容失败则closeclose(sock);logMessage(Warning,sockfd[] array full);}else //找到了对应的位置{fdarray_[pos].fdsock;fdarray_[pos].eventsPOLLIN;fdarray_[pos].reventsdefaultevent;}}void HandlerEvent()//处理就绪事件{ for(int i0;iN;i){int fdfdarray_[i].fd;int revent fdarray_[i].revents;if( (fddefaultfd)(revent POLLIN))//读事件就绪{ continue;}//合法fd//若套接字为listensock套接字并且读事件就绪if(fdlistensock_.Fd() (revent POLLIN)){Accepter();}//若套接字不是listensock套接字并且读事件就绪 即普通的读取数据就绪else if ((fd ! listensock_.Fd()) (revent POLLIN)) {char buffer[1024];ssize_t srecv(fd,buffer,sizeof(buffer)-1,0);//读取不会被阻塞if(s0)//读取成功{buffer[s-1]0;coutclient# bufferendl;//发送回去 也要被select管理string echobuffer ;echo [select server echo ];send(fd,echo.c_str(),echo.size(),0);//发送消息 将echo内的数据 交给fd}else {if(s0)//读到文件结尾{logMessage(Info,client quit...,fdarray_[i] - defaultfd:%d-%d,fd,defaultfd);}else //读取失败 {logMessage(Warning,recv error,client quit...,fdarray_[i] - defaultfd:%d-%d,fd,defaultfd);} close(fd);fdarray_[i].fddefaultfd;fdarray_[i].eventsdefaultevent;fdarray_[i].reventsdefaultevent;} } } }void DebugPrint(){coutfdarray_[]:endl;for(int i0;iN;i){if(fdarray_[i].fddefaultfd){continue;}coutfdarray_[i].fd ;}cout\n;}void Start() //启动{//在网络中新连接到来被当作 读事件就绪//对应不同的事件就绪做出不同的动作fdarray_[0].fdlistensock_.Fd();fdarray_[0].eventsPOLLIN;//数据可读while(true) {int timeout -1;//永久阻塞 int n poll(fdarray_,N,timeout);//timeout 设为nullptr后全部为阻塞等待switch(n){case 0: //表示没有任何一个文件描述符就绪 logMessage(Debug,timeout,%d: %s,errno,strerror(errno));break;case -1: //等待失败 返回-1logMessage(Warning,%d: %s,errno,strerror(errno));break;default: //大于0 则表示成功 返回有多少文件描述符就绪logMessage(Debug,有一个就绪事件发生了:%d,n);HandlerEvent();//处理就绪事件DebugPrint();//打印数组内容break;}}}~PollServer(){listensock_.Close();if(fdarray_){delete[]fdarray_;}}private:uint16_t port_;//端口号Sock listensock_;//创建Sock对象type_t* fdarray_;//自己定义一个数组,与位图大小相同来进行已经获得的sock进行管理 }; poll 特点 poll 就相当于在 select 的基础上进行优化 poll自带结构体只需将读写 异常 放入 events 事件即可 poll 跟 select 一样 也是以数组的形式 传递多个文件描述符传进去后需要操作系统继续遍历 每次调用poll都需要把fd集合从用户态拷贝到内核态在fd很多时开销会很大 (每次都需要用户需要告诉内核那些文件描述符的那些事件需要关心)每次调用poll都需要在内核遍历传递过来的所有fd在fd很多时 开销会很大 (每次都需要内核需要告诉用户关心的文件文件描述符上的那些事件就绪) poll 解决了文件描述符 有上限的问题 (定义的数组是在堆上开辟的若空间满了还可以动态扩容) select由于定义的是一个固定长度的数组大小当到达整个数组长度时就只能打印信息 2. epoll epoll 是为处理大批句柄而作改进的poll 认识接口 epoll_create 输入 man epoll_create 参数size可以被忽略但是必须大于0 返回值 若返回epoll文件描述符则表示返回成功 若返回-1则表示返回失败 epoll_create 作用创建出epoll模型 epoll_ctl 输入 man epoll_ctl 第一个参数 epfd 为 epoll_create 的返回值 第二个参数 op 表示你想作什么样的操作 一般常见设置为三个值 EPOLL_CTL_ADD 添加 EPOLL_CTL_MOD 修改 EPOLL_CTL_DEL 删除 第三个参数 fd 表示 哪一个文件描述符 最后一个参数 event 表示关心什么事件 events 表示 输入 fd表示 输入时 表示那些文件描述符上的什么样事件要关心 epoll_ctl 作用 用户告诉内核帮我关心 增加/修改/删除那个文件描述符上的那一个事件 epoll_wait 输入 man epoll_wait 返回值含义 与select和poll相同 第一种 大于0表示有几个文件描述符 是就绪的 第二种 等于0进入timeout状态 即 5s以内没有任何一个文件描述符 就绪 第三种 小于0等待失败 返回-1如想要等待下标为1 和2的文件描述符但是下标为2的文件描述符根本不存在就会等待失败 第一个参数 epfd v 为 epoll_create的返回值 最后一个参数 timeout 与poll中含义相同 第二个参数 events 为 返回的就绪事件 第三个参数 maxevents为 epoll模型的最大个数 epoll_wait作用内核告诉 用户 那些文件描述符上的那些事件就绪 与poll的宏基本一致 主要使用 EPOLLIN 和 EPOLLOUT EPOLLIN 表示 有数据可以读 EPOLLOUT 表示 当前写的时候不会被阻塞 基本原理 红黑树 创建epoll时在底层就会创建一颗红黑树 使用红黑树 使用户告诉操作系统 来关心 增加/修改/删除那个文件描述符上的那一个事件 点击查看红黑树概念 红黑树的节点假设为 sruct rb_node 内部包含 文件描述符fd 和 对应事件 event eopll_ctl 本质 为 通过epoll模型来对红黑树操作 向红黑树中新增 删除 修改 某一个节点 而每一个节点 都对应的是文件描述符和对应的事件 即 epoll_ctl 用来对红黑树 进行增删改 操作 在内核中一个结构体对象既可以属于结构A又可以属于结构B 所以struct rb_node 既可以属于红黑树又可以属于其他结构 就绪队列 创建epoll时同时也会创建一个就绪队列 当特定的文件描述符上有对应的事件发生了就可以将对应已经发生事件的节点 链入就绪队列中 (所以struct rb_node 既可以属于红黑树又可以属于就绪队列) 就绪队列中只保存已经准备好的文件描述符上的对应事件 作为就绪队列的节点需要包含文件描述符fd 以及 revent (操作系统告诉用户 关心的文件描述符的那些事件就绪) epoll_wait 以事件复杂度为O(1)的方式检测有没有事件就绪 即检测就绪队列是否为空 数据就绪 形成节点放入就绪队列中 将红黑树中节点关系 也添加到就绪队列中 这样一个结构体对象就可以既属于红黑树 又属于就绪队列了 整体称为 epoll 当调用 epoll_create 时就是创建epoll模型 epoll避免使用 遍历而是通过回调函数的方式将就绪的文件描述符加入 就绪队列中 epoll_wait 返回直接访问 就绪队列 就知道那些文件描述符就绪
http://www.ho-use.cn/article/10821091.html

相关文章:

  • 国外网站视频播放器简述网站开发步骤
  • 网站备案公告wordpress没有图片不显示
  • 网站 公众号 建设方案户网站建设整改报告
  • 自助建站平台便宜网页制作模板html
  • 网站建设和优化内容最重要性广东省建设工程金匠奖公布网站
  • 如何给网站绑定域名城乡现代社区建设
  • 网站设计用什么软件做的wordpress主题模板调用
  • 公司在线网站制作系统中交建设设计院有限公司网站
  • 做网站Linux佛山网站建设过程
  • 舟山网站设计公司分销平台都有哪些
  • wordpress 站内信插件尚海整装公司电话
  • 做企业宣传片的网站电子商务网站建设与管理 教案
  • 二级a做爰片免费视网站wordpress底部信息修改
  • 网站添加悬浮二维码dw自己做网站需要什么区别
  • 建设网站的技术风险新春祝福图片在线制作
  • 肥城网站建设贵州做网站找谁
  • 建设一个做资料库的网站网站建设的基本术语
  • 电商网站大全有哪些做家教网站
  • 制作团体网站企业网站模板建站怎么用
  • 深圳婚纱摄影网站建设wordpress插件外贸
  • 有没有做粤菜的网站dede+营销型网站
  • 东莞清溪镇做网站公司网页设计师考试报名
  • 建设一个网站流程图电脑传奇游戏哪个好玩
  • 巢湖网站开发做商城网站公司吗
  • 机械门户网站建设特点网站建设和运营的课程
  • 佛山+网站建设网站编程语言哪个好
  • 山东省山东省建设厅网站做网站需要知道什么软件
  • 做有关兼职网站的需求分析个人做网站要缴税
  • 东莞如何建网站费用深圳网站建设公司多吗
  • 百度网站评分html代码翻译