写在前面:我是【程序员宝藏】的宝藏派发员,致力于创作原创干货。我热爱技术、热爱开源与分享,创作的【计算机基础面试问题】系列文章和【计算机基础主干知识】系列文章广受好评!后期会创作更多优质原创系列文章!如果您对计算机基础知识、编程等感兴趣,可以关注我,我们一起成长!
本人力荐:如果觉得CSDN排版不够美观,欢迎来我的个人原创公zong号【程序员宝藏】(号如其名,诚不欺你!)查看有红色重点标记和排版美观的全系列文章(不细你来找我要红包)
参考链接:TCP三次握手四次挥手
好多同学问我要pdf版,我干脆把全部文章都整理成了pdf直接打印版,在公zong号后台回复关键字【宝藏】即可免费带回家慢慢看!
相关系列文章:
- TCP三次握手和四次挥手加拓展面试题(全网最细)
- 介质访问控制全网最细没有之一
- 路由算法(全网最细)
- 各层网络协议加面试拓展(全网最细)
- 各层网络设备加拓展(全网最细)
- 线程|进程|程序比较总结(全网最细)
- 死锁加拓展问题(全网最细)
正文开始
1.程序直接控制方式
如下图所示,计算机从外部设备读取数据到存储器,每次读一个字的数据。对读入的每个字, CPU 需要对外设状态进行循环检查,直到确定该字已经在I/0 控制器的数据寄存器中。在程序直接控制方式中,由于CPU 的高速性和I/0设备的低速性,致使CPU 的绝大部分时间都处于等待I/0 设备完成数据I/0 的循环测试中,造成了CPU 资源的极大浪费。在该方式中, CPU 之所以要不断地测试I/0 设备的状态,就是因为在CPU 中未采用中断机构,使I/0 设备无法向CPU报告它已完成了一个字符的输入操作。
【痛点】程序直接控制方式虽然简单且易于实现,但其缺点也显而易见,由于CPU 和I/0 设备只能串行工作,导致CPU 的利用率相当低。
2.中断驱动方式
其实后一种的方式都是对前一种的方式的一种改进(OS里面都是为了提高资源利用率和并发性等才改进的,其他也差不多),计算机专业的课程很多都可以用这样的方法学习,不要硬背,这些都不是孤立的,回答的时候体现出改进,一步一步的讲出来,条理和逻辑会比较清楚!
中断驱动方式的思想是,允许I/0 设备主动打断CPU 的运行并请求服务,从而“解放"CPU,使得其向I/0 控制器发送读命令后可以继续做其他有用的工作。如下图所示,我们从I/0 控制器和CPU 两个角度分别来看中断驱动方式的工作过程:
【1】从I/0 控制器的角度来看, I/0 控制器从CPU 接收一个读命令,然后从外围设备读数据。一且数据读入该I/0 控制器的数据寄存器,便通过控制线给CPU 发出一个中断信号,表示数据已准备好,然后等待CPU 请求该数据。I/0 控制器收到CPU 发出的取数据请求后,将数据放到数据总线上,传到CPU 的寄存器中。至此,本次I/0 操作完成, I/0 控制器又可开始下一次I/0操作。
【2】从CPU 的角度来看, CPU 发出读命令,然后保存当前运行程序的上下文(现场,包括程序计数器及处理机寄存器),转去执行其他程序。在每个指令周期的末尾, CPU 检查中断。当有来自I/0 控制器的中断时, CPU 保存当前正在运行程序的上下文,转去执行中断处理程序以处理该中断。这时, CPU 从I/0 控制器读一个字的数据传送到寄存器,并存入主存。接着, CPU 恢复发出I/0 命令的程序(或其他程序)的上下文,然后继续运行。
【痛点】:中断驱动方式比程序直接控制方式有效,但由于数据中的每个字在存储器与I/0 控制器之间的传输都必须经过CPU, 这就导致了中断驱动方式仍然会消耗较多的CPU 时间。
【注意】:什么叫经过CPU呢?
答:在DMA(Direct memory access 直接存储器访问)之前,输入数据流大概是这样的:
【外围设备->I/O控制器的数据寄存器->CPU寄存器->存储器】,这就叫经过CPU,或者说传输数据的过程需要CPU的干预,于是引出了所谓的DMA(直接在I/O设备和内存之间建立数据通路)。
3.DMA方式
为何引入DMA前面提到了,所有改进如下:
- 基本单位是数据块(前面是一个字)。
- 所传送的数据,是从设备直接送入内存的,或者相反。
- 仅在传送一个或多个数据块的开始和结束时,才需CPU 干预,整块数据的传送是在DMA控制器的控制下完成的。
- 命令/状态寄存器(CR) 。用于接收从CPU 发来的I/0 命令或有关控制信息,或设备的状态。
- 内存地址寄存器(MAR) 。在输入时,它存放把数据从设备传送到内存的起始目标地址;在输出时,它存放由内存到设备的内存源地址。
- 数据寄存器(DR) 。用于暂存从设备到内存或从内存到设备的数据。
- 数据计数器(DC) 。存放本次要传送的字(节)数。
如下图所示,DMA方式的工作过程是: CPU 接收到I/O 设备的DMA 请求时,它给I/0
控制器发出一条命令,启动DMA 控制器,然后继续其他工作。之后CPU 就把控制操作委托给DMA 控制器,由该控制器负责处理。DMA 控制器直接与存储器交互,传送整个数据块,每次传送一个字,这个过程不需要CPU 参与。传送完成后,DMA 控制器发送一个中断信号给处理器。因此只有在传送开始和结束时才需要CPU的参与(预处理【设置CR、MAR、DC等】和后处理【中断处理、唤醒因该I/O阻塞的进程程等】)。
DMA控制方式与中断驱动方式的主要区别是:中断驱动方式在每个数据需要传输时中断
CPU, 而DMA 控制方式则是在所要求传送的一批数据全部传送结束时才中断CPU; 此外,中断驱动方式数据传送是在中断处理时由CPU 控制完成的,而DMA 控制方式则是在DMA 控制器的控制下完成的(前面提到了,加深印象!)。
【不算痛点】:如何进一步提高资源利用率呢?当然是请更牛逼的秘书(通道),老板(CPU)尽可能的从累活中解放出来。
4.通道控制方式
I/0 通道是指专门负责输入/输出的处理机。I/O通道方式是DMA方式的发展,它可以进一步
减少CPU的干预,即把对一个数据块的读(或写)为单位的干预,减少为对一组数据块的读(或写)及有关控制和管理为单位的干预。同时,又可以实现CPU、通道和I/0 设备三者的并行操作,从而更有效地提高整个系统的资源利用率。
例如,当CPU要完成一组相关的读(或写)操作及有关控制时,只需向I/O 通道发送一条I/O 指令,以给出其所要执行的通道程序的首地址和要访问的I/0 设备,通道接到该指令后,执行通道程序便可完成CPU 指定的I/O任务,数据传送结束时向CPU发中断请求。(都有预处理和后处理,毕竟CPU才是老板!)
I/O通道与一般处理机的区别是:通道指令的类型单一,没有自己的内存,通道所执行的通道程序是放在主机的内存中的,也就是说通道与CPU 共享内存。
I/O 通道与DMA方式的区别是:DMA 方式需要CPU 来控制传输的数据块大小、传输的内存位置,而通道方式中这些信息是由通道控制的。另外,每个DMA 控制器对应一台设备与内存传递数据,而一个通道可以控制多台设备与内存的数据交换(包工头;也是上面提到的三者能并行的原因)。
5.总(举个栗子)
科班的同学应该不用看这个栗子也早就理解了,但为了照顾跨考的同学(不来个三连吗?),举个栗子总结以上4种方式:
想象一位客户要去裁缝店做一批衣服的情形。
1)采用程序直接控制时,裁缝没有客户的联系方式,客户必须每隔一段时间去裁缝店看看裁缝
把衣服做好了没有,这就浪费了客户不少的时间。
2)采用中断驱动方式时,裁缝有客户的联系方式,每当他完成一件衣服后,给客户打一个电话,让客户去拿,与程序直接控制能省去客户不少麻烦,但每完成一件衣服就让客户去拿一次,仍然比较浪费客户的时间。
3)采用DMA 方式时,客户花钱雇一位单线秘书,并向秘书交代好把衣服放在哪里(存放仓库),裁缝要联系就直接联系秘书,秘书负责把衣服取回来并放在合适的位置,每处理完100 件衣服,秘书就要给客户报告一次(大大节省了客户的时间)。
4)采用通道方式时,秘书拥有更高的自主权,与DMA方式相比,他可以决定把衣服存放在哪里,而不需要客户操心。而且,何时向客户报告,是处理完100 件衣服就报告,还是处理完10000件衣服才报告,秘书是可以决定的。客户有可能在多个裁缝那里订了货,一位DMA 类的秘书只能负责与一位裁缝沟通,但通道类秘书却可以与多名裁缝进行沟通。
不要忘记去我的个人原创公zong号【程序员宝藏】----专注于计算机基础、编程、分享,获取【宝藏】哦!
作为过来人,有考研的小伙伴可以加我好友(公zong号有二维码,备注【考研】),免费解答相关问题,做你的知心大哥哥!我们一研为定!
觉得有收获?希望老铁们来个三连击(点赞、评论、收藏),让更多的人看到这篇文章!顺便也激励下我,嘿嘿!