欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

进程间通信(IPC)解决和问题和算法

程序员文章站 2023-11-22 16:49:40
进程间通信(IPC)解决和问题和算法...
谈谈我们的进程间通信,上次我们谈进程是什么?进程是社会的一个个人,每个都有自己的财产,都有自己的空间,那么人需要通信吗?人需要通信,否则社会不会向前流通,而进程作为一个个实体也会有自己的沟通,否则一个个憋在那能干什么?当然当个笑话听!这里面涉及到三个问题,第一是比较棘手的,怎么把信息从一个进程传给另外一个进程?这个我们这样想,人在社会上生存是不是要交流,你给老外讲中文他能听懂?所以信息必须以一种约定好的规格传递,当然,这只是我这样想。第二点,人在社会中生存,我们都会有竞争,我们都需要抢夺资源,这对于进程来讲也一样的,而且很多时候两者会产生冲突造成一些不可预估的结果,我们想人之间有冲突会打架需要调节,进程不一样的吗?最后一点是进程间的执行有时是需要秩序的,进程a获得数据而进程b打印数据,诸如此类。 所以我们归纳进程间通信(ipc)主要解决三个问题:在进程间传递数据进程间约定秩序协调对于共享数据的互斥访问 topic1: 竞争条件:当两个或多个进程同时访问某个共享区域时(通常会有读写两种情况),最后的运行结果取决于进程的运行时序,这样就产生了竞争条件,很经典的问题就是对文件的读写,一个在读,一个在写,读出来的东西很可能不是你想要的,所有ipc必需要协调好对于共享数据的互斥访问,也就是说,必需要有这样一种机制能够避免这种竞争的发生! 临界区的概念: 既然有竞争,那我们就必须要去协调!如何避免?比如张三和李四都想要某个东西,两个人打起来了,现在怎么办,他们自己肯定不想停下来,都想要这个东西,现在我们作为他们的上级,肯定要说,你们不要打了,让其中一个拿走这个东西,或者更好的建议是,我们在之前就应该分配好,在更高的层次上说,比如张三就应该先拿走这个东西,可是这样对于其他人(其他进程)是不公平的,所以谁先到先得,我们只需要保证,当他拿到这个东西的时候,其他人不能抢夺,拿不走,同样的思想,运用在进程上!这种思想的根本在于对于互斥的实现,一个人在做,另外的人只能看! 不知你懂否,看了这么久,其实我们就是在探讨一个问题,上面的问题3,如何达到互斥访问,但是这样的描述其实还不够精确,因为事实上,进程真正访问共享区域的只有一部分时间而已,为了把互斥做得更细致,我们要往下走!一个进程访问共享区域的那部分代码,我们不妨称之临界区,其实名字无所谓,但是这个考试或者面试经常考,而且很多人误以为是内存或者资源,不要闹了笑话!那我们以这样的视角看,大家都有开车的时候,这么多人,都某个点开出来那么肯定会堵车,那我们只要让大家错开时间段出来就好了啊! 当然这依然是一个很粗的模型,事实上,我们需要提出一个方案(也就是一个算法)解决互斥(如同解决交通堵塞问题一样),这个方案最好应该满足以下的条件: 基本条件,解决互斥 你的方案不应该对cpu速度和这类条件作任何假设,这个很容易理解,cpu的执行在多道程序模型下是具有不可再现性的! 因为临界区互斥,a进程在占用,b进程阻塞,但是c进程不能因为b进程的阻塞阻塞,也就是说不要引起无关人的损伤! a执行,b阻塞,你让我一直等!no!那我还咋混!笑话听。 上面最后两点涉及到后面会谈到的死锁,活锁,饥饿,反正大家记住,系统就是要让每个进程都能安安稳稳的执行! 说白了,比较好的结果就,a执行,b等一会,a走了,b跑,大家走,理想的效果! 下面就这个算法向大家介绍一些比较典型的算法! 这个为了讲清楚,我不想讲的很笼统,首先大家要知道从大的角度看,有两种方式,忙等待与非忙等待! 忙等待和非忙等待不是两种算法,而是两种思路,下面包括实际的解决方法,其实忙等待和非忙等待是很经典的两个模型,不仅在进程通信有这个概念,其实就是事件模型,当某个事件发生的时候,你如何知道?比如你在等某一个人,如果你很急,你可能会不断跑到门口去看,来了没有啊!这就是忙等待,非忙等待就是我在这睡觉,咦,有人敲门了,好,等到了!这个听懂了,很多其他开发你自然理解了! 我们说忙等待,如何实现互斥? 笼统的讲,忙等待实现互斥是通过不断的检测一个状态变量,当这个状态变量为某个值的时候就往下执行!你也可以按你的思路理解,这个状态变量,就像一把锁,你不断去看开了没有,也可以理解为一个信号灯,随你的想法了,但是思想都是一样的! 忙等待的几个算法: first:禁止中断,这种方法你需要知道一个前提,我们需要让进程1执行完后进程2,3,4.。。依次执行,如何实现?我们通过时间中断,每次时间中断后更新进程x的执行时间,到了时间了,对不起了您,收拾东西先回去吧!所以如果你关了中断,这就是开了外挂啊,哥想执行多久就执行多久,谁还能抢夺我的时间,我得资源?可是这样带来了一些问题,第一用户没有权利开关中断,限于内核编程,另外现在cpu多核,关一般关一个核的中断,最后,你掌控了全局的寿命,这不是很安全的做法,要是你小子不把时间给其他人咋办?所以,现在这种方式不是很有用。 second:严格交替法,设置一个变量不妨为x,这种方法在进程1和进程0间讨论,设x最开始为0,进程0不断对x检测看是否为0,进程1不断对x检测看是否为1,这里先叙述到这,下章再续。