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

seo内容优化方法seo关键词排名优化怎样

seo内容优化方法,seo关键词排名优化怎样,做免费看电影的网站不违法吗,厦门网站的制作文章目录 IO模型多路转接select 和 pollepoll IO模型 在还在学习语言的阶段#xff0c;C里使用cin#xff0c;或者是C使用scanf的时候#xff0c;总是要等着我们输入数据才执行#xff0c;这种IO是阻塞IO。下面是比较正式的说法。 阻塞IO: 在内核将数据准备好之前#xf… 文章目录 IO模型多路转接select 和 pollepoll IO模型 在还在学习语言的阶段C里使用cin或者是C使用scanf的时候总是要等着我们输入数据才执行这种IO是阻塞IO。下面是比较正式的说法。 阻塞IO: 在内核将数据准备好之前系统调用会一直等待数据的获取数据的做法就是阻塞IO。 所以网络套接字在你没有自行设置的情况下用的也是阻塞方式IO。 上面说的仿佛只有读取一种情况那么写呢 实际上写也是有一样的问题内核有缓冲区的空间才写没有缓冲区空间就一样得阻塞。 非阻塞IO:顾名思义如果需求的数据内核还没卓备好那么操作系统就会直接返回。 在C语言里如果你使用C接口的非阻塞IO如果没收到数据系统调用就返回那么 宏变量 errno就会被设置其值是EWOULDBLOCK 错误码。 C在C11标准之后C11标准之后都是支持线程安全的。 那么问题来了究竟什么是IO呢 等待数据 拷贝数据 我们发现不论是网络的套接字亦或者是我们常用的自己的输入输出其实无非都在等待一些数据把这些数据拷贝进我们的内存交由程序处理。 多路转接 理解多路转接之前我们先思考一个问题 IO等待拷贝。 那我们该什么时候区拷贝呢 一些比较经典的操作就是轮询信号。 所谓轮询就是每当我需要数据我就问问你数据好了没没有我就稍等一会再来接着问知道数据好了我取走。 所谓信号就是当你数据好了你来通知我让我来取走数据。 我们知道一个主机可以和其他多个主机建立TCP链接也就是需要使用多个套接字。 那么每当有一个新的连接来临我们不想中断我主线程的业务但是新连接的数据收发也要管理。该如何呢 其中一般想到的是开多个线程。 开多线程固然是一种解决方案其对于一般服务器负载也没问题。 那么有成千上万的连接来临呢要知道创建新线程也是有开销的根据我的Linux下的POSIX线程库正常创建线程不重新设置栈大小等那么每一个线程约需要10MiB的空间。 算下来4GiB的内存用户一般有3GiB那么就是说约莫只有300个线程的情况显然算不上高并发。 因此就有一种IO模型其处于非阻塞IO你的每一个文件描述符windows下叫文件句柄都有一个中间者来给你管理当这些句柄有数据来临时他来通知你告诉你改处理这些数据了。而这就是多路转接。 下面介绍Linux多路转接常用的函数selectpoll和epoll select 和 poll int select (int __nfds, fd_set *__restrict __readfds,fd_set *__restrict __writefds,fd_set *__restrict __exceptfds,struct timeval *__restrict __timeout);void FD_CLR(int fd, fd_set *set);int FD_ISSET(int fd, fd_set *set);void FD_SET(int fd, fd_set *set);void FD_ZERO(fd_set *set);fd_set # 文件描述符集的类型 注select和poll在2.6版本之后用的较少因为后来的机器内存都相对较大同时主要因为有了epoll的出现使之取代了select。 select维护了一个文件描述符集FDS其类型如上面的 fd_set你可以用一些列函数接口来操作。当你有一个文件描述符是5号文件描述符那么你就可以调用 FD_SET取设置入你的fd_set的数据类型里面。然后最后交给select帮你管理。 虽然答题过程如上输代码一言但是其实际使用并不方便。原因也十分简单select的思想处理其实是一种轮询的方式。、这导致你每次都要设置文件描述符。 下面是一段示例代码。 #include stdio.h #include stdlib.h #include string.h #include sys/select.h #include sys/time.h #include sys/types.h #include unistd.h#define MAX_FD 10 // 最大文件描述符数量 #define BUFFER_SIZE 1024 // 读取缓冲区大小int main() {int fd[MAX_FD]; // 存储文件描述符的数组fd_set read_fds; // select的可读文件描述符集合int max_fd 0; // 当前最大的文件描述符char buffer[BUFFER_SIZE]; // 读取数据的缓冲区int i, ret;// 初始化文件描述符这里只是示例实际情况可能是套接字for (i 0; i MAX_FD; i) {fd[i] -1; // 初始化为-1表示未使用}// 假设我们监听标准输入文件描述符0fd[0] 0;max_fd 0; // 标准输入的文件描述符是0while (1) {// 清空fd集合FD_ZERO(read_fds);// 将需要监听的文件描述符加入到fd集合for (i 0; i max_fd; i) {if (fd[i] ! -1) {FD_SET(fd[i], read_fds);}}// 设置超时时间这里设置为永远等待struct timeval timeout;timeout.tv_sec 10; // 10秒timeout.tv_usec 0; // 0微秒// 调用selectret select(max_fd 1, read_fds, NULL, NULL, timeout);if (ret -1) {perror(select error);exit(EXIT_FAILURE);} else if (ret 0) {printf(select timeout\n);continue;}// 检查哪个文件描述符可读for (i 0; i max_fd; i) {if (fd[i] ! -1 FD_ISSET(fd[i], read_fds)) {// 这里处理文件描述符i的数据memset(buffer, 0, BUFFER_SIZE);ssize_t count read(fd[i], buffer, BUFFER_SIZE - 1);if (count 0) {printf(Read from fd %d: %s\n, fd[i], buffer);} else if (count 0) {// EOF可能需要关闭文件描述符close(fd[i]);fd[i] -1;} else {// 读取错误perror(read error);}}}}return 0; } 你会发现意见很让人觉得效率低且麻烦的事情那就是select每一次都需要遍历。如同轮询一般因为你放进去的select文件描述符发生事件时select并不会告诉你具体是谁发生了只知道在 FD_MAX目前最大的文件描述符为止有事件发生这就显得麻烦且效率低下。不过因为select上限文件描述符大多数都是1024也就是 FD_SETSIZE 宏。所以select的整体效率不算高但是其适用于一些比较没有那么支持性能的机器。 总结 1.每次调用select都需要把fd集合从用户态往内核态拷贝一次而每次拷贝都需要通过系统调用进入内核态且在内核也是遍历访问这个开销在fd很多时会很大 2.select支持的文件描述符数量太小了默认是1024 3.select返回后需要遍历文件描述符集合来获取已经就绪的socket 4.select不支持O_NONBLOCK 5.每次对要用第三方数组动不动就需要遍历十分耗时 poll类似select解决了文件描述符上限同时解决了输入输出每次重置的问题。也就是select每次都要传一个表进去同时也要传出来。 具体用法不多叙述可以自行百度。 epoll epoll整体设计理念相较于select就比较人性化我们知道每当有数据来临的时候目前许多OS采用的都是硬件中断让CPU临时去被数据接受之后存储起来。比如你的键盘输入就是如此。 那么为什么不把每个文件描述符有数据需要处理时都会有信号那么既然如此我维护这份记录就行因此epoll就是如此做的。每当一个进程调用epoll时会创建一个红黑树将你关心的文件描述符添加进去每当有事件来临他就去红黑树里面找关心了这个事件与否然后如果发现时关心了的那么就通过回调ep_poll_callback 把这个节点给放到 另外的就绪队列上去如此你就知道这个事件需要用了。 因此总结一下使得epoll关心文件描述符的方法 调用epoll_create创建一个epoll句柄; 调用epoll_ctl, 将要监控的文件描述符进行注册; 调用epoll_wait, 等待文件描述符就绪; 具体调用可查询手册下面是例子 #include stdio.h #include stdlib.h #include string.h #include unistd.h #include sys/socket.h #include netinet/in.h #include sys/epoll.h#define MAX_EVENTS 10 #define PORT 8080int main() {int listen_sock, conn_sock, epfd;struct sockaddr_in serv_addr;struct epoll_event event;struct epoll_event events[MAX_EVENTS];int num_fds;// 创建监听socketlisten_sock socket(AF_INET, SOCK_STREAM, 0);if (listen_sock -1) {perror(socket);exit(EXIT_FAILURE);}memset(serv_addr, 0, sizeof(serv_addr));serv_addr.sin_family AF_INET;serv_addr.sin_addr.s_addr htonl(INADDR_ANY);serv_addr.sin_port htons(PORT);// 绑定socketif (bind(listen_sock, (struct sockaddr *)serv_addr, sizeof(serv_addr)) -1) {perror(bind);exit(EXIT_FAILURE);}// 监听socketif (listen(listen_sock, 5) -1) {perror(listen);exit(EXIT_FAILURE);}// 创建epoll实例epfd epoll_create1(0);if (epfd -1) {perror(epoll_create);exit(EXIT_FAILURE);}// 添加监听socket到epoll实例event.data.fd listen_sock;event.events EPOLLIN;if (epoll_ctl(epfd, EPOLL_CTL_ADD, listen_sock, event) -1) {perror(epoll_ctl: listen_sock);exit(EXIT_FAILURE);}// 事件循环while (1) {num_fds epoll_wait(epfd, events, MAX_EVENTS, -1);if (num_fds -1) {perror(epoll_wait);exit(EXIT_FAILURE);}for (int i 0; i num_fds; i) {if (events[i].data.fd listen_sock) {// 处理新的连接conn_sock accept(listen_sock, NULL, NULL);if (conn_sock -1) {perror(accept);exit(EXIT_FAILURE);}printf(Accepted connection on fd %d\n, conn_sock);// 将新的连接添加到epoll实例event.data.fd conn_sock;event.events EPOLLIN | EPOLLET; // 边缘触发模式if (epoll_ctl(epfd, EPOLL_CTL_ADD, conn_sock, event) -1) {perror(epoll_ctl: conn_sock);exit(EXIT_FAILURE);}} else {// 处理已连接socket的数据if (events[i].events EPOLLIN) {char buffer[1024];ssize_t count;count read(events[i].data.fd, buffer, sizeof(buffer));if (count -1) {perror(read);close(events[i].data.fd);} else if (count 0) {// 连接关闭printf(Closed connection on fd %d\n, events[i].data.fd);close(events[i].data.fd);} else {// 处理读取到的数据printf(Read %zd bytes from fd %d\n, count, events[i].data.fd);// 这里可以将数据发送回去或者进行其他处理}}}}}close(listen_sock);return 0; }
http://www.dnsts.com.cn/news/23253.html

相关文章:

  • 成都建网站成都建网站项目策划书八篇案例
  • 跨境网站入口前端写代码用什么软件
  • 网站做seo屏蔽搜索引擎海尔网站建设
  • 在网站留外链怎么做室内设计效果图的软件
  • 云主机是不是可以搭建无数个网站响应式网站 软件
  • 专业免费网站建设一般多少钱给网站做rss
  • 网站设置qq临时会话北京到邢台
  • 合肥建设厅官方网站百度站长
  • 网站服务器空间上海百度推广排名优化
  • 成都专业网站建设套餐食品公司名字大全
  • 淘宝电商设计hyein seo是什么牌子
  • 芜湖做网站建设公司WordPress插件api调用
  • 公司备案证查询网站查询批量建站怎么赚钱
  • 市桥有经验的网站建设虚拟主机控制面板怎么建设网站
  • 百度有没有做游戏下载网站徐汇做网站公司
  • 营销案例网站推荐wordpress 底部样式
  • 站长工具seo查询5g5g新手学做网站图
  • 青岛栈桥重庆企业网站seo
  • 天津葛沽 网站建设公司百度智能小程序怎么优化排名
  • 镇江地区做网站的公司有哪些资深品牌策划公司
  • 苏州网站建设公司鹅鹅鹅深圳建设网站哪家最好
  • 佛山市seo网站设计工具在微信怎么开发公众号
  • 企业建站 wordpress简单的网站更新 关键词优化 关键词互联
  • 自适应影视网站模板门户网页版登录入口
  • 淮南市建设工程质量监督中心网站怎么做网站咨询
  • 讨债公司 做网站房产网站流量排名
  • 网站开发主要用到哪些工具产品设计开发公司
  • 自动跳转手机网站代码wordpress做采集站
  • 网站整站建设深圳注册投资公司的条件
  • 辽宁网站建设哪里好找企业品牌网站建设应该怎么做