月度归档:2015年04月

并发模型之——基本概念

      从很久之前在学校到现在我们编程的时候经常都有听说到并发编程,偶尔也会听到说并行,但我们很多人其实都不太清除并发与并行具体的区别在哪;我们刚开始学习编程语言的时候我相信我们写的都是串行程序,一步接着一步来,可以说这比并发程序更不容易出错,但在性能上要远不如并发;还有一种并发具有很强容错性:分布式程序,分布式程序也算是并发程序,还可以具有很强的容错性,可以分开部署;
     并发与并行有着本质上的区别。
     ****并发****指程序在同一时间只能做一个操作,但是可以在不同的时间点做多个操作;
     如:人是一个多线程的物种,只有你一个人的时候你开启多线程“一边炒菜,一边玩iPad”,但其实在某一时间点,人只可以做一件事,当我们翻炒菜的时候不可能还在玩iPad,当我们在玩iPad的时候不可能还能够翻炒菜,只有我们不在翻炒的时候才能够玩iPad,只有我们放下手中的iPad的时候才能够翻炒,但从时间概念上看我们还是在边炒菜边玩iPad;这样炒出来的菜可能不好吃,哈哈,就如并发编程一样存在资源的竞争,这里竞争的资源是手、眼睛,在计算机里是CPU,处处存在危机,一不小心就烧焦了,哈哈!
      并行****指在同一个时间点可以做几个相同的操作或几个不相同的操作;
      如:现在家有你和你女朋友两个人,这个时候就不用你炒菜了,在你女朋友炒菜的时候你就可以哔哩啪啦的玩iPad了,等你女朋友做好饭就你可以吃了(不是好男人);就如现在很多计算机中都有多个CPU,我们可以写出比并发性能更高可以同时跑在多个CPU上的程序,但前提是你要有条件(多个CPU的计算机);
      并发不是并行,有时候并行也是并发,有时候只是并行不是并发;只有当并行从整体上看是多个任务时才也是并发,但并行只是一个任务的时候那只是并行;
这个系列说的只是编程中的并发模型,可能有时候也会谈到并行,但重点是并发模型;

这系列文章主要将会谈论到这么几个并发模型:线程与锁模型、Actor模型、Go的CSP模型等;

通讯协议之——字节序

最近有接触通讯协议有碰到字节序,记得上学的时候有说过不过太久了不怎么记得了,现在我在这里说说字节序;

   我们都知道计算机存储数据的时候都是把数据转换成字节进行存储,而日常我们的程序或存储的数据通常都是由多个字节组成的,而不同的计算机或设备存储的规则又不一致,导致我们在多计算机、设备间传输数据时就要了解设备的字节存储(字节序)规则是怎样的,这就是我们要了解字节序的原因,在做网络编程,游戏编程时这是必须清楚的概念;

   比如:在我们使用的计算机编程语言中就有各种数据类型:byteintshortlong等等

a byte由八个bit组成,一个short由两个字节组成,一个int由四个字节组成等,而我们对byteshortint等这些数据进行存储或通过网络传输时需要把他转换为byte进行存储或传输,这时把一个int转为byte数组时的数据存储顺序就成为:字节顺序。

        例如:  int 类型数据 33818120对应的十六进制为0x02040608
              转成byte数组后byte数据为byte[4]= 02,04,06,08
              byte数组中的数据的顺序就称为:字节顺序

为什么在存储或网络编程的时候要关注字节顺序呢?在网络编程中比如我们发送的数据为:byte[4]= {02,04,06,08}而接收端不清楚我们的字节顺序而使用与我们相反的字节顺序接收数据:byte[4]= {08,06,04,02}这就导致接收端收到的数据变成了错误无效的数据,我们发送的数据为:33818120,而现在由于他不知道我们的字节顺序导致接收到的数据为134611970

在英文上这个词为endian,有翻译为端序、字节序等等,我这里称为【字节序】,据说endian这个词的由来源自18世纪的一本小说《格列佛游记》,小说中:“吃鸡蛋时是从鸡蛋较大的一端打破鸡蛋还是从鸡蛋较小的一端打”,还以为这事有了叛乱;1980年一个网络协议的开发者在其著名的论文《On Holy Wars and a Plea for Peace》中首次使用了该词。

   从字面上理解字节序为:字节存储顺序,上面我们也说过实际上字节序就是程序对象、数据存储在计算机上的顺序,一般字节序分为:小字节序(Little-Endian)、大字节序(Big-Endian)、混合字节序(Mixed-Endian)三种,混合字节序用得比较少,TCP/IP各层协议使用的是大字节序(Big-Endian)我们也称为网络字节序

 

     有块地址空间四个字节长度如下:

 

 

例如:十进制数 33818120  十六进制为:0x02040608

    在地址空间中以大字节序、小字节序存储为如下格式:

 

大字节序(Little-Endian)在地址空间中存储格式:

                 

小字节序(Big-Endian)在地址空间中存储格式:

                     

 

大字节序(Big-Endian)   :数据的高位存储在地址空间的低位,数据的低位存储在地址空间高位
小字节序(Little-Endian):数据的低位存储在地址空间的低位,数据的高位存储在地址空间高位

java中使用的是大字节序(Big-Endian)存储数据,而C/C++存储则与CPU相关,所以在网络编程中一端为java开发的程序,一端为C/C++中的程序在传输的时候需要对传输的数据字节序(Endian)进行统一,都是用小字节序(Little-Endian)或大字节序(Big-Endian),否则一端接收到的数据将有可能为无效数据。