2024年运维最全女友:不跟我解释清楚 Linux I O 晚上你就睡沙发吧(3),Linux运维权限处理

本文详细介绍了Linux的各种I/O模型,包括阻塞、非阻塞、I/O复用、信号驱动和异步I/O,强调了系统化学习的重要性。适合Linux开发者和学习者深入了解Linux系统内部工作原理。
摘要由CSDN通过智能技术生成

最全的Linux教程,Linux从入门到精通

======================

  1. linux从入门到精通(第2版)

  2. Linux系统移植

  3. Linux驱动开发入门与实战

  4. LINUX 系统移植 第2版

  5. Linux开源网络全栈详解 从DPDK到OpenFlow

华为18级工程师呕心沥血撰写3000页Linux学习笔记教程

第一份《Linux从入门到精通》466页

====================

内容简介

====

本书是获得了很多读者好评的Linux经典畅销书**《Linux从入门到精通》的第2版**。本书第1版出版后曾经多次印刷,并被51CTO读书频道评为“最受读者喜爱的原创IT技术图书奖”。本书第﹖版以最新的Ubuntu 12.04为版本,循序渐进地向读者介绍了Linux 的基础应用、系统管理、网络应用、娱乐和办公、程序开发、服务器配置、系统安全等。本书附带1张光盘,内容为本书配套多媒体教学视频。另外,本书还为读者提供了大量的Linux学习资料和Ubuntu安装镜像文件,供读者免费下载。

华为18级工程师呕心沥血撰写3000页Linux学习笔记教程

本书适合广大Linux初中级用户、开源软件爱好者和大专院校的学生阅读,同时也非常适合准备从事Linux平台开发的各类人员。

需要《Linux入门到精通》、《linux系统移植》、《Linux驱动开发入门实战》、《Linux开源网络全栈》电子书籍及教程的工程师朋友们劳烦您转发+评论

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以点击这里获取!

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

总结:在阻塞 I/O 模型里面,从硬件到内核,从内核到程序空间,都是阻塞的在这里插入图片描述

非阻塞 I/O

在非阻塞 I/O 模型中,当进程发起一个读取文件的请求时(recvfrom 系统调用),如果内核缓冲区没有缓存对应的数据,那么内核就会去读取磁盘,将对应数据放到内核缓冲区

但此时进程的请求不是堵塞的,内核在读取磁盘数据的时候会先返回一个错误信息给进程——数据暂时还没准备好,你待会再来试试

于是进程就会不断地向内核发起重试,一直问:数据准备好了没数据准备好了没

当内核读取数据完毕后,就会通知进程:数据已经准备好了,你可以来拿了

于是第一阶段就此结束,在第一阶段里面进程不会在这里干等,而是不断的轮询重试,但也是阻塞的

当进程收到内核的响应之后,把内核缓冲区中的数据 copy 一份到程序缓冲区,最后完成读取文件的操作

于是第二阶段就此结束,在第二阶段里面进程是堵塞的,它只能乖乖地将数据从内核缓冲区 copy 到程序缓冲区

总结:在非阻塞 I/O 模型里面,从硬件到内核,从内核到程序空间,都是阻塞的。但比阻塞 I/O 有进步了一点,并不是站在那里干等,而是时不时跑去问一下内核。即使是无用功,效率多少还是提高了一点的在这里插入图片描述

I/O复用

之所以叫复用,是因为在这个模型中进程可以同时操作多个数据流,而不像前面所讲的阻塞 I/O、非阻塞 I/O 同一时间只能操作一个数据流

在 I/O 复用模型中,进程监听多个数据流,然后去不断的轮询,当其中一个数据流有数据之后,内核便会通知进程

UNIX/Linux 下的 select、poll、epoll 就是干这个的(epoll 比 poll、select 效率高,做的事情是一样的)

于是第一阶段就此结束,在第一阶段里面进程会不断地对多个数据流进行轮询重试,但依旧是阻塞的

当收到内核的通知之后,进程就会将数据从内核缓冲区 copy 到 程序缓冲区,最后完成读取文件的操作

于是第二阶段就此结束,在第二阶段里面进程是堵塞的,它只能乖乖地将数据从内核缓冲区 copy 到程序缓冲区

I/O 多路复用中有 select、poll、epoll 函数,select 调用是内核级别的,select轮询相对非阻塞的轮询的区别在于——select 轮询可以监听多个数据流,当其中任何一个数据流的数据准备好了,就能返回成功

总结:

  • I/O 复用模型的第二阶段与阻塞 I/O、非阻塞 I/O 的第二阶段是一致的,但是在第一阶段中,进程能够同时轮询多个数据流,监听多个数据流,其效率有巨大的提升
  • I/O 多路复用是阻塞在select,epoll 这样的系统调用之上,而没有阻塞在真正的 I/O 系统调用如 recvfrom 之上
  • I/O 多路复用在阻塞到 select 阶段时,用户进程是主动等待并调用 select 函数获取数据就绪状态消息,并且其进程状态为阻塞。所以,把IO多路复用归为同步阻塞模式在这里插入图片描述

信号驱动 I/O

信号驱动 I/O 可以说是 I/O 模型上的一个里程碑

它与前面三个 I/O 模型的区别在于信号这个词

信号驱动 I/O 在第一阶段,即等待内核将数据从磁盘读取到内核缓冲区这个阶段,进程是不阻塞的,而是设置了一个信号回调,当数据到达内核缓冲区之后,内核调用程序的回调

在第一阶段里面进程是非阻塞的,它可以去干其他事情

当数据到达内核缓存区,进程收到内核的信号之后,进程再将数据从内核缓冲区 copy 到程序缓冲区,最后完成读取文件的操作

第二阶段就此结束,在第二阶段里面进程是堵塞的,它只能乖乖地将数据从内核缓冲区 copy 到程序缓冲区

总结:

  • 虽然说信号驱动 I/O 模型的第二阶段跟前面三个 I/O 模型一样,即进程是阻塞的。但在第一阶段做到了真正的异步
  • 信号驱动 IO 在第一阶段,进程去请求内核读取数据,这时候其不会阻塞,也不会去轮询,而是设置一个信号回调。 当数据完全拷贝到系统内核时,系统发出 SIGIO 信号,通知进程去进行第二阶段,将数据拷贝到程序缓冲区在这里插入图片描述

异步 I/O

异步I/O 相比前面四个 I/O 模型,无论是第一阶段还是第二阶段都实现了非阻塞

与信号驱动 I/O 类似,异步 I/O 模型在第一阶段通过信号回调的方式实现了进程的非阻塞

即用户进程进行 aio_read 系统调用之后,无论内核数据是否准备好,都会直接返回给用户进程,然后用户态进程可以去做别的事情

而在第二阶段,进程将数据从内核缓冲区 copy 到程序缓冲区的时候并非阻塞,而是同样设置一个信号回调,当 copy 完成后,进程收到通知,再去执行相应的操作

总结:异步 IO 不仅仅是在第一阶段实现了信号回调,其也在第二阶段实现了信号回调,两个过程都是非阻塞的,从而完全实现了异步 IO 操作在这里插入图片描述

总结

我们根据这五种 I/O 模型在第一第二阶段的表现来总结一下:

  • 阻塞 I/O
    • 第一阶段(硬件到系统内核),阻塞
    • 第二阶段(系统内核到程序空间),阻塞
  • 非阻塞 I/O
    • 第一阶段(硬件到系统内核),轮询阻塞
    • 第二阶段(系统内核到程序空间),阻塞
  • I/O 复用
    • 第一阶段(硬件到系统内核),多路轮询阻塞
    • 第二阶段(系统内核到程序空间),阻塞
  • 信号驱动 I/O
    • 第一阶段(硬件到系统内核),信号驱动不阻塞
    • 第二阶段(系统内核到程序空间),阻塞
  • 异步 I/O
    • 第一阶段(硬件到系统内核),信号驱动不阻塞
    • 第二阶段(系统内核到程序空间),信号驱动不阻塞

从上面的 5 种 I/O 模型,我们可以看出,真正实现异步非阻塞的只有异步 IO 这种模型,而其他四种都是同步 I/O

因为在第二阶段:从内核缓冲区复制到程序缓冲区的时候,不可能干其他事情

最后再来简单说说阻塞与非阻塞、同步与异步的区别

阻塞与非阻塞:

  • 阻塞 I/O 会一直 block 对应的进程,直到 I/O 操作完成
  • 非阻塞 I/O 在内核还在准备数据的情况下会立刻返回给进程

同步与异步:

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以点击这里获取!

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值