进程的创建
进程本身是一个动态的实体,所以它本身在运行期间也通过创建进程系统调用,并且可以创建多个新进程,对于这句话我同样使用图解的方式来做个简单说明:
当一个进程创建一个新进程时,会存在两种可能的方式执行:
1. 父进程(继续执行)和子进程并行的执行;
2. 父进程等待部分或者全部子进程终止执行;
而新进程的地址空间也存在两种可能:
1. 子进程是父进程的一个COPY了;
2. 载入一个程序来运行;
到这里就有点感觉Erlang的进程思想端倪了(开始我咋看感觉有点象,但是越深入后就觉得确实就是到这个思想才形成了Erlang程序语言的意义本质,个人揣度啊,哈哈)既然有那么点思想的感觉,那我们就开始进入探讨阶段了。也正是下面即将要讲到的问题才印证一句话:技术的本质还存留在简单事物之上(个人总结,哈哈)。
进程间通信
进程间通信有两种本质的方式:
1. 共享缓冲区提供通信;
2. 消息传递;
大家有没有认真看到上面的四个字“消息传递”,对没错就是消息传递!那这里我就感觉是否就是这里和Erlang的语言所谈到的消息传递呢?尽管一个处于操作系统级别,而另一处于语言级别,但是初看给我的感觉是原理是否一致呢?呵呵,那就让我们来看看OS级别的进程间通信本质起了。
消息传递系统
消息系统的功能是允许进程与其他进程之间通讯不必借助共享数据,他们各自独立。而这里要说到一个概念,什么是IPC?
如果我们先不看它定义,而了解具体做法,看是一个什么效果。
到这里为止是不是感觉又和我们说的Erlang非常类似呢?真的没错。。。那就继续往下看看它到底如何而做了。有以下几种方法实现和Send/Receive操作的方法:
u 直接或者间接通信
u 对称或不对称通信
u 自动或手动缓冲
u 发送copy或者引用
u 定长消息或者变长消息
为了更好的说明上面各自的特征是如何引入和体现的,使用两个典型的进程p,q作为两个进程之间的通讯来加以演示。
直接通信:
这里就是两个非常赤裸的而且是非常利索的通信了:
u send(P,message) P发送一个消息给进程Q;
u receive(Q,message) 从进程Q中接收一个消息
特点:
1. 每对需要通信的进程之间自动建立一条链路,进程只需要知道彼此的进程标识符(Pid);
2. 一个连接就只连接到这两个进程;
因此这种机制在寻址上是对称的;发送者与接收者进程都必须要指明通信一方。不过这里要谈到它的一种特例:发送者需要知道接收者,但是接收者不需要知道发送者,其原语定义为:
Send(P,Message) 发送一个消息给P;
Receive(id,Message)从任意进程中接受一个消息;
由于通信是一种交互行为,所以一般情况来说我们有发送自然希望存在一个回复的交互动作,而像这种特例就无法知道它的这种情形,因此这种情况也是我们不希望所见的。
间接通信
间接通信中消息发送和接收则是通过邮箱(实际中更多的是端口方式,这里为了更好理解我们比作邮箱方式)进行的。若把邮箱看成一个对象,进程就可以把消息邮寄(放置)在其中,显而易见既然能够放入自然也就可以从邮箱中取出了。而每一个邮箱都有一个唯一的地址(标识符),进程可以通过不同的邮箱和其它进程通信了。两个进程只有共享一个邮箱才可以进程通信。因此基本构建和原语定义图示如下:
Send(A,M):发送消息(Message)给邮箱A;
Receive(A,M):从邮箱A接收到消息(M);
特点:
1. 只有在两个进程间有一个共享邮件箱下才能两者建立一个连接;
2. 一条链路可以连接两个或者更多的进程;
3. 每对通信进程之间可以同时存在多个不同的链路,而且每条链路对应一个邮箱;
那我们来看看直接通信和间接通信最大的区别是什么?没错,其实间接通信存在中间一个共享的邮箱,而正是这种方式才在以后的应用中得到广泛利用。这里就联想到Erlang语法的:Pid!M是否感觉很相似(注:M消息通知标示符为Pid的进程操作事件,而且具体在接受中也存在得到一个receive来获取消化了),在我看来它就是典型使用到了这个原理机制。这里来看一道例题:假如有两个进程P1,P2和P3都存在共享邮箱A,而且P2与P3正是从A中接收。那么谁 接收到P1发送来的消息呢?图示:
这里我们就需要具体讨论问题的实质了:
对照上面说讲到的间接通信特点,我们知道一条链路最多连接两个进程,同时最多允许任意选择进程来接收消息(现在这个例子中只存在P2,P3),所以他们两者只允许单独接收消息而不是同时接收消息。至于消息会发送给谁,这就需要系统本身来确定接收者了。因此,一个邮箱可能为一个进程或者操作系统所有,不难看出这个例子存在以下情况:
一旦拥有邮箱
A的
进程终止时,邮箱也就同时要消失,随后向该邮箱发送消息的进程就会被告知邮箱不存在。这里需要强调的是作为操作系统本身来说拥有一个邮箱是独立的不依赖于任何进程。所以操作系统有必要提供一种机制允许一个进程来专门做这个工作了,那是什么工作呢?具体有以下特征:
u 创建一个新邮箱;
u 通过这个邮箱发送和接收信息;
u 删除一个邮箱;
接下来就开始单独讨论所谓的这个“邮箱”的单独机制能够引发的一些线索了。
进程同步
通过消息传送来进程通信,这个是它本质所在。但是消息传送可能有阻塞或者无阻塞——同步和异步。所以这里就存在对于发送者和接收者的阻塞或无阻塞现象的讨论了,对于他们有一下特点:
1. 发送进程阻塞:发送进程被阻塞,直到接收进程接收消息;
2. 发送进程无阻塞:发送进程发送消息并且立刻恢复执行;
3. 接收进程阻塞:接收进程被阻塞,知道一个消息为有效;
4. 接收进程无阻塞:接收进程获取一个有效或空消息;
以上的方式还可以组合形成。
既然有阻塞和无阻塞现象,那立刻可以联想到我们的邮箱扩展成一种管道方式呢?没错这里就需要讲解下面的定义形成。
缓冲
这里只想对于三个定义了解:
u 零长度:无缓冲消息系统;
u 限定长度:
自动缓冲
u 无限长度:
这里单独把限定长度和无限长度提取出来定义:
限定长度:消息队列中存在N个消息,发送者在发送未满的队列中无阻塞。一旦队列满则阻塞直到出现空闲空间。
无线长度:消息队列有无限个消息,也不会阻塞发送者。
下面我们就要通过这些概念扩展到程序开发中经常会遇到的实例。
(待续。。。。。。)
posted on 2008-12-14 12:42
叶澍成 阅读(1200)
评论(0) 编辑 收藏 所属分类:
计算机系统