总得来说,同步异步出现在以下几个领域:
1 计算机网络。
数据通信技术中有同步通信与异步通信。同步通信简单的说就是你在发送数据时候我必须同时接受。这个过程有精确的时钟控制。而异步通信是你在发数据时候必须加上开始与结束符号,这样我才可以接受,异步通信没有时钟控制。因为没有了时钟的控制(额外硬件),所以成本低,设备简单,但是传输效率较低。(开始与结束符占了开销)。
在网络协议(network protocol)的三大组成部分:语法,语义,同步。这时候同步指的是事件实现的顺序。比如建立tcp连接时候的三次握手实现顺序。
2 操作系统。
中断系统的一个特点就是可以对异步事件响应。异步事件指的是断断续续,随机,没有时序关系的事件。同步事件反之,一个事件从头到尾顺序执行,没有间断。
进程间的关系有同步与互斥。同步就是多个进程协调完成一个任务。比如,司机与售票员关系。司机停车---售票员开门----乘客上车---售票员关门---司机开车。在这个过程中任务就是拉乘客。司机和售票员作为两个进程协调工作。互斥指的是多个进程竞争同一个资源。这时资源叫做临界资源(任何时刻只允许一个进程访问,三个线程可以同时时一个变量iChange减1,但任何时间只允许一个对其进行操作,火车售票问题如果不加同步最终票数会出现负值。)。
在现代操作系统中,有并发性,共享性,虚拟性,不确定性四大基础特征。而程序并发活动的实现是异步(一个程序走走停停),并发控制的时候需要用到同步技术。(Java多线程中可以使用Synchronized实现同步控制),所以并发控制需要同步,并发的实现是异步,同步过多又会导致死锁。在并发领域有一句经典的话,并发执行的可串行化。那么并行是什么?并行才是真正的并发。并发只不过在占用时间片不同上实现的。
I/O模型中,频繁出现的有同步与异步,阻塞与非阻塞。要想弄清这个问题,必须了解冯诺依曼体系结构与进程状态模型。首先理解I/O在计算机体系中作用。
一个输入操作包含两个过程:
1 等待数据准备好
2 从内核向进程复制数据。
同步与异步在I/O中指的是一种数据访问机制。
同步指的是主动请求后等待I/O,数据就绪后读写必须阻塞。
异步指的是主动请求后,可处理其他任务,等I/O完毕后通知。
阻塞指的是进程访问的数据未就绪,进程必须等待。
非阻塞指的是进程访问数据未就绪,进程可以不用等待。
进程一般有五种状态,创建进程,此时进程在就绪队列中等待cpu调度,当在cpu上执行时,此时为运行态,运行过程中可能遇到I/O请求此时进入阻塞状态,或者进程执行完,进入死亡状态。阻塞的时候,当所需资源满足时,从阻塞状态转化为就训态。如此反复。
有了以上基础知识的积淀,现在来看常用I/O模型。
完整模型请参考《Unix网络编程卷1》P127.
举个例子吧:纯概念实在难以理解。
如果说我(某个进程)去食堂吃饭(任务A),吃完后要去图书馆(任务B)。也可以去教室。(任务C)等待阿姨把饭做好。
阻塞式I/O就是我一直在等阿姨做饭。直到吃上饭。
非阻塞式I/O就是我在等的时候,会一直问阿姨饭好了没有,直到吃上饭。
同步阻塞式I/O和同步非阻塞式I/O都会使得进程阻塞。(任务卡在A那里不动了)
I/O复用涉及到select,poll函数,由于未深入理解,例子没想到。
信号驱动式就是我在等的时候,也在等其他信号,比如阿姨使眼色我让我吃饭,直到吃上饭。
异步I/O就是我在等的时候,可以去图书馆也可以去教室,饭好了后,阿姨会叫我吃饭。(发起任务A到通知结束A时候过程中可以执行选择性执行A,B,C,而不会把阻塞到任务A那里)。
看了这么多,那究竟什么是同步与异步呢?必须放在具体的环境以及项目中去深入理解。
这是我所知道的同步与异步在计算机中出现的地方,文中有很多观点是我自己理解的,可能不符合真实的含义,希望大家帮我纠正下。不甚感激。个人水平实在有限,没有贡献关于同步异步的代码。
这是我的第一篇技术博客,没想到竟然花费了2个多小时。发现自己理解的---写出来----说出来---说出来让别人理解的难度水平在递增,写作过程也是一个梳理知识体系以及思考的过程。希望自己可以坚持写博客。
本文出自 “我的博客” 博客,请务必保留此出处http://thinklili.blog.51cto.com/10867130/1742869
原文地址:http://thinklili.blog.51cto.com/10867130/1742869