96SEO 2026-02-19 09:15 15
I/O模型的原因7.1.6同步阻塞I/O模型7.1.7同步非阻塞I/O模型7.1.8同步I/O多路复用模型7.1.9同步信号驱动式I/O模型7.1.10

五种I/O模型比较07.udpclient.c07.tcpclient.c
多线程并发服务器07.04.tcpthreadserver.c
基于select的服务器07.05.tcpselectserver.c
基于poll的服务器07.06.tcppollserver.c
基于epoll的服务器07.07.tcpepollserver.c
按使用协议分为TCP服务器和UDP服务器按处理方式分为循环服务器和并发服务器。
I/O即数据的读取接收和写入发送操作分为内存I/O、网络I/O、磁盘I/O。
进程中的完整I/O分为两个阶段用户进程空间–内核空间、内核空间–设备空间磁盘、网卡等。
进程无法直接操作I/O设备通过系统调用请求内核协助完成I/O操作。
内核为每个I/O设备维护一个缓冲区。
对于输入操作进程I/O系统调用后内核先看缓冲区是否有相应数据无则到设备比如网卡设备读取设备I/O慢需等待有则直接复制到用户进程空间。
1等待网络数据到达网卡把数据从网卡读取到内核缓冲区准备好数据。
网络I/O的本质是socket的读取对流的操作。
一次I/O访问数据先拷贝到操作系统的内核缓冲区然后从内核缓冲区拷贝到应用程序的地址空间。
是否等请求出最终结果。
异步调用完成后通过状态、通知、信号和回调来通知调用者。
与等待消息通知时的状态调用线程有关。
非阻塞方式可提高CPU的利用率但同时增加系统的线程切换。
阻塞状态线程放弃CPU的使用暂停运行等导致阻塞的原因消除后恢复运行或者被其他线程中断推出阻塞状态抛出InterruptedException。
5执行wait方法等待其他线程执行notify或者notifyAll方法。
同步函数做完事情后才返回阻塞函数也是做完事情后才返回且会引起线程阻塞。
recv、recvfrom函数。
套接字缓冲区无数据可读数据到来前阻塞。
send、sendto函数。
套接字缓冲区无可用空间线程休眠到有空间。
非阻塞socket在发送缓冲区无足够空间时会部分拷贝返回拷贝字节数将errno置为EWOULDBLOCK。
非阻塞socket在接收缓冲区无数据时返回-1将errno置为EWOULDBLOCK。
同步通信阻塞通信多线程可改善同步阻塞线程的情况。
可运行线程间上下文切换浪费CPU时间效率低。
非阻塞recvform调用后内核马上返回给进程若数据未准备好返回errorEAGAIN或EWOULDBLOCK。
进程返回后可先处理其他业务逻辑稍后继续调用recvform。
采用轮询方式检查内核数据直到数据准备好。
再拷贝数据到进程进行数据处理。
该模型能够在等待任务完成的时间里做其他工作但响应延迟增大整体数据吞吐量降低因为轮询。
单进程同时处理多个网络连接的I/O。
应用程序不监视而内核监视文件描述符。
系统开销小不需要创建和维护额外的进程或线程维护少节省系统资源主要应用场景
注册信号处理函数进程运行不阻塞。
数据准备好时进程收到SIGIO信号信号处理函数中调用I/O操作。
系统调用后不阻塞进程。
等数据准备好内核直接复制数据到进程空间然后内核通知进程数据在用户空间可以处理。
2进程在内核态处理比如同步阻塞读写磁盘会挂起通知等内核态事情完成回到用户态再触发信号通知。
前四种同步I/O操作第二阶段一样数据从内核复制到应用缓冲区期间用户空间进程阻塞于recvfrom调用。
异步I/O模型在等待和接收数据阶段都是非阻塞的可以处理其他逻辑整个I/O操作由内核完成完成后发送通知。
在此期间用户进程不需要检查I/O操作的状态也不需要主动拷贝数据。
sizeof(saddr));saddr.sin_family
rbuf);closesocket(s);WSACleanup();return
sizeof(saddr));saddr.sin_family
rbuf);closesocket(s);WSACleanup();return
{recvfrom(...);process(...);sendto(...);
htonl(INADDR_ANY);saddr.sin_port
sockaddr));}close(sockfd);return
{accept(...);process(...);close(...);
0);close(clisock);}close(s);return
客户端有请求时服务器创建子进程处理父进程继续等待其他客户端的请求。
//成功返回0子进程和大于0父进程中返回子进程ID错误-1进程上限或内存不足子进程复制父进程资源进程上下文、代码区、数据区、堆区、栈区、内存信息、打开文件的文件描述符、信号处理函数、进程优先级、进程组号、当前工作、资源限制和控制终端等Linux内核采取写时拷贝技术Copy
process\n);//getpid()获取自己的进程号printf(Pid
getpid());}else//父进程pid为子进程ID{printf(This
0)//子进程{close(sockfd);//关闭监听套接字process(...);//具体事件处理close(connfd);//关闭已连接套接字exit(0);//结束子进程}close(connfd);//关闭已连接套接字
close(sockfd);07.03.tcpforkserver.c
sizeof(my_addr));my_addr.sin_family
AF_INET;my_addr.sin_addr.s_addr
my_addr.sin_addr);my_addr.sin_port
0){perror(socket);exit(-1);}char
0){perror(binding);close(sockfd);exit(-1);}err_log
0){perror(listen);close(sockfd);exit(-1);}socklen_t
0){perror(accept);close(sockfd);exit(-1);}pid_t
0){perror(fork);_exit(-1);}else
//指向以NULL为结尾的字符串指针该字符串包含要转换为数字的二进制形式的IP地址文本形式。
PVOID
pAddrBuf//指向存储二进制表达式的缓冲区);*//*PCWSTR
pStringBuf,//指向缓冲区的指针该缓冲区用于存储IP地址的以NULL终止的字符串表示形式。
size_t
StringBufSize//输入时由pStringBuf参数指向的缓冲区的长度以字符为单位);*/char
sizeof(cli_ip));inet_ntop(AF_INET,
INET_ADDRSTRLEN);printf(----------------------------------------------\n);printf(client
ntohs(client_addr.sin_port));char
ntohs(client_addr.sin_port));close(connfd);exit(0);}elseclose(connfd);}close(sockfd);return
进程消耗较大的系统资源。
一个进程内的所有线程共享相同的全局内存、全局变量等注意同步问题。
针对客户端的每个请求主线程都会创建一个工作者线程负责和客户端通信。
close(sockfd);//关闭监听套接字07.04.tcpthreadserver.c
closed!\n);close(connfd);return
sizeof(my_addr));my_addr.sin_family
AF_INET;my_addr.sin_addr.s_addr
htonl(INADDR_ANY);my_addr.sin_port
0){perror(bind);close(sockfd);exit(-1);}err_log
0){perror(listen);close(sockfd);exit(-1);}int
INET_ADDRSTRLEN);printf(----------------------------------------------\n);printf(client
ntohs(client_addr.sin_port));if
thread_id;pthread_create(thread_id,
*)connfd);pthread_detach(thread_id);}}close(sockfd);return
select、pselect、poll、epoll等系统调用支持I/O多路复用通过进程监视多个描述符描述符就绪可读写通知程序进行相应处理。
本质上是同步I/O读写过程是阻塞的需要读写事件就绪后自己负责读写。
异步I/O无需自己负责读写它会负责把数据从内核拷贝到用户空间。
I/O多路复用的最大优势是系统开销小无进程/线程的创建和维护。
epoll是Linux特有select是POSIX规定一般操作系统均可实现。
客户端处理多个描述符交互式输入和网络套接字必须使用客户端处理多个套接字很少出现TCP服务器处理监听套接字和已连接套接字服务器处理TCP和UDP服务器处理多个服务或多个协议
进程调用select阻塞内核监视多个socket任一socket准备好可读、可写、异常返回。
此时进程执行read、write、exit等。
//timeout等待时间NULL阻塞0非阻塞大于0超时时间select函数返回时fd_set结构中填入相应套接字。
有数据可读recv立即读取连接已关闭、重设或终止有请求建立连接的套接字accept会成功
初始化套接字集合FD_ZERO(readfds)指定套接字放入集合FD_SET(s
readfds)调用select函数返回所有fd_set集合中变化套接字总个数并会更新集合中变化套接字状态遍历集合判断s是否在某个集合内。
FD_ISSET(s,
-1){perror(setsockopt);exit(1);}int
server_addr;memset(server_addr,
sizeof(server_addr));server_addr.sin_family
AF_INET;server_addr.sin_addr.s_addr
htonl(INADDR_ANY);server_addr.sin_port
error!\n);close(sock_fd);exit(1);}if
error!\n);close(sock_fd);exit(1);}printf(listen
fdsr;FD_ZERO(fdsr);FD_SET(sock_fd,
0){printf(timeout\n);continue;}for
new_fd;break;}}conn_amount;printf(new
inet_ntoa(client_addr.sin_addr),
ntohs(client_addr.sin_port));if
0);close(new_fd);continue;}}showclient();}for
0)close(fd[i]);close(sock_fd);return
poll和select本质一样管理多个描述符进行轮询根据描述符状态进行处理但poll无文件描述符数量的限制过多性能下降。
相同缺点是大量文件描述符数组整体在用户态和内核的地址空间之间进行复制无论描述符是否就绪。
poll函数在指定时间内轮询一定数量的文件描述符测试是否有就绪者监测多个事件若无事件发生进程睡眠放弃CPU控制权。
若监测的任一事件发生唤醒进程判断事件执行相应操作。
退出后struct
events;//等待的事件用户设置告诉内核我们关注什么short
revents;//实际发生的事件内核调用返回时设置说明该描述符发生了什么事件
childSd;fds[currentFdNum].events
POLLRDHUP);nfds;currentFdNum;fprintf(stderr,
i);close(fds[i].fd);fds[i].events
POLLOUT;break;}else{errExit();}}}}//
2内核/用户空间内存拷贝问题select需要复制大量的句柄数据结构巨大开销。
4水平触发已就绪的文件描述符未完成I/O操作每次调用select都会通知。
epoll三大关键要素mmap、红黑树、链表。
mmap将用户空间和内核空间的地址映射到相同物理内存地址减少用户态和内核态的数据交换。
内核可以直接看到epoll监听的句柄效率高。
红黑树存储epoll监听套接字epoll_ctr在红黑树上插入或删除套接字。
添加事件时会建立与相应设备网卡驱动程序的回调关系ep_poll_callback回调函数ep_poll_callback会将发生的事件放入双向链表rdllist中。
epoll_wait时只检测rdlist中是否存在注册的事件效率非常高这里需要将发生了的事件复制到用户态内存中。
水平触发LT缺省描述符就绪内核通知未处理下次还通知。
边缘触发ET只支持非阻塞描述符。
需保证缓存区的数据全部读取或写出下次不会通知。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback