操作系统原理及应用(全国高等院校应用型创新规划教材·计算机系列) 下载 pdf 百度网盘 epub 免费 2025 电子书 mobi 在线

操作系统原理及应用(全国高等院校应用型创新规划教材·计算机系列)精美图片
》操作系统原理及应用(全国高等院校应用型创新规划教材·计算机系列)电子书籍版权问题 请点击这里查看《

操作系统原理及应用(全国高等院校应用型创新规划教材·计算机系列)书籍详细信息

  • ISBN:9787302478928
  • 作者:暂无作者
  • 出版社:暂无出版社
  • 出版时间:2017-10
  • 页数:暂无页数
  • 价格:34.70
  • 纸张:胶版纸
  • 装帧:平装-胶订
  • 开本:16开
  • 语言:未知
  • 丛书:暂无丛书
  • TAG:暂无
  • 豆瓣评分:暂无豆瓣评分
  • 豆瓣短评:点击查看
  • 豆瓣讨论:点击查看
  • 豆瓣目录:点击查看
  • 读书笔记:点击查看
  • 原文摘录:点击查看
  • 更新时间:2025-01-20 18:07:14

内容简介:

操作系统是现代计算机中必不可少的核心软件,是计算机学科各专业的必修课程,也是从事计算机应用人员的必 备知识。

本书系统地讲述了操作系统的基本概念、原理、技术、策略及功能,尽可能多方面地提示操作系统的精髓和特征,以简洁、易懂的语言组织全书内容。

全书共7章,第1章介绍操作系统的基本知识,第2章详细说明进程管理的相关内容,第3章阐述处理机调度,第4章介绍存储管理,第5章介绍设备管理,第6章介绍文件系统,第7章介绍Linux网络及服务器配置实例。

本书既可作为高等院校计算机及相关专业本科、专科的教材,也可供从事计算机科学、工程、应用等方面工作的科技人员参考使用。


书籍目录:

目录

第1章  概述 1

1.1  操作系统的定义 3

1.1.1  面向用户的操作系统 3

1.1.2  面向系统资源的操作系统 4

1.1.3  操作系统的定义 4

1.2  操作系统的发展简史 5

1.2.1  手工操作阶段 5

1.2.2  监督程序阶段 5

1.2.3  执行系统阶段 5

1.2.4  多道程序系统阶段 6

1.2.5  操作系统的形成 7

1.3  操作系统的分类 7

1.4  计算机系统硬件简介 11

1.4.1  中央处理器 11

1.4.2  存储器 11

1.4.3  磁盘 12

1.4.4  I/O设备 12

1.4.5  总线 13

1.4.6  操作系统的工作过程 13

1.5  系统调用 15

1.5.1  系统调用的基本类型 16

1.5.2  系统调用的实现 16

1.6  现代操作系统的特征 17

1.7  操作系统的发展趋势 19

1.8  Linux操作系统简介 20

1.8.1  Linux的产生 20

1.8.2  Linux的特性 20

1.8.3  Linux与Windows操作系统

之间的差别 21

1.8.4  Linux的用户界面 22

本章小结 23

习题 24

第2章  进程控制 25

2.1  进程的概念 27

2.1.1  程序的顺序执行 27

2.1.2  程序的并发执行 28

2.1.3  进程的引入原因 31

2.2  进程控制 38

2.2.1  进程创建 38

2.2.2  进程撤销 40

2.2.3  进程阻塞 41

2.2.4  进程唤醒 42

2.2.5  Linux进程创建及执行实例 43

2.3  进程间通信 45

2.3.1  临界区与临界资源 46

2.3.2  忙等的互斥 46

2.3.3  用信号量机制实现互斥与

同步 50

2.3.4  进程通信 56

2.3.5  Linux IPC概述 57

2.3.6  Linux管道通信 58

2.3.7  Linux软中断通信 60

2.4  经典的IPC问题 63

2.4.1  生产者与消费者问题 63

2.4.2  哲学家进餐问题 63

2.4.3  读者-写者问题 65

2.5  线程 66

2.5.1  线程的引入及定义 66

2.5.2  线程与进程的关系 67

2.5.3  线程的实现方法 68

2.5.4  Linux的线程管理 68

2.5.5  Linux线程管理相关函数 69

2.5.6  Linux线程管理举例 70

2.6  管程 71

2.6.1  管程的提出 71

2.6.2  管程概念 71

2.6.3  管程的组成 71

2.6.4  管程的形式 72

2.6.5  管程的三个主要特性 73

2.7  死锁 73

2.7.1  死锁的定义和起因 73

2.7.2  规避死锁的方法 74

2.8  小型案例实训 77

本章小结 78

习题 78

第3章  处理机调度 81

3.1  作业的概念 82

3.2  作业与进程的关系 83

3.3  多级调度的概念 84

3.3.1  高级调度 84

3.3.2  中级调度 85

3.3.3  低级调度 85

3.3.4  线程调度 85

3.4  调度算法 85

3.4.1  作业调度算法 86

3.4.2  进程调度算法 87

3.5  进程调度的时机 91

3.6  Linux进程调度 91

3.6.1  Linux进程调度的目标 91

3.6.2  Linux进程分类 92

3.6.3  Linux进程优先级 92

3.6.4  Linux进程调度程序 93

3.6.5  进程调度策略 94

3.6.6  可变优先级 94

3.6.7  可变时间片 94

3.6.8  Linux进程调度实现 95

3.7  小型案例实训 95

本章小结 103

习题 103

第4章  存储管理 106

4.1  存储管理概述 107

4.1.1  计算机系统的存储体系 108

4.1.2  存储器的组织方式 109

4.2  单一连续存储管理 112

4.3  分区存储管理 112

4.3.1  固定分区方式 112

4.3.2  可变分区方式 114

4.3.3  分区式存储管理的特点 116

4.3.4  分区式存储管理的内存扩充

技术 117

4.4  分页存储管理 119

4.4.1  分页存储管理的基本原理 119

4.4.2  分页存储管理的数据结构 120

4.4.3  页式地址结构及转换 122

4.4.4  相联存储器和快表 124

4.4.5  分页存储管理的内存分配与

回收 125

4.4.6  分页存储管理的内存共享与

保护 126

4.4.7  分页存储管理的特点 127

4.5  分段存储管理 127

4.5.1  分段存储管理的基本原理 127

4.5.2  分段存储管理的数据结构 128

4.5.3  分段存储管理的地址结构及

转换 128

4.5.4  内存分配与回收 129

4.5.5  段共享与保护 130

4.5.6  分段存储管理的特点 131

4.5.7  分页存储管理和分段存储管理

的区别 131

4.6  段分页存储管理 131

4.7  虚拟存储管理系统 131

4.7.1  虚拟存储概述 131

4.7.2  请求分页虚拟存储管理 133

4.7.3  请求分段虚拟存储管理 138

4.7.4  段页式虚拟存储管理 138

4.8  Linux的存储管理 139

4.8.1  Intel 80386体系结构下的内存管理机制 139

4.8.2  Linux地址转换机制 142

4.8.3  Linux内存分配和释放 143

4.8.4  Linux进程虚拟内存地址 145

4.8.5  Linux页面操作 147

4.9  小型案例实训 149

本章小结 153

习题 153

第5章  设备管理 155

5.1  概述 156

5.1.1  设备的分类 156

5.1.2  设备管理的功能 157

5.2  设备控制器 158

5.2.1  设备控制器的基本功能 158

5.2.2  设备控制器的组成 159

5.3  数据传送控制方式 159

5.3.1  程序直接控制方式 160

5.3.2  中断控制方式 160

5.3.3  DMA方式 161

5.3.4  通道控制方式 163

5.4  中断技术 164

5.4.1  中断的基本概念 164

5.4.2  中断类型 166

5.4.3  中断的优先级 167

5.4.4  软件中断 168

5.5  缓冲技术 168

5.5.1  缓冲技术的引入 168

5.5.2  缓冲的分类与管理 169

5.6  设备独立性 169

5.7  设备分配 170

5.7.1  设备分配中的数据结构 170

5.7.2  设备分配时应考虑的因素 171

5.8  SPOOLing系统 172

5.9  Linux设备管理 173

5.9.1  设备管理概述 173

5.9.2  Linux的I/O控制 175

5.9.3  字符设备与块设备管理 177

5.10  小型案例实训 178

本章小结 182

习题 183

第6章  文件系统 184

6.1  文件 186

6.1.1  文件管理的几个基本概念 186

6.1.2  文件分类 187

6.2  文件组织形式 187

6.2.1  文件的逻辑结构 187

6.2.2  文件的物理结构 188

6.3  文件存储空间的管理 191

6.3.1  空闲文件目录法 191

6.3.2  空闲块链法 191

6.4  文件目录管理 192

6.4.1  文件目录管理的基本要求 192

6.4.2  文件控制块和索引节点 193

6.4.3  文件目录结构 193

6.4.4  文件共享 194

6.4.5  文件保护 195

6.5  文件操作 196

6.6  文件系统的层次模型 196

6.7  Linux文件系统概述 198

6.7.1  Linux文件系统特点 198

6.7.2  Linux的文件类型 198

6.7.3  Linux的虚拟文件系统 199

6.7.4  挂载、卸载文件系统 201

6.7.5  ext2文件系统 201

6.8  小型案例实训 202

本章小结 208

习题 209

第7章  Linux网络及服务器配置

实例 211

7.1  Linux网络基础 212

7.1.1  Linux网络的相关概念 212

7.1.2  Linux的网络端口 212

7.1.3  Linux网络的相关配置文件 213

7.2  配置网卡 216

7.2.1  配置TCP/IP 网络 216

7.2.2  网络相关命令 217

7.2.3  桌面环境下配置网卡 218

7.2.4  配置网络的shell命令 221

7.3  Linux网络服务 223

7.3.1  服务器软件与网络服务 223

7.3.2  管理服务 224

7.4  samba服务器 224

7.4.1  samba概述 224

7.4.2  samba的安装 227

7.4.3  samba的配置文件 227

7.4.4  samba的文件共享 227

7.4.5  samba的打印共享 229

7.4.6  启动和停止samba服务 230

7.4.7  编辑文件配置samba服务器

实例 230

7.5  DNS服务器 232

7.5.1  配置主DNS服务器 232

7.5.2  配置辅助DNS服务器 234

7.5.3  测试DNS服务器 234

7.6  FTP服务器 236

7.6.1  FTP服务器简介 236

7.6.2  vsftpd服务器配置基础 237

7.6.3  配置vsftpd服务器 239

本章小结 240

习题 241

附录 242

参考文献 257


作者介绍:

暂无相关内容,正在全力查找中


出版社信息:

暂无出版社相关信息,正在全力查找中!


书籍摘录:

第2章  进 程 控 制

本章要点

* 进程的概念。

* 进程与程序间的区别。

* 进程控制。

* 原语。

* 临界区、临界资源。

* 进程互斥、进程同步、进程通信。

* 信号量机制。

* Linux IPC种类。

* Linux管道通信。

* Linux软中断通信。

* 线程的概念。

* 管程。

* 死锁的概念。

学习目标

* 理解并掌握进程的概念。

* 理解进程与程序的区别。

* 熟悉进程状态及转换。

* 理解Linux进程状态及转换。

* 理解并掌握进程控制块的概念。

* 理解原语的概念。

* 掌握临界区、临界资源的概念。

* 理解并掌握进程互斥、进程同步的概念。

* 理解并掌握信号量机制。

* 理解排除死锁的三种方法。

* 理解并掌握银行家算法。

* 了解线程、管程的概念。

* 理解并掌握Linux管道通信及软中断通信方式。

  

  计算机开机后就一直在运行各种各样的程序,而操作系统的核心任务就是管理好这些程序,确保它们正确、高效地运行。如果任何时刻,计算机系统中只有一个程序,则该程序将独占计算机系统中的所有资源,整个程序的运行过程就非常简单,管理起来也很容易。为提高计算机系统中各种资源的利用率,现代操作系统都采用了多道程序设计技术,多道程序的创建都围绕着进程的概念。因此,操作系统的程序管理也就转变成了进程管理。

  进程是操作系统最基础和最重要的概念。进程是执行中的程序,想要了解程序在系统中的执行情况,只有通过进程才能够了解其中的细节。进程涉及操作系统中的很多内容,因此通过进程的学习,可以了解操作系统内部的工作机制,对于操作系统设计者及学生来说,这是至关重要的。

  进程是操作系统中最为抽象的概念之一。单CPU系统中程序是以并发方式执行的,对进程而言,这也就是将CPU虚拟成多个。这种抽象是现代计算机操作环境下的应用基础。本书内容是以单CPU环境作为实例。

2.1  进程的概念

  从静态的角度观察,操作系统是一组程序和表格的集合;从动态的角度观察,操作系统是进程的动态、并发执行。进程是执行中的程序。因此,可以从程序的执行方式来说明进程的概念。

  程序的执行方式分为顺序执行和并发执行两种。顺序执行是指操作系统按顺序执行程序,每一程序在执行过程中占用系统所有资源,也不会被暂停。单道批处理系统是顺序执行的典型例子。并发执行是指系统中同时有多个程序处于运行中,这些程序以交替的方式在处理器上执行,而从宏观的角度看,这些程序是“同时”被处理器执行的。并发是操作系统的特征,因此现代操作系统中程序均是以并发的方式被执行。

2.1.1  程序的顺序执行

1. 顺序执行的概念

  程序通常是由若干个操作构成,一个操作对应一个功能,这些功能必须有严格的先后顺序,只有前一个功能执行完毕,后一个功能才能开始执行,这是程序内部的顺序执行性。若有一个任务由若干程序组成,而这些程序之间也存在前后顺序性,这就是程序外部的顺序性。

  假设程序的执行过程可分为输入、计算、打印,用I表示程序的输入操作,用C表示程序的计算操作,用P表示程序的打印输出,则顺序执行方式的示意如图2-1所示。

图2-1  程序的顺序执行方式

2. 顺序执行程序的特点

  顺序执行程序的特征如下。

  1) 顺序性

  程序的执行严格按照顺序方式进行。

  2) 环境的封闭性

  按顺序方式执行程序,该程序独占系统全部资源,不受外界因素的影响。

  3) 结果的可再现性

  一个程序在初始条件保持不变的情况下,无论在什么环境中运行、什么时间段内运行,都应该有相同的执行结果。

2.1.2  程序的并发执行

1. 并发执行的概念

  在顺序执行方式下,系统资源只为一个程序服务,系统管理程序较为简单,但是当一个部件工作时,另两个部件均处于空闲状态,因此顺序执行程序时系统资源利用率不高。现代操作系统为提高系统资源的利用率,提升系统吞吐能力,程序通常是以并发的方式执行,如图2-2所示。

图2-2  程序的并发执行方式

  当程序1执行计算操作时,输入设备可以给程序2使用,当程序1执行打印操作时,可以让程序2执行计算操作,同时可以让程序3执行输入操作。从时间上看,3个程序全部都在系统中执行,虽然它们在执行不同的操作,3种设备也得到了充分的利用。

  另一种并发是在某道程序的几个程序段中,其中包含可同时执行或颠倒执行的代码,例如:

  

read(x);

read(y);

  

  这两个语句执行时互不影响,它们既可同时执行,也可颠倒次序执行。也就是说,这种语句同时执行或颠倒顺序执行不会改变程序执行结果。因此,可采用并发执行方式充分利用系统资源以提高计算机的处理能力。

  综上所述,程序的并发执行是指,若干个程序或程序段同时在系统中运行,这些程序的执行时间是重叠的,即一个程序或程序段还未执行完毕,另一个程序或程序段已经开始运行,这就是几个程序或程序段的并发执行。

  并发执行的程序之间可以没有交互,也可以是有交互的。没有交互的程序并发执行表示这些程序在执行过程中互不影响,例如没有共享变量或程序段,而反之就是有交互的,有共享变量或程序段的程序之间并行执行时必须加以控制,以保证程序执行结果的正确性。

  并发执行的程序只有严格地保证相互之间没有交互性,才可以并发执行。1966年,Bernstein提出了程序可并发执行的条件,称为Bernstein条件:

  假设任一程序语句Pi,在执行过程中会涉及两个变量集合R(Pi)和W(Pi)的操作,其中R(Ti)={a1, a2,…, am}, aj(j=1, 2, … ,m)表示语句Pi在执行过程中必须进行读操作的变量集合;W(Ti)={b1, b2, … , bm}, bj(j=1, 2, … ,m)表示语句Pi在执行过程中必须进行写操作的变量集合;如果对语句T1和T2在执行过程中满足R(T1)∩W(T2)={φ},R(T2)∩W(T1)={φ},W(T1)∩W(T2)={φ}同时成立,则语句T1和T2是可以并发执行的。

2. 并发执行带来的影响

  程序并发执行可以使系统资源的利用率得到提高,从而提高系统的处理能力,这是并发执行的优势所在。当然,多个程序并发执行共享系统中的所有软硬件资源,这就对资源的管理提出了较高的要求。若系统分配资源出现问题,将会使并发执行程序的结果出现混乱。若并发执行的程序或程序段满足前面描述过的Bernstein条件,则认为不会对执行结果的可再现性产生影响。但一般程序在执行时,系统要判断各条语句或程序段是否满足Bernstein的3个条件是相当困难的。

  两个交互的并发执行的程序,它们之间的相互影响通常是不可预测的,甚至无法再现。这是因为程序并发执行的相对速度不可预测,交互的速率不仅受处理器调度的影响,还要受到与其交互的程序、资源等的影响,甚至受到无关程序的影响。因此,对于有共享资源的程序,当它们以并发的方式执行时,执行结果往往取决于这一组并发程序的相对速度,各种与时间有关的错误就可能出现。与时间有关的错误或者表现为结果的不唯一,即执行结果的可再现性被破坏,或者表现为程序间相互无限等待。这些情况可通过下面的例子进行详细说明。

  【例2-1】 程序间共享公共变量。

  若有共享公共变量的两个程序段A和程序段B:

  程序段A

  

{

 …

 n := n 1;

 …

}

  

  程序段B

  

{

 …

 print(n);

 n := 0;     

 …

}

  

  当两个程序段顺序执行时,例如,A先执行B后执行,执行结果具有封闭性和可再现性。但是,当两个程序段并发执行时,执行情况如表2-1所示。

表2-1  程序段A和B并发执行的情况

A的n :=n 1与B的两个语句

执行顺序的关系

变量n的取值情况

A在B之前执行

A在B之后执行

A在B的两个

语句之间执行

n的初值

10

10

10

打印n的值

11

10

10

n最终的值

0

1

0

  

  由表2-1可知,程序段A和B并发执行的3种情况对于变量n的输出和n的最终值均不完全相同,说明程序执行结果的可再现性被破坏。这种情况的发生是因为程序段A和B有共享公共变量n,而且对于共享变量n的使用没有加以控制,因此,当程序段A和程序段B以不同的速度执行时就产生了不同的结果。

  【例2-2】 假设某飞机订票系统在T0时刻有A、B、C、D四个终端程序同时都要对同一航班当前剩余票数X进行操作。如果每个终端程序的当前订票需求为Ni(i=A, B, C, D),并对共享变量X进行如下操作:

  在数据库中取出当前航班的机票剩余数X;

  判断X >0(有票吗)?

  如果有,判断X≥Ni(票够吗)?

  如果够,则出票(打印票据);

  Xi=X-Ni(修改剩余票数);

  将Xi回写到数据库中。

  假设当终端A执行到出票还未执行完毕时,这时另有终端B开始读取数据库中当前剩余票数X。因终端A仅执行到出票操作,还未将新的剩余机票数Xi修改回数据库,这时终端B读取到的剩余机票数X已经是过时的数据(也称脏数据)。本例中,多个终端共享服务器端存储的同一航班剩余机票数X,导致上述问题的发生是因为当多个终端同时访问剩余机票数X时,若不加以控制,就可能出现一个终端正在修改X的值,而同时另一终端读取数据库中还没有来得及修改的X旧值,这种情况可能导致某航班售出的座位数超过实际座位数。

  上述两例说明,在多道程序并发执行中,由于并发执行的程序共享资源或者互相协作,因其执行速度的不确定性以及多道程序之间缺乏控制所带来的错误称为“与时间有关的错误”。

  导致这种“与时间有关的错误”出现的原因如下。

  (1) 与各程序的执行速度有关。

  (2) 由于多个程序都共享了同一个变量或者互相需要协调同步。

  (3) 对于变量的共享或者互相协作的过程没有进行有效的控制。

3. 并发执行的特点

  (1) 并发性。程序的执行在时间上可以重叠,在单处理器系统中可以并发执行;在多处理器环境中可以并行执行。

  (2) 共享性。它们可以共享某些变量,通过引用这些共享变量就能互相交换信号,从而,程序的运行环境不再是封闭的。

  (3) 制约性。程序并发执行或协作完成同一任务时,会产生相互制约关系,必须对它们并发执行的次序(即相对执行速率)加以协调。

  (4) 交互性。由于程序在执行中共享某些变量,所以一个程序的执行可能影响其他程序的执行结果。因此,这种交互必须是有控制的,否则会出现不正确的结果。即使程序自身能正确运行,由于程序的运行环境不再是封闭的,程序结果仍可能是不确定的,计算过程具有不可再现性。

2.1.3  进程的引入原因

  现代计算机使用时一般都是多个任务同时运行。例如,用户可能一边在编辑文字,一边听音乐,同时还上网查资料。当计算机启动时,后台会运行许多程序,如系统杀毒程序、系统网络服务程序等,这些程序均对用户是透明的,只有在任务管理器中才有体现。

  在多任务执行环境下,操作系统中的进程是不断进行切换的,也即进程在轮流使用CPU。这种切换的时间很短,大致在毫秒或纳秒之间(根据各操作系统设计实现中设置的时间片不同而不同)。在某一时刻,CPU只运行一道程序。人可以明显感觉到1秒的变化,但对CPU而言,在1秒钟的时间已经切换多个进程了,这样就给人一种错觉,系统中所有程序在同时运行。例如,一边听歌,一边上网,一边处理文字编辑,用户感觉不到音乐程序被间断执行,也感觉不出上网过程中的间断等,这种情况就是进程的并发执行。并发指的就是一段时间内的同时运行,这是一种伪并行(在多CPU计算机系统中,或大型机上才会有真正的并行程序执行)。并发是逻辑上的“同时”,在一段时间内的“同时”;而并行是物理上的同时,是一个时刻(或一个时间点上)的同时。若要了解并发方式下程序的执行细节,通过程序是很难说明的。但是,从操作系统中引入的进程可以清楚、明白地了解到程序在系统中的执行细节。

1. 进程的定义

  根据前面的分析,进程可看作3个部分的组合。

  (1) 一段可执行的程序代码。

  (2) 程序运行所需要的相关数据(常量、变量、工作区、缓冲区等)。

  (3) 程序运行时的上下文环境。

  程序是一段实现某个功能的代码,由用户事先编制,在运行过程中通常不再改动。程序的数据是程序的处理对象,随着程序的运行通常会被修改。程序上下文环境包括CPU管理和执行程序所需要的所有信息,是最重要的部分。进程实际上是一个有独立功能的程序在某个数据集合上的一次运行。

2. 进程与程序的关联

  进程是执行中的程序。从抽象的角度来看,每个进程都有自己的CPU。这是通过操作系统的分时技术和程序的并发执行方式给用户提供的一种抽象。而实际上,在一段时间内,CPU同时运行了多道程序。这种在一段时间内多道程序的同时运行也就是多道程序设计。

  多道程序的特点是在任何时候计算机系统中都允许有多个程序在运行。先来看一个多道程序的例子。

  在图2-3中,程序A、程序B和程序C都在t0到t1时间内运行,但各个程序是在该时间范围的不同时间段内运行的。换句话说,三个程序在较大时间范围内(宏观)是同时运行的,但在若干小的时间段内(微观)是单独运行的。这种运行方式被称为并发运行。

图2-3  多道程序同时运行的例子

  在多道程序并发运行过程中,由于多个程序共享CPU等各类资源,或者互相协作,操作系统需要解决程序运行过程中产生的下列问题。

  1) 程序运行的确定性

  一个程序的运行结果不能受系统中其他运行程序的干扰。一个程序不论是一次性全部运行完,还是走走停停,最后的运行结果只能跟程序的输入有关。

  2) 互斥

  多个处于运行过程中的程序经常要访问同一共享资源,要正确控制多个程序对共享资源的访问。例如火车售票系统中,多个售票窗口访问同一个数据库。当一个售票窗口正在修改数据库中的车票信息时,应该禁止其他窗口访问数据库,否则就可能会出现同一张票售给多个用户的情况。

  3) 同步

  多个程序在运行时,会出现其中一个程序需要其他程序提供数据的情况,或者需要等待其他程序的事件,所以要提供正确的同步机制。例如一个程序启动了I/O设备的读操作,在继续进行之前必须等到输入缓冲区有数据。在这种情况下,程序需要接收I/O设备的输入完成信号。如果信号机制不正确,则可能导致信号丢失或重复接收。

  4) 死锁

  程序在运行过程中会出现等待情况,要避免出现所有程序都在等待、而靠它们自己又结束不了等待的情况。例如,一个程序获得了一个资源的访问权,而另一个程序获得了另一个资源的访问权,假如现在两个进程都在等待对方释放其占有的资源,然后才肯释放自己占有的资源,这就导致两个程序都不能运行。

  因CPU在多道程序间来回切换,这就表明操作系统运行期间存在的所有进程是对系统中的所有资源进行共享,包括CPU、内存、I/O设备、共享的文件等,因此一个程序在系统中的执行时间是未知的,因每个程序使用某种共享资源的时间是不确定的。从某种意义上说,一个程序以并发方式执行时,其执行时间是被拉长的。同时,同一道程序在不同时刻被执行两次,每次的执行时间是不确定且很有可能是不同的,但操作系统必须保证的是,对于有相同初始条件的程序,在任一时间、任一环境下执行后其结果是保持不变的,这就是程序执行结果的可再现性。

  进程与程序之间的关联既紧密又微妙。这里通过一个例子来说明它们之间的关系,虽然不太恰当,但却有助于理解。例如,用户购买了一个电动手钻工具,准备在墙上打一个墙钉。电动手钻的说明书就好比程序,使用手钻的过程就好比是进程。打墙钉过程中使用到的电动手钻工具、墙、钉等三件物品就好比进程在系统中执行时涉及的程序代码、数据、堆栈、进程空间等相关资源。不管电动手钻这个工具使用与否,说明书都是一直存在的(如果用户没有将它丢掉的话),而手钻的使用过程却是因时因人而异,一次使用完毕,这个过程也就结束了,这和进程是非常一致的。程序的一次执行过程结束之后,程序仍存在于外存上,但进程执行完毕后就没有存在的意义了。此时该进程无须继续存在于内存中,进程执行过程中所使用到的资源也将被收回。在Linux或UNIX操作系统中,进程无须继续存在时将被“杀死”。进程与程序有联系,也有区别,具体表现在以下几个方面。

  (1) 程序是静态的,进程是动态的,且有生存期的。

  (2) 进程的特征是并发的,而程序没有。

  (3) 进程在执行过程中会占用某些系统资源,操作系统中分配资源是以进程为单位,不会以程序为单位分配资源。

  (4) 进程和程序之间存在多对多关系。一个程序可以运行多次,每次运行对应不同的进程;另外,程序运行过程中可以创建多个子进程,如果子进程不重新加载其他程序,则这些进程便对应同一个程序。当进程在运行过程中加载其他程序时,将使得一个进程可以包含多个程序的运行。

3. 进程的状态

  一个进程从新建到消亡前之间的任何时刻,或者正在执行,或者没有执行。某时刻正在执行的进程只有一个,而对应的没有执行的进程则往往有多个。这些没有执行的进程有两种可能:一种是处于非运行状态但已经就绪等待执行;另一种是等待I/O操作等被阻塞(等待)。运行、就绪、阻塞是3个最基本的进程状态,再加上新建和消亡两个辅助状态,共有5个基本状态,如图2-4所示。

图2-4  进程基本状态与变迁

  (1) 新建。刚刚创建的进程,操作系统还没有把它加入到可执行进程组中,通常是还没有加载到主存中的新进程。

  (2) 运行。该进程正在被执行。

  (3) 就绪。进程做好了运行准备,只要获得CPU就可以开始执行。

  (4) 阻塞。进程在等待某些事件,如I/O操作。

  (5)消亡。操作系统从可执行进程组中撤销了进程,或者自身停止,或者因为某种原因被撤销。

  “新建”状态和“消亡”状态对进程管理非常有用。进程处于新建状态意味着操作系统已经执行了创建进程的必需动作,但进程未获得开始运行所需的资源。例如,操作系统基于性能或内存局限性等原因,可能会限制系统中的进程数量。当进程处于新建态时,操作系统所需要的关于该进程的信息已保存在内存相关数据结构中,但程序代码还未进入内存,也没有分配相关的数据空间。待合适时机再把程序及其数据装入内存。消亡态的进程不能再获得CPU的调度,但与进程相关的表和其他信息临时被保存起来,这样实用程序可从中提取进程的历史信息进行性能和效率的分析。当这些信息被使用完后,操作系统再将消亡态的进程从系统中删除。

  接下来进一步分析各状态之间的转换关系。

  1) 新建→就绪①,新建→运行②

  刚刚创建的进程已经具备运行的条件,通常将该进程插入就绪列队而使之成为就绪态。

  但如果该新建进程对应紧急事件需要立即处理,也可以直接将之投入运行,这种情况称为抢先,在实时系统中是可能的。

  2) 运行→消亡③,运行→阻塞④,运行→就绪⑤

  处于运行状态的进程接下来可能会进入什么状态呢?理想情况下,进程一直被执行,直到全部结束成为消亡状态。

  但在多任务系统中,操作系统不能让一个进程一旦投入运行便一直占用CPU。进程运行过程中可能需要请求一个无法立即得到的资源,此时,CPU可以调度另外的进程来运行,该进程被阻塞成为阻塞状态。

  也有可能进程运行过程中不需要频繁请求资源,但运行时间比较久,比如复杂的算法程序,这会造成其他进程长时间等待,就不能保证其他进程的快速、公平、优先权和系统总体效率。为了改善这种情况,可考虑让进程运行一段合适的时间(时间片),如果该时间段过后,进程仍未能运行完,操作系统需要暂停该进程的执行,而将CPU分配给其他就绪进程。被暂停的进程只要重新获得CPU就可继续执行,它并不是因为等待某些事件,因而,应将它插入就绪队列,等待操作系统的调度。

  3) 阻塞→就绪⑥,阻塞→运行⑦

  当处于阻塞状态的进程等待的事件到来,比如已获得申请的资源时,则它也具备了运行的条件,通常将它插入就绪队列,等待调度。

  跟新建→运行一样,如果该进程获得等待事件后需要立即处理,也是可以将它抢先于当前运行进程而成为运行态,被抢先的进程则进入就绪队列。

  4) 就绪→运行⑧

  就绪状态的进程在调度算法的调度下获得CPU便可投入运行。

  上述状态是一般性分析,实际操作系统对进程的状态及其变迁有具体的规定。

4. Linux进程的状态

  Linux的进程状态及其变迁如图2-5所示。

图2-5  Linux的进程状态及其变迁

  从图2-5中可以看出,Linux的进程状态有6种。

  1) 运行态和就绪态

  运行和就绪通过进程是否占有CPU资源来区分,它们同时由R(TASK_RUNNING)代表。同一时刻可能有多个进程处于可执行状态,这些进程的task_struct结构(进程控制块)被放入对应CPU的可执行队列中(一个进程最多只能出现在一个CPU的可执行队列中)。进程调度器的任务就是从各个CPU的可执行队列中分别选择一个进程在该CPU上运行。

  2) 僵死态

  在Linux进程的状态中,僵死态是非常特殊的一种,它表示进程已经结束,但是没有从进程表中删除。它没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程的退出状态等信息供其他进程收集,除此之外,该进程不再占有任何内存空间,处于僵死状态(TASK_ZOMBIE)。

  进程在退出的过程中,处于TASK_DEAD状态。在这个退出过程中,进程占有的所有资源将被回收,除了task_struct结构(以及少数资源)以外。于是进程就只剩下task_struct这么个空壳,故称为僵尸。之所以保留task_struct,是因为task_struct里面保存了进程的退出码,以及一些统计信息。而其父进程很可能会关心这些信息。子进程在退出的过程中,内核会给其父进程发送一个信号,通知父进程来“收尸”。父进程可以通过wait系列的系统调用(如wait4、waitid)来等待某个或某些子进程的退出,并获取它的退出信息。然后wait系列的系统调用会顺便将子进程的“尸体”(task_struct)也释放掉。

  3) 可中断睡眠

  可中断睡眠S(TASK_INTERRUPTIBLE)表示进程等待某个事件或某个资源。可中断睡眠的进程可以被信号唤醒而进入就绪状态等待调度,又称为浅度睡眠。

  4) 不可中断睡眠

  不可中断睡眠D(TASK_UNINTERRUPTIBLE)的进程是因为硬件资源无法满足,不能被信号唤醒,必须等到所等待的资源得到之后由特定的方式唤醒,又称为深度睡眠。

  TASK_UNINTERRUPTIBLE状态存在的意义就在于,内核的某些处理流程是不能被打断的。在进程对某些硬件进行操作时(比如进程调用read系统调用对某个设备文件进行读操作,而read系统调用最终执行到对应设备驱动的代码,并与对应的物理设备进行交互),可能需要使用该状态对进程进行保护,以避免进程与设备交互的过程被打断,造成设备陷入不可控状态。这种情况下的TASK_UNINTERRUPTIBLE状态总是非常短暂的。

  5) 暂停态

  处于暂停状态的进程用T(TASK_STOPPED)表示,一般都是由运行状态转换而来,等待某种特殊处理。比如处于调试跟踪的程序,每执行到一个断点,就转入暂停状态,等待新的输入信号。

  向进程发送一个sigstop信号,它就会因响应该信号而进入TASK_STOPPED状态(除非该进程本身处于TASK_UNINTERRUPTIBLE状态而不响应信号)。

5. 进程的实现(PCB)

  操作系统运行期间,在一段时间内系统中的进程数量通常都有很多个。系统为了能完成系统资源的分配与管理以保证进程间的顺利切换,需要掌握系统中进程执行的详细情况,例如需要了解进程当前的状态、进程执行中使用CPU的情况、进程的家族情况记录、进程使用其他资源情况等诸多信息。因此,操作系统中为每一进程维护着一个进程控制块PCB(Process Control Block,也有称为进程表Process Table的),并在其中不断记录上述信息。不同的操作系统对这些信息的组织有所不同,但大致包括三大类,如表2-2所示。

表2-2  进程控制块中的典型信息

类  别

具体内容

进程标识信息

进程的标识信息有本进程标识符、父进程标识符和家族关系结构、用户标识符

进程状态信息

可通过指令访问的用户可见寄存器、CPU自动维护的控制和状态寄存器、栈指针

进程控制信息

诸如进程状态、优先级、调度的信息、等待事件等的调度和状态信息、链接到其他进程的各种队列指针、与进程通信有关的标志/信号/信息、进程特权管理信息、本进程的虚拟存储空间的段或页指针、本进程拥有的资源及使用情况

  

  PCB是进程存在的唯一标识,是操作系统对进程进行控制、管理和调度的依据,它在创建进程时产生,在撤销进程时消亡。

6. 系统中PCB的管理

  通常操作系统运行期间,内存中存在的进程数量较多。这些进程中有一部分进程正在等待处理器的执行,有些进程等待外设的操作,有些进程等待共享软件资源变为可用。操作系统管理程序要从为数众多的进程中找出其中某一个,并为其分配所需的资源,这样就存在如何管理系统中进程的问题。一般的管理方法如下。

  (1) 把所有的PCB组织在一个表格中。这种方法管理程序简单,由于没有进行归类排序,因此系统在查找某一进程时会耗费较多时间,这种方法使用不太方便,仅适用于进程数目少的场合。

  (2) 分别把有着相同状态的进程的PCB组织在同一表格中,如图2-6所示。这种方法相比前一种方法进行了较简单的归类,如将进程分别放到就绪进程表、等待进程表、运行进程表等表中。相较前一种方法,系统查找效率有较大的提高,但这种方法仍只是初步排序,在实际应用中还有些信息有待更进一步细分。

图2-6  进程多队列管理示意

  (3) 分别把具有相同状态的所有进程的PCB按优先级排成一个或多个队列,如图2-7所示。这是目前较为常用的方法,如针对不同优先级有相应的就绪队列、等待队列等,虽然进程可能等待的资源相同,但优先级不同。这种分类方法与操作系统内核实际更为接近,故用这种方式管理系统中的进程PCB,虽然增加了管理程序的复杂度,但是系统的工作效率得到极大提高。

图2-7  不同优先级的多就绪队列管理示意

7. Linux的进程控制块

  在Linux中,进程又被称为任务。系统中的所有进程用一个数组表示:

  

struct task_struct * task[NR_TASKS];

  

  每个进程占用task数组中的一项,即一个task_struct结构,该结构就是进程控制块(PCB)。

  task_struct的主要内容如下。

  (1) 标示符:描述本进程的唯一标识符,用来区别其他进程。

  (2) 状态:任务状态,退出代码,退出信号等。

  (3) 优先级:相对于其他进程的优先级。

  (4) 程序计数器:程序中即将被执行的下一条指令的地址。

  (5) 内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针。

  (6) 上下文数据:进程执行时处理器的寄存器中的数据。

  (7) I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。

  (8) 记账信息:可能包括处理器时间总和、使用的时钟数总和、时间限制、记账号等。

  task_struct可以在include/linux/sched.h里找到。所有运行在系统里的进程都以 task_struct 链表的形式存在于内核中。

2.2  进 程 控 制

  操作系统必须严格地管理对进程的操作。若对系统中进程未加以严格控制管理,系统将会出现严重错误。例如,在多任务环境下,某个进程创建了一个新的进程,还未执行成功系统就发生了进程切换,新被切换的进程在执行中需杀死某个进程,可能因某种计算错误而导致将被杀死的进程是刚刚被创建还未成功的进程,或者杀死的是刚刚被撤销但并未处于消亡态的进程,甚至杀死的是不被允许操作的进程等。这些情况的发生就会导致CPU处理时间的浪费,或者导致某用户程序出现重大错误。出现这些错误的原因,是由于操作系统没有对进程控制加以严格管理而造成的。因此,在操作系统中对于进程控制的管理须严格加以控制,对于进程控制的操作是不允许并发执行的。

  以上进程控制操作可以通过原语程序来实现。原语是系统态下执行的特殊系统程序。为严格保证程序执行过程中不被中断,原语在执行时CPU处于关中断状态(CPU不响应中断信号),即原语不允许并发执行。进程控制如不使用原语,会造成状态的不确定性,不能达到进程控制的目的。原语的实现方法之一是以系统调用的方式提供原语接口,采用屏蔽中断的方式来实现,以保证原语操作不被中断的特性。原语和系统调用都使用访管指令(访管中断)实现,具有相同的调用形式,但原语由内核完成,而系统调用由系统进程或系统服务程序实现(如中断服务子程序);原语不可被中断,而系统调用执行时允许被中断,甚至某些操作系统中的系统进程或系统服务程序就在用户态进行。原语通常供系统进程或系统服务程序使用,反之不会形成调用关系,系统进程或系统服务向实用程序提供系统调用,而实用程序向应用程序提供高层功能。与进程控制相关的操作有进程创建、进程撤销、进程阻塞、进程唤醒4种。



原文赏析:

暂无原文赏析,正在全力查找中!


其它内容:

编辑推荐

 操作系统是计算机系统中较为重要的系统软件,在计算机学科的课程体系中占有重要的地位,是计算机及相关专业的一门基础必修课,也是计算机专业从业者必须掌握的知识。一本适用的教材对于操作系统的学习尤为重要。因此,作者在多年教学工作的基础上,结合Linux 2.4内核相关内容编写了此书。

  考虑到课程学习的有限课时数,我们对内容进行了精选,着重于操作系统基本概念、基本原理、实现策略、基本算法原理的阐述,力图从两个主线――操作系统的资源管理角度和面向用户的角度将操作系统内容组织成一个逻辑清晰的整体。

  全书共分7章。从操作系统的资源管理角度分别介绍了相关软硬件资源管理的内容,并在其中引入Linux 2.4相关的内容进行实例说明。


前言

前    言

  操作系统是计算机系统中较为重要的系统软件,在计算机学科的课程体系中占有重要的地位,是计算机及相关专业的一门基础必修课,也是计算机专业从业者必须掌握的知识。一本适用的教材对于操作系统的学习尤为重要。因此,作者在多年教学工作的基础上,结合Linux 2.4内核相关内容编写了此书。

  考虑到课程学习的有限课时数,我们对内容进行了精选,着重于操作系统基本概念、基本原理、实现策略、基本算法原理的阐述,力图从两个主线――操作系统的资源管理角度和面向用户的角度将操作系统内容组织成一个逻辑清晰的整体。

  全书共分7章。从操作系统的资源管理角度分别介绍了相关软硬件资源管理的内容,并在其中引入Linux 2.4相关的内容进行实例说明。

  第1章  概述  介绍操作系统的基本知识、操作系统的历史与发展、操作系统的分类,简要介绍了计算机系统相关部件,并引入系统调用的概念,说明了操作系统的特征及发展趋势,并对Linux操作系统的产生及发展特征做了简要说明。

  第2章  进程控制  介绍进程的概念,对进程控制、进程互斥、同步、通信、进程死锁、管程、线程的概念等问题进行了分析和讨论,并介绍了Linux进程控制、Linux进程通信的内容,设计了两次实验。

  第3章  处理机调度  介绍作业的概念、作业与进程的关系、多级调度的概念、作业及进程调度算法、Linux进程调度等相关内容。

  第4章  存储管理  介绍存储管理功能、单一连续存储管理、分区式管理、分页式管理、分段式管理、段页式管理、虚拟存储技术、Linux存储管理等知识。

  第5章  设备管理  介绍设备管理概述、设备控制器、设备的数据传输控制方式、中断技术、缓冲技术、设备独立性、设备分配、SPOOLing技术等内容。

  第6章  文件系统  介绍文件的基本概念、文件组织形式、文件存储空间管理方法、文件目录管理、文件操作、文件系统的层次模型、Linux文件系统概述等内容。

  第7章  Linux网络及服务器配置实例  介绍Linux网络基础知识、网卡配置、Linux网络服务、samba服务器配置、DNS服务器配置、FTP服务器配置等相关内容。

  本书主要由福建工程学院陈敏、许雪林、汤龙梅、王璇、杨海燕等教师合作编写,在本书的编写过程中参考了大量的相关技术资料及经典案例,吸取了许多宝贵经验,在此一并表示谢意!

  由于编者水平有限,书中难免会有疏漏和不妥之处,希望读者批评指正。

  

  

编者

 



书籍真实打分

  • 故事情节:4分

  • 人物塑造:7分

  • 主题深度:3分

  • 文字风格:9分

  • 语言运用:8分

  • 文笔流畅:4分

  • 思想传递:9分

  • 知识深度:9分

  • 知识广度:6分

  • 实用性:6分

  • 章节划分:7分

  • 结构布局:9分

  • 新颖与独特:8分

  • 情感共鸣:8分

  • 引人入胜:5分

  • 现实相关:5分

  • 沉浸感:3分

  • 事实准确性:4分

  • 文化贡献:8分


网站评分

  • 书籍多样性:8分

  • 书籍信息完全性:8分

  • 网站更新速度:7分

  • 使用便利性:5分

  • 书籍清晰度:9分

  • 书籍格式兼容性:4分

  • 是否包含广告:7分

  • 加载速度:7分

  • 安全性:3分

  • 稳定性:3分

  • 搜索功能:8分

  • 下载便捷性:8分


下载点评

  • 速度慢(534+)
  • 差评少(58+)
  • 傻瓜式服务(207+)
  • 收费(556+)
  • 可以购买(585+)
  • 藏书馆(97+)
  • 不亏(419+)
  • 值得下载(207+)
  • 无漏页(397+)
  • txt(82+)
  • 中评(312+)

下载评价

  • 网友 权***波: ( 2025-01-03 12:58:52 )

    收费就是好,还可以多种搜索,实在不行直接留言,24小时没发到你邮箱自动退款的!

  • 网友 石***烟: ( 2025-01-15 14:57:43 )

    还可以吧,毕竟也是要成本的,付费应该的,更何况下载速度还挺快的

  • 网友 丁***菱: ( 2025-01-11 14:19:57 )

    好好好好好好好好好好好好好好好好好好好好好好好好好

  • 网友 融***华: ( 2025-01-08 01:01:32 )

    下载速度还可以

  • 网友 谭***然: ( 2024-12-27 10:36:24 )

    如果不要钱就好了

  • 网友 印***文: ( 2025-01-16 12:34:59 )

    我很喜欢这种风格样式。

  • 网友 养***秋: ( 2025-01-02 03:00:59 )

    我是新来的考古学家

  • 网友 常***翠: ( 2024-12-29 19:40:50 )

    哈哈哈哈哈哈

  • 网友 师***怀: ( 2024-12-25 00:06:31 )

    好是好,要是能免费下就好了


随机推荐