在说io的五中模型之前,先说说Io把文件从哪里移到了哪里
自己的理解:
根据工作或者遇到的业务. 文件不可能存在缓存或在内存中,因为缓存和内存不能永久性储存东西,
文件需要被永久性储存.因此文件都存在电脑的硬盘里, 或者存在云服务器的它们的硬盘里.
我们io文件,
第一种情况:对文件的内容进行修改
就是先去硬盘读取文件, 然后把文件读取到内存, 再对文件的内容进行修改,然后再把文件存到硬盘
第二种情况:不对文件的内容进行修改
就是先去云服务器的硬盘读取文件, 然后把文件读取到云服务器的内存, 然后把云服务器的内存的文件上传到web服务器, 然后我们再从web服务器上下载文件到我们自己电脑的硬盘里.
第三种情况:不对文件的内容进行修改
就是先去自己电脑的硬盘读取文件, 然后把文件读取到自己电脑的内存, 然后把自己电脑的内存的文件上传到web服务器,然后我们再从web服务器上下载文件到我们自己电脑的硬盘里.
io的五种模型
说到I/O模型,都会牵扯到同步、异步、阻塞、非阻塞这几个词,以下讲解这几个词的概念。
阻塞和非阻塞
阻塞和非阻塞指的是执行一个操作时等操作结束再返回结果,还是马上返回结果。
阻塞(blocking):指IO操作需要彻底完成后才返回到用户空间,调用结果返回之前,调用者被挂起(当前线程进入非可执行状态,在这个状态,CPU不会分配时间片,线程暂停运行)只有到到结果才进入活动状态;
阻塞例子:海底捞的服务器为你点菜,当你点完菜后,服务员把消息传到后厨,这时你就在餐桌上等待,直到厨师把汤锅和配菜都准备好以后送到你桌上,你才能开吃。在上菜的过程中你还不能离开,因为你离开了之后服务员上菜了却找不到你人,所以你就是能等待,这个时候你处于阻塞等待状态,就是前面说的,你是调用者,你被挂起了,进入了非可执行状态。
非阻塞(nonblocking):指I/O操作被调用后立即返回给用户一个状态值,无需等到I/O操作彻底完成,最终的调用结果返回之前,调用者不会被挂起;
非阻塞例子:海底捞的服务器为你点菜,当你点完菜后,服务员把消息传到后厨,过了三分钟,你跑到后厨问,我的锅底或者肥牛卷好了没有?后厨说没好,然后你去处理其它事情,然后又过了五分钟,你又跑到后厨问,我的某个菜好了没有,如果没有,你还是继续做其他事情,然后等会再问一次,这个时候就是在I/O操作的同时,你没有被挂起,可以操作其他事情,但是如果I/O操作完成,你需要立马接受。
明天再学吧!!!!!!,这个有点多 哭哭哭
这是一个很好的关于并发/并行系统的问题。简单回答就是:IO所需要的CPU资源非常少。大部分工作是分派给DMA完成的。
对于磁盘IO,真实发生的场景可能是这样的:
CPU说:硬盘兄帮我把我要看的小电影拷贝一份到主存,谢谢,亲。
硬盘说:好的!我考完了叫你。
CPU说:么么哒!那我打游戏去啦!
...
CPU打撸啊撸 (100纳秒过去了)
...
硬盘说:小C我考完了。
CPU说:苍老师我来啦!
当然我们也可以到网上下载苍老师的作品,这就是网络IO。但情况基本是一样的,CPU童鞋在等小电影的过程中,打了一局撸啊撸。
所以,正因为这样派发任务,通讯,等待的过程,并发系统才彰显出它的意义。当然实际过程可能比这个复杂一万倍。比如CPU是不会直接和硬盘对话的,他们之间有个中间人,叫DMA(Direct Memory Access)芯片.
CPU计算文件地址 ⇒ 委派DMA读取文件 ⇒ DMA接管总线 ⇒ CPU的A进程阻塞,挂起 ⇒ CPU切换到B进程 ⇒ DMA读完文件后通知CPU(一个中断异常) ⇒ CPU切换回A进程操作文件
这个过程,对应下图(图源:《UNIX网络编程》),看到application这一列时间线了吗?aio_read操作之后,都是空白,CPU就不管了,可以做其他事去了。
假设原先读取文件CPU需要傻等50纳秒。现在尽管两次上下文切换要各消耗5纳秒。CPU还是赚了40纳秒时间片。
上面讲的是传统5大IO模型中的“异步IO”的大致过程。
---------------------------------------------------------------------------------------------------------------------
此文来源于下面的链接.
I/O会一直占用CPU吗? - 胖君的回答 - 知乎 https://www.zhihu.com/question/27734728/answer/127095338