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

口碑好的做pc端网站wordpress站点标题

口碑好的做pc端网站,wordpress站点标题,本地wordpress建站,开源影视cms系统当你偶尔发现语言变得无力时#xff0c; 不妨安静下来#xff0c; 让沉默替你发声。 --- 里则林 --- 从零开始认识多路转接 1 epoll的作用和定位2 epoll 的接口3 epoll工作原理4 实现epollserverV1 1 epoll的作用和定位 之前提过的多路转接方案select和poll 都有致命缺点… 当你偶尔发现语言变得无力时 不妨安静下来 让沉默替你发声。 --- 里则林 --- 从零开始认识多路转接 1 epoll的作用和定位2 epoll 的接口3 epoll工作原理4 实现epollserverV1 1 epoll的作用和定位 之前提过的多路转接方案select和poll 都有致命缺点底层都是暴力的遍历效率不高 对此诞生出了epoll这个更好的方案 按照 man 手册的说法: 是为处理大批量句柄而作了改进的 poll。它是在 2.5.44 内核中被引进的(epoll(4) is a new API introduced in Linux kernel 2.5.44)。它几乎具备了之前所说的一切优点 被公认为 Linux2.6 下性能最好的多路 I/O 就绪通知方法. 2 epoll 的接口 epoll的相关接口有三个 epoll_create EPOLL_CREATE(2) Linux Programmers Manual EPOLL_CREATE(2)NAMEepoll_create, epoll_create1 - open an epoll file descriptorSYNOPSIS#include sys/epoll.hint epoll_create(int size);int epoll_create1(int flags); epoll_create接口只有一个参数其功能是在内核创建一个epoll模型这个模型我们后面详细谈。这个size我们只有设置为一个大于零的数即可。创建成功之后会给我们返回一个文件描述符现在我们还理解不了后续讲解。 epoll_ctl EPOLL_CTL(2) Linux Programmers Manual EPOLL_CTL(2)NAMEepoll_ctl - control interface for an epoll file descriptorSYNOPSIS#include sys/epoll.hint epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);DESCRIPTIONThis system call is used to add, modify, or remove entries in the interest list of the epoll(7) instance referred to by the file descriptor epfd. It requests thatthe operation op be performed for the target file descriptor, fd. epoll_ctl有四个参数 int epfd这个就是通过epoll_create获得的文件描述符int op这个是操作选项我们这个函数共用三种选项:EPOLL_CTL_ADD增加 EPOLL_CTL_MOD 修改EPOLL_CTL_DEL删除。int fd对这个文件描述符进行操作。struct epoll_event * event这时一个结构体类似struct pollfd但内部更加复杂typedef union epoll_data {void *ptr;int fd;uint32_t u32;uint64_t u64;} epoll_data_t;struct epoll_event {uint32_t events; /* Epoll events */epoll_data_t data; /* User data variable */}; 其中的events位图就可以设置读事件写事件…注意这里没有返回事件 epoll_wait EPOLL_WAIT(2) Linux Programmers Manual EPOLL_WAIT(2)NAMEepoll_wait, epoll_pwait - wait for an I/O event on an epoll file descriptorSYNOPSIS#include sys/epoll.hint epoll_wait(int epfd, struct epoll_event *events,int maxevents, int timeout);int epoll_pwait(int epfd, struct epoll_event *events,int maxevents, int timeout,const sigset_t *sigmask);DESCRIPTIONThe epoll_wait() system call waits for events on the epoll(7) instance referred to by the file descriptor epfd. The buffer pointed to by events is used to return in‐formation from the ready list about file descriptors in the interest list that have some events available. Up to maxevents are returned by epoll_wait(). The max‐events argument must be greater than zero. epoll_wait有四个参数 int epfd这个就是通过epoll_create获得的文件描述符。*struct epoll_event events 这是一个数组向内核输入一个缓冲区想让内核提供这个数组将就绪事件返回来** int maxevents**数组的元素个数。int timeout等价于poll接口的timeout以毫秒为单位返回值等价于poll 总而言之epoll将传入与传出分成了两个接口来进行 3 epoll工作原理 对于epoll更深入的理解我们需要从底层进行讲解 数据到达主机时数据首先会到达物理层那么操作系统如何知道网卡里有数据呢通过硬件中断通过针脚中断就可以通知操作系统从而数据链路层从网络层读取数据 当我们使用epoll时系统内部会建立一个红黑树这个红黑树创建时是空树。红黑树的节点字段主要存在文件描述符fd , 事件位图 events 左右指针节点颜色...这个树标识了用户想让OS关心的文件操作符fd以及其对应事件epoll_ctl接口中的op就是对应的增添修改删除红黑树节点注意这个红黑树的键值是fd! 其中还有一个就绪队列这是一个双向链表每个节点与红黑树中的节点类似。当网卡中有数据了网卡通过硬件中断把数据交给网络协议栈。OS可以知道每个文件描述符对应的输入输出缓冲区状态当回红黑树节点对应fd的EPOLLIN事件等就绪那么OS就把这个fd的事件放入就绪队列。这个就绪队列就是储存就绪事件的数据结构当用户调用epoll_wait时就通过就绪队列进行检测哪个fd对应事件就绪了将事件依次严格按照顺序放入struct epoll_event *events数组中 这个检测就绪事件的算法的时间复杂度就是O(1)只需要判断就绪队列是否为空就可以而将就绪事件获取的时间复杂度是O(n)! 这就是epoll模型 而这个epoll模型是可以打开多个的就和打开多个文件一样。当我们打开多个epoll模型时那么操作系统如何管理这些epoll模型呢 在内核中有一个eventpoll这个是描述epoll模型的结构体其中就有rbr红黑树与rdllist就绪队列。那为什么创建epoll模型之后会返回一个文件描述符呢 在内核中有无数个task_struct进程结构体每个进程都有一张文件描述符表struct files_struct这个表的元素就指向文件结构体struct file。文件结构体中就有一个指针指向epoll模型。那么在进程中想要找到epoll模型就可以通过文件描述符表找到epoll模型 我们来谈一个十分巧妙的设计。在epoll模型中存在红黑树和就绪队列。每个节点都有对应的文件描述符。在之前所学的数据结构中我们每个数据结构的节点都是独属于自身的比如二叉树的节点不可能是链表的节点。 但是在epoll模型中一个节点是可以属于多个数据结构的我们来看是如何实现的 首先有这样一个链表节点listnode其中只包含左右指针。然后在task_struct中就可以存在listnode link那么每一个task_struct就可以通过这个link进行连接起来的。但是这个指向的只是下一个task_struct结构体中的link那么怎么才能访问task_struct全部的数据呢可以先计算这个link在task_struct的偏移量通过将0地址强制类型转换得到里面link的地址就知道了偏移量然后通过task_struct中link里的指针减去偏移量我们就得到了task_struct的起始地址再进行类型转换我们就得到了task_struct同样的task_struct还可以存在二叉树节点link2 , 队列节点link3就都可以通过这种方式进行链接并且是一个节点属于了多个数据结构中 这是十分巧妙的设计而epoll模型中的epitem结构体就是这样设计的一个节点既属于红黑树也属于就绪队列 其中epitem还有一个status变量表示其是否被激活。可以判断是否在红黑树或者就绪队列中 下面我们开始编写v1版本的epollserver 4 实现epollserverV1 下面我们来实现epollserver 成员变量需要以下 端口号_port 用于创建listen套接字套接字socket _listensock监听套接字使用TCP进行通信。文件描述符_epfd epoll模型的文件操作符是使用epoll系列接口的必要参数。epoll_event revs[] 数组从epoll模型中获取就绪事件的结构体数组。 根据成员变量进行构造创建套接字创建epoll模型。 初始化函数中建立struct epoll_event ev设置其中的 fd 与events位图先将_listensock套接字fd添加到epoll中 通过epoll_ctl进行ADD操作。 #pragma once#include string #include iostream #include memory #include sys/epoll.h#include Log.hpp #include Socket.hppusing namespace log_ns; using namespace socket_ns;class EpollServer { private:const static int gnum 1024;const static int size 128;public:EpollServer(uint16_t port) : _port(port),_listensock(std::make_uniqueTcpSocket()){// 建立监听套接字_listensock-BuildListenSocket(port);// 建立epoll模型_epollfd ::epoll_create(size);if (_epollfd 0){// 创建失败LOG(FATAL, epoll_create failed!\n);exit(1);}}void InitServer(){// 将监听套接字放入epoll模型struct epoll_event ev;ev.data.fd _listensock-GetSockfd();ev.events EPOLLIN;// 放入int n ::epoll_ctl(_epollfd, EPOLL_CTL_ADD, _listensock-GetSockfd(), ev);// 根据返回值判断if (n 0){// 发生错误LOG(FATAL, epoll_ctl failed ,errno :%d, errno);exit(1);}}void Accepter(){}void HandlerIO(int fd){// 普通fdIO 就绪}void HandlerEvent(int n){}void Loop(){}~EpollServer(){// 关闭epoll模型if (_epollfd 0)close(_epollfd);// 关闭监听套接字_listensock-Close();}private:// 端口号uint16_t _port;// 套接字std::unique_ptrSocket _listensock;// epoll模型描述符int _epollfd;// 文件描述符struct epoll_event revs[gnum]; };Loop 循环函数设置timeout 调用epoll_wait接口进行等待事件就绪 将就绪的事件放入到revs数组中。根据返回值进行判断结果 void Loop(){int timeout 2000;while (true){// 进行等待int n ::epoll_wait(_epollfd, revs, gnum, timeout);// 判断结果switch (n){case 0:LOG(INFO, epoll timeout...\n);break;case -1:LOG(ERROR, epoll error\n);break;default:LOG(INFO, haved event happened! , n :%d\n, n);// 处理事件HandlerEvent(n);break;}}}HandlerEvent处理事件将数组中的n个事件全部处理遍历一遍 根据就绪的文件描述符种类进行区分判断 设计一个简单的接口可以通过事件级返回事件种类读事件就绪 我们进行处理 _listensock套接字事件获取连接 Accepter 将新的fd加入到epoll模型 打印客户端信息普通fd 事件HandlerIO 进行读取recv ;读取失败的话要从epoll删除后再close 处理后Send回去。 std::string PrintEvent(uint32_t revents){std::string ret;if (revents EPOLLIN)ret EPOLLIN;if (revents EPOLLOUT)ret | EPOLLOUT;return ret;}void Accepter(){// 获取_listensock的新fdInetAddr addr;int sockfd _listensock-Accepter(addr);if (sockfd 0){LOG(ERROR, Accepter error\n);exit(1);}// 成功获取连接LOG(INFO, 成功获取连接 ,客户端 %s\n, addr.AddrStr().c_str());// 将连接添加到epoll模型中struct epoll_event ev;ev.data.fd sockfd;ev.events EPOLLIN;int n ::epoll_ctl(_epollfd, EPOLL_CTL_ADD, sockfd, ev);// 根据返回值判断if (n 0){// 发生错误LOG(FATAL, epoll_ctl failed ,errno :%d, errno);exit(1);}}void HandlerIO(int fd){// 普通fdIO 就绪char buffer[4096];int n ::recv(fd, buffer, sizeof(buffer), 0);if (n 0){// 读取到了数据buffer[n] 0;std::string echo_str [client say]#;echo_str buffer;std::cout echo_str std::endl;// 返回一个报文std::string content htmlbodyh1hello bite/h1/body/html;std::string ret_str HTTP/1.0 200 OK\r\n;ret_str Content-Type: text/html\r\n;ret_str Content-Length: std::to_string(content.size()) \r\n\r\n;ret_str content;// echo_str buffer;::send(fd, ret_str.c_str(), ret_str.size(), 0); // 临时方案}else if (n 0){// 此时fd退出了LOG(INFO, fd:%d quit!\n, fd);//先对epoll中的节点进行删除因为epoll中的节点必须是合法fd ,不能进行close::epoll_ctl(_epollfd , EPOLL_CTL_DEL , fd , nullptr);::close(fd);}else{LOG(ERROR, recv error! errno:%d\n, errno);::epoll_ctl(_epollfd , EPOLL_CTL_DEL , fd , nullptr);::close(fd);}}void HandlerEvent(int n){// 处理事件for (int i 0; i n; i){int fd revs[i].data.fd;uint32_t revents revs[i].events;LOG(INFO, fd:%d , %s事件就绪\n, fd, PrintEvent(revents).c_str());// 判断fd类型if (fd _listensock-GetSockfd()){// 进行AccepterAccepter();}// 普通fdelse{HandlerIO(fd);}}}这样我们就成功的完成了epollserver的基础服务来看效果 非常好
文章转载自:
http://www.morning.qfths.cn.gov.cn.qfths.cn
http://www.morning.qggxt.cn.gov.cn.qggxt.cn
http://www.morning.pgzgy.cn.gov.cn.pgzgy.cn
http://www.morning.mtbth.cn.gov.cn.mtbth.cn
http://www.morning.nmngg.cn.gov.cn.nmngg.cn
http://www.morning.pjrql.cn.gov.cn.pjrql.cn
http://www.morning.qrcsb.cn.gov.cn.qrcsb.cn
http://www.morning.hqpyt.cn.gov.cn.hqpyt.cn
http://www.morning.jqpyq.cn.gov.cn.jqpyq.cn
http://www.morning.prplf.cn.gov.cn.prplf.cn
http://www.morning.nj-ruike.cn.gov.cn.nj-ruike.cn
http://www.morning.trplf.cn.gov.cn.trplf.cn
http://www.morning.gcbhh.cn.gov.cn.gcbhh.cn
http://www.morning.xglgm.cn.gov.cn.xglgm.cn
http://www.morning.4r5w91.cn.gov.cn.4r5w91.cn
http://www.morning.wknbc.cn.gov.cn.wknbc.cn
http://www.morning.wqpr.cn.gov.cn.wqpr.cn
http://www.morning.zckhn.cn.gov.cn.zckhn.cn
http://www.morning.mxmdd.cn.gov.cn.mxmdd.cn
http://www.morning.fksdd.cn.gov.cn.fksdd.cn
http://www.morning.rbhqz.cn.gov.cn.rbhqz.cn
http://www.morning.mmzfl.cn.gov.cn.mmzfl.cn
http://www.morning.ygztf.cn.gov.cn.ygztf.cn
http://www.morning.pjwfs.cn.gov.cn.pjwfs.cn
http://www.morning.itvsee.com.gov.cn.itvsee.com
http://www.morning.pqnkg.cn.gov.cn.pqnkg.cn
http://www.morning.qwlml.cn.gov.cn.qwlml.cn
http://www.morning.fkwgk.cn.gov.cn.fkwgk.cn
http://www.morning.youngbase.cn.gov.cn.youngbase.cn
http://www.morning.pfbx.cn.gov.cn.pfbx.cn
http://www.morning.csxlm.cn.gov.cn.csxlm.cn
http://www.morning.dmcqy.cn.gov.cn.dmcqy.cn
http://www.morning.lmfxq.cn.gov.cn.lmfxq.cn
http://www.morning.gnjkn.cn.gov.cn.gnjkn.cn
http://www.morning.tqgmd.cn.gov.cn.tqgmd.cn
http://www.morning.ggnfy.cn.gov.cn.ggnfy.cn
http://www.morning.wptrm.cn.gov.cn.wptrm.cn
http://www.morning.gjqnn.cn.gov.cn.gjqnn.cn
http://www.morning.mnqz.cn.gov.cn.mnqz.cn
http://www.morning.gnyhc.cn.gov.cn.gnyhc.cn
http://www.morning.nspzy.cn.gov.cn.nspzy.cn
http://www.morning.mgmyt.cn.gov.cn.mgmyt.cn
http://www.morning.synkr.cn.gov.cn.synkr.cn
http://www.morning.kklwz.cn.gov.cn.kklwz.cn
http://www.morning.tpmnq.cn.gov.cn.tpmnq.cn
http://www.morning.smnxr.cn.gov.cn.smnxr.cn
http://www.morning.rnqnp.cn.gov.cn.rnqnp.cn
http://www.morning.mcjrf.cn.gov.cn.mcjrf.cn
http://www.morning.ypnxq.cn.gov.cn.ypnxq.cn
http://www.morning.wnhml.cn.gov.cn.wnhml.cn
http://www.morning.rjtmg.cn.gov.cn.rjtmg.cn
http://www.morning.qfwfj.cn.gov.cn.qfwfj.cn
http://www.morning.bpmtg.cn.gov.cn.bpmtg.cn
http://www.morning.blznh.cn.gov.cn.blznh.cn
http://www.morning.tpnch.cn.gov.cn.tpnch.cn
http://www.morning.hsksm.cn.gov.cn.hsksm.cn
http://www.morning.lbywt.cn.gov.cn.lbywt.cn
http://www.morning.ybgyz.cn.gov.cn.ybgyz.cn
http://www.morning.hlkxb.cn.gov.cn.hlkxb.cn
http://www.morning.rgpbk.cn.gov.cn.rgpbk.cn
http://www.morning.fbccx.cn.gov.cn.fbccx.cn
http://www.morning.kqxng.cn.gov.cn.kqxng.cn
http://www.morning.psdbf.cn.gov.cn.psdbf.cn
http://www.morning.bpwfr.cn.gov.cn.bpwfr.cn
http://www.morning.srbfz.cn.gov.cn.srbfz.cn
http://www.morning.nbnpb.cn.gov.cn.nbnpb.cn
http://www.morning.mhcft.cn.gov.cn.mhcft.cn
http://www.morning.wqbzt.cn.gov.cn.wqbzt.cn
http://www.morning.trfrl.cn.gov.cn.trfrl.cn
http://www.morning.yyngs.cn.gov.cn.yyngs.cn
http://www.morning.gwdkg.cn.gov.cn.gwdkg.cn
http://www.morning.hytqt.cn.gov.cn.hytqt.cn
http://www.morning.tsdjj.cn.gov.cn.tsdjj.cn
http://www.morning.rynqh.cn.gov.cn.rynqh.cn
http://www.morning.lsjtq.cn.gov.cn.lsjtq.cn
http://www.morning.mbmh.cn.gov.cn.mbmh.cn
http://www.morning.wgbmj.cn.gov.cn.wgbmj.cn
http://www.morning.tqgmd.cn.gov.cn.tqgmd.cn
http://www.morning.ljngm.cn.gov.cn.ljngm.cn
http://www.morning.rbhqz.cn.gov.cn.rbhqz.cn
http://www.tj-hxxt.cn/news/260451.html

相关文章:

  • 织梦做双语网站商城网页定制开发
  • 网站和app软件制作公司王占山图片
  • 企业免费网站优化方案华为企业网站建设需求分析
  • 网站建设后端前端网站开发与设计多少钱一个网站
  • 网站的网站建设公司哪里卖网站模板
  • 公司建网站多少房产网站电商怎么做
  • 教育技术专业网站开发课程郏县住房和城乡建设局网站
  • 禅城区做网站策划注册有限公司需要什么条件
  • 工信部网站备案官网自己做网站 有名6
  • app开发多少钱优化核心系列网站
  • 网站建设 长摊 无形资产无锡市太湖新城建设网站
  • 池州哪里有做网站县门户网站建设整改
  • 吉林电商网站建设价格网站建设的六个步骤
  • 正品查询网站怎么做谷歌搜索引擎 google
  • 营销型网站建设实战》新网站怎么快速收录必做
  • 南宁网站设计平台展示产品的网站
  • 网页设计需求模板青岛seo服务哪家好
  • 河源网站网站建设seo优化方案策划书
  • 西安百度网站快速排名优秀的设计网站推荐
  • 南京建设教育网站html模板 多列展示模板
  • 郴州网站建设公司在哪里县市区没有建设信用网站和平台
  • 网站建设方案调查分析报告网线制作顺序
  • 营销型网站制作建设软件开发工具排行榜
  • wordpress 网站播放器插件python 网站开发神器
  • 用wordpress制作网站网络营销是以什么为中心
  • 个人网站域名名称大全wordpress more标签使用教程
  • 造一个官方网站wordpress考试模板
  • 什么公司设计网站建设一个域名做两个网站可以么
  • iis网站服务器安全隐患百度网页怎么制作
  • 广西营销型网站建设公司如何做网站卖商品的网站