




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第四章第四章 进程间通信进程间通信 内内 容容 提提 要要 1、进程与进程间通信 2、创建一个进程 3、终止进程的运行 4、进程通信 5、内存文件映射 4.1 4.1 进程与进程间通信进程与进程间通信 第四章第四章 进程间通信进程间通信 进程的定义: 进程是应用程序的执行实例,每个进程都有私有 的虚拟地址空间、代码、数据和其它系统资源。 操作系统在创建进程时为其分配资源,在进程结 束时回收资源。在很多实际应用中,往往需要多个进 程协同工作,它们之间经常需要交换一定的数据以便 协同进行工作,这就要用到进程间通信机制。 进程是程序在计算机上的一次执行活动。 当你运行一个程序,你就启动了一个进程。显
2、 然,程序是死的(静态的),进程是活的(动态 的)。 每个进程都有私有的虚拟地址空间、代码、 数据以及其它可利用的系统资源。 虚拟地址空间(一) v由于在由于在32位系统下,地址总线是位系统下,地址总线是32位的,即位的,即4个字个字 节大小,取值范围为节大小,取值范围为0 x00000000到到0 xffffffff ;由于地址总线最大只能寻址到;由于地址总线最大只能寻址到0 xffffffff,所,所 以它的寻址能力就是以它的寻址能力就是4gb。 v虽然每一个虽然每一个32位进程可使用位进程可使用4gb的地址空间,但并的地址空间,但并 不意味着每一个进程实际拥有不意味着每一个进程实际拥有4
3、gb的物理地址空间的物理地址空间 ,该地址空间仅仅是一个虚拟地址空间,此虚拟地,该地址空间仅仅是一个虚拟地址空间,此虚拟地 址空间只是内存地址的一个范围。址空间只是内存地址的一个范围。32位系统的虚拟位系统的虚拟 地址空间范围从地址空间范围从0 x000000000 xffffffff( 4gb) 虚拟地址空间(二) v进程实际可以得到的物理内存要远小于其虚拟地址进程实际可以得到的物理内存要远小于其虚拟地址 空间。空间。 v例如:程序例如:程序a有有4gb虚拟地址空间,但是它实际在虚拟地址空间,但是它实际在 物理内存的物理内存的0 x100000000 x10010000; v程序程序b也有也
4、有4gb虚拟地址空间,但是它实际在物理虚拟地址空间,但是它实际在物理 内存的内存的0 x200000000 x20010000; v一个程序不可能申请实时的有一个程序不可能申请实时的有4gb的内存映射到物的内存映射到物 理内存上,只是映射经常用到的那部分数据而已,理内存上,只是映射经常用到的那部分数据而已, 不经常用到都被转换到虚拟内存上了。不经常用到都被转换到虚拟内存上了。 虚拟内存 v虚拟内存是计算机系统虚拟内存是计算机系统内存管理内存管理的一种技术。的一种技术。 它使得它使得应用程序应用程序认为它拥有连续的可用的认为它拥有连续的可用的内存内存 (一个连续完整的(一个连续完整的地址空间地址
5、空间),而实际上,它),而实际上,它 通常是被分隔成多个通常是被分隔成多个物理内存物理内存碎片,还有部分碎片,还有部分 暂时存储在外部暂时存储在外部磁盘存储器磁盘存储器上,在需要时进行上,在需要时进行 数据交换数据交换。 虚拟地址空间 v4g的虚拟地址空间大致分为的虚拟地址空间大致分为4块,从低地址到高地址块,从低地址到高地址 依次是:依次是:null区,用户区,隔离区,核心区区,用户区,隔离区,核心区。用户。用户 私有的数据都在用户区;系统内核等都在核心区。私有的数据都在用户区;系统内核等都在核心区。 v总体来说,总体来说,a进程的虚拟地址空间中的内容和进程的虚拟地址空间中的内容和b进程进程
6、 相比,只有各自的用户区不一致。通常用户区中,进相比,只有各自的用户区不一致。通常用户区中,进 程又会将程又会将exe文件中定义的代码段、堆栈段、数据段文件中定义的代码段、堆栈段、数据段 等各个段映射到用户区的特定不同部位。等各个段映射到用户区的特定不同部位。 v这这4gb地址空间的一些部分被映射了物理内存,一些地址空间的一些部分被映射了物理内存,一些 部分映射硬盘上的交换文件,一些部分什么也没有映部分映射硬盘上的交换文件,一些部分什么也没有映 射。射。 v进程的虚拟地址空间是为每个进程所私有的进程的虚拟地址空间是为每个进程所私有的 ,在进程内运行的线程对内存空间的访问都,在进程内运行的线程对
7、内存空间的访问都 被限制在调用进程之内,而不能访问属于其被限制在调用进程之内,而不能访问属于其 他进程的内存空间。他进程的内存空间。 虚拟地址空间 v由于在32位系统下我们的地址总线是32位的,即4个字节大小,所以, 它的取值范围为0 x00000000到0 xffffffff;由于地址总线最大只能寻 址到0 xffffffff,所以它的寻址能力就是4gb;这就是我们说的4gb 地址空间了;举个实际的例子,你买台电脑,如果你安装的是32位系统 ,那么你即使插上8gb内存,也只能识别4gb(实际比4gb还要小,因 为你的显卡上的显存还要吃掉一部分,如果显存512mb,实际只能识别 3.5gb内存
8、) 其次,程序的4gb空间是虚拟地址空间,每个程序都有 4gb的虚拟地址空间;但是他们实际占用的物理内存是程序运行时映射 到物理内存上的;也就是说程序a有4gb虚拟地址空间,但是它实际在 物理内存的0 x100000000 x10010000;程序b也有4gb虚拟地址空间, 但是它实际在物理内存的0 x200000000 x20010000;你的程序不可能 申请实时的有4gb的内存映射到物理内存上,只是映射你经常用到的那 部分数据而已,不经常用到都被转换到虚拟内存上了(虚拟内存技术, 就是写到你的硬盘上了); 进程可以分为系统进程和用户进程。 凡是用于完成操作系统的各种功能的进 程就是系统进程
9、,它们就是处于运行状态下 的操作系统本身; 用户进程就是所有由你启动的进程。 进程是操作系统进行资源分配的单位。 进程与线程 v在一个进程内又可包含多条可并发执行的路 径,每条执行路径叫做一个线程,一个进程 至少包含一个主线程。主线程负责执行运行 的启动代码。 v另外,一个进程可以创建若干子进程。 v当进程被创建时,系统自动产生主线程,主 线程然后可创建更多的线程。 并发 v在操作系统中,是指一个时间段中有几个程 序都处于已启动运行到运行完毕之间,且这 几个程序都是在同一个处理机上运行,但任 一个时刻点只有一个程序在处理机上运行。 4.2 创建一个进程 v函数格式: bool createpr
10、ocess( lpctstr lpapplicationname, lptstr lpcommandline, lpsecurity_attributes lpprocessattributes, lpsecurity_attributes lpthreadattributes, bool binherithandles, dword dwcreationflags, lpvoid lpenvironment, lpctstr lpcurrentdirectory, lpstartupinfo lpstartupinfo, lpprocess_information lpprocessinfo
11、rmation ); v函数功能: 为新进程创建一个虚拟的地址空间,并将 可执行文件或任何必要的dll文件的代码和数 据加载到该进程的地址空间中。 启动程序,新进程的主线程开始运行,并 最终调用winmain,wwinmain,main,或 wmain。 v返回值: 成功创建了新进程或者主线程,返回true, 否则返回0。 v参数说明: lpapplicationname:新进程将要使用的可执行文件 的名字,必须包含扩展名。 lpcommandline:新进程的命令行。若上面第一个 参数为null,lpcommandline 的第一个参数是新 进程将要使用的可执行文件的名字,可以不包含扩展 名
12、,系统假定是exe文件。 以存于下面路径的程序为例 : c:programfilessubdirprogram.exe v可以采用如下两种方式: bool flag; flag=createprocess( “c:programfilessubdirprogram.exe ”, null, , ); 或者: flag=createprocess( null, “c:programfilessubdirprogram (.exe) ”, ); lpprocessattributes和lpthreadattributes:分 别是给进程对象和线程对象指定的安全属性。 如果设为null则系统赋予默认
13、的安全属性。 也可以指向一个security_attributes结构,创 建自己的安全性权限。 binherithandles:指定该进程是否继承其父 进程中的句柄。 如果设为true,则新创建的 进程就能继承父进程的任何可继承句柄。 dwcreationflags:指定新进程的优先级类。 表4.1 进程优先级类别 优先级类别优先级类别标志的标识符 空闲idle_priority_class 低于正常below_normal_priority_class 正常normal_priority_class 高于正常above_normal_priority_class 高high_priorit
14、y_class 实时realtime_priority_class lpenvironment:指向含有新进程将要使用的 环境块字符串的内存块。一般为null,使子 进程继承父进程的一组环境块。 lpcurrentdirectory:设置子进程的当前驱动 器和工作目录。若为null,子进程继承父进 程的当前驱动器和工作目录。 lpstartupinfo:指向startupinfo 的结构。 该结构可用来指定新进程中主窗口的出现形 式。一般让子进程使用缺省值null。 lpprocessinformation :指向 process_information结构,用来记录进程句柄 及进程id号等信
15、息。createprocess在返回之前,填 入有关进程的信息,父进程正是利用该信息监测子进 程是否终止。 process_information结构如下: typedef struct _process_information handle hprocess; /新新进程的句柄 handle hthread; /新新进程的主线程的句柄 dword dwprocessid; /新新进程的id号 dword dwthreadid; /新新进程的主线程的id号 process_information; v说明: 1) 终止进程之前父进程必须关闭子进程和它的 主线程的句柄。系统不再需要访问子进程和
16、它的线程时也应该显式关闭这些句柄(函数 closehandle)。 2) 创建进程函数产生的新进程的句柄及id可分 别从返回参数lpprocessinfo-hprocess和 lpprocessinfo-dwprocessid中获得。 4.3 4.3 终止进程终止进程 ( (三种方法及结束时的处理三种方法及结束时的处理) ) 1. 主线程的进入点函数返回 始终都应该这样来设计应用程序,即只有当 主线程的进入点函数返回时,它的进程才终止。 这是保证所有线程资源能够得到正确清除的唯一 办法。 v让主线程的进入点函数返回,可以确保下列操作 的实现: 该线程创建的任何c+对象将能使用它们的析构 函数正
17、确地撤消。 操作系统将能正确地释放该线程的堆栈使用的内 存。 系统将进程的退出代码(在进程的内核对象中维 护)设置为进入点函数的返回值。 系统将进程内核对象的返回值递减1。 2.利用exitprocess函数(程序不能正确将自己清除, 避免使用) void exitprocess( uint uexitcode /exit code for all threads ); 进程中的一个线程调用该函数则终止进程,并将 函数的退出代码设置为uexitcode。但函数本身不返 回任何值,进程要等到它所有线程终止运行后才终止 运行。即,进程中运行的任何其他线程都随着进程而 一道终止。 (exitthre
18、ad终止线程,进程将继续运行) 3.利用 terminateprocess函数 bool terminateprocess( handle hprocess, uint uexitcode ); 任何线程都可以用terminateprocess终 止,但终止进程时不通知dll,因此通常不采 用此方法。 4.进程终止时的结束处理: 1) 进程中剩余的所有线程全部终止运行。 2) 进程指定的所有用户对象和gdi对象均被释放,所 有内核对象均被关闭(如果没有其他进程打开它们 的句柄,那么这些内核对象将被撤消。但是,如果 其他进程打开了它们的句柄, 内核对象将不会撤 消)。 3) 进程的退出代码将从s
19、till_actives改为传递给 exitprocess或terminateprocess的代码。 4) 进程内核对象的状态变成收到通知的状态。系统中 的其他线程可以挂起,直到进程终止运行。 5) 进程内核对象的使用计数递减1。 注意,进程的内核对象的寿命至少可以达到进程本 身那么长,但是进程内核对象的寿命可能大大超过它的 进程寿命。当进程终止运行时,系统能够自动确定它的 内核对象的使用计数。 如果使用计数降为0,那么没有 其他进程拥有该对象打开的句柄,当进程被撤消时,对 象也被撤消。不过,如果系统中的另一个进程拥有正在 被撤消的进程的内核对象的打开句柄,那么该进程内核 对象的使用计数不会降
20、为0。 内核对象 v1. 内核对象是系统的一种资源。系统对象一旦产生,任何应用程序都可内核对象是系统的一种资源。系统对象一旦产生,任何应用程序都可 以开启并且使用该对象。系统给内核对象一个计数值作为管理之用,内以开启并且使用该对象。系统给内核对象一个计数值作为管理之用,内 核对象包括:核对象包括: vevent,mutex,semaphore,file,file-mapping,preocess,thread. 这些内这些内 核对象每次产生都会返回一个核对象每次产生都会返回一个handle,作为标示。每使用一次,对应的计作为标示。每使用一次,对应的计 数值加数值加1,调用调用closehand
21、le可以结束内核对象的使用。可以结束内核对象的使用。 v2.内核对象只能由内核所拥有内核对象只能由内核所拥有,而不是由进程拥有而不是由进程拥有.(就是说进程没有了就是说进程没有了,内内 核还可以被其他进程使用核还可以被其他进程使用) 3.内核对象的数据结构中有计数器内核对象的数据结构中有计数器,进程调用时进程调用时,计数器增计数器增1,调用结束调用结束,计数计数 器减器减1,内核对象计数器为零时内核对象计数器为零时,销毁此内核对象销毁此内核对象.(系统来管理内核对象系统来管理内核对象) 内核只有一个,内核对象可以有多个。内核只有一个,内核对象可以有多个。 v 4.4 进程通信进程通信 4.4.
22、1 概述概述 进程间通信进程间通信ipc (inter process communication): 在进程间传送数据。在进程间传送数据。 包括同一台计算机的不同进程之间、不同计算机包括同一台计算机的不同进程之间、不同计算机 的进程之间的通信。的进程之间的通信。 比如,多个进程间协调工作的时候,进程之间的比如,多个进程间协调工作的时候,进程之间的 数据交换是必须的。数据交换是必须的。 4.4.2 进程通信分类进程通信分类 vwin32的ipc机制: netbios,socket 网间ipc机制的典型应用 邮槽,管道,事件, 文件映射 1) 邮槽(mailslot) 单向ipc:将消息传送或者
23、广播给其他进程 适用区间:同一计算机的不同进程之间和不同计 算机的进程之间 可靠性:不可靠(广播) 当在一个小范围内需要实时发布(广播)消息 时,可以利用邮槽。 2) 命名管道(named pipes) 单向或双向的ipc 适用区间:同一计算机的不同进程之间和不同计 算机的进程之间 可靠性:可靠 3) 事件(events) 双向ipc 适用区间:主要用于同一台计算机上多个进程间通知 一些简单事件,也用于进程同步。 (如:netbios命令的异步调用方式) 4) 文件映射文件映射(filemapping) 不支持网间通信 同一台计算机上的多个进程可以利用文件映射 共享数据。 单机多进程通信最有效
24、的方法。 4.5 内存文件映射内存文件映射 拿文件直接当作系统的内存使用拿文件直接当作系统的内存使用 作用:作用: 1. 直接用内存映射文件来访问磁盘上的数据文件直接用内存映射文件来访问磁盘上的数据文件,无需无需 再进行文件的再进行文件的i/0操作,不必对文件内容进行缓存。操作,不必对文件内容进行缓存。 2. 用来在多个进程之间共享数据。用来在多个进程之间共享数据。一个进程使用另一一个进程使用另一 个进程的文件映射对象在自己的虚拟地址空间中建立个进程的文件映射对象在自己的虚拟地址空间中建立 一个相同的视图,从而共享内存,利用这种方式使得一个相同的视图,从而共享内存,利用这种方式使得 进程之间交
25、换数据。进程之间交换数据。 内存文件映射的共享数据特性内存文件映射的共享数据特性是进程间通信的主是进程间通信的主 要手段。要手段。 要利用内存文件映射实现进程间通信主要步骤 有如下四步: 1.createfilemapping 创建一个文件映射内核对象 2.openfilemapping 打开映射对象 3.mapviewoffile 将文件数据映射进进程地址空间 4.unmapviewoffile 从进程地址空间解除这个映射 4.5.1 内存文件映射使用到的函数内存文件映射使用到的函数 1. 创建内存文件映射创建内存文件映射(createfilemapping) 函数创建一个有名或无名的文件映
26、射对象,函数创建一个有名或无名的文件映射对象, 成功返回文件映射对象的句柄,失败返回成功返回文件映射对象的句柄,失败返回null。 handle createfilemapping( handle hfile, /物理文件句柄 lpsecurity_attributes lpattributes, /安全设置 dword flprotect, /保护设置 dword dwmaximumsizehigh, /高位文件大小 dword dwmaximumsizelow, /低位文件大小 lpctstr lpname /共享内存名称 ); 参数说明如下: hfile:想要映射到地址空间中的文件对象的
27、句柄。 对于磁盘文件句柄可以用createfile得到;对于共享 内存区操作,指定为0 xfffffff 。 lpattributes:安全设置, 一般设置为null, 使用默认 的安全配置。 flprotect:指定文件映射区物理存储器的页面保护属 性。可取如表4.2中的三种属性。 dwmaximumsizehigh和dwmaximumsizelow :指 定该文件映射的最大字节数。前者用于设定较高的 32位,后者设定较低的32位,一般我们现在所用的 机器都是32位的,所以高32位置0。 lpname:以0结尾的字符串,用于给该文件映射对 象设置一个名字。该名字用于与其他进程共享文件 映射对
28、象。 2.打开文件映射对象openfilemapping 成功则返回文件映射对象的句柄,否则null。 handle openfilemapping( dword dwdesiredaccess; bool binherithandle; lpctstr lpname ); 参数说明: dwdesiredaccess:指定对文件映射对象的访 问方式。 binherithandle:指定该文件对象句柄是否可以 被继承。(ture,false) lpname:以0结尾在字符串,用于指定一个已 经创建的文件映射对象的名字。(系统通过这 个名字实现与其他进程共享文件映射对象, 进而实现进程间的数据交换
29、) 3.将文件数据映射进进程地址空间mapviewoffile lpvoid mapviewoffile( handle hfilemappingobject, dword dwdesiredaccess, dword dwfileoffsethigh, dword dwfileoffsetlow, dword dwnumberofbytestomap); 函数执行成功返回进程地址空间映射区的首地址, 否则null。 参数说明: hfilemappingobject:标识文件映射对象的句柄,即前面调 用createfilemapping返回的内存文件映像对象句柄或者 openfilemappi
30、ng函数所返回的句柄。 dwdesiredaccess:指定文件映射数据(视图)的访问方式。 表4.3 dwfileoffsethigh和dwfileoffsetlow:指定数据文件中的 哪个字节作为视图中的第一个字节来映射,即视图相对于文 件映射数据的位移值或者说偏移量。(分别指明高、低32位)。 dwnumberofbytestomap:映射文件有多少字节要映射到 地址空间。若为0,则把文件中的指定位移开始到文件的结 尾的视图映射到地址空间。 4.释放地址映射(unmapviewoffile) bool unmapviewoffile( lpcvoid lpbaseaddress); 成功返回非0值,否则返回0。 必须调用此函数来释放地址映射对象,否则进程 终止前,保留的区域就不会被释放。 参数说明: lpbaseaddress:用于设定释放区域的基地址,必须 与调用mapviewoffile函数返回的值相同。 5. 关闭文件映射对象(closehandle) boo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 驻村工作队疫情防控工作总结模版
- 湖南省湘一名校联盟2024-2025学年高一下学期期中考试历史试题(原卷版)
- 山东省济宁市2025年高考模拟考试语文试题及答案(济宁三模)
- 机械制图基础知识规范
- 中职学生政治思想个人总结模版
- 前台收银年终总结模版
- 症状性癫痫综合征的临床护理
- 学前儿童发展 课件 第11章 学前儿童情绪的发展
- 解码新质生产力
- 离心泵操作与维护培训
- 2024年初级会计实务考试真题
- 变电站设备危险源辨识清单及预控措施
- GB/T 45083-2024再生资源分拣中心建设和管理规范
- 艾灸疗法课件
- 银行职业介绍课件
- T-CASME 1514-2024 市域智慧共享中药房建设指南
- 《全球各大邮轮公司》课件
- 【MOOC】创新与创业管理-南京邮电大学 中国大学慕课MOOC答案
- 2024年3月天津高考英语第一次高考真题(原卷版)
- 2024年度高端医疗服务合同for海外医疗咨询与安排
- 池塘河道治理方案
评论
0/150
提交评论