96SEO 2026-02-19 20:20 17
比如我们用键盘来敲代码其实就是输入#xff0c;那显示器显示图案就是输出#xff0c;这其实就是

比如我们用键盘来敲代码其实就是输入那显示器显示图案就是输出这其实就是
读取本地文件的时候要将磁盘的数据拷贝到内存中修改本地文件的时候需要把修改后的数据拷贝到磁盘中。
当网络上的数据到来时网卡需要将数据拷贝到内存中。
当要发送数据给网络上的其他人时需要将数据从内存拷贝到网卡里。
protocol);domain这个参数用于选择通信的协议族比如选择
通信等等type选择套接字类型可选字节流套接字、数据报套接字等等。
protocol指定使用的协议。
这个
和端口这样客户端才好找上门来要服务所以此时我们需要指定一个地址和端口来与这个
有一个队列同时存放已完成的连接和半连接backlog为这个队列的大小。
socket
有两个队列分别为已完成的连接队列和半连接队列backlog为这个两个队列的大小之和。
socket
有两个队列分别为已完成的连接队列和半连接队列backlog仅为已完成的连接队列大小。
ack此时这个连接在接收方就处于半连接状态当接收方再收到请求方的
现在我们已经初始化好监听套接字了此时会有客户端连上来然后我们需要处理这些已经完成建连的连接。
从上面的分析我们可以得知三次握手完成后的连接会被加入到已完成连接队列中去。
这时候我们就需要从已完成连接队列中拿到连接进行处理这个拿取动作就由
addrlen);调用connect需要指定远程的地址和端口进行建连三次握手完毕之后就可以开始通信了。
connect需要阻塞等待三次握手的完成。
accept需要等待可用的已完成的连接如果已完成连接队列为空则被阻塞。
为读数据从服务端来看就是等待客户端的请求如果客户端不发请求那么调用
为写数据一般而言服务端接受客户端的请求之后会进行一些逻辑处理然后再把结果返回给客户端这个写入也可能会被阻塞。
协议需要保证数据可靠地、有序地传输并且给予端与端之间的流量控制。
所以说发送不是直接发出去它有个发送缓冲区我们需要把数据先拷贝到
协议告知别发了忙不过来了。
发送缓存区是有大小限制的由于无法发送还不断调用
阻塞会占用当前执行的线程使之不能进行其他操作并且频繁阻塞唤醒切换上下文也会导致性能的下降。
由于阻塞的缘故起初的解决的方案就是建立多个线程但是随着互联网的发展用户激增连接数也随着激增需要建立的线程数也随着一起增加到后来就产生了
随着用户数的增长只能利用增加线程的方式来处理更多的请求而线程不仅会占用内存资源且太多的线程竞争会导致频繁地上下文切换产生巨大的开销。
我们的电脑可能同时运行着非常多的程序这些程序分别来自不同公司。
谁也不知道在电脑上跑着的某个程序会不会发疯似得做一些奇怪的操作比如定时把内存清空了。
划分了非特权指令和特权指令做了权限控制一些危险的指令不会开放给普通程序只会开放给操作系统等特权程序。
你可以理解为我们的代码调用不了那些可能会产生“危险”操作而操作系统的内核代码可以调用。
这些“危险”的操作指内存的分配回收磁盘文件读写网络数据读写等等。
这就好比我们去行政大厅办事那些敏感的操作都由官方人员帮我们处理系统调用所以道理都是一样的目的都是为了防止我们(普通程序)乱来。
我们普通程序的代码是跑在用户空间上的而操作系统的代码跑在内核空间上用户空间无法直接访问内核空间的。
当一个进程运行在用户空间时就处于用户态运行在内核空间时就处于内核态。
程序需要等待数据从网卡拷贝到内核空间。
因为用户程序无法访问内核空间所以内核又得把数据拷贝到用户空间这样处于用户空间的程序才能访问这个数据。
介绍这么多就是让你理解为什么会有两次拷贝且系统调用是有开销的因此最好不要频繁调用。
假如A在河边钓鱼的时候非常的专心生怕鱼儿溜掉故此A就一直盯着鱼竿一直等着鱼儿上钩专心的做这一件事情直到鱼儿上钩才结束这个动作这就是阻塞IO。
在内核把数据准备好之前系统调用会一直处于阻塞状态。
获取网络数据的时候首先这个数据得有也就是网卡得先收到客户端的数据然后这个数据有了之后需要拷贝到内核中然后再被拷贝到用户空间内这整一个过程用户线程都是被阻塞的。
假设没有客户端发数据过来那么这个用户线程就会一直阻塞等着直到有数据。
即使有数据那么两次拷贝的过程也得阻塞等着。
缺点也很明显一个线程对应一个连接一直被霸占着即使网卡没有数据到来也同步阻塞等着。
假如B也在河边钓鱼B不想像A一样把所有的时间都花在等鱼儿上钩这件事情上所以他的做法就是在等待鱼儿上钩的同时自己也可以看看书刷刷小编的博客聊天等等。
但是B也不是就不管鱼儿了他会每隔一段固定时间都来看一下有没有鱼儿上钩如果有鱼儿上钩他就结束这个动作这就是非阻塞IO。
非阻塞IO往往需要程序员循环的方式反复尝试读取文件描述符这个过程称为轮询这对于cpu来说的话是较大的浪费一般只有特定的场景下才能使用。
在没数据的时候可以不再傻傻地阻塞等着而是直接返回错误告知暂无准备就绪的数据
但是如果你的线程就是取数据然后处理数据不干别的逻辑那这个模型又有点问题了。
等于你不断地进行系统调用如果你的服务器需要处理海量的连接那么就需要有海量的线程不断调用上下文切换频繁CPU
假如D也在河边钓鱼但是D是一个土豪他一个人就拿了好多鱼竿摆在哪里这样很明显就增加了鱼儿上钩的机会。
他只需要不断地查看每个鱼竿是否有鱼儿上钩就行了提高了效率。
实际上最核心在于IO多路转接能够同时等待多个文件描述符的就绪状态。
这个专员工作就是管理多个连接帮忙查看连接上是否有数据已准备就绪。
来监控它所管理的连接是否有数据已就绪如果有则可以通知别的线程来
这样一来就可以用少量的线程去监控多条连接减少了线程的数量降低了内存的消耗且减少了上下文切换的次数很舒服。
所谓的多路指的是多条连接复用指的是用一个线程就可以监控这么多条连接。
假如C也在河边钓鱼他认为A、B不够聪明故此他想了一种办法就是在鱼竿上挂上了一个铃铛当有鱼儿上钩的时候铃铛就会被触发发出响声他就可以过去将鱼儿钓上来了。
信号驱动IO模型应用进程告诉内核当数据报准备好的时候给我发送一个信号对SIGIO信号进行捕捉并且调用我的信号处理函数来获取数据报。
虽然不阻塞了但是他得时刻去查询看看是否有数据已经准备就绪那是不是可以让内核告诉我们数据到了而不是我们去轮询呢
也就是说不仅仅只有数据准备就绪才会发信号其他事件也会发信号而这个信号又是同一个信号所以我们的应用程序无从区分到底是什么事件产生的这个信号。
假如E也想钓鱼但是他又有点忙所以他雇佣了一个人专门帮他看着鱼竿一旦有鱼儿上钩就让这个人通知他他过来将鱼儿钓上来。
由内核在数据拷贝完成时,
这一次我们雇了一个钓鱼高手。
他不仅会钓鱼还会在鱼上钩之后给我们发短信通知我们鱼已经准备好了。
我们只要委托他去抛竿然后就能跑去干别的事情了直到他的短信。
我们再回来处理已经上岸的鱼。
不太友好但是这个思路对的往异步发展但是它并没有完全异步因为其后面那段
其实思路很清晰让内核直接把数据拷贝到用户空间之后再告知用户线程来实现真正的非阻塞I/O
然后包括将数据从内核拷贝到用户空间那步所有操作都由内核完成当内核操作完毕之后再调用之前设置的回调此时用户线程就拿着已经拷贝到用户控件的数据可以继续执行后续操作。
作为专业的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