讨论三个问题:
1、进程间如何通信呢,如何来相互传递信息呢?
(1)、低级通信:只能传递状态和整数值(控制信息)
–信号量(semaphore)
–信号(signal)
(2)、高级通信:能够传送任意数量的数据
–共享内存(shared memory)
–消息传递(message passing)
–管道(pipe)
剪贴板:
基本机制是:系统预留的一块全局共享内存,可用于被各进程暂时存储数据。写入进程首先创建一个全局内存块,并将数据写到该内存块;接受数据的进程通过剪贴板机制获取此内存块的句柄,并完成对该内存块数据的读取。
管道包括三种:
管道(Pipe)实际是用于进程间通信的一段共享内存,创建管道的进程称为管道服务器,连接到一个管道的进程为管道客户机。一个进程在向管道写入数据后,另一进程就可以从管道的另一端将其读取出来。匿名管道(Anonymous Pipes)是在父进程和子进程间单向传输数据的一种未命名的管道,只能在本地计算机中使用,而不可用于网络间的通信。
1)
普通管道PIPE, 通常有种限制,一是半双工,只能
单向传输; 二是只能在
父子或者兄弟进程间使用.
2)
流管道s_pipe: 去除了第一种限制,可以
双向传输.
3)
命名管道:name_pipe, 去除了第二种限制,
可以在许多并不相关的进程之间进行通讯.
邮件槽:
邮件槽(Mailslots)提供进程间
单向通信能力,任何进程都能建立邮件槽成为邮件槽服务器。其它进程,称为邮件槽客户,可以通过邮件槽的名字给邮件槽服务器进程发送消息。进来的消息一直放在邮件槽中,直到服务器进程读取它为止。一个进程既可以是邮件槽服务器也可以是邮件槽客户,因此可
建立多个邮件槽实现进程间的双向通信。 通过邮件槽可以给本地计算机上的邮件槽、其它计算机上的邮件槽或指定网络区域中所有计算机上有同样名字的邮件槽发送消息。广播通信的消息长度不能超过400字节,非广播消息的长度则受邮件槽服务器指定的最大消息长度的限制。
邮件槽与命名管道相似,不过它传输数据是
通过不可靠的数据报(如TCP/IP协议中的UDP包)完成的,一旦网络发生错误则无法保证消息正确地接收,而命名管道传输数据则是建立在可靠连接基础上的。不过邮件槽有简化的编程接口和给指定网络区域内的所有计算机广播消息的能力,所以邮件槽不失为应用程序发送和接收消息的另一种选择。
优缺点:
邮槽最大的一个缺点便是只允许从客户机到服务器,建立一种不可靠的单向数据通信。
而另一方面,邮槽最大的一个优点在于,它们使客户机应用能够非常容易地将广播消息发送给一个或多个服务器应用。
共享内存:
存在于内核级别的一种资源,共享内存指在多处理器的计算机系统中,可以被不同中央处理器(CPU)访问的大容量内存。由于多个CPU需要快速访问存储器,这样就要对存储器进行缓存(Cache)。任何一个缓存的数据被更新后,由于其他处理器也可能要存取,共享内存就需要立即更新,否则不同的处理器可能用到不同的数据。共享内存 (shared memory)是 Unix下的多进程之间的通信方法 ,这种方法通常用于一个程序的多进程间通信,实际上多个程序间也可以通过共享内存来传递信息。
2、当两个或者多个进程访问共享资源时,如何确保他们不会相互妨碍-----进程互斥问题。
原因:
进程宏观上并发执行,依靠时钟中断来实现微观上轮流执行。当两个或者多个进程对同一个共享内存访问,结果不能预测。在同一时刻,只允许一个进程访问该共享数据,即如果当前已有一个进程正在使用该数据,那么其他进程暂时不能访问。这就是互斥的概念。
实现互斥访问的四个条件:
(1)、任何两个进程都不能同时进入临界区;
(2)、不能事先假定CPU的个数和运行速度;
(3)、当一个进程运行在它的临界区外面时,不能妨碍其他的进程进入临界区;
(4)、任何一个进程进入临界区的要求应该在有限时间内得到满足。
(解决办法)
(1)、用标志位加锁。
lock的初始值为0,当一个进程想进入临界区时,先查看lock的值,若为1,说明已有进程在临界区内,只好循环等待。等它变成了0,才可进入。
缺点是:lock也是一个共享资源,当进程竞争lock时,可能会出现问题。加锁标志位法的缺点在于可能出现针对共享变量 lock 的竞争状态。例如,当进程 0 执行完循环判断语句后,被时钟中断打断,从而可能使多个进程同时进入临界区。
是一种不安全的做法、
(2)、强制轮流法
基本思想:每个进程严格地按照轮流的顺序来进入临界区。
优点:保证在任何时刻最多只有一个进程在临界区
缺点:违反了互斥访问四条件中的第三个条件,当一个进程运行在它的临界区外面时,不能妨碍其他的进程进入临界区
(3)、Peterson方法。
当一个进程想进入临界区时,先调用enter_region函数,判断是否能安全进入,不能的话等待;当它从临界区退出后,需调用leave_region函数,允许其它进程进入临界区。两个函数的参数均为进程号。
小结:
当一个进程想要进入它的临界区时,首先检查一下是否允许它进入,若允许,就直接进入了;若不允许,就在那里循环地等待,一直等到允许它进入。
缺点:
1)浪费CPU时间;
2)可能导致预料之外的结果(如:一个低优先级进程位于临界区中,这时有一个高优先级的进程也试图进入临界区)
3、当进程间存在某种依存关系时,如何来调整他们运行的先后次序-----进程同步问题。
用P,V原语操作实现同步(略)
另外:上述的问题也适合线程吗??
posted on 2011-10-07 15:44
Yu_ 阅读(1364)
评论(0) 编辑 收藏 引用 所属分类:
Windows程序设计