当前位置:C++技术网 > 资讯 > 为什么需要进程间的通信机制

为什么需要进程间的通信机制

更新时间:2015-06-23 21:16:04浏览次数:1+次

    之前学习进程,学习线程,可以说,进程线程多线程等名词已经耳熟能详了。但是“温故而知新”,确实发现了不少意外的收获。不仅加深了理解,更是理想得到了突破。总是觉得自己都会了,才会把自己的思想禁锢在一个狭小的范围,而忽视了温故知新的必要。请记住,任何学问都博大精深,如果你觉得没什么,那就是你的水平还不足以探知肤浅表面背后的深渊。所以,求学,一定要时刻提醒自己,谦虚再谦虚。不过,谦虚不是表现给他人看的,而是在内心深处告诉自己,其实自己还有很多不懂得,不然,看看大师的境界,就知自己的水平,自己又有什么骄傲自满的呢。如果你达到了超前沿的水平,那么你的思想必然在引导别人在前进,否则你永远都需要不断的完善自己,提升自己的水平。以上的话,是本人的突发感悟,遂当做与大家共勉的劝词,更是劝勉志同道合的朋友要坚持,只有坚持到最后,你才是真正的优秀者。我对优秀者的定义是:思想可以引领社会潮流的人才是真正的优秀者。
    进程为什么要通信?你肯定回答是需要共享数据。对的,确实如此。而这里的进程通信是一个专有名词IPC。这里指代的不是简单的共享数据的通信。还包括各种通信手段。具体的通信手段,请查阅IPC,很多资料有介绍。我们确实要通信,通信的目的也确实包含数据共享,还包括进程同步等。但是,进程间为什么要通信?如果你一下子不清楚,那么换一个问题。一个进程间的线程需不需要特别的通信机制?比如内存映射文件、管道、邮槽等。在学习这些方式是,我也只是机械的学习他们是如何实现通信的。不过惭愧的很,还是不是很清楚。因为我一直都没有想清楚一个问题,那就是,为什么要使用这些方法通信?感觉这些用处不大。不过,后来发现,我错了。正是因为我学识浅薄,理解不够,才这样感觉。
    说了这么多,不要觉得这些都是无聊闲扯。我不想再用生硬的语言将一些重要的知识灌输给大家。我希望你可以听明白我说这番话的意思,这比纯粹的讲解知识答案重要。因为这是我对进程间通信的认识疑惑和最终清晰的过程,希望你能从这个过程中得到启发。
    下面将介绍知识主题。进程,作为一个软件的执行体,代表一个软件是否运行的标志。当然,一个软件必然有一个主进程。软件启动时就会有一个主进程执行,如果主进程再调用一个子进程后自己关闭,子进程成为独立的进程。从逻辑上讲,可以把这个子进程当做软件的“主进程”。因为此时,从软件的角度讲,软件并没有结束。而一个进程一定会有线程,至少有一个,叫做主线程。如果一个进程的所有线程都终止,那么这个进程也没有存在的意义了,系统会终止这个进程。
    而对于进程,线程是进程的组成部分。现代操作系统,线程是CPU调度的单位,进程只是线程的执行场所。CPU调度分配使用时,看的是线程而不是进程。但是一个不是多线程的程序,也会有一个主线程,也就是单线程程序。那么这个进程对于系统来讲,就只有一个分配单位。而如果另一个进程有三个线程,那么就有三个线程来接受分配,有三个分配单位。如果按照平均分配,那么多线程可以得到更多的执行时间,单线程就只有一个执行时间,因此,多线程占用的时间更多,可以在一定时间内做更多的事。对于进程线程调度,请参看本站其他相关文章或者查阅相关书籍。进程包含线程,线程是进程的执行的部分,而进程还有大量的资源,存放在进程的空间里,线程需要使用就直接到进程的空间里使用即可。
    对于“一个进程间的多个线程需不需要特别的通信机制”的问题,我想你应该有所启发了吧。进程就相当于一个大房子,线程相当于房子里的一个人。房子里的人需要分享一个东西,只要每次一个人使用就可以了,用完再让别人用。这里恭喜使用就是“线程互斥”原理。详细可以参考本站相关文章或者相关“进程互斥线程互斥”的资料。因为一个房子里的东西,对房子里的所有人来说,都是可见的,可以直接使用的。
    而进程间的通信,就不是一个进程间的多个线程通信那么简单了。这个操作系统的特性有关。为什么需要特别的进程通信机制。原因就是,操作系统中,进程间是相互不可见的。操作系统在逻辑上将每个进程隔离开了。一个进程里是不可能看到真实的物理内存地址的。你肯定听说过虚拟内存地址。你所听说的内存地址,都是虚拟内存地址,而不是真实的物理内存地址。每个进程的虚拟内存地址都是一样大的,大小和操作系统所能支持的大小。32位操作系统的虚拟内存大小就是2的32次方,也就是4GB大小。
    进程间的内存相互隔绝,操作系统这样做就是防止进程间的相互干扰。假如A进程在操作一个内存时,B进程无意中程序执行出错,改写了A的进程的内存,A进程就很可能崩溃,从而造成了破坏。这也是保护各个进程的安全的一个手段。同时,操作系统也是有各种进程组成的。系统的进程同样也会被其他进程进行破坏,从而让操作系统出现严重问题。这样的设计,操作系统很容易被病毒程序攻陷。所以操作系统为了安全起见,就采用隔绝的方式,既保护了用户程序安全,更是保护了操作系统本身,使操作系统变得很健壮。因为程序的操作都是在自己的虚拟地址空间中执行的,系统内部在执行时,总是可以将虚拟内存地址映射到进程的实际的内存地址区间而不会越界,从而避免了内存破坏问题。
    也就是因为这个原因,将进程相互隔绝,以至于进程间是相互看不到的。所以就给进程间的通信带来了问题。相互看不见,如何通信呢?你不可能跟空气说话,然后就说自己跟一个你没看见的人说过话了吧。就是隔绝了,才会出现各种各样的通信机制。比如内存映射文件,就是将一个文件打开,作为通信中介,然后将这文件作为内核对象,分配一个句柄,这个是公用的文件,而这个句柄,是系统全部进程都可以看到的,并且看到的都是同一个,就好比几个房子里的人都能看到广场的一个雕像。然后通过向系统请求,得到访问这个内核对象的句柄就可以操作了。操作完后,其他进程才可以操作,这个是“进程间的互斥”。而通过这种方式就可以更改公共的变量,达到通信的目的。而这个通信的过程就是内存映射文件模式。内核文件作为一个中介,让相互看不见的进程可以相互交换数据。
    而管道,邮槽则也是通过消息信件机制,通过系统投递给进程的。进程只要接受这个信件即可,然后了解情况后再发送信件。系统成为了信使。这样也达到通信的机制。
    这些也就解决了进程间相互不能通信的问题,也保证进程间相互隔绝后的安全。如果当初没有实现进程间的相互隔绝,也就用不上进程间的通信,就像一个进程间的多个线程之间的通信,是多么的容易。
    相信知道了前因后果,徐徐的分析,你一定对进程间的通信有一个更加深刻的理解。再学习这些内容,将会是如虎添翼!