IO模型--同步/异步 阻塞/非阻塞

    到底什么是IO,我们之前经常说的IO就是指进行文件的写入和读取操作所做的操作, 但是在操作系统层面的IO并不是这么狭义。从键盘获取数据从socket都可以称作IO。

  在正式介绍IO之前我们需要先弄清楚几个概念。

  • 用户空间和内核空间

    我们都听过虚拟内存的概念,现在的操作系统都是采用的虚拟存储器,对于32位系统来说,他的地址位有32个比特位,也就是说他最大可以访问2的32次方个比特位的数据,也就是4G,操作系统的核心是内核,他和我们普通下载一个应用程序来说是不一样的,他可以访问跟多受保护的内存空间,并且也可以访问底层的硬件设备,为了保证普通用户的进程不能直接操作计算机的内核,保证内核的安全,操作系统就把虚拟空间分成了两部分,一部分是内核空间,一部分是用户空间,对于Linux操作系统来说,最高的是1G字节从c0000000到ffffffff是让内核来使用的,低的00000000到bfffffff 3G内存空间是让用户进程来使用的。

  • 进程切换

   我们既然了解了进程的概念就很容易理解进程切换,内核要有能力让正在CPU上执行的程序下来,并且让CPU执行以前停止的某个进程,这个过程就是进程切换,任何进程都是在操作系统内核的支持下运行的。从一个进程切换到另一个进程的时候需要1.保存处理上下文,包括程序的计数器和一些寄存器2.更新进程块PCB的信息3.把正在执行的进程PCB移到等待队列中等待下次唤醒4.选择另一个进程更新他的PCB 5.更新内存管理的数据结构 6.恢复当前进程的处理上下文。这个过程是十分消耗资源的。

  • 什么是阻塞、非阻塞、什么是同步、异步

    我们首先说什么是同步什么是异步,这两个概念的区别在消息的通知机制有关,也就是说同步和异步的最大区别就在消息的通知机制。

    同步就是当一个进程完成的前提是另一个任务的时候,只有等待被依赖的任务完成之后任务才算完成,这是一种可靠的任务序列,要么两个都成功,要么都失败了,两个任务的状态是一致的,但是对于异步来说,不需要等待被依赖的任务完成,只是告诉被依赖的任务要完成什么工作,依赖的任务也直接去执行,只要各自完成各自的任务就算整个任务都完成了,至于被依赖的任务是不是完成了,不清楚,所以他是一个不可靠任务队列。

    当一个同步的调用发出之后,调用者要一直等待消息的返回结果,通知后才能继续执行,但是当一个异步过程调用发出去之后,调用者不能立刻得到返回消息,实际处理在这个调用的部件完成之后,通过状态。通知和回调来通知调用者。

    假如我现在去医院看病都会有挂号的机制,当我挂了号之后,如果我站在门诊吗门口一直等一直等,不断的在等待医生的处理情况,那我就是同步的等待。如果说我现在拿了好就去坐着等着,等待门诊医生的回调机制,当该我去看病的时候就会触发这个机制,然后直接找到我告诉我轮到你了该去看病了。这就是同步和异步的区别。

    那什么是阻塞什么是非阻塞。很多时候大多人会认为阻塞?那不是和同步一样么?非阻塞?那不是和异步一样么?其实这完全是两个方面的描述,对于异步和同步我们说了最大的区别是在消息的通知机制,但是对于阻塞和非阻塞来说最大的区别是在等待消息时候的状态有关。也就是说阻塞和非阻塞是进程在等待消息通知的时候的状态来区别的。

    阻塞调用是说,当调用的结果返回之前进程会被挂起,一直等待消息来,不能够执行其他任务,所以说还是上边那个例子,假如你拿了号无论你在哪,你啥都不干就等着轮到你看病,那你就就是阻塞的,如果说你拿了号之后开始玩手机,听音乐等等那就是非阻塞的,所以同步的实现方式会有多种,一种是同步阻塞,一种是同步非阻塞,同样异步也是这两种。阻塞非阻塞是在指不能立马得到结果之前,当前进程能不能再执行其他任务,虽然看着来说,可能非阻塞的方式更能提高我们的CPU利用率,但是就带来了大量的线程和进程之间的切换,我们上边也说了进程的切换时很浪费的,所以到底是阻塞还是非阻塞还是需要考虑。

    通常来说同步阻塞的效率是最低的,也就是说你拿了号之后一直在那等着其他事情也还不做,异步形式就是在当你拿到挂的号之后虽然没有排队但是 并没有去执行其他事情,异步操作是可以被阻塞的不过他并不是在处理消息的时候阻塞,而是在等待消息通知的时候阻塞。同步非阻塞的效率也是比较地低的。比如你现在排队边玩王者边不断的抬头看轮到你了没,这样不断的切换效率实际上也是比较低的。异步非阻塞的形式效率是比较高的,因为当你拿到号之后你再等候区去打王者,当该你去看病的时候自然会有回调机制来通知你。  

还有一个更容易理解的例子,下载文件,比如我现在要下载一个文件

1、同步阻塞的方式下载文件:一直盯着下载文件的进度条,等100%的时候就完成

      同步:我一直在等待下载完成的通知

      阻塞:等待下载完成的通知的过程中,不做其他任何事情,一直等着

2、同步非阻塞:提交下载任务之后,可以去做别的事情,但是每隔一段时间都要去看一下任务是否完成了

      同步:一直在等待下载任务的完成

      非阻塞:等待下载完成的过程中,去做了其他任务,不过需要不断的切换回来看一下是否完成了

3、异步阻塞:换了个有通知功能的下载软件,当完成后会通知我,但是我还是在盯着他,这是一个看起来很蠢的行为

      异步体现在:不用一直等待了,完成之后他会自动提醒我

      阻塞体现在:等待通知的过程中,我一直在盯着进度条等他完成

4、异步非阻塞:依然是有通知功能的下载软件,提交任务之后就去做别的事情

      异步体现在:下载完成后会给我一个通知告诉我完成

      非阻塞体现在:在提交任务之后我就可以去做别的事情,等待通知我就可以了。

所以同步和异步关注的是消息通知的方式,但是阻塞非阻塞关注的时候在等待消息过程中的状态,并没有说绝对的谁好谁坏,不同场景用不同的组合来实现不同的功能。

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值