操作系统-同步和通信

进程同步
竞争关系
协作关系
进程通信
通信方式

进程同步

进程同步、互斥

进程同步、互斥是在并发进程下存在的概念,有了并发进程,就产生了资源的竞争与协作,从而要通过进程的互斥、同步、通信来解决资源的竞争与协作问题;
在多道程序设计系统中,同一时刻可能有许多进程,这些进程之间存在两种基本关系:竞争、协作
而进程的互斥、同步、通信都是基于这两种基本关系存在,为了解决进程间的竞争关系(间接制约),引入了进程互斥;为了解决进程间松散的协作关系(直接制约)引入了进程同步;为了解决进程间紧密的协作关系引入了进程通信。

竞争关系(互斥)

(互斥解决竞争)系统中多个进程之间彼此无关,互相不知道其他进程的存在,并且不受其他进程执行的影响;
例如:批处理系统中建立多个用户进程,分时系统中建立多个终端进程,而这些进程共用了一套计算机系统资源,因而,必然出现多个进程竞争资源的问题,当多个进程竞争共享硬设备、存储器、处理器和文件等资源时,操作系统就需要协调;

资源竞争出现两个控制问题:
一个是死锁deadlock,一组进程如果都获得了部分资源,还想要其他其他进程占有的资源,最终所有的进程都会陷入死锁(死锁出现条件参考上边关于线程)
另一个问题就是饥饿starvation,一个进程由于其他进程总是优先于他而被无限拖延;
操作系统需要保证多个进程能互斥的访问临界资源,既要解决饥饿问题,又要解决死锁问题;

进程的互斥mutual exclusion 是解决进程间竞争关系(间接制约)的手段,进程互斥指的是若干个进程要使用同一共享资源时,任何时刻最多运行一个进程使用,其他进程必须等待,直到占有资源的进程释放该资源;

互斥实现:

进程的互斥关系是一种特殊的进程同步关系,可以将同步机制与解决进程互斥看做一样;
其中,互斥的软件解决办法:Dekker算法与Peterson算法,管程,消息传递;
互斥的硬件解决办法为中断、使用机器指令;

附:peterson算法
为每个进程设置标志,当标志值为false时表示此进程要求进入临界区,另外再设置一个指示器turn以指示可以由哪个进程进入临界区,当turn=i时则可由进程Pi进入临界区。

在实际应用中,不同系统有不同的进程同步方法,Linux和Windows的主要同步和通信机制如下:
Linux:
Linux 下常见的进程同步方法有:SysVIPC 的 sem(信号量)、file locking / record locking(通过 fcntl 设定的文件锁、记录锁)、
futex(基于共享内存的快速用户态互斥锁)。针对线程(pthread)的还有 pthread_mutex 和 pthread_cond(条件变量)。

Linux 下常见的进程通信的方法有 :pipe(管道),FIFO(命名管道),socket(套接字),SysVIPC 的 shm(共享内存)、msg queue(消息队列),mmap(文件映射)。以前还有 STREAM,不过现在比较少见了(好像)。

Windows:
在Windwos中,进程同步主要有以下几种:互斥量、信号量、事件、可等计时器等几种技术。
在Windows下,进程通信主要有以下几种:内存映射、管道、消息等,但是内存映射是最基础的,因为,其他的进程通信手段在内部都是考内存映射来完成的。

协作关系(同步)

进程同步(直接制约):某些进程为了完成同一任务需要分工协作,由于合作的每一个进程都是独立的并以不可预知的速度推进,这就需要互相协作的进程在某些协调点上协调各自的工作。当合作进程中一个达到协调点后,在尚未得到其伙伴进程发来的消息或者信号之前应该阻塞自己,知道收到信号或者消息后才被唤醒继续执行;
这种协作进程之间互相等待对放消息或者信号的协调关系-进程同步;

进程间的协作可以是双方不知道对方名字的间接协作,也可以是双方知道名字,直接通过通信机制进行紧密协作;允许进程协同工作有利于共享信息、有利于加快计算速度、有利于实现模块化程序设计;

进程同步synchronization 是解决进程间协作关系(直接制约关系)的手段,进程同步指两个以上进程基于某个条件来协调他们的活动,一个进程的执行依赖于另一个协作进程的消息信号,当一个进程没有得到来自另一个进程的消息或信号时需要等待,直到消息或者信号到达才被唤醒;不难看出进程互斥关系是一种特殊的进程同步关系,即逐次使用互斥共享资源,也是对进程使用资源次序上的一种协调;

同步实现

进程同步:主要有四种方式:临界区Critical Section、互斥区Mutex、事件Event、信号量Semaphore;
1、临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问;在任意还上课只允许一个线程对共享资源进程访问,如果有多个线程视图访问公共资源,那么在有一个线程进入后,其他视图访问的线程将被挂起;
首先说一下临界区问题(Critical Section Problem)
临界区的问题的解答必须满足以下三个条件:
1)互斥:如果进程Pi在其临界区内执行,那么其他进程都不能在其临界区内执行。

2)有空让进:如果没有进程在其临界区内执行且有进程需进入临界区,那么只有那些不在剩余区内执行的进程可参加选择,以确定谁能下一个进入临界区,且这种选择不能无限推迟。

3)有限等待:从一个进程做出进入其临界区的请求,直到该请求允许为止,其他进程被允许进入其临界区的次数有上限。

2、互斥量:采用互斥对象机制;只有拥有互斥对象的线程才有访问公共资源的权限,以为互斥对象只有一个,所以能保证公共资源不会同事被多个线程访问;互斥不仅能实现同一应用程序的公共资源安全共享,还能实现不同应用程序的公共资源完全共享,互斥量比临界区复发,因为使用互斥不仅仅能在同一应用程序的不同线程中实现资源安全共享,还能在不同应用程序之间实现对资源的安全共享;

3、信号量:它允许多个线程同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目;
PV操作及信号量的概念都是由荷兰科学家E.W.Dijkstra提出的。信号量S是一个整数,S大于等于零时代表可供并发进程使用的资源实体数,但S小于零时则表示正在等待使用共享资源的进程数。
   P操作申请资源:
  (1)S减1;
  (2)若S减1后仍大于等于零,则进程继续执行;
  (3)若S减1后小于零,则该进程被阻塞后进入与该信号相对应的队列中,然后转入进程调度。

   V操作 释放资源:
  (1)S加1;
  (2)若相加结果大于零,则进程继续执行;
(3)若相加结果小于等于零,则从该信号的等待队列中唤醒一个等待进程,然后再返回原进程继续执行或转入进程调度。

4、事件:通过通知操作的方式来保持线程同步,还可以方便实现对多个线程的优先级比较的操作;

同步总结:

1、互斥量与临界区的作用十分相似,但是互斥量可以命名,也就是说可以跨越进程使用。所以创建互斥量需要的资源更多,所以如果只为了在进程内部使用的话,使用临界区会速度上有优势减少资源使用量。因为互斥量是跨越进程的,一旦被创建,就可以通过名字打开;

2、互斥量、信号、事件、都可以跨越进程使用来进行同步数据操作,而其他的对象与数据同步操作无关,但是对于进程和线程来说,如果进程和线程在运行状态则为无信号状态,退出后则为有信号状态,所以可以使用WaitForSingleObject来等待进程和线程退出;

3. 通过互斥量可以指定资源被独占的方式使用,但如果有下面一种情况通过互斥量就无法处理,比如现在一位用户购买了一份三个并发访问许可的数据库系统,可以根据用户购买的访问许可数量来决定有多少个线程/进程能同时进行数据库操作,这时候如果利用互斥量就没有办法完成这个要求,信号灯对象可以说是一种资源计数器;

进程通信

进程通信的概念:IPC

并发进程之间的交互必须满足两个基本要求:同步和通信;
进程竞争资源时要实施互斥,互斥是一种特殊的同步,实质上需要解决好进程同步的问题,进程同步是一种进程通信,通过修改信号量,进程之间可以建立起联系,相互协调运行和协同工作。

但是信号量与pv操作只能传递信号,并没有传递数据的能力,有些情况下进程之间交换的信息量很少,例如仅是交换某个状态信息,但是很多情况下进程之间需要交换大批数据,如传送一批信息或整个文件,这可以通过一种新的通信机制来完成,进程之间互相交换信息的工作就是进程通信IPC interprocess communication(主要指大量数据交换)

通信方式

进程间通信方式主要包括:高级通信和低级通信,其中同步与互斥为低级通信,高级通信为共享内存、消息传递系统(消息队列)、管道;

1、进程通信:进程间传输数据(交换信息)
进程间通信IPC基本有四中技术:共享内存、fifo、管道、消息队列

常用方式:管道、有名管道、信号、信号量、消息队列、共享内存、套接字;

管道:pipe 是一种半双工的通信方式,数据只能单向流动,且只能在具有亲缘关系的进程间使用(父子进程关系);

有名管道:named pipe,有名管道也是半双工的通信方式,但是允许无亲缘关系进程间通信;命名管道在文件系统中有对应的文件名,系统调用mkfifo创建;

信号:signal,信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生;除了用于进程间通信外,还可以发送信号给进程本身;

信号量:semaphore,信号量是一个计数器,可以用来控制多个进程对共享资源的访问,它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段;信号量的数据结构为一个值和一个指针,指针指向等待该信号量的下一个进程。
信号量的值与相应的值与相应资源的使用情况有关,当它的值大于0时,表示当前可用资源的数量,当它的值小于0时,其绝对值表示等待使用该资源的进程个数。信号量的值仅能由pv操作改变;

消息队列Message:消息队列是消息的链接表,包括Posix消息队列和system V消息队列,有足够权限的进程可以向队列中添加消息,被赋予读权限的进程可以读队列中的消息;
消息队列克服了信号承载信息量少、管道只能承载无格式字节流以及缓冲区大小受限等问题;

共享内存:使得多个进程可以访问同一个内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率低而设计的,往往与其他通信机制,如信号量结合使用,达到进程间的同步互斥;

内存映射:mapped memory 内存映射允许任何多个进程间通信,每一个使用该机制的进程通过把一个共享的文件映射到自己的进程地址空间来实现它;

套接字socket:是更一般的进程间通信机制,可用于不同机器之间的进程间通信;

fifo;先入先出队列,任何时候都能通信,但是速度慢,

线程与进程的同步/通信的区别:

首先再次明确线程和进程的区别(见另一文)

关于同步机制:信号量、管程、互斥都是进程的同步机制,但是信号量、互斥也可用于线程同步,管程只在进程中使用;

通信:管道、fifo、消息队列、信号量、共享内存是进程的通信机制,信号量可以用于进程同步又能通信;管道与管程不同,管道是进程通信,而管程是进程同步;

总结

关于操作系统进程同步和通信这一块,感觉有些复杂繁琐,可能是个人理解上还不够深入,由其引发的生产者消费者问题、哲学家进餐问题、读写者问题,在下一文中讨论。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值