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

网站怎么做cp备案号个人网站模板素材

网站怎么做cp备案号,个人网站模板素材,个人备案网站做淘宝客可以,黑龙江省建设厅官网查询目录 一.IO多路复用 二.为什么有IO多路复用机制? 三.IO多路复用的三种实现方式 3.1 select select 函数接口 select 使用示例 select 缺点 3.2 poll poll函数接口 poll使用示例 poll缺点 3.3 epoll epoll函数接口 epoll使用示例 epoll缺点 四. 进程和线程的区别…目录 一.IO多路复用 二.为什么有IO多路复用机制? 三.IO多路复用的三种实现方式 3.1 select select 函数接口 select 使用示例 select 缺点 3.2 poll poll函数接口 poll使用示例 poll缺点 3.3 epoll epoll函数接口 epoll使用示例 epoll缺点 四. 进程和线程的区别 五. 线程和进程的通信方式都有哪些 六. 多线程并发服务器 七. 线程池 八. 深拷贝和浅拷贝 九. 内存泄漏 一.IO多路复用 IO多路复用是一种同步IO模型实现一个线程可以监视多个文件句柄一旦某个文件句柄就绪就能够通知应用程序进行相应的读写操作没有文件句柄就绪时会阻塞应用程序交出CPU多路是指网络连接复用指的是同一个线程 二.为什么有IO多路复用机制? 没有IO多路复用机制时有BIO、NIO两种实现方式但有一些问题 同步阻塞(BIO) · 服务端采用单线程当accept一个请求后在recv或send调用阻塞时将无法accept其他请求(必须等上一个请求处recv或send完)无法处理并发 · 服务端采用多线程当accept一个请求后开启线程进行recv可以完成并发处理当随着请求数增加需要增加系统线程 同步非阻塞(NIO) · 服务端当accept一个请求后加入fds集合每次轮询一遍fds集合recv(非阻塞)数据没有数据则立即返回错误 IO多路复用 · 服务器端采用单线程通过select/epoll等系统调用获取fd列表遍历有事件的fd列表accept/recv/send使其能支持更多的并发连接请求 三.IO多路复用的三种实现方式 3.1 select select 函数接口 #include sys/select.h #include sys/time.h#define FD_SETSIZE 1024 #define NFDBITS (8 * sizeof(unsigned long)) #define __FDSET_LONGS (FD_SETSIZE/NFDBITS)// 数据结构(bitmap) // 用来表示一组文件描述符的状态 typedef struct {unsigned long fds_bits[__FDSET_LONGS]; }fd_set;// API int select{int max_fd, fd_set *readset, fd_set *writeset, fd_set *exceptset, struct timeval *timeout }// 返回值就绪描述符的数目FD_ZERO(int fd, fd_set* fds) // 清空集合 FD_SET(int fd, fd_set* fds) // 将给定的描述符加入集合 FD_ISSET(int fd, fd_set* fds) // 判断指定描述符是否在集合中 FD_CLR(int fd, fd_set* fds) // 将给定的描述符从文件中删除 select 使用示例 int main() {/** 这里进行一些初始化的设置* 包括socket建立地址的设置等,*/fd_set read_fs, write_fs;struct timeval timeout;int max 0; // 用于记录最大的fd在轮询中时刻更新即可// 初始化比特位FD_ZERO(read_fs);FD_ZERO(write_fs);int nfds 0; // 记录就绪的事件可以减少遍历的次数while (1) {// 阻塞获取// 每次需要把fd从用户态拷贝到内核态nfds select(max 1, read_fd, write_fd, NULL, timeout);// 每次需要遍历所有fd判断有无读写事件发生for (int i 0; i max nfds; i) {if (i listenfd) {--nfds;// 这里处理accept事件FD_SET(i, read_fd);//将客户端socket加入到集合中}if (FD_ISSET(i, read_fd)) {--nfds;// 这里处理read事件}if (FD_ISSET(i, write_fd)) {--nfds;// 这里处理write事件}}} select 缺点 · 单个进程所打开的FD是有限制的通过 FD_SETSIZE 设置默认 1024 · 每次调用 select 都需要把 fd 集合从用户态拷贝到内核态这个开销在 fd 很多时会很大 · 对 socket 扫描时是线性扫描采用轮询的方法效率较低高并发时 3.2 poll poll函数接口 poll与select相比只是没有fd的限制其它基本一样 #include poll.h // 数据结构 struct pollfd {int fd; // 需要监视的文件描述符short events; // 需要内核监视的事件short revents; // 实际发生的事件 };// API int poll(struct pollfd fds[], nfds_t nfds, int timeout); poll使用示例 // 先宏定义长度 #define MAX_POLLFD_LEN 4096 int main() {/** 在这里进行一些初始化的操作* 比如初始化数据和socket等。*/int nfds 0;pollfd fds[MAX_POLLFD_LEN];memset(fds, 0, sizeof(fds));fds[0].fd listenfd;fds[0].events POLLRDNORM;int max 0; // 队列的实际长度是一个随时更新的也可以自定义其他的int timeout 0;int current_size max;while (1) {// 阻塞获取// 每次需要把fd从用户态拷贝到内核态nfds poll(fds, max1, timeout);if (fds[0].revents POLLRDNORM) {// 这里处理accept事件connfd accept(listenfd);//将新的描述符添加到读描述符集合中}// 每次需要遍历所有fd判断有无读写事件发生for (int i 1; i max; i) { if (fds[i].revents POLLRDNORM) { sockfd fds[i].fdif ((n read(sockfd, buf, MAXLINE)) 0) {// 这里处理read事件if (n 0) {close(sockfd);fds[i].fd -1;}} else {// 这里处理write事件 }if (--nfds 0) {break; } }}} poll缺点 · 每次调用 poll 都需要把 fd 集合从用户态拷贝到内核态这个开销在 fd 很多时会很大 · 对 socket 扫描时是线性扫描采用轮询的方法效率较低 3.3 epoll epoll函数接口 #include sys/epoll.h// 数据结构 // 每一个epoll对象都有一个独立的eventpoll结构体 // 用于存放通过epoll_ctl方法向epoll对象中添加进来的事件 // epoll_wait检查是否有事件发生时只需要检查eventpoll对象中的rdlist双链表中是否有epitem元素即可 struct eventpoll {/*红黑树的根节点这颗树中存储着所有添加到epoll中的需要监控的事件*/struct rb_root rbr;/*双链表中则存放着将要通过epoll_wait返回给用户的满足条件的事件*/struct list_head rdlist; };// APIint epoll_create(int size); // 内核中间加一个 ep 对象把所有需要监听的 socket 都放到 ep 对象中 int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); // epoll_ctl 负责把 socket 增加、删除到内核红黑树 int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);// epoll_wait 负责检测可读队列没有可读 socket 则阻塞进程 epoll使用示例 int main(int argc, char* argv[]) {/** 在这里进行一些初始化的操作* 比如初始化数据和socket等。*/// 内核中创建ep对象epfdepoll_create(256);// 需要监听的socket放到ep中epoll_ctl(epfd,EPOLL_CTL_ADD,listenfd,ev);while(1) {// 阻塞获取nfds epoll_wait(epfd,events,20,0);for(i0;infds;i) {if(events[i].data.fdlistenfd) {// 这里处理accept事件connfd accept(listenfd);// 接收新连接写到内核对象中epoll_ctl(epfd,EPOLL_CTL_ADD,connfd,ev);} else if (events[i].eventsEPOLLIN) {// 这里处理read事件read(sockfd, BUF, MAXLINE);//读完后准备写epoll_ctl(epfd,EPOLL_CTL_MOD,sockfd,ev);} else if(events[i].eventsEPOLLOUT) {// 这里处理write事件write(sockfd, BUF, n);//写完后准备读epoll_ctl(epfd,EPOLL_CTL_MOD,sockfd,ev);}}}return 0; } epoll缺点 epoll只能工作在linux下 四. 进程和线程的区别 · 进程是资源分配的最小单位线程是 CPU 调度的最小单位 · 一个进程可以包含多个线程一个线程只能属于一个进程 · 进程间内存空间独立线程间共享同一个内存地址 五. 线程和进程的通信方式都有哪些 线程间的通信 1. 共享内存同一进程内的所有线程共享相同的地址空间所以一个线程可以直接访问另一个线程的数据 2. 互斥锁任何时刻只有一个线程可以访问该资源 3. 条件变量允许线程在某个条件满足之前阻塞等待当条件满足时被唤醒 4. 信号量可以用来控制对共享资源的访问次数 5. 原子操作提供了一种无需额外同步机制即可安全地更新共享数据的方法 进程间的通信 1. 管道一种半双工的通信方式适用于父子进程之间或者具有亲缘关系的进程之间进行通信 2. 命名管道可以在不相关的进程之间使用并且可以持久化到文件系统中 3. 消息队列允许多个进程以队列的形式发送和接收信息 4. 共享内存进程间可以通过映射同一段物理内存来进行高速数据交换 5. 信号 6. 套接字 六. 多线程并发服务器 多线程并发服务器是一种能够同时处理多个客户端请求的服务器架构 七. 线程池 线程池是一种用于管理和复用线程的技术它预先创建了一组线程并将这些线程保存在池中。当有任务需要执行时从线程池中取出一个空闲的线程来处理任务任务完成后该线程不会被销毁而是返回到线程池中等待下一次使用。这种方式可以减少频繁创建和销毁线程带来的开销。 八. 深拷贝和浅拷贝 浅拷贝浅拷贝创建了一个新的对象然后将原始对象中所有可变引起的对象直接复制到新对象中。 深拷贝创建了一个新的对象还会递归地复制原始对象中的所有子对象。新对象与原始对象完全独立互不影响 九. 内存泄漏 程序在申请内存后未能释放不再使用的内存。 解决措施 1.释放资源 2.使用智能指针自动管理生命周期 3.对象池防止频繁创建 4.避免使用全局变量
http://www.zqtcl.cn/news/763750/

相关文章:

  • 学校网站建设发展规划线上推广的渠道有哪些
  • 公主岭网站建设seo网站推广技术
  • 网站建设一次crm管理
  • 电商网站设计公司优选亿企邦wordpress管理员头像
  • 医院做网站需要多少钱wordpress 模板 设计
  • 建设网站的规则建设公司网站的原则
  • 专业网站定制 北京龙泉驿网站seo
  • 网站标签是什么网站flash导入页
  • 城市网站建设摘要论文网站建设基本步骤包括哪些
  • 如何做招聘网站分析wordpress状态修改
  • 兰考网站建设微信运营是干嘛的
  • 网站ps照片怎么做的网站开发项目实训报告
  • 做流量网站it建设人才网
  • 杭州拱墅区网站建设推荐定制型网站建设
  • 网站建设需要达到什么样的效果上海营销网站推广多
  • 现代化公司网站建设长沙公司网站建立
  • 网站开发需要哪些人才辽宁奔之流建设工程有限公司网站
  • 做旅游产品的网站有哪些个人做搜索网站违法吗
  • 营销型网站的功能网站制作价钱多少
  • angularjs 网站模板工作感悟及心得
  • 福州 网站定制设计哈尔滨网站建设咨询
  • 酒吧网站模板创办网页
  • 外贸网站建设软件有哪些现在网站建设用什么语言
  • lnmp wordpress 主题不见高级seo课程
  • 成都哪家公司做网站最好杭州软件开发
  • 做网站多少宽带够wordpress编辑文章中图片
  • 无锡网站制作排名软件工程公司
  • 做网站国内好的服务器美食网站建设项目规划书
  • 三亚市住房和城乡建设厅网站江西电信网站备案
  • 联谊会总结网站建设对外宣传如何在家做电商