Linux进程(五)进程通信与进程函数详解

1.进程通信

进程间为实现相互制约和合作需要彼此传递信息。然而每个进程都只在自己独立的存储空间中运行,无法直接访问其他进程的空间。因此,当进程需要交换数据时,必须采用某种特定的手段,这就是进程通信。进程通信(Inter-Process Communication,IPC)是指进程间采用某种方式互相传递信息,少则是一个数值,多则是一大批字节数据。

为实现互斥与合作,进程使用信号量相互制约,这实际上就是一种进程通信,即进程利用对信号量的P、v操作,间接地传递资源使用状态的信息。更广泛地讲,进程通信是指在某些有关联的进程之间进行的信息传递或数据交换。这些具有通信能力的进程不再是孤立地运行,而是协同工作,共同实现更加复杂的并发处理。

1.1进程通信的方式

进程间的通信有多种方式,大致可以分为信号量、信号、管道、消息和共享内存几类,从通信的功能来分,进程通信方式可以分为低级通信和高级通信两类。低级通信只是传递少量的数据,用于通知对方某个事件;高级通信则可以用来在进程之间传递大量的信息

低级通信的方式有信号量和信号,高级通信的方式有消息、管道和共享内存等。

按通信的同步方式来分,进程通信又分为同步通信与异步通信两类。同步通信是指通信双方进程共同参与整个通信过程,步调协调地发送和接收数据。这就像是打电话,双方必须同时在线,同步地交谈。异步通信则不同,通信双方的联系比较松散,通信的发送方不必考虑对方的状态,发送完就继续运行;接收方也不关心发送方的状态,在自己适合的时候接收数据。异步通信方式就如同发送电子邮件,不必关心对方何时接收。管道和共享内存等都属于同步通信,而信号、消息则属于异步通信。现代操作系统一般都提供了多种通信机制,以满足各种应用需要。利用这些机制,用户可以方便地进行并发程序设计,实现多进程之间的相互协调和合作。

1.2IPC机制

信号(signal):信号是进程间可互相发送的控制信息。一般只是几个字节的数据。用于通知进释有某个事件发生。信号属于低级进程通信,传递的信息量小,但它是Linu进程天生具有的一种通信能力,即每个进程都具有接收信号和处理信号的能力。系统通过一组预定义的信号来拉制进程的活动,用户也可以定义自己的信号案遇告进程某个约定事件的发生。

信号量(semaphore):作为一种IPC机制,信号量用于传递进释对资源的占有状态信息,从而实现进程的同步与互斥.

管道(pipe):管道是连控两个进程的一个数据传输通路。一个进程向管菡写数据,另一个进理从管道读数据,实现两进程之间同步传送字节流。管道的信息传输量大。速度快。内置同步机制,使用简单。

消息队列(message queue):消息是结构化的数据,消息队列是由消息掰接而成的链式队列。进程之间酒过消息队列来传递消息。有写权限的进程可以向队列中添加消息。有读权限的进程则河以读走队列中的消息。与管道不同的是。这是一种异步的通信方式:消息的发送方把消息送入消息队列中,然后继续运行;接收进程在合适的时机去消息队列中读取自己的消息。相此比信号来说,消息队列传递的信息量更大。能够传递格式化的数据。更主要的是。消息通信是异步的,还合于在异步运行的进程间交换信息。

共享内存(shared-memary):共享内存通信方式就是在内存中开辟一段存储空间。将这个区域映射到多个进程的地址空间中。使得多个进程能够共拿这个内存区域。通信双方直接读/写这个存储区即可达到数据共享的目的。由于进程访问共享内存区就如同访问进程自己的地址空间,因此访问速度最快,只要发送进程将数据写入共享内存,接收进程就可立即得到数据。共享内存的效

2.进程函数

 进程无论以那种方式结束,都会调用一个exit()系统调用,通过这个系统调用终止自己的运行,并及时通知父进程回收本进程。exit0系统调用完成以下操作:

  • 释放进程除PCB外的几乎所有资源;
  • 向PCB写入进程退出状态和一些统计信息;
  • 置进程态为"僵死态"
  • 向父进程发送"子进程终止"信号;
  • 调用进程调度程序切换CPU的运行进程。

至此,子进程已变为"僵尸进程",它不再具备任何执行条件,只是PCB还在。保留PCB的目的时为了保存有关该进程运行的重要信息,比如这个进程的退出状态、运行时间的统计、收到信号的数目等。子进程的最后回收工作由父进程负责。父进程收集子进程的信息后将其PCB撤销。如果某一个进程由于某种原因先于子进程终止,有它创建的子进程就会变成"孤儿进程"。当系统中出现孤儿进程时,init进程将会发现并收养它,成为它的父进程。由于init进程不会退出,所以所有的进程都会被收养,最后,在系统关机之前,init进程要负责结束所有的进程。

2.1进程的等待和收集

在并发执行的环境中,父了进程的运行造度是无法确定的。在许多情况下。我们希望父子进程的进展能有某种同步关系。比如,父进释需要等待子进程的运行结果才能继续执行下一步计算,或父进程要负击子进程的回收工作,他必须在子进程结束后才能踢出。这时就需要通过wait系统调用来沮塞父进程,等特子进程结束。

当父进程凋用waiti时,自己立即被阻塞。有wait检查是否有僵死子进程,如果找到就收集它的信息,然后化掉它的PCB;否则就阻塞下去。等特子进程发来的线止信号。父进程被信号唤醒后,执行wait().处理子进程的回收工作。经walit0收集后。子进程才真正的消失

独立性:进程是可以独立运行的基本单位,是操作系统分配资源和调度资源管理的基本对象,因此,每个进程都是独立地拥有各种必要的资源,独立地占有cpu并独立的运行

异步性:每个进程都独立的执行,各自按照不可预知的速度向前推进,进程之间的协调运行有操作系统负责。

1.一个进程可通过fork()或vfork()或system()等系统调用创建一个子进程。

2.进程的终止两种方式:异常终止、正常终止。

3.监视子进程:wait()函数

返回值:若成功则返回终止的子进程对应的进行号;失败则返回-1。

4.wait()回收子进程

5.waitpid()函数(回收子进程)

返回值:

6.孤儿进程:父进程先于子进程结束。

7.僵尸进程:如果子进程先与父进程结束,此时父进程还未来得及给子进程“收尸”,那么此时子进程就变成了一个僵尸进程。

8.进程的互斥与同步

同步是复杂的互斥,互斥是特殊的同步

9.信号量与P、V操作

信号量是最早出现的用来解决进程同步与互斥问题的机制。

信号量:由一个值和一个指针组成,指针指向等待该信号量的进程。信号量的值表示相应资源的使用情况。

信号量是一个整型变量s,它为某个临界资源而设置,表示该资源的可用数目。s大于0时表示有资源可用,s的值就是资源的可用数;s小于或等于0时表示资源已都被占用,s的绝对值就是正在等待此资源的进程数。

P(s)操作用于申请资源s。P(s)操作使资源的可用数减1。如果此时s是负数,表示资源不可用(即已被别的进程占用),则该进程等待。如果此时s是0或正数,表示资源可用,则该进程进入临界区运行,使用该资源。 V(s)操作用于释放资源s。V(s)操作使资源的可用数加1。如果此时s是负数或0,表示有进程在等待此资源,则用信号唤醒等待的进程。如果此时s是正数,表示没有进程在等待此资源,则无须进行唤醒操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dola_Pan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值