<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<atom:link href="http://gentoo-zh.org/extern.php?action=feed&amp;tid=427&amp;type=rss" rel="self" type="application/rss+xml" />
		<title><![CDATA[Gentoo中文社区 / 进程间的通信]]></title>
		<link>http://www.gentoo-zh.org/viewtopic.php?id=427</link>
		<description><![CDATA[进程间的通信 最近发表的帖子。]]></description>
		<lastBuildDate>Sat, 03 Sep 2022 06:23:12 +0000</lastBuildDate>
		<generator>FluxBB</generator>
		<item>
			<title><![CDATA[进程间的通信]]></title>
			<link>http://www.gentoo-zh.org/viewtopic.php?pid=433#p433</link>
			<description><![CDATA[<p>前面在聊到进程的概念的时候，我们知道，进程在操作系统中是一个个相互独立的个体，也就是说，在没有外力介入的条件下，进程之间相互独立，是无法相互看见对方的。</p><p>那么操作系统是如何使进程之间相互独立，无法看见对方呢？这里用到了一种叫做虚拟内存的技术。</p><p>在前面聊到动态库的时候，我们提过一句虚拟内存的机制。（想要看动态库内容的朋友点这里）<br />那么究竟虚拟内存是个什么情况呢？<br /><span class="postimg"><img src="https://img-blog.csdn.net/20180612171857686?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3p5bTEzNDgwMTA5NTk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70" alt="70" /></span> </p><p>这个就是虚拟内存到物理内存转化的示意图，也就是说，我们用高级语言写出来的程序，其中指针所指向的地址，其实是虚拟地址。</p><p>进程1和进程2在创建出来的时候，都会认为它本身独占4G内存。但实际上，这4G内存是操作系统提供的虚拟地址，只有通过页表转化成物理地址的部分，才占有实际的物理内存。</p><p>那么为什么要 使用虚拟地址呢？</p><p>其实在早期的时候，加载程序是使用物理地址的，但是后来发现各个相互独立的进程之间可能会发生影响，如果一个进程访问出错，越界访问到了别的进程，那么这两个进程最终可能都会挂掉。</p><p>所以后来智慧的程序猿就研究出了这样的方法，也就是虚拟内存机制，这极大的提升了进程的独立性，但是也带来了一些问题。</p><p>比如，两个进程的确有一些需求，想要进行一些数据传输。<br />多个进程之间共享同样的资源。<br />一个进程需要向另一个进程发送消息，通知它们发生了某种事件。<br />有些进程希望完全控制另一个进程，此时控制进程希望能够拦截另一个进程所陷入的异常，并且能够及时知道它的状态改变（Debug进程）。</p><p>这就是我们进程通信的目的。</p><p>而现在我们需要通过一些手段来进行进程间的通信，既然进程之间是相互独立的，它们之间相互无法看见，那么作为进程的管理者，当然是有办法看见不同的进程了。</p><p>所以我们现在进程通信的方法，都是两个进程通过某种中间的媒介，来达到通信的目的。</p><p>现在常见的进程通信有以下分类：</p><p>&#160; &#160; 管道：</p><p>&#160; &#160; 匿名管道pipe。<br />&#160; &#160; 命名管道。</p><p>&#160; &#160; System V IPC</p><p>&#160; &#160; 消息队列<br />&#160; &#160; 共享内存<br />&#160; &#160; 信号量</p><p>&#160; &#160; POSIX IPC</p><p>&#160; &#160; 消息队列<br />&#160; &#160; 共享内存<br />&#160; &#160; 信号量<br />&#160; &#160; 读写锁</p><p>但是一旦涉及到通信，势必会涉及到同步和互斥的问题！</p><p>首先解释什么叫做同步：同步就是进程间的相互制约，多个进程需要相互配合完成一项任务。</p><p>举个栗子：A进程是一个打印进程，B进程是一个计算进程，A进程要打印B进程的执行结果，在执行过程中，A进程先运行了，但是等A执行到打印那一步的时候，B进程的结果还没有计算出来，这个时候A进程就被阻塞在这里了，只有等B执行出计算结果的时候，A进场才可以完成打印。在A进程阻塞等待B进程的过程就可以理解为同步。</p><p>那么什么是互斥呢？</p><p>互斥是由于多个进程之间需要访问临界资源，而临界资源同时只能被有限个进程访问，各个进程需要相互竞争使用这些资源，这种关系称为互斥。</p><p>临界资源：同时只允许有限个进程访问的资源，被称之为临界资源，访问临界资源的代码叫做临界区。</p><p>同样，举个栗子：A进程和B进程都是打印进程，但是这台计算机只有一台打印机，A和B同时只能有一个进程在访问打印机，那么A和B就是互斥关系，打印机就是临界资源。</p><p>进程之间的通信在很多情况下都会涉及到同步互斥，比如两个进程，一端在读，一端在写，那么写端在写的时候，读端就不能读，否则可能会读出错误信息。而读端在读的时候，写端就不能写，否则还是可能会造成信息不对称。</p>]]></description>
			<author><![CDATA[dummy@example.com (batsom)]]></author>
			<pubDate>Sat, 03 Sep 2022 06:23:12 +0000</pubDate>
			<guid>http://www.gentoo-zh.org/viewtopic.php?pid=433#p433</guid>
		</item>
	</channel>
</rss>
