美高梅官方网站3045-mgm6608美高梅app下载
一起talk C栗子吧(第一百零三回:C语言实例--进程间通信大阅兵)

一起talk C栗子吧(第一百零三回:C语言实例--进程间通信大阅兵)

作者:mgm6608美高梅app下载    来源:未知    发布时间:2020-02-10 09:21    浏览量:

信号量与共享内存。共享内存是最快是进程间通信方式,因为n个进程之间并不需要数据复制,而是直接操控同一份数据。实际上信号量和共享内存是分不开的,要用也是搭配着用。*NIX的一些书籍中甚至不建议新手轻易使用这种进程间通信的方式,因为这是一种极易产生死锁的解决方案。共享内存顾名思义,就是一坨内存中的区域,可以让多个进程进行读写。这里最大的问题就在于数据同步的问题,比如一个在更改数据的时候,另一个进程不可以读,不然就会产生问题。所以为了解决这个问题才引入了信号量,信号量是一个计数器,是配合共享内存使用的.

一起talk C栗子吧(第一百零三回:C语言实例--进程间通信大阅兵)


各位看官们,大家好,上一回中咱们说的是使用信号量进行进程间同步与互斥的例子,这一回咱们说的例
子是:进程间通信大阅兵。闲话休提,言归正转。让我们一起talk C栗子吧!

mgm6608美高梅app下载,看官们,我们在前面的章回中介绍了多种进程间通信的方式,大家可能觉得有点杂乱的感觉,或者有各种疑问:为什么会有这么多进程间通信方式呢?这么多通信方式中哪个最好呢?其实这么多的进程间通信方式除了历史的原因外,也与技术的发展有关系。这些通信方式中不能说哪个最好,只能说哪个最适用。具体使用哪种通信方式取决于我们的编程环境。

在本章回中,我们会以阅兵的方式对这些通信方式进行总结与比较,通过阅兵来展现他们的优点,避免它们的缺点。让大家对他们有更加深刻的认识,以便在写程序的时候选择最恰当的通信方式。

参加本次阅兵的方队来自我军海陆空三大军种,他们来自五湖四海,但是为了保家卫国而走在了一起。本次参阅的方队有信号方队,管道方队,无名管道方队(相对于命令管道FIFO而而言),命名管道方队,消息队列方队,共享内存方队,信号量方队。各方队已经就绪,随时准备接受检阅。

升旗!
奏乐!
阅兵仪式正式开始!

看官们,走在阅兵方阵最前面的是信号方队。信号方队是我军历史上最悠久的部队。该部队随着Unix系统产生而产生,为Unix系统的发展做出了卓越的贡献。在Linux系统产生后,该部队也不畏险阻,挻进Linux领域,成为该领域中进程通信的主要方式之一。信号方队为我军及时传递各种信号,使我们永远走在敌人的前面,有效地压制了敌人。

接下来出场的是管道方队。管道方队披星戴月,日夜奋战,有力地保证了进程间的正常通信。他和信号方队有互补的作用,他的产生有效地解决了信号方队只能发送信号不能传递数据的缺点。他为进程间通信输送了海量数据,堪比Linux shell中的管道。

俗话说:打仗亲兄弟,上阵父子兵。现在出场的就是好比父子兵的无名管道方队。它们属于管道这个大分支,所以和前面走过去的管道方队在服装上比较类似。无名管道部队处处做好事,处处不留名,因为他们都是活雷锋。在父子进程间通信时首选无名管道部队。

伴随着嘹亮的军歌声,我们送走了无名管道方队,迎来了命名管道方队。命名管道部队也隶属于管道这个大分支。他们有郊地扩展了战场,从无名管道只能在父子进程间通信扩展到可以在任何进程间通信。是进程中最常使用的通信方式。命名管道部队的诞生,好比装备了高科技设备部队,为我军的现代化发展做出了突出的贡献,堪称现代化部队的鼻祖。

一二三四!三大管道方队的口号声还在耳边环绕,消息队列方队已经出现在我们眼前。消息队列部队是与管道部队并列的现代化部队。消息队列部队机动灵活,能适用各种做战环境。哪里需要就去哪里,是最令敌人畏惧的部队。管道部队传送的是数据流,消息队列部队传送的是数据块,而且可以自己控制消息块的大小和包装。这就是它灵活性的体现。如果说管道部队送来的是救命水,那么消息队列部队送来就是保命粮。水是液体,类似数据流;粮食是一袋一袋的,类似于一条一条的消息。进程间通信时需要看消息的类型,可以依据消息的类型来选择进程间通信的方式,进而提高通信的效率。这比如打仗,不同战场需要不同的部队,它们是一个道理。

空中飞机翱翔,地上战车滚滚。共享内存方队乘着战车来接收检阅。共享内存方队是我军中反应最快捷的部队。他们广泛使用飞机和战车来装备部队,极大地提高了部队的作战速度。神龙见首不见尾是他们一贯的作风,如果哪天发现天降神兵了,哪肯定是共享内存部队。在我们介绍的这几种进程间通信方式中,共享内存是最快的通信方式,因为它是在进程的内存中进行通信,而且它还克服了管道单向通信的缺点。

看官们,最后出场的是信号量部队,他好比部队的神经网络,能够有效地联络和指挥各个部队进行综合做战。现代战争是综合形式的战争,有了信号量部队,我们就在现代战争中掌握了主动权。进程间通信时会涉及到多个进程,使用信号量可以保证多个进程正常通信。也就是说信号量经常用来解决进程同步与互斥相关的问题。

台下传来了阵阵的欢呼声,阅兵仪式在大家的欢呼声中正式结束!

各位看官,关于进程间通信大阅兵的例子咱们就说到这里。欲知后面还有什么例子,且听下回分解 。


C栗子吧(第一百零三回:C语言实例--进程间通信大阅兵) 各位看官们,大家好,上一回中咱们说的是使用信号量进行进程间同步与...

一、进程/线程间同步机制。

<?php//ftok将一个路径名pathname和一个项目名, 转化成一个整形的用来使用系统V IPC的key$sem_key = ftok( __FILE__, 'b' );// 获取信号id$sem_id = sem_get( $sem_key );//ftok将一个路径名pathname和一个项目名, 转化成一个整形的用来使用系统V IPC的key$shm_key = ftok( __FILE__, 'm' );// 创建一个共享内存$shm_id = shm_attach( $shm_key, 1024, 0666 );const SHM_VAR = 1;$child_pid = [];for( $i = 1; $i <= 2; $i++ ){ $pid = pcntl_fork(); if( $pid < 0 ){ exit(); } else if( 0 == $pid ) { // 获取信号量 sem_acquire( $sem_id ); // 判断此信号量中是否有值 if( shm_has_var( $shm_id, SHM_VAR ) ){ $counter = shm_get_var( $shm_id, SHM_VAR ); $counter += 1; shm_put_var( $shm_id, SHM_VAR, $counter ); } else { $counter = 1; shm_put_var( $shm_id, SHM_VAR, $counter ); } // 释放信号量 sem_release( $sem_id ); exit; } else if( $pid > 0 ) { $child_pid[] = $pid; }}while( !empty( $child_pid ) ){ foreach( $child_pid as $pid_key => $pid_item ){ pcntl_waitpid( $pid_item, $status, WNOHANG ); unset( $child_pid[ $pid_key ] ); }}sleep;echo '最终结果'.shm_get_var( $shm_id, SHM_VAR ).PHP_EOL;// 删除共享内存数据,删除共享内存是有顺序的,先remove后detachshm_remove( $shm_id );shm_detach( $shm_id );

临界区、互斥区、事件、信号量四种方式
临界区(Critical Section)、互斥量(Mutex)、信号量(Semaphore)、事件(Event)的区别
1、临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。在任意时刻只允许一个线程对共享资源进行访问,如果有多个线程试图访问公共资源,那么在有一个线程进入后,其他试图访问公共资源的线程将被挂起,并一直等到进入临界区的线程离开,临界区在被释放后,其他线程才可以抢占。
2、互斥量:采用互斥对象机制。 只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程访问。互斥不仅能实现同一应用程序的公共资源安全共享,还能实现不同应用程序的公共资源安全共享 .互斥量比临界区复杂。因为使用互斥不仅仅能够在同一应用程序不同线程中实现资源的安全共享,而且可以在不同应用程序的线程之间实现对资源的安全共享。
3、信号量:它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目 .信号量对象对线程的同步方式与前面几种方法不同,信号允许多个线程同时使用共享资源,这与操作系统中的PV操作相同。它指出了同时访问共享资源的线程最大数目。它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目。

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. 互斥量(Mutex),信号灯(Semaphore),事件(Event)都可以被跨越进程使用来进行同步数据操作,而其他的对象与数据同步操作无关,但对于进程和线程来讲,如果进程和线程在运行状态则为无信号状态,在退出后为有信号状态。所以可以使用WaitForSingleObject来等待进程和线程退出。
  3. 通过互斥量可以指定资源被独占的方式使用,但如果有下面一种情况通过互斥量就无法处理,比如现在一位用户购买了一份三个并发访问许可的数据库系统,可以根据用户购买的访问许可数量来决定有多少个线程/进程能同时进行数据库操作,这时候如果利用互斥量就没有办法完成这个要求,信号灯对象可以说是一种资源计数器。

 

二、进程间通信方式

由于比较容易混淆,我们把进程间通信方法也列在这里做比较。

程间通信就是在不同进程之间传播或交换信息,那么不同进程之间存在着什么双方都可以访问的介质呢?进程的用户空间是互相独立的,一般而言是不能互相访问的,唯一的例外是共享内存区。但是,系统空间却是“公共场所”,所以内核显然可以提供这样的条件。除此以外,那就是双方都可以访问的外设了。在这个意义上,两个进程当然也可以通过磁盘上的普通文件交换信息,或者通过“注册表”或其它数据库中的某些表项和记录交换信息。广义上这也是进程间通信的手段,但是一般都不把这算作“进程间通信”。因为那些通信手段的效率太低了,而人们对进程间通信的要求是要有一定的实时性。

 

  进程间通信主要包括管道, 系统IPC(包括消息队列,信号量,共享存储), SOCKET.

    管道分为有名管道和无名管道,无名管道只能用于亲属进程之间的通信,而有名管道则可用于无亲属关系的进程之间。

    消息队列用于运行于同一台机器上的进程间通信,与管道相似;

  共享内存通常由一个进程创建,其余进程对这块内存区进行读写。得到共享内存有两种方式:映射/dev/mem设备和内存映像文件。前一种方式不给系统带来额外的开销,但在现实中并不常用,因为它控制存取的是实际的物理内存;

下一篇:没有了
友情链接: 网站地图
Copyright © 2015-2019 http://www.zen-40.com. mgm美高梅有限公司 版权所有