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

会ps的如何做网站个人发布信息的免费平台

会ps的如何做网站,个人发布信息的免费平台,个人可以做网站吗,wordpress调用评论数一、I/O多路复用 1、为什么要多路复用 之前开启多线程能实时接收数据,并且也不是一次性连接服务。但毕竟是一请求一连接,每有一个客户端向服务端发起请求,就会创建一个线程,当请求达到上千上万,就会创建上千上万的线…

一、I/O多路复用

1、为什么要多路复用

之前开启多线程能实时接收数据,并且也不是一次性连接服务。但毕竟是一请求一连接,每有一个客户端向服务端发起请求,就会创建一个线程,当请求达到上千上万,就会创建上千上万的线程,虽然线程所占资源很少,但也架不住数量多,会给系统内核资源调度增加负担<不利于高并发>

2、解决单个线程处理多个I/O操作问题

系统提供3种策略来解决,分别是select,poll,epoll

二、select机制

1、将多个线程请求看成是一个集合

2、关注集合中的fd哪些可读,可写,可出错

3、逐个管理集合中的fd,如果有数据到来就进行处理,否则就继续阻塞等待。

4、遍历集合中的fd,判断是否可读,可读就接收。

三、具体实操

在之前的阻塞I/O中,我们是阻塞在accept上,现在我们阻塞在select上。
所以在之前的代码中,将accept及以下代码进行更换。

1、创建集合,清空集合,设置集合

fd_set rfds, rset;        //集合
FD_ZERO(&rfds);     //对集合进行清空
FD_SET(socketfd, &rfds);           //对集合进行设置,将客户端fd添加至集合中

2、阻塞在select上

select函数原型:

int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout);
/*
nfds: 集合最大边界值 + 1,因为从0开始
readfds: 关注这部分(如4,5,6)fd是否可读
writefds: 关注这部分(如7,8,9)fd是否可写
exceptfds:关注这部分(如7,8,9)fd是否出错
timeout: 超时时间,NULL表示永久阻塞,非NULL表示等待时间,单位为秒
return value: 返回的是所关注的共达标多少个,如可读3个,可写2个,可出错1个,共计6个
*/
int maxfd = socketfd;             //对集合遍历的最大值,集合也有边界,从0开始
while(true){rset = rfds;                    //复制一份集合,防止在select中被修改int nready = select(maxfd + 1, &rset, NULL, NULL, NULL);    //等待IO就绪if(nready < 0){                //出错处理cout << "select error:" << strerror(errno) << endl;continue;}else if (nready == 0){                //超时处理cout << "timeout\n";continue;}else{//accept操作,此处省略}//recv操作,此处省略
}

3、管理逐个IO,accept操作

if(FD_ISSET(socketfd, &rset)){          //如果有数据到来,则进行接收处理====acceptint clientfd = accept(socketfd, (struct sockaddr *)&clientaddr, &len);cout<<"clientfd:"<<clientfd<<endl;       //获取到客户端的连接描述符FD_SET(clientfd, &rfds);            //将新的连接加入到集合中if(clientfd > maxfd){               //更新遍历的边界,回收旧的连接,更新边界值maxfd = clientfd;}
}

4、recv操作,判断是否可读,接收数据

for(int i = socketfd + 1; i <= maxfd; i++){ if(FD_ISSET(i, &rset)){                 //判断IO是否可读char buffer[1024] = {0};int count = recv(i, buffer, 1024, 0);if(count == 0){close(i);FD_CLR(i, &rfds);continue;}cout << "buffer:" << buffer << endl;//返回信息count = send(i, buffer, count, 0);}
}

在这里插入图片描述

5、小结:

一个线程多路I/O,阻塞在select上,当有客户端连接时,select返回,再进行accept操作。
select主要用到

fd_set          //集合
FD_SET          //设置集合,将fd加入到集合中
FD_CLR          //清除集合,将fd从集合中移除
FD_ISSET        //判断IO是否可读
FD_ZERO         //初始化为空集合
select          //阻塞等待IO就绪

相比于之前的网络I/O,避免了多线程的开销, select解决了单个线程处理多个I/O的问题。
但是,select还是有缺陷的。select,每次调用都需要把fd_set集合,从用户空间拷贝到内核空间,随着fd越来越大,拷贝的开销比较大。
maxfd,遍历到最大的fd。

6、扩展问题:

1、fd_set究竟是什么?

#define FD_SETSIZE 1024  // 假设文件描述符集合的最大大小为1024typedef struct {unsigned long fds_bits[FD_SETSIZE / (8 * sizeof(unsigned long))];
} fd_set;

可见fd_set本质是一个位图,每个fd对应一个bit位。
2、集合大小是多少,能修改吗?
集合大小可以通过宏定义修改,但是不建议修改。

http://www.dtcms.com/wzjs/163446.html

相关文章:

  • 网站维护合同范本在线建站平台免费建网站
  • 门头沟建设委员会网站下载百度app并安装
  • 萝岗高端网站建设拓客渠道有哪些
  • 九江网站推广外贸网站制作公司
  • 做一个平台网站的预算上海优化外包公司排名
  • 温州网站建站模板百度推广全国代理商排名
  • 武汉高端网站制作公司网页制作成品模板网站
  • 潍坊住房和城乡建设部网站seo引擎优化平台培训
  • 建造师信息查询网sem优化师
  • 北京网站建设第一企业产品网络推广
  • 专业网站建设好不好广东知名seo推广多少钱
  • html5开发seo网站推广服务
  • ps做网站logo优化seo厂家
  • 网站建设的功能定位网站是否含有seo收录功能
  • 盐城网站建设服务百度关键词怎么优化
  • 为什么做营销型网站今日军事新闻头条新闻
  • 一个专门做字画的网站做企业网站建设公司哪家好
  • 营销型网站的目标是句容市网站seo优化排名
  • 长沙软件开发公司windows优化大师是官方的吗
  • 为什么做网站结构优化小吃培训去哪里学最好
  • dede title 我的网站长沙关键词优化服务
  • 个人网站模板html外链发布工具
  • 做网站用的字体是什么软文推广哪个平台好
  • 简单企业网站长春网站关键词推广
  • 男女做暖昩视频试看网站谷歌官网首页
  • 河北建设厅网站上不去培训机构排名前十
  • 做网站 php和java杭州营销策划公司排名
  • 做分类信息网站代码网络营销课程学什么
  • 网站企业建设百度一下下载安装
  • 美食网站建设的背景和目的seosem是什么职位