同步与异步解析

编程中的同步(Synchronous)/异步(Asynchronous)/并发:


(一)传输中的同步,异步:
(1)同步传输:


(2)异步传输:
1)定义:
异步传输是以字符为单位,每个字符都要附加一位起始位和一位停止位,以标记一个字符的开始以及结束。起始位对应二进制0,占用一位宽度;停止位对应二进制1,占用1-2位宽度。
另外,一般还会附加一位奇偶校验码,可以选择奇校验或者偶校验来对该字符进行简单的差错控制。


异步传输实际是指字符与字符之间(一个字符的结束与下一个字符的开始)的时间间隔是可变的。


2)传输条件:


1.发送端与接收端需要采用相同的数据格式(字符的位数,停止位的位数,有无校验位以及校验方式)
2.相同的传输速率。典型的速率有9600b/s, 19.2kb/s , 56kb/s等


3)优点:
异步传输又称为 起止式异步传输,
优点为:简单,可靠,适用于面向字符,低速的异步通信。


如:计算机与Modem(调制解调器)之间的通信,计算机键盘与主机之间的通信。


4)缺点:
通信开销大,没传输一个字符,需要额外附加2-3位。


========
(2)同步传输:


1)定义:
同步传输是以数据块(数据帧)为传输单位,每个数据块的头部和尾部都要附加一个特殊的字符或者比特序列,标记数据块的开始和结束,一般还要附加一个校验序列(比如16位或者32位的CRC校验码),以便对数据块进行差错控制。
所谓同步传输是指数据块与数据块之间的时间间隔是固定的。


2)条件:
发送方和接收方的时钟是统一的,数据块与数据块之间的传输是同步无间隔的。即时钟需要保持在相同的频率,以保证单位时间内读取的信号单元数相同。
发送器需要在每个数据块(每帧数据)前面添加时钟同步信号,以控制接收器的时钟同步。


======
(3)比较:


1)
同步传输:如果数据没有被对方确认收到,则调用传输的函数就不返回。


异步传输:调用一个函数发送数据,马上返回,可以继续处理其他事。


============================


(二)编程中的同步,异步:


(1)理解一:
1.同步:
A在做事件1前,发送一个消息给B,得到B的回复后,才可以做事件1,否则一直等待B的答复。


2.异步:
A在事件1前,发送给一个消息给B,然后就可以做事件1了,无论是否得到B的答复。


(2)理解二:
同步是阻塞模式,异步是非阻塞模式。


同步是指:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式。  
异步是指:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。  


(3)例子:


1)普通B/S模式(同步)AJAX技术(异步)
同步:提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事
异步: 请求通过事件触发->服务器处理(这是浏览器仍然可以作其他事情)->处理完毕


2)打电话时同步 发消息是异步。


(4)线程中的同步,异步:


1)线程同步与异步:
线程同步是多个线程同时访问同一资源,等待资源访问结束,浪费时间,效率低 。
线程异步:访问资源时在空闲等待时同时访问其他资源,实现多线程机制。


2)同步的使用场景:
多个线程同时访问一块数据,也叫共享区。对于多个线程同时访问一块数据的时候,必须使用同步,否则可能会出现不安全的情况。
但是,多个线程同时访问一块数据,有一种情况不需要同步技术,那就是原子操作,也就是说操作系统在底层保证了操作要么全部做完,要么不做。
3)转换:
在实现上,同步的过程会阻塞进程的所有其他操作,将同步转换为异步的最常见方法则是将会阻塞进程的等待操作放入到一个新的进程中,同时为该等待操作添加一个监视器,在检测到等待操作完成的时候结束等待的进程。


4)同步异步理解:


1:同步可以看做是一个单线程操作,只要客户端请求了,在服务器没有反馈信息之前是一个线程阻塞状态(就是假死状态,不能操作其他方法)。
2:异步肯定是个多线程。在客户端请求时,可以执行其他线程,并且在把这个线程存放在他的队列里面,有序的执行。(可以设置线程的数量,当超过最大时会显示等待状态)。


3:同步比异步实现起来简单一些,用于读取数据量较小的接口。
            异步可以按规定顺序去执行线程,多用于 比如一个网页信息 ,(你把他分成2个线程或者多个,先读取它的title,时间,作者等等 第二个或者其他进程用于读取数据量较大的正文内容,比如图片)。这样对于用户体验很有效果。


 4:同步为线程阻塞,异步为线程非阻塞。


 1)同步意为着线程阻塞,在主线程中使用此方法会不响应任何用户事件。所以,在应用程序设计时,大多被用在专门的子线程增加用户体验,或用异步请求代替。所有主程序中不能有同步。同步如下:


 - (IBAction)grabURL:(id)sender  { 
 NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"]; 
  ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 
  [request startSynchronous]; 
  NSError *error = [request error]; 
  if (!error) {  NSString *response = [request responseString];  }  



用 requestWithURL 快捷方法获取 ASIHTTPRequest 的一个实例


startSynchronous 方法启动同步访问


由于是同步请求,没有基于事件的回调方法,所以从 request的error 属性获取错误信息


responseString,为请求的返回 NSString 信息 *


注意:在这里我发现NsUrlRequset和connect系统Api就可以配合做到效果。也不需要到移植开源代码。




2)异步:异步请求的好处是不阻塞当前线程,但相对于同步请求略为复杂,至少要添加两个回调方法来获取异步事件


- (IBAction)grabURLInBackground:(id)sender  {  
NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"]; 
 ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];  
[request setDelegate:self];  
[request startAsynchronous]; 
 }  
 - (void)requestFinished:(ASIHTTPRequest *)request  { 
 // Use when fetching text data 
 NSString *responseString = [request responseString];  
 // Use when fetching binary data  
NSData *responseData = [request responseData];  
}   
- (void)requestFailed:(ASIHTTPRequest *)request  {  NSError *error = [request error];  } 


与上面不同的地方是指定了一个 “delegate”,并用 startAsynchronous 来启动网络请求


在这里实现了两个 delegate 的方法,当数据请求成功时会调用 requestFinished,请求失败时(如网络问题或服务器内部错误)会调用 requestFailed。


PS: 异步请求一般来说更常用一些,而且里面封装都挺不错的,至少比symbian等平台方便的多,而且还可以修改源代码。多数这个跟队列混合封装来达到图片和异步下载包的目的(已实现)。








一个进程启动的多个不相干线程,它们相互之间关系为异步。
同步的话指的是多线程同时操作一个数据这个时候需要对数据添加保护 这个保护就是线程的同步。

猜你喜欢

转载自blog.csdn.net/legend050709/article/details/45369387