一、状态介绍在理解其他概念之前,首先要了解进程的几种状态。程序在运行过程中,由于操作系统调度算法的控制,程序会进入几种状态:就绪、运行和阻塞。就绪(Ready)状态:当进程已经分配了除CPU以外的所有必要资源,只要获得处理器就可以立即执行,此时的进程状态称为就绪状态。Executing/Running(运行)状态当进程已经获取了处理器,其程序正在处理器上执行时,此时的进程状态称为执行状态。阻塞(Blocked)状态下正在执行的进程,当它因为等待事件发生而无法执行时,就会放弃处理器,处于阻塞状态。导致进程阻塞的事件可以有很多种,例如等待I/O完成、申请不能满足的缓冲区、等待信件(信号)等等。2.同步与异步所谓同步,就是当一个任务的完成需要依赖另一个任务时,只有等待被依赖的任务完成,才能认为被依赖的任务完成。这是一个可靠的任务序列。要么成功就是成功,失败就是失败,两个任务的状态可以保持一致。所谓异步,就是不需要等待依赖任务完成,而是通知依赖任务要做什么工作,依赖任务会立即执行,只要整个任务自己完成即可。至于被依赖的任务最终是否真正完成,无法确定依赖于它的任务,因此是一个不可靠的任务序列。2.1例子比如我去银行办理业务,可能有两种方式:第一种方式:选择排队等候;通知我轮到我处理业务的人;第一种:前者(排队等候)是同步等待消息通知,也就是我要等银行来办理业务;第二种:后者(waitingfornotificationfromothers)就是异步等待消息通知。在异步消息处理中,等待消息通知的人(本例中为等待处理业务的人)往往会注册一个回调机制。一种机制(在这种情况下是一个写在小纸条上的数字,大喊)找到等待事件的人。3.阻塞和非阻塞阻塞和非阻塞这两个概念与程序(线程)等待消息通知(无论同步还是异步)的状态有关。也就是说,阻塞和非阻塞主要是程序(线程)等待消息通知的状态。3.1例子继续上面的例子,不管是排队还是用号码等待通知,如果在等待过程中,waiter除了等待消息通知不能做其他事情,那么该机制就被阻塞了,表现在程序,即程序已经阻塞在函数调用处,无法继续执行。相反,有些人在银行办理这些业务时喜欢边打电话边发短信等。这个状态是非阻塞的,因为他(服务员)并没有阻塞在这个消息通知上,而是自己在等待的时候是东西。注意:同步非阻塞形式实际上是低效的。想象一下,您需要在打电话时抬头看看队列是否由您决定。如果把调用和观察排队位置看成是程序的两个操作,程序需要在这两种不同的行为之间来回切换,效率之低可想而知;而异步非阻塞形式则没有这个问题,因为调用是你的工作(服务员),通知你是计数器的工作(消息触发机制),程序不会来回切换两种不同的操作。四、同步/异步与阻塞/非阻塞4.1同步阻塞形式效率最低。就拿上面的例子来说,就是你专心排队,什么都不做。4.2异步阻塞形式如果在银行等待业务的人使用异步方式等待消息被触发(通知),即收到小纸条,如果期间不能离开银行做其他事情这时候的事情,那么显然,这个人就被挡在了这个等待的操作上。异步操作可以被阻塞,但不是在处理消息时阻塞,而是在等待消息通知时阻塞。4.3同步非阻塞形式其实是低效的。想象一下,当您正在打电话时,您需要抬头看看队列是否由您决定。如果把调用和观察队列位置看成是程序的两个操作,那么这个程序就需要介于这两个不同的行为之间。来回切换,效率之低可想而知。4.4异步非阻塞形式效率更高,因为调用是你的工作(服务员),通知你是计数器的工作(消息触发机制),程序不会在两个不同的操作之间来回切换。比如这个人突然意识到自己烟瘾大,需要出去抽根烟,就跟大堂经理说,等他的号码排队的时候,请到外面通知我,这样才不会堵在里面这个等待操作上面,自然这是异步+非阻塞的方式。很多人混淆了同步和阻塞,因为同步操作往往以阻塞的形式出现。同样,很多人也把异步和非阻塞搞混了,因为异步操作一般不在真正的IO操作中。阻止。
