网站大量收购闲置独家精品文档,联系QQ:2885784924

清华大学UNIX讲义第7章-1.ppt

  1. 1、本文档共168页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第7章 进程控制与进程间通信 7.1 进程控制 7.2 信号 7.3 进程与文件描述符 7.4 消息队列 7.5 信号量 7.6 共享内存 7.7 信号量和共享内存使用举例 7.8 内存映射文件I/O 7.9 文件和记录的锁定 7.1 进 程 控 制 7.1.1 进程的基本概念 1.进程与程序 所谓“进程”,就是程序的一次执行。从内核的角度看,进程是系统中的一个对象,它对应一个程序的执行流并且是一个资源分配(包括内存和文件等)的单位。操作系统就以“进程”为单位,管理这个执行流和它占用的内存等资源,并负责做到多个进程之间互不影响。 所谓“程序”,是一个由CPU指令和数据构成的集合,这些指令和数据存放在磁盘的一个普通文件中。注意:这里的“程序”不是指用C语言等高级语言编写的文本文件格式的“源程序”。程序文件的内容是按照UNIX所规定的可执行文件的格式来组织的,一般是源程序经编译链接后产生的。常见的可执行文件和目标文件的格式有ELF格式和COFF格式。其中,ELF是executable and linking format(可执行和链接格式)的缩写,COFF是common object-file format(普通目标文件格式)的缩写。程序是一个静态的概念,它用于在创建进程时初始化进程的用户数据段和指令段。初始化完成之后,进程开始执行。自此以后,进程和初始化它的程序之间就不再有联系了。 进程运行后,它对应的磁盘上的程序文件不可被删除。这是由于操作系统中虚拟内存管理功能的需要。 几个同时运行的进程可以由同一程序初始化得到,然而这些进程之间并没有什么联系。例如:允许多个用户同时使用vi程序编辑不同的文件,会有多个vi进程同时存在。但是这些进程操作的数据对象不同,互不影响,而且进程的许多属性,例如:进程主,也不一样。这将影响文件权限判断结果的不同。UNIX 内核可以通过安排相同程序创建的多个进程来共享同一个指令段以节省内存,甚至使用动态链接的手段允许不同的程序共享相同的子程序代码,但这种安排对用户来说是透明的。 2.进程的组成部分 进程是操作系统管理系统活动的基本单位。一个进程包括四个部分内容:指令段,用户数据段,用户堆栈段和系统数据段。 指令段,UNIX的术语叫做“正文段”(text),为了避免与其他概念混淆,这里称作指令段或者代码段。指令段中存放程序的CPU指令代码。对于一个C语言程序来说,主程序和子程序编译后的可执行CPU指令代码,以及调用的其他库函数的代码,都被组织在该段内。 指令段的大小是固定不变的,占用进程独立的逻辑地址空间的一部分。装入内存的指令段被设置为只读内存段,受“内存管理部件(MMU)”保护,用户程序试图篡改它们的企图会被MMU识别,产生“软中断”。为区别于CPU外部的硬件产生的中断,软中断有时也叫做“异常”或者“陷入”。操作系统内核负责所有CPU的硬件中断和软中断的处理。内核会在“中断服务程序”中处置试图篡改指令段的非法操作,一般是将进程中止。用户程序产生这样的非法操作,多数是由软件中的错误引起。比如,试图向一个指针所指单元赋值,而由于未给指针赋初值等原因,导致指针所指位置错误地指向了指令段。 用户数据段,存放程序运行所需要的数据。具体来说,C语言中的全局变量,静态(static)变量,字符串常数,都存放在该区域。对于那些在C语言源程序中给出了初值的全局变量或数组,以及字符串常数,数据段对应部分的初始值从程序文件中得到;未给出初值的变量,初始都被清为0,但是C语言不建议程序依赖系统的这种初始化来认定全局变量的初始值。UNIX允许数据段增长和缩小,这样便实现了内存的动态分配。 UNIX系统调用sbrk()允许编程调整数据段的大小,在需要分配更多内存时或者减少内存分配时增长或者缩小数据段大小。但是很少有人直接使用这个系统调用,而是直接利用C语言中基于sbrk()调用编写的一组内存管理库函数,如:malloc(), free()等。 用户堆栈段是用户程序执行所需要的堆栈空间,用于实现函数的嵌套调用。递归调用也算作嵌套调用的一种特殊形式。用户堆栈用于保存子程序执行完毕之后返回主调程序的下条指令的地址,以及在函数和被调函数之间传递参数。具体来说,在C语言中,函数调用时的实参变量,被调函数结束后返回主调函数的指令地址,都保留在堆栈内。函数体内部定义的变量(静态变量除外),也在堆栈中分配空间,函数返回时堆栈复原就会释放这些空间。另外,main()函数可以得到的命令行参数以及环境参数,存放在堆栈的最底部,程序的main()函数运行之前,这些部分就已经被系统初始化。 上述三部分均在进程私有的独立的逻辑地址空间内。而构成进程的第四部分内容“系统数据段”,是在操作系统内核内的数据,每个进程对应一套数据,包括

文档评论(0)

wuyoujun92 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档