那些分不清的编程术语
这篇博文主要分享序列化/反序列化、并行/并发、同步/异步等概念
序列化/反序列化
定义及相关概念
序列化和反序列化属于通讯协议的一部分。通讯协议往往采用分层模型,不同模型每层的功能定义以及颗粒度不同。例如:TCP/IP协议是一个四层协议,而OSI模型却是七层协议模型。在OSI七层协议模型中展现层(Presentation Layer)的主要功能是把应用层的对象转换成一段连续的二进制串,或者反过来,把二进制串转换成应用层的对象——这两个功能就是序列化和反序列化。
- 序列化:将数据结构或对象转换成二进制串的过程
- 反序列化:将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程
数据结构、对象与二进制串
不同的计算机语言中,数据结构、对象、二进制串的表示方式不同。
- 数据结构和对象:对于类似Java这种完全面向对象的语言,工程师所操作的一切都是对象(Object),来自于类的实例化。在Java语言中最接近数据结构的概念,就是POJO(Plain Old Java Object)或者Javabean——那些只有setter/getter方法的类。而在C++这种半面向对象的语言中,数据结果和structural对应,对象和class对应。
- 二进制串:序列化所生成的二进制串指的是存储在内存中的一块数据。C++语言具有内存操作符,所以二进制串的概念容易理解。例如:C++语言的字符串可以直接呗传输层使用,因为其本质上就是以“\0”结尾的存储在内存中的二进制串。在Java语言中,二进制串的概念容易和string混淆。实际上string是Java的一种特殊对象。对于跨语言间的通讯,序列化后的数据当然不能是某种语言的特殊数据类型。二进制串在Java里面所指的是byte[],byte是Java的8种原生数据类型之一(Primitive data types)。
并行/并发
并发和并行从宏观上来讲都是同时处理多路请求的概念。但并发和并行又有区别,并行是指两个或者多个事件在同一时刻发生;而并发是指两个或者多个事件在同一时间间隔内发生。
- 并发的实质是一个物理CPU(也可以多个物理CPU)在若干道程序之间多路复用,并发性是对有限物理资源强制行使多用户共享以提高效率。并发是在同一个CPU上同时运行多个程序(cpu在多个程序之间切换)
- 并行性是指两个或两个以上事件或活动在同一时刻发生。在多道程序环境下,并行性使多个程序同意时刻可在不同CPU上同时执行。(并行是每个cpu运行一个程序)
同步/异步
进程同步用来实现程序并发执行时候的可再现性。
概念
- 进程同步:就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。也就是必须一件事一件事做,等前面一件做完了才能做下一件事。其实绝大多数函数都是同步调用。但一般而言,我们再说同步、异步的时候,特指那些需要其他部件协作或者需要一定时间完成的任务。例如:SendMessage,该函数发送一个消息给某个窗口,在对方处理完消息之前,这个函数不返回。当对方处理完以后,该函数才把消息处理函数所返回的result值返回给调用者。
- 异步:异步的概念和同步相对,但一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。以casycsocket类为例(注意,csocket从casyncscoket派生,但是其功能已经从异步转化为同步),当一个客户端通过调用connect函数发出一个连接请求后,调用者线程立刻可以朝下运行。当连接真正建立起来后,socket底层会发送一个消息通知对象。
同步阻塞与异步阻塞
同步是阻塞模式,异步是非阻塞模式。
- 同步是指两个线程的运行是相关的,其中一个线程要阻塞等待另外一个线程的运行。同步是指:发送方发出数据后,等接收方发回响应以后才发送下一个数据包的通讯方式。
- 异步是指两个线程毫无相关,自己运行自己的。异步是指:发送发发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。