0%

1、下载mongodb(3.4.4版本)

官网可查[Docker Hub](Docker Hub)

1
docker pull mongo:3.4.4

2、创建挂载文件

1
mkdir /mydata/mongodb3.4.4/datadb

3、启动

27017端口映射到宿主机的27018端口,root密码为000000

1
docker run -d --name mongodb3.4.4 -v /mydata/mongodb3.4.4/datadb:/data/db -p 27018:27017 -e MONGO_INITDB_ROOT_USERNAME=admin -e MONGO_INITDB_ROOT_PASSWORD=000000 --privileged=true 34ba9aead272

4、进入mongodb设置用户

进入mongodb

1
docker exec -it mongodb3.4.4 mongo admin

(可选操作)

设置用户

1
2
db.createUser({ user:'root',pwd:'000000',roles:[ { role:'userAdminAnyDatabase', db: 'admin'},'readWriteAnyDatabase']});

配置docker-compose.yml

官网↓

[安装 | EMQX 5.0 文档](安装 | EMQX 5.0 文档)

docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
version: '3'

services:
emqx1:
image: emqx/emqx:5.0.4
container_name: emqx1
ports:
- 1883:1883
- 8083:8083
- 4369:4369
- 18083:18083
environment:
- "EMQX_NODE_NAME=emqx@node1.emqx.io"
- "EMQX_CLUSTER__DISCOVERY_STRATEGY=static"
- "EMQX_CLUSTER__STATIC__SEEDS=[emqx@node1.emqx.io,emqx@node2.emqx.io]"
healthcheck:
test: ["CMD", "/opt/emqx/bin/emqx_ctl", "status"]
interval: 5s
timeout: 25s
retries: 5
networks:
emqx-bridge:
aliases:
- node1.emqx.io

emqx2:
image: emqx/emqx:5.0.4
ports:
- 1884:1883
- 8084:8083
- 4370:4369
- 18084:18083
environment:
- "EMQX_NODE_NAME=emqx@node2.emqx.io"
- "EMQX_CLUSTER__DISCOVERY_STRATEGY=static"
- "EMQX_CLUSTER__STATIC__SEEDS=[emqx@node1.emqx.io,emqx@node2.emqx.io]"
healthcheck:
test: ["CMD", "/opt/emqx/bin/emqx_ctl", "status"]
interval: 5s
timeout: 25s
retries: 5
networks:
emqx-bridge:
aliases:
- node2.emqx.io

networks:
emqx-bridge:
driver: bridge

端口说明:(MQTT 服务器搭建:EMQX 安装指南和常见问题 | EMQ)[MQTT 服务器搭建:EMQX 安装指南和常见问题 | EMQ]

5

运行,查看节点

1、在compose根目录下运行

1
docker-compose up -d

1

2、检验

1
2
$ docker exec -it emqx1 sh -c "emqx_ctl cluster status"

2

3、查看运行节点

进入web管理页面输入网址ip+188083,默认用户名admin默认密码public。

4

题型及分值分布:
一、 填空题(共12分,每题1分)
二、 单选题(共20分,每题1分)
三、 判断题(共20分,每题2分)
四、 简答题(共24分,每题8分)
五、 设计题 (共24分,每题8分)

重点复习

uml概述

uml的特点(理解)[选择、填空]

uml的特点:

  • (1)统一标准
    • 提供标准的面向对象的模型元素的定义和表示。
  • (2)面向对象
    • 西区面向对象技术领域其他流派的长处。剔除了他们的缺点。
  • (3)可视化、表示能力强
    • 表示系统的逻辑模型或实现模型,用于复杂软件系统的建模。
  • (4)独立于过程
    • 独立于特定的软件开发过程。
  • (5)易掌握、易用
    • UML概念明确建模表示法简洁明了,易于掌握使用。

uml构造块中的关系类型包括关联、依赖、泛化、实现

UML中事物是模型中基本元素的抽象,关系把事物结合在一起,图聚集了相关事物

uml的基本构造块:

  • 事物: 语言描述的基本要素
    • 事物是UML语言的基本构成要素,包括:
      • 结构事物: 语言的静态构成要素,有7种
        • 1
        • 2
      • 行为事物: 语言的动态构成要素,表示事物的变化和状态
        • 3
        • 4
      • 分组事物: 对模型中事物分组组织的要素
        • 5
      • 注记事物: 对模型中事物标注和解释
        • 6
  • 关系: 语言要素之间的关系
    • 关联
      • 本指事物之间存在的固有的牵连关系,在UML中,是对具有共同结构特征、关系和语义的对象之间相互链接的描述。
      • 7
    • 泛化
      • 在UML中,描述事物之间的一般和特殊关系。特殊事物具有并继承一般事物的特性。
      • 8
    • 依赖
      • 两个要素之间的因果关系,其中一个要素(独立要素)发生变化会影响另外一个要素(依赖要素)的语义。
      • 9
    • 实现
      • 描述类元之间的语义关系。一种是接口与实现它的类和构件;另一种是用例和实现它们的协作。
      • 10
  • : 语言所能够提供的图形类型

uml的4类公共(通用)机制是规格说明、修饰、通用划分、扩展机制

uml的公共机制有:

  • 规格说明
    • UML允许对每一个用图形符号表示的模型元素给出详细的文字语义说明。使可视化视图和文字视图分离。
    • 售书处理用例的说明↓
    • 11
  • 修饰
    • 表示 : 将图形修饰附加到UML图形的模型元素上,通常写在相关元素旁边
    • 作用 : 为图形中的元素增加语义
    • 例:当一个元素代表一个类型时, 名称用粗体表示;
      代表一个类型的实例时, 名称用下划线表示;
      代表接口时,名称用斜体表示。
    • 12
  • 通用划分
    • 类型-实例
      • 定义 : 描述了一个通用描述符与单个元素之间的对应关系。通用描述符成为型元素(相当于类),单个元素是实例元素(相当于类的实例)。
      • 表示 : 使用相同的表示, 但名称的表示不同。实例元素名称有下划线,且名称后加上冒号和通用描述符。
      • 例 : 类与对象相当于一种型-实例划分, 数据类型与数据值
    • 接口-实现
      • 强制规范与实现的约定,接口声明了一个规定了服务的约定,实例负责执行接口的全部语义定义并实现该项服务。
  • 扩展机制
    • ① 版型:用来扩展UML的词汇,使用户可以从已经存在的模型元素中派生出新模型元素。
    • ② 标记值:用来扩充模型元素的属性
    • ③ 约束:约束扩充模型的元素的语义,使用户可以添加新规则或修改已存在的规则

uml的扩展机制(版型、标记值、约束)

uml的扩展机制:

  • ① 版型
    • 用来扩展UML的词汇,使用户可以从已经存在的模型元素中派生出新模型元素。
    • 例1,把“包” 构造为“子系统”类型。
    • 13
    • 例2,参与者是一个版型化的类。
    • 14
  • ② 标记值
    • 标记值用来扩充模型元素的属性。
    • 例如,{location=client}指出类student驻留在客户机结点上。
    • 15
  • ③ 约束
    • 约束扩充模型的元素的语义,使用户可以添加新规则或修改已存在的规则。约束用{ }描述。
    • 例如,{subset}指出领导是成员的子集。
    • 16

uml的4+1视图的使用者及作用。

UML1.x共定义了9种图,UML2.0扩展为14种:
●用例图 ●状态图
●类图 ●活动图
●对象图 ●组合结构图
●顺序图 ●构件图
●协作图 ●部署图
●时序图 ●包图
●交互概览图

视图(views) :

​ 一个系统应从不同的角度进行描述,从一个角度观察到的系统称为一个视图(view)。
​ 视图由多个图(Diagrams)构成,它不是一个图表(Graph),而是在某一个抽象层上,对系统的抽象表示。
​ 如果要为系统建立一个完整的模型图,需定义一定数量的视图,每个视图表示系统的一个特殊的方面。另外,视图还把建模语言和系统开发时选择的方法或过程连接起来。  

18

用例视图(Use Case View)

使用者 : 全部人员
作用 : 描述用户需要的系统功能。用例模型列出系统中的用例和参与者, 显示哪个参与者执行哪个用例
核心 : 用例视图是其它四种视图的核心, 其作用是驱动其它视图开发

逻辑视图(Logical View)

使用者 : 设计人员, 开发人员
实现需求 : 系统功能
作用 : 揭示系统的内部设计和协作情况, 表示系统静态结构和动态行为。

主要用来描述系统的功能需求,反应出系统内部是如何组织和协作来实现功能的,不涉及具体的编译即输出和部署。
静态结构 : 描述类, 对象, 关系
动态行为 : 描述对象之间通过发送消息产生的动态协作

实现视图(Implementation View)

使用者 : 程序员
作用 : 描述软件的静态结构, 显示代码之间的组织方式, 通过系统输入输出关系的模型图和子系统图,来描述实现模块之间的依赖关系.

进程视图(Process View)

使用者 : 系统集成.
作用 : 显示系统并发性, 解决在并发系统中存在的通信和同步问题。该视图显示进程, 线程, 对象等运行时状态, 以及相关同步, 并发, 通信等问题

进程视图与实现视图关系 : 实现视图显示的是编译时的静态关系, 进程视图显示的是编译完之后运行时的对象、线程、进程之间的交互问题

部署视图(Deployment View)

使用者 : 运维
作用 : 软件到硬件的映射,把目标程序及其依赖的运行库和系统软件部署到物理机器上,以及说明部署机器对系统环境的要求。部署视图综合考虑软件系统和整个IT系统相互影响的架构视图。
部署视图与进程视图关系 : 进程视图关注程序的动态执行情况,部署视图关注程序的静态位置

uml的应用领域不仅限于软件系统建模,也可以应用在其他领域系统的建模。

用例图

用例图的概念(主要描述系统的功能及功能间的关系,是整个开发过程的开发依据,用例是与实现无关的关于系统功能的描述。是一种功能分解的技术,并没有使用面向对象思想。

用例图用来描述软件需求模型中的系统功能,通过一组用例可以描述软件系统能够给用户提供的功能。

用例图可以作为整个系统开发过程中的开发依据,指导和驱动其他模型。

参与者与用例间的关系。

每个参与者可以参与一个或多个用例。
一个用例可以由多个参与者使用。

用例图中的关系的类型及分析判断及图例(泛化、包含和扩展)

包含关系:

  • 两个用例之间,一个用例(基本用例)的行为要用到另外一个用例(包含用例)的行为。
  • 将若干用例的相同动作,提取出来单独构成一个用例。这个用例可以重用
  • 特点:由基本用例决定是否调用,包含用例对调用对象一无所知,且不参与其中的选择判断。
  • 使用场景 :
    • 公用用例 : 为了复用用例, 当多个用例有重复的功能,可以将重复的功能分解到另一个用例中,将这个分解出来的用例与原来的多个用例建立包含关系。
    • 分解用例 : 为了简化用例, 当一个用例包含的功能太多的时候,需要将用例分解成一个个子用例,用例之间建立包含关系。
  • 图形表示:
    • 19
    • 20

扩展关系:

  • 扩展关系表示基本用例在扩展点要增加新的行为或功能,以扩展到新用例。
  • 当在某个现有用例中插入“可选”行为或“异常”行为时,使用扩展关系
  • 扩展用例总是在一个或多个扩展点处来扩展基本用例,或处于特定条件下, 才扩展基本用例。
  • 使用情形 :
    • a.两个用例相似但不完全相同时
    • b.当要对多个额外情况逐一建模时,使用扩展关系,用一个独立的用例替代每个额外的情况
    • c.如果用例涵盖了所有的情况变化,则该用例将会变得十分复杂,应该考虑使用扩展关系
  • 21
  • 22

包含关系与扩展关系的区别:

  • ①两个关系箭头方向相反.包含关系的箭头由基用例指向包含用例;扩展关系的箭头由扩展用例指向基用例。

  • ②在基用例执行的过程中,被包含的用例一定要被执行;扩展关系如果条件不为真,扩展用例可以不执行。

  • 包含关系中的基用例必须依赖被包含的用例,它不能独立存在;扩展关系中的基用例可独立存在。

泛化关系:

  • 泛化代表一般与特殊的关系。子用例表示父用例的特殊形式。
  • 父用例表示通用行为序列,通过插入额外的步骤,子用例特化父用例。
  • 表示方法↓
    • 23
    • 24
    • 25

关系的比较:

26

用例图的绘制

绘制用例图的注意事项:

  • (1)用主动语态描述用例
          强调动作的施加对象
    
  • (2)利用事件/响应描述用例
          体现参与者与系统的交互
    
  • (3)用例文档中可以使用其他UML图

顺序图和协作图

交互图通常用于描述一个用例的行为,显示该用例中所涉及的对象和这些对象之间的消息传递情况

顺序图是显示对象之间交互的图,描述了对象之间传送消息的时间顺序。

顺序图中的消息类型(简单、异步、同步、返回、返身,阻止、超时)含义,图形表示。

顺序图包含4个元素:

  • 对象(Object)
  • 生命线(Lifeline)
  • 消息(Message)
  • 控制焦点(激活)(Activation)

消息的种类:

  • 简单消息

    • 表示普通的控制流。只表示控制如何从一个对象传递给另一个对象,而没有描述通信的任何细节。
    • 主要用于通信细节未知或者无需考虑通信细节的场合。即主要用于不知道消息是同步还是异步的场合,但通常表示异步消息
    • 图形表示
      • 27
  • 异步消息

    • 发送者将该消息发送给接收者后,无需等待接收者消息处理的完成而继续执行。异步消息的接收者和发送者是并发工作的。
    • 28
  • 同步消息(调用消息)

    • 调用消息的发送者把控制传递给消息的接收者,然后停止活动,等待消息接收者放弃或返回控制。
    • 调用对象的接收者必须是一个被动对象。应该有一个配对的返回消息,但为了图的简洁,可以省略。
    • 图形表示
      • 29
  • 返回消息

    • 是接收对象接收到消息之后,给发送对象返回的消息,通过该应答消息告诉接收对象,已经成功接收到发送的消息。
    • 30
  • 反身消息

    • 消息发送方和消息接受方是同一个对象
    • 31
  • 阻止消息

    • 消息发送者发出消息给消息接收者,如果接收者无法立即接受消息,则发送者放弃这个消息
    • 32
  • 超时消息

    • 消息发送者发出消息给消息接收者并按指定时间等待,如果接收者无法在指定时间内接受消息,则发送者放弃这个消息
    • 33

协作图中链是关联的实例,当一个类与另一个类之间有关联时,这两个类的实例之间就有链,一个对象就能向另一个对象发送消息。要在协作图中增加消息,必须先建立对象之间的链接。消息显示在链的旁边,一个链可以有多个消息

协作图用于强调发送和接受消息的对象之间的结构组织的交互图,显示对象、对象之间的链接以及对象之间的消息。

顺序图一般完成一个任务,执行用例的一条路径,而协作图可以完成多个任务,执行多条路径。

建立协作图的步骤(8步)

建立协作图的步骤:

  • (1)确定交互过程的上下文。
  • (2)识别参与交互过程的对象。
  • (3)如果需要,为每个对象设置初始特性。
  • (4)确定对象之间的链,以及沿着链的消息。
  • (5)从引发这个交互过程的初始消息开始,将随后的每个消息附到相应的链上。
  • (6)如果需要表示消息的嵌套,则用Dewey十进制数表示法。
  • (7)如果需要说明时间约束,则在消息旁边加上约束说明。
  • (8)如果需要,可以为每个消息附上前置条件和后置条件。

类图和对象图

类的定义,各个部分(名称、属性、操作)的命名规则及含义。

34

类的元素:

  • 1 名称
    • ① 名词或名词短语(动词或动词短语表示控制类)
       例如:人,桌子,图形,汇总
      
    • ② 尽可能用明确、简短,业务领域中事物的名称,
      避免使用抽象、无意义的名词
       例如:帐户,订单,事物
      
    • ③ 用英文,第1个字母大写
      例如:Shape, Person, CheckingAccdount
      
    • ④ 可分为简单类名,带限定名的类名
      例如: CheckingAccdount
                  Banking::CheckingAccdount
      
  • 2 属性
    • 用来描述该类的对象所具有的静态特征。
    • 一个类可以拥有三种类型的信息:
      • 对象必须了解自己,即他有自己的结构和当前的状态
      • 对象必须了解与其它对象的关系
      • 对象有时还要监视特定的信息
    • 类可以有任意数目的属性,也可以没有属性。
    • 在UML中,类属性的语法为:
      • [可见性] 属性名 [:类型] [多重性] [=初始值] [{特性}]
    • (1) 可见性
      • 35
    • (2) 属性名
      • 36
    • (3) 类型
      • 37
    • (4)多重性
      • 38
    • (5)初始值
      • 39
    • (6)特性
      • 40
    • (7)类作用域的属性
      • 41
  • 3 操作
    • 用于修改、检索类的属性或执行某些动作。
    • 一个类可以有任意数量的操作或者根本没有操作
    • 返回类型、名称和参数一起被称为特征标记。
    • 在同一个类中,操作的名称不必是惟一的,但特征标记必须是惟一的。
    • 在UML中,类操作的语法为:
      [可见性] 操作名 [(参数列表)] [:返回类型] [{特性}]
    • (1) 可见性
      • 42
    • (2) 操作名
      • 43
    • (3) 参数表
      • 44
    • (4) 返回类型
      • 45
    • (5) 特性
    • (6) 类作用域的操作
      • 46
  • 4 职责
  • 5 约束
  • 6 注释

类之间的关系(关联、聚集、组合、依赖、实现)概念含义,区别,及应用

类之间的关系:

  • 1 关联关系

    • 模型元素间的一种语义联系,是对具有共同的结构特性、行为特性、关系和语义的链的描述
    • 47
    • 48
    • 一个完整的关联包含三部分:类之间的关联直线和两个关联端点。端点是一个元类,有自己的属性(多重性、约束、角色)。
    • 49
    • (1) 名称(Name)
      • 50
    • (2) 角色(Role)
      • 51
    • (3) 多重性(Multiplicity)
      • 52
    • (4) 关联类(Association Class)
      • 53
    • (5)关联的约束
      • 54
    • (6)限定关联
      • 55
      • 限定符是关联的属性,而不是类的属性
      • 限定符概念在进行软件设计时非常有用,如果一个系统需要根据关键字对数据集进行查询,则经常用到限定关联。
      • 引入限定符的一个目的是把多重性从n降为1或0..1,这样如果做查询操作,则返回的对象最多是一个,而不是集合
    • (7)关联的种类
      • 自反关联(一元关联)
        • 57
      • 二元关联
        • 58
      • N元关联(多元关联)
        • 59
    • (8) 导航性
      • 一个类的属性中有另一个类。
      • 60
      • 61
  • 2 聚集关系

    • 一种特殊类型的关联。
      表示整体与部分关系的关联。
      需求分析中的“包含”、“组成”、“分为……部分”
      作为整体方的类的重数不是1,则作为聚集
    • 62
    • 63
    • 64
    • 65
  • 3 组合关系

    • 聚合关系中的一种特殊情况,是更强形式的聚合,又称强聚合
      整体拥有各个组成部分,部分与整体共存,整体不存在,则部分随之消失
      整体不仅控制着部分对象的行为,而且控制着部分对象的创建和结构。
    • 66
    • 68
  • 4 泛化关系

    • 泛化具有抽象、概括和超越的意思。
      泛化指抽取事物的共性特征,形成超越特殊事物而具有普遍意义的一般事物的方法。
      泛化的反面是特化,意思是对一般事物的具体化、特殊化和细化。
      泛化和特化反映事物之间的特殊与一般关系。可以用于类、用例以及其他模型元素。
    • 69
    • 70
  • 5 依赖关系

    • 表示一个模型元素在其语义或结构上依赖于另外一个元素。
      一个模型元素是独立的,另一个不是独立的。非独立的模型元素依赖于独立模型元素,独立模型改变将影响依赖于其的非独立模型。
      应用场合:
      一个类向另一个类发送消息
      一个类是另一个类的数据成员
      一个类作为另一个类中操作的参数
      关联、实现和泛化在语义上都是依赖关系。

    • 如果类A和类B之间有关联关系,那么A和B之间就有依赖关系了,但如果两个类间有关联关系,那么一般只表示出关联关系即可,不用再表示依赖关系。

      依赖关系不生成专门的代码。
      与泛化关系类似,依赖关系也不仅仅用于类间关系,其他建模元素如用例间也有依赖关系。

    • 71

    • 关联关系与依赖关系区别:

      • 72
  • 6 实现关系

    • 规格说明和其实现之间的关系。类和接口之间的关系是实现关系,表示类实现接口提供的操作。显示一个类引用另一个类。
      客户必须至少支持提供者的所有操作。
      泛化和实现都可以将一般描述与具体描述联系起来:
      泛化将同一语义层上的元素连接起来,并且通常在同一模型内。
      实现将不同语义层内的元素连接起来,并且通常建立在不同的模型内。

聚集关系与组合关系区别

聚集关系也称“has-a”关系,组合关系也称“contains-a”关系。
聚集关系表示事物的整体/部分关系的较弱的情况,组合关系表示事物的整体/部分关系较强的情况。
在聚集关系中,代表部分事物的对象可以属于聚集对象,也可以为多个聚集对象所共有,而且可以随时改变他所从属的聚集对象。代表部分的事物与聚集事物对象的生存期无关。在组合关系中,代表整体事物的对象负责创建和删除代表部分事物的对象,代表事物的对象只属于一个组合对象,一旦删除组合对象,也就删除了相应代表部分事物的对象。

类间关系的总结

聚集和组合关系表达整体和部分关系
泛化关系表达一般和特殊关系
依赖、关联表示语义关系
在描述语义上相互有联系的类之间的关系时,首先考虑泛化关系和关联关系,当类之间的关系不宜于这两种关系,考虑依赖关系。

理解掌握关联关系(名称、角色、多重性、关联类、限定关联,关联的种类)

关联关系

模型元素间的一种语义联系,是对具有共同的结构特性、行为特性、关系和语义的链的描述

47

48

一个完整的关联包含三部分:类之间的关联直线和两个关联端点。端点是一个元类,有自己的属性(多重性、约束、角色)。

49

(1) 名称(Name)

50

(2) 角色(Role)

51

(3) 多重性(Multiplicity)

52

(4) 关联类(Association Class)

53

(5)关联的约束

54

(6)限定关联

55
限定符是关联的属性,而不是类的属性
限定符概念在进行软件设计时非常有用,如果一个系统需要根据关键字对数据集进行查询,则经常用到限定关联。
引入限定符的一个目的是把多重性从n降为1或0..1,这样如果做查询操作,则返回的对象最多是一个,而不是集合

(7)关联的种类

  • 自反关联(一元关联)
    • 57
  • 二元关联
    • 58
  • N元关联(多元关联)
    • 59

      (8) 导航性

  • 一个类的属性中有另一个类。
  • 60
  • 61

派生属性与派生关联概念识别应用

是指可以从其他属性和关联计算推演得到的属性和关联。
使用他们是为了增强类图的性能,方便于在复杂的类图中寻找所需信息。
表示:加上“/”
在生成代码时,派生属性和派生关联不产生代码

边界类、控制类、实体类的定义和图形表示。

边界类

系统与外界交互的类,如窗体、对话框、报表、表示通讯协议的类。
边界类是系统内对象与系统外参与者的联系媒介。

图形表示:

73

通过用例图可以确定边界类
每个actor/use case对至少要有一个边界类,但并非每个actor/use case对都要生成唯一边界类,例如多个actor启动同一个use case时,可以用同一个边界类与系统通信。

实体类

定义:实体类保存要放进持久存储体的信息。是问题域中的核心类,从客观世界的实体对象抽象出来的。

83

控制类

用于协调边界类和实体类之间的交互。

74

其他类并不向控制类发送很多消息,而是由控制类发出很多消息

类图和对象图的区别

75

类图的绘制,(类定义,属性,操作,关系的应用)

状态图和活动图

状态图标包含两部分内容名称+内部转移(入口动作、出口动作、内部转移)

状态图标一般分为两个部分:

  • 名称
  • 内部转移
    • 入口动作
    • 出口动作
    • 内部转移

状态图的初态与终态

初态:

  • 初态标志出对象的创建状态,它是一个伪状态,因为它不具备真实状态所具有的特征,但它使得状态图更加清晰
    初始状态代表状态图的起始位置,只能作为转换的源,而不能作为转换的目标。
    初始状态在一个状态图中只允许有一个。
  • 76

终态:

  • 表示对象生命周期的终点。在该点对象的状态不再发生迁移。
    终止状态是模型元素的最后状态,是一个状态图的终止点。
    终止状态只能作为转换的目标,而不能作为转换的源。
    终止状态在一个状态图中可以有多个。
  • 77

一个状态图只能有一个初态,但可以有多个终态或没有终态.

状态图的绘制

建模步骤:

  • 找出适合用模型描述其行为的类。
    确定对象可能存在的状态。
    确定引起状态转换的事件。
    确定转换进行时对象执行的相应动作。
    对建模的结果进行相应的精化和细化。

78

活动图的转换不需要特定事件的激发,一个动作状态执行完后自动转换到另外一个状态。

理解泳道的概念。

泳道将活动图中的活动化分为若干组,并把每一组指定给负责这组活动的业务组织,通常为对象。
泳道区分了负责活动的对象,明确地表示了哪些活动是由哪些对象进行的。
每个活动只能明确地属于一个泳道。
泳道用垂直实线绘出,垂直线分隔的区域就是泳道。在泳道上方可以给出泳道的名字或对象(对象类)的名字,该对象(对象类)负责泳道内的全部活动。
泳道没有顺序,不同泳道中的活动既可以顺序进行也可以并发进行,动作流和对象流允许穿越分隔线。

活动图的作用。

活动图的作用:

  • 对系统工作流程建模
    • 工作流:是一个良好定义的动作序列,执行时将产生一个可观察的值,或者产生一个个体或实体的对象。
  • 对算法流程建模
    • 描述算法的每一个步骤

活动图用于描述系统的工作流程和并发行为。

活动图用于简化描述一个过程或操作的工作步骤。例如,对软件开发过程建模;对求Fibnacci数列的操作进行建模。

活动图可看作状态图的特殊形式。一个活动结束后立即进入下一个活动而不需要事件触发活动的转移。

活动图的绘制

79

80

构件图、部署图(不考画图)

构件是系统中遵从一组接口并提供其实现的物理的、可替换的部分,是定义了良好接口的软件模块,如源代码、二进制代码、可执行文件以及动态连接库等。

构件类型理解并能进行判断(部署构架、工作产品构件、执行构件)

部署构件

DLL文件、exe文件、COM+文件、CORBA对象、EJB、动态Web页、数据库表.

81

工作产品构件

源代码文件、数据文件

82

执行构件

系统执行后得到的构件

部署图中的结点有两种类型:处理机和设备。

包图(不考画图)

每个包必须有一个与其他包相区别的名称。

两种形式:简单包名和路径包名。

包拥有的元素:类、接口、构件、结点、协作、用例、图以及其他包。

一个模型元素不能被一个以上的包所拥有。

包中可以含有其它子包

包的可见性类型(公有的、私有的、受保护的)

包间的关系(访问和导入依赖、泛化)

第一章 绪论

第二章 进程和线程

进程概念(PROCESS)

程序的顺序执行和并发执行

程序的两种执行方式:

  • 顺序执行
    • 单道批处理系统的执行方式,也用于简单的单片机系统。
  • 并发执行
    • 多道程序设计环境的执行方式,具有许多新的特征。
    • 并发执行能够提高资源的利用率。

顺序执行的特征:

  • 顺序性
    • 处理机杨哥按照程序所规定的顺序执行。
  • 封闭性
    • 程序一旦开执行,其计算结果不受外界的影响,只有本程序才能改变自己。
  • 可在线性
    • 程序执行的结果与初始条件有关,而与执行时间和运行速度无关。只要程序初始条件相同,他的执行结果是相同的。

并发执行的特征:

  • 失去封闭性
    • 共享资源,收其他程序的控制逻辑的影响。
  • 程序与计算不再一一对应
    • 在并发执行过程中,一个共享程序可被多个用户作业调度,形成多个“计算”。
  • 并发执行在执行期间互相制约。

进程概念

进程的定义

进程:一个具有一定独立功能的程序在一个数据集上的一次动态执行过程。

进程的根本属性是动态性并发性

进程与程序的区别

进程与程序的区别—–举例

Mary正在为女儿按食谱烘制生日蛋糕,她的儿子哭着跑进厨房说他被蜜蜂蛰了,Mary停下来,找出急救手册,为儿子处理蛰伤。

Mary——CPU
做蛋糕的食谱——程序
做蛋糕的各种原料——输入数据
阅读食谱,取来各种原料以及烘制蛋糕的一系列动作的总和—–进程
每个进程都有各自的程序

进程的基本特征

进程的特征:

  • 动态性
    • 进程是程序的一次执行过程。
    • 进程具有一定的生命周期。
  • 并发性
    • 多个进程实体同存与内存,且能在一段时间内同时运行。
  • 调度性
    • 进程是系统中申请资源的单位,也是被调度的单位。
  • 异步性
    • 进程可按各自独立的、不可预知的速度向前推进。
  • 结构性
    • 进程组成:程序+数据+PCB
  • 独立性
    • 各进程的地址空间相互独立。
    • 进程实体是一个能够独立运行、独立被分配资源和独立接受调度的基本单位。

进程的状态和组成

进程的状态及其转换

五种状态

1

进程的三种基本状态

2

进程的状态:

  • 运行状态
    • 进程正在被执行,占用处理资源;处于此状态的进程数目小于等于CPU数目。
  • 就绪状态
    • 进程已获得除处理机外的所需资源,等待分配处理机资源;只要分配CPU就可执行。
  • 阻塞状态
    • 进程等待某个事件的发生(如I/O操作或进程同步),在该事件发生前,即使把处理机分配给进程,他也无法运行。
  • 创建状态
    • 进程刚创建还不能运行,OS还没有把它加入到可执行进程组中,通常是还没有加载到主存中的新进程。
  • 结束状态
    • OS从可执行进程组释放出的进程。
    • 进程结束,回收除PCB之外的其他资源,并让其他进程从PCB中手机有关信息。

进程的状态转换:

  • 新建——》就绪(提交admit)
    • 接纳一个新进程,进入就绪状态。
  • 就绪——》运行(分派dispath)
    • 从就绪进程表中选择一个进程,进入运行状态。
  • 运行——》阻塞(事件等待event wait)
    • 进程要求的事件未出现而进入阻塞。
  • 阻塞——》就绪(事件出现event occurs)
    • 进程等待的事件出现。
  • 运行——》就绪(超时timeout)
    • 由于用完时间片或高级进程就绪等导致进程暂停运行。
  • 运行——》退出(释放release)
    • 由于进程完成或失败而终止进程运行。
    • 分为正常和异常退出。

进程必须经过就绪状态而不能直接从阻塞状态转换到运行状态一,一个状态由运行状态转换成阻塞状态一般由运行进程主动提出的,一个进程由阻塞状态转换成就绪状态一般是由外部事件引起的

练习↓

3

进程描述

进程映像

  • 一个或一组被执行的程序。
  • 与程序关联的局部变量、全局变量等。
  • PCB:用于描述进程当前的状态、本身的特性、对资源的占用等。
  • 栈:用来保存过程调用和相互传递参数的踪迹。

进程控制块是由OS维护的用来记录进程相关信息的一块内存。

进程控制块组成:

  • 进程描述信息
    • 唯一标志对进程的一个标识符或数字。
  • 处理器状态信息(现场保护区)
    • 包括处理器寄存器的内容
  • 进程控制信息
    • 进程当前状态
    • 调度优先级
    • 通信信息
    • 资源占用信息
    • 进程实体信息
    • 族系关系
    • 其他信息

进程控制块作用:

  • 每个进程由唯一的进程控制块。
  • OS根据PCB对进程实施控制和管理。
  • 进程的动态、并发特性是利用PCB表现出来的。
  • PCB是进程存在的唯一标志

进程队列

进程队列——PCB的组织方式

线性方式

优点:简单,容易实现。

缺点:

  • 操作系统预先确定整个系统中同时存在的进程的最大数目,限定了系统同时存在的最大进程数目。
  • 在执行CPU调度时,为了选择合理的进程投入运行,经常要对整个PCB表进行扫描,降低了调度效率。

链接方式

链表原理:将同一状态的进程的PCB放在同一个队列中,组成一个链表,多个状态对应多个不同的链表。

各状态的进程形成不同的链表。最常用的是unix系统采用的这种方式

4

索引方式

索引表:同意状态的进程归入一个index表(利用索引表记载不同状态进程的PCB地址),多个状态对应多个不同的index表。

索引表的起始地址放到硬件寄存器中,可快速得到某个索引表地址。

5

进程管理

进程图

进程图是描述进程族系关系的有向树。

某进程可以动态的创建新进程,前者称作父进程,后者称作子进程。

6

进程控制的功能

完成进程状态的转换。

原语:为完成某些特定功能而编制的一段系统程序。

也成为“原子操作”要么全完成,要么一个不做。

原语操作代码通常比较短,以尽快开放中断。

进程控制原语

7

进程阻塞:运行状态->阻塞状态
进程唤醒:阻塞状态->就绪状态
进程调度:就绪状态->运行状态
进程创建:新建进程置为就绪状态
进程撤消:进程终止(消亡)

1、进程创建

进程的创建原因:

  • 系统初始化;
  • 调度新的批作业;
  • 交互式用户登录;
  • 操作系统提供服务;
  • 现有进程派生新进程。

当一个新进程增加到正在被管理的新进程行列中时,操作系统需要建立用于管理该进程的数据结构,并在主存中给他分配地址空间。

进程创建的过程:

  • 申请一个空闲的PCB
  • 为新进程分配资源
  • 将新进程的PCB初始化
  • 将新进程加到就绪队列中

unix系统中的fork()

8

进程终止的过程:

  • 找到指定进程的PCB
  • 终止该进程的运行
  • 回收该进程所占用的全部资源
  • 终止其所有子孙进程,回收他们所占用的全部资源
  • 将被终止进程的PCB从原来队列中摘走

unix系统中的终止原语exit()

9

进程阻塞的过程:

  • 立即停止当前进程的执行
  • 现行进程的CPU现场保存
  • 现行状态由“运行”改为“阻塞”转到阻塞队列
  • 转到进程调度程序,选出运行进程

unix系统中的阻塞原语sleep()

10

唤醒原语执行过程:

  • 把阻塞进程从相应的阻塞队列中摘下。
  • 将现行状态改为就绪状态,然后把该进程插入就绪队列中。
  • 如果被唤醒的进程比当前运行进程的优先级更高,则设置重新调度标志。

unix系统中的wakeup()

阻塞原语和唤醒原语是一对功能相反的原语,调用前者使自己进入睡眠,调用后者把别人唤醒。通常要成对使用,现有睡眠,后又唤醒

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include  <stdio.h>
void main(int argc,char *argv[])
{
int pid;
pid = fork( );
if (pid < 0) { /* error occurred */
fprintf(stderr, "Fork Failed");
exit(-1);
}
else if (pid = = 0) { /* child process */
execlp( "/bin/ls", "ls",NULL);
}
else { /* parent will wait for the child to complete */
wait(NULL);
printf( "Child Complete" );
exit(0);
}
}

↑程序执行说明:

  • 主进程在执行fork系统调用前使一个进程,执行fork系统调用后,系统中又增加了一个与原过程环境相同的子进程,他们执行程序中fork语句以后相同的程序。

  • 父进程和子进程都有各自的变量pid,但是值不同,pid是fork嗲用后的返回值。父进程的pid大于0,子进程的pid为0.

  • 这样父子进程执行同一程序,但执行不同的程序段。

  • 父子进程并发执行,执行序列任意。

  • 但由于父进程执行的第一条语句是wait(null),它表示父进程将挂起,直到该进程的一个子进程暂停或终止为止,所以,只能子进程执行 execlp语句。

建立子进程的地址空间有两种方式:

  • 父进程复制自己的地址空间给子进程
    • 地址空间副本,包括正文字段、数据段……
    • 父进程和子进程通信容易
  • 父进程把程序装入子进程的地址空间

线程(THREAD)

线程的引入:

  • 拥有资源的独立单元——进程
  • 被处理机独立调度和分配的单元——线程

线程概念

现代操作系统中,进程只作为资源拥有者,而调度和运行的属性赋予新的实体——线程。

线程是进程中实施调度和分派CPU的基本单元。

进程把相关资源集中在一起,有存放程序正文和数据以及其他资源的地址空间。

线程基本上不拥有系统资源,只拥有运行中必不可少的一点资源:

  • 程序计数器:记录接着要执行哪一条指令
  • 寄存器:保存线程当前的工作变量
  • 堆栈:记录执行历史

线程必须在某个进程内执行。

一个进程可以包含一个或多个线程。

线程的组成:每个线程都有一个thread结构,即线程控制块,用于保存自己私有的信息,主要由以下几部分组成。↓

11

线程状态:

  • 新建状态
  • 就绪状态
  • 运行状态
  • 阻塞状态
  • 终止状态

线程的管理:

  • 线程创建
    • 一个线程通过调用线程库中的thread_create创建新线程。
  • 线程终止
    • 调用线程库中的thread_exit种植自身。
  • 线程等待
    • 调用线程库中的thread_wait等待指定线程终止,调用者阻塞。
  • 线程让权
    • 一个线程调用thread_tield自愿放弃CPU,让给另外的线程运行。

线程和进程的关系:

  • 一个进程可以有多个线程;一个线程只能在一个进程的地址空间内活动。
  • 资源分配给进程,同一进程的所有线程共享进程的所有资源。
  • 处理机分配给线程。
  • 线程在执行过程中需要协作同步。不同进程的线程间要利用小心通信的办法实现同步。

在用户空间实现线程

用户应用程序建立线程,并负责调度和管理这些线程。OS内核并不知道线程的存在。任何应用程序可以通过使用线程库设计多线程程序。

线程库是用于用户级线程管理的一个例程包,它包含用户创建和销毁线程的代码、在线程间传递消息和数据的代码、调度线程执行的代码以及保存和恢复线程上下文的代码。

OS内核负责所有的线程的创建、调度和管理。应用程序部分没有进行线程管理的代码,只有一个到内核线程设施的应用程序编程接口。

组合方式:

  • 一对一模型
    • 12
  • 多对一模型
    • 13
  • 多对多模型
    • 14

进程的同步和通信

进程的同步和互斥

进程间的相互关系分为3种:

  • 互斥
  • 同步
  • 通信

同步

同步进程通过共享资源来协调活动,在执行时间次序上有一定约束

同步指系统中一些进程需要相互合作,共同完成一项任务。具体说,一个进程运行到某一点时要求另一伙伴进程为它提供消息,在未获得消息之前,该进程处于阻塞状态,获得消息后被唤醒进入就绪态。

互斥

在逻辑上这两个进程本来完全独立,毫无关系,只是由于竞争同一个物理资源而相互制约。

他们运行不具有时间次序的特征。

对于互斥进程,单独执行正确,但不能交叉执行,只要互斥进行,先后没有关系;

对同步进程,单独执行会产生错误,必须相互配合,有先后次序关系

临界资源与临界区

例:2个窗口同时出售同一车次的火车票,若同时修改票数R,则会出现丢失修改的现象。

为避免数据丢失,必须找到某种途径来阻止一个以上的进程同时使用这种资源,即多进程共享这种资源时,必须互斥地使用。

票数R是一种临界资源,对R操作的售票程序是临界区。

临界资源:

  • 一次仅允许一个进程使用的资源称为临界资源。
  • 宿舍电话、打印机……

临界区:

  • 在每个进程中访问临界资源的那段程序叫做临界区。
  • 为保证进程互斥的使用了临界资源,一次只允许一个进程进入临界区。

进程互斥进入临界区的模式:

  • 进入前要申请
  • 获准后方可进入
  • 执行后要退出

临界区进入准则:

  • 如果若干进程要求进入空闲的临界区,一次仅允许一个进程进入。(空闲则入)
  • 任何时候,处于临界区内的进程不可多于一个。(忙则等待)
  • 进入临界区的进程要在有限时间内退出。(有限等待)
  • 如果进程不能进入自己的临界区,则应让出CPU,避免进程出现“忙等”现象。(让权等待)
  • 依据准则设计入口区、出口区

互斥实现方式

硬件方法:

  • 禁止中断
  • 专用机器指令

软件方法:

  • 置锁变量法
  • 信号量法

用硬件方法解决进程互斥——禁止中断

15

中断禁止缺点:一旦某个进程关闭中断后,如果不在开放中断,系统可能因此而终止。

用硬件方法解决进程互斥——专用机器指令

TSL指令:Test and Set Lock

软件方法——置锁变量法

为每类临界区设置一把锁,该锁有打开和关闭两状态

进程执行临界区程序的操作步骤:

  • 关索
  • 执行临界区程序
  • 开锁

16

软件方法——信号量法

对信号量的操作有以下限制:

  • 初始化为一个非负值;
  • 只能由P和V两个操作来访问。

P操作表示测试,也称wait或DOWN操作。

V操作表示增加,也称signal或UP操作。

信号量

信号量的实现有三种:

  • 整形信号量——解决“忙等”问题
  • 结构型信号量——解决“忙等”问题
  • 二值信号量——结构型信号量的特殊情况

17

结构性信号量:

结构型信号量一般是由两个成员组成的数据结构。

  • 每个信号量s含有一个整数值s.value(计数)
  • 还有一个进程等待队列s.list,其中是阻塞在该信号量的各个进程的表示(PCB)

P操作定义(申请资源)

18

V操作定义(释放资源)

19

信号量S的物理意义:

  • s>0,表示该类可用资源的数量;
  • s=0,表示没有该类可用资源;
  • s<=0,表示没有该类资源可供分配,请求资源的进程将被阻塞在相应的信号量的等待队列中。s的绝对值 = 该信号量上等待的进程数。

P、V操作的物理意义:

  • 没执行一次P操作,就意味着请求分配一个单位的该类资源给执行P操作的进程,S:=S-1。
    • 若无可用资源,进程阻塞等待。
  • 每执行一次V操作,意味着进程释放一个单位的该类可用资源,S:=S+1。
    • 若有阻塞等待的进程,则唤醒他,转入就绪队列。

信号量的一般应用

用信号量实现进程互斥

利用信号量实现进程互斥的模式:

20

为临界资源设置一个互斥信号量mutex,初值为1;在每个进程中将临界区代码置于P和V原语之间。

用信号量实现互斥的准则:

  • 互斥信号量mutex的初值一般设为1
    • 它相当于一把锁,最多只允许一个进程进入临界区。
  • 必须成对使用PV原语,不能重复或遗漏
    • 遗漏P则不能保证互斥访问,遗漏V则不能在使用临界区资源之后将其释放。
  • PV次序不能颠倒
    • 先P进入临界区,后V退出临界区。

用信号量实现进程简单同步

供者和用者的同步关系

  • 缓冲区空,则供者把信息传入缓冲区,此时用者不能操作(阻塞)
  • 缓冲区满,则用者从缓冲区取数处理,此时供者不能操作(阻塞)

供者和用者要交换两个消息:缓冲区空和缓冲区满的状态。

设置两个信号量:

  • S1表示缓冲区是否空(1表示空,0表示不空)
  • S2表示缓冲区是否满(1表示满,0表示不满)
  • 规定S1和S2的初值分别为1和0

例↓

21

用PV操作实现同步应注意三点:

  • 分析进程间的制约关系,确定信号量种类和个数,说明信号量的含义。
  • 确定信号量初值
    • 信号量的初值与相应资源的数量有关,也与PV操作在程序中出现的位置有关。
  • 同一信号量的PV操作要“成对”出现
    • 通常出现在不同的进程代码中

经典进程同步问题

生产者-消费者问题

如果一个进程能产生并释放资源,则该进程称作生产者;如果一个进程单纯消耗资源,则该进程称作消费者

问题表述如下:一组生产者进程和一组消费者进程(设每组有多个进程)通过缓冲区发生联系。生产者进程将生产的产品(数据、消息等)送入缓冲区,消费者进程从中取出产品。假定缓冲区共有N个,把它们设想成一个环形缓冲池。

22

为了使这两类进程协调工作,防止盲目的生产和消费,他们应满足如下同步条件:

  • 任意时间所有生产者存放产品的单元数不能超过缓冲区的总容量N。
  • 所有消费者取出产品的总量不能超过所有生产者当前生产产品的总量。
  • 任何时刻只能有一个进程可对共享缓冲区进行操作。

为了使两类进程实现同步操作,设置三个信号量:

  • empty:表示可供使用的空缓冲区数,初值为N。
  • full:表示方有产品的缓冲区数,初值为0.
  • mutex:互斥信号量,初值为1,保证任何时候只有一个进程使用缓冲区。

23

读者-写者问题

24

25

26

第一种实现方式:读者优先写者

27

设置两个信号量、一个计数器:

  • wmutex:写互斥信号量,用于保证一个写者与其他读者/写者互斥的访问共享资源,初值为1.
  • readcount:读计数器,用于统计数据库中读者数量,使整型变量,初值为0.
  • rmutex:互斥信号量,用于读者互斥的访问readcout,初值为1.

30

第二种实现方式:读者写者俺到达顺序访问数据库

31

设置三个信号量、一个计数器:

  • wmutex:写互斥信号量,用于保证一个写者与其他读者/写者互斥的访问共享资源,初值为1.
  • readcount:读计数器,用于统计数据库中读者数量,是整型变量,初值为0。
  • rmutex:读互斥信号量,用于读者互斥地访问readcount,初值为1。
  • w:互斥信号量,用于控制进程按照进程申请顺序访问,初值为1

32

第三种实现方式:写者优先读者

当写者和读者同时等待时,后续写者到达时可以插队到等待的读者之前,只要等待队列中有写者,不管何时到达,都优先于读者被唤醒。

33

假定一个阅览室可容纳一百人,读者进入和离开阅览室时都必须在阅览室门口的登记表上做标识(进入时登记,离开时去掉登记),而且每次只允许一人登记或去掉登记。
应设置几类进程?
用P、V操作实现同步算法。

答:

每个读者对应一个进程,他们是同类进程。每个读者的动作都包括:

  • 申请阅览室的空位;
  • 入室前查表、登记;
  • 进入室内,阅读书籍;
  • 出室时删除登记;
  • 阅览室多出一个空位。

信号量:

  • S——座位情况,初值100;
  • mutex——互斥使用登记表,初值1.

34

哲学家进餐问题

问题描述:

  • 五位哲学家围坐在一张圆桌旁进餐,每人面前有一只碗,各碗之间分别有一根筷子。
  • 哲学家先思考,感到饥饿时便试图占用其左右最靠近他的筷子,他可能一根也拿不到。当拿到两根时就进餐,餐毕,放回筷子,继续思考。

答:

简单的解决办法:五根筷子对应信号量数组chopstick[5],初值为1。第i个哲学家的进餐过程可描述为:

1
2
3
4
5
6
7
While(true){
think;
P(chopstick[i]);
P(chopstick[(i+1)mod5]);
eat;
V(chopstick[i]);
V(chopstick[(i+1)mod5]); }

上述算法可保证相邻的两个哲学家不能同时进餐。

但存在死锁隐患:如果五个哲学家同时拿起各自左边的筷子,又试图拿右边的,则产生死锁。

解决死锁的办法:

  • 最多只允许4个哲学家同时拿筷子,从而保证有一人能够进餐。
  • 仅当某哲学家左右两边的筷子都可用时,才允许他拿筷子。
  • 将哲学家编号,要求奇数号的哲学家先拿左边筷子,偶数号哲学家先拿右边筷子。

用第一种方法解决死锁:

  • 五根筷子对应信号量数组chopstick[5],初值为1;
  • 将允许同时拿筷子准备进餐的哲学家数量看作一种资源,定义成信号量count,初值为4;
  • 哲学家进餐前先执行P(count),进餐后执行V(count)。

35

36

第二种方法解决死锁:

  • 必须让哲学家拿起2根筷子的操作是不可分割的,如果不能拿起2根筷子则阻塞等待,直到确定能拿起2根筷子则结束等待。

设信号量和状态变量:

  • 对每个哲学家设置信号量S[i],代表是否能够拿起两根筷子,即是否具备进餐条件,初值都是0。
  • 对每个哲学家设一个整型变量state,用于存储状态,则5个哲学家对应一个整型数组state[i]。
    • 每个哲学家都有三种状态:thinking、hungry、eating。
    • 如果当前哲学家是hungry,左邻、右邻都不在eating状态,则当前哲学家i可以转入eating状态,即进行V(S[i])操作。
  • 对哲学家状态的测试和改变需要互斥操作,用mutex控制。

c语言描述:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#define  N    5
#define LEFT (i-1)%N
#define RIGHT (i+1)%N
#define THINKING 0
#define HUNGRY 1
#define EATING 2
typedef struct{ /* 定义结构型信号量 */
int value;
struct PCB *list;
}semaphore;
int state[N];
semaphore mutex=1; /* 互斥进入临界区 */
semaphore s[N]=0; /* 每位哲学家一个信号量,代表是否具备进餐的条件,信号量初值都是0,表示最初都不具备进餐条件,需要测试完才知道是否具备条件 */

37

38

39

打瞌睡的理发师问题

问题描述:

  • 理发店有一名理发师、一把理发椅、几把等待座椅。
  • 如果没有顾客,理发师就打盹。顾客到来,唤醒理发师。如果顾客到来时理发师正在理发,则顾客坐在椅子上等待;如果座满了,直接离开。
  • 用P、V操作协调理发师和顾客的同步行为。

解决办法:

理发师和顾客各对应一类进程。有多种解题思路。

无论哪一种,首先都要弄清楚理发师的工作流程和顾客的行为流程,再根据需求设信号量,同步二者的行为

第一种思路:

  • 设三个信号量,一个计数器:

    • customers:用来记录等候理发的顾客数,初值为0。

    • barbers:用来记录等候顾客的理发师数,初值为0。

    • waiting:整型计数器,表示等候理发的顾客数,初值为0。

    • waiting是customers的副本,但不是信号量,可以在程序

      中对它做增减操作。

    • mutex:用于控制对waiting的互斥操作,初值为1。

    • ```c++
      #define CHAIRS 5
      typedef struct{

           int value;
           struct PCB *list;
      

      } semaphore;

      semaphore customers=0;
      semaphore barbers=0;
      semaphore mutex=1;
      int waiting=0;

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32

      - ![40](/操作系统课程笔记/40.jpg)

      第二种思路:

      - 将理发椅(1个bchair)与等待椅(n个wchair)分开看作两种不同的资源,顾客分别申请使用。
      - ![41](/操作系统课程笔记/41.jpg)

      解题:

      - 考虑等待的顾客数(坐在凳子上的顾客数),设置一个整型变量waiting,初值为0。当一个顾客到达时waiting加1,当一个顾客开始理发时waiting减1。

      - 考虑对waiting的互斥操作,设互斥信号量mutex,初值为1。

      - 考虑空凳子数量,设信号量wchair,初值为5。

      - 考虑理发椅的数量,设信号量bchair,初值是1。

      - 考虑顾客和理发师的同步操作,设ready和finish两个信号量,前者表示顾客是否准备好,后者表示理发师是否完成理发,初值均为0。

      - ```c
      typedef struct{
      int value;
      struct PCB *list;
      } semaphore;

      int waiting=0;
      semaphore mutex=1;
      semaphore bchair=1;
      semaphore wchair=5;
      semaphore ready=finish=0;

  1. 42

管程

管程的定义

一个管程定义了一个数据结构和一组操作,并发进程可以在这个数据结构上执行这组操作,这组操作能使进程同步和改变管程中的数据。

一个管程由四部分组成:

  • 管程名称
  • 局部于管程的共享数据的说明
  • 对数据进行操作的一组过程
  • 对该共享数据赋初值的语句

管程有三个特性:

  • 管程内部的局部数据变量只能被管程内定义的过程所访问,不能被管程外面声明的过程直接访问
  • 进程要想进入管程,必须调用管程内的某个过程
  • 一次只能有一个进程在管程内执行,而其余调用该管程的进程都被挂起,等待该管程成为可用的。即管程能有效地实现互斥。

管程的特征:

  • 模块化:一个管程是一个基本程序单位,可以单独编译;
  • 抽象数据类型:管程是一种特殊的数据类型,不仅有数据,还有对数据进行操作的代码;
  • 信息隐藏:管程是半透明的,管程内部的过程(函数)实现了某些功能,这些功能如何实现,外部不可见;
  • 封装性:管程中定义的对共享变量的所有操作都局限在管程中,外部只能通过调用管程的某些函数来间接访问这些变量。

管程的缺点:

  • 要求编译程序必须能识别管程,并用某种方式实现互斥。
  • 编译程序如何知道哪些过程属于管程内部,哪些不属于管程,实现有难度。
  • C等多数编程语言都不支持管程。

进程通信

高级通信:能够传送任意数量的数据。

主要方式:

  • 共享存储区
  • 消息传递
  • 管道文件

共享存储器方式:

  • 共享存储器方式是在内存中分配一片空间作为共享存储区。需要进行通信的各个进程把共享存储区附加到自己的地址空间中,然后就对可以对共享区中的数据进行读或写。如果不需要,可以取消。
  • 需要使用同步互斥工具(如PV操作)对共享空间的读写进行控制。

消息传递方式:

  • 消息传递方式以消息(Message)为单位在进程间进行数据交换。
  • 进程通过操作系统提供的发送消息(send)和接收消息(receive)两个原语进行数据交换。
  • 用消息传递方式解决生产者-消费者问题。

消息传递方式途径:

  • 直接通信方式
    • 发送进程直接将消息挂在接收进程的消息缓冲队列上,接收进程从消息缓冲队列中得到消息。
  • 间接通信方式
    • 发送进程将消息送到称做信箱的中间设施上,接收进程从信箱中取得消息,也称为信箱通信方式。
  • 广泛应用于计算机网络中,相应的通信系统称为电子邮件系统。

管道文件方式(PIPE文件):

  • 管道文件也称管道线,它是连接两个命令的一个打开文件。一个命令向该文件中写入数据,称做写者;另一个命令从该文件中读出数据,称作读者。
    • $ cat file1 | more
    • 分屏显示文件file1的内容。
  • 由系统自动处理二者间的同步、调度和缓冲。
  • 为了协调双方的通信,管道机制必须提供以下三方面的能力:同步、互斥、确定对方的存在。

本章小结:

  • (1)进程、程序在并发环境的执行过程;
  • (2)进程的基本特征——并发性、动态性;
  • (3)进程的基本状态:就绪、运行、阻塞;
  • (4)进程与程序的区别;
  • (5)进程存在的唯一标志:进程控制块PCB;
  • (6)PCB的组织方式:线性表、链接表、索引表;
  • (7)进程控制原语:创建、阻塞、终止、唤醒;
  • (8)进程:资源分配单位;线程:调度基本单位;
  • (9)线程实现的方式:用户空间、内核空间、组合;
  • (10)进程的同步和互斥;
  • (11) 临界资源与临界区,信号量和P、V操作;
  • (12)经典进程同步问题:生产者-消费者、读者-写者、哲学家进餐、打瞌睡的理发师;
  • (13)高级同步机制——管程:自动互斥、条件变量+原语实现同步;
  • (14)高级进程通信方式:共享内存区、消息传递、管道文件。

第三章 死锁

资源

计算机系统中有很多一次只能由一个进程使用的资源:

  • 硬件资源:硬件设备
  • 软件资源:一组信息(加锁记录、信号量、系统表格等)
  • 临界区、临界资源

资源使用模式

1、申请

2、使用

3、释放

申请数量<=可用资源的总量,否则阻塞。

资源分类

按占用方式分类:

  • 可剥夺资源:
    • 其他进程可以从拥有资源的进程那里剥夺为及所用,且不会产生不良影响。
    • 例如,内存就是可剥夺资源
  • 不可剥夺资源:死锁和不可剥夺资源有关
    • 不能从当前占有他的进程那里强行抢占的资源,必须由拥有者自动释放,否则会引起相关计算的失效。
    • 例如进程A录刻光盘。

死锁概念

死锁定义:

  • 所谓死锁,是指在一个进程集合中的每个进程都在等待仅由该集合中的另一个进程才能引发的事件而无限期地僵持下去的局面。(系统中多个进程无限地等待永远不会发生的状态)

产生死锁的根本原因:

  • 资源有限
  • 操作不当
    • 程序编写问题
    • 进程推进顺序不对

当计算机系统同时具备下面4个必要条件时,会发生死锁:

  • 互斥条件
  • 占有且等待条件(请求并保持)
  • 不可抢占条件(不可剥夺)
  • 循环等待条件(环路等待)
  • 只要由一个必要条件不满足,则死锁就可以排除

死锁的预防——静态策略:

  • 破坏死锁的四个必要条件之一。

死锁的避免——动态策略:

  • 利用某些协议避免死锁,保证系统不会进入死锁状态。

检测恢复:

  • 允许系统进入死锁状态,然后设法发现并恢复它。

综合方式

忽略(鸵鸟策略):

  • 发现死锁较困难,处理死锁代价高,所以忽略。

死锁的预防

破坏互斥条件:

  • 有些资源本身要求必须互斥访问,这是资源的固有属性,所以,用否定互斥条件的办法不能预防死锁。

破坏占有且等待条件:

  • 一种办法时“空手”申请资源策略:不占有资源的时候,才能申请。
  • 一种办法时预分资源策略:静态分配(执行之前申请到全部资源)。
    • 缺点:
      • 很多情况下,进程执行前无法知道所需全部资源;
      1. 资源利用率降低;
      2. 降低了进程的并发性;
      3. 可能出现饥饿现象:无法得到众多进程争用的“紧俏”资源。

破坏不可抢占条件:

  • 隐式抢占方式(被抢):
    • 如果一个进程占有某些资源,它还要申请被别的进程占有的资源,该进程就一定处于等待状态,则进程当前所占有的全部资源可被抢占。
  • 抢占等待者的资源(去抢)
    • 进程申请资源,如果没有可用,可以从等待进程那里抢占资源。
  • 这些办法常用于资源状态易于保留和恢复的环境中,如CPU寄存器、内存,但不能用于打印机、磁带机等。

破坏循环等待条件:

  • 一种方法是实行资源有序分配策略。
    • 设R={r1, r2, …, rm}表示一组资源,定义一对一的函数F:R→N,式中N是一组自然数。
    • 所有进程对资源的申请严格按照序号递增的次序进行。
    • 例如: F(磁带机)= 1,F(磁盘机)= 5,F(打印机)= 12。
  • 另一种方法:先弃大,再取小。也就是说
    • 资源利用率和系统吞吐量都有所提高,但也存在两个缺点:
      • 限制了进程对资源的请求,同时给系统中所有资源合理编号也是件难事,并会增加系统开销;
      • 为了遵循按编号申请的次序,暂不使用的资源也需要提前申请,从而增加了进程对资源的占用时间。

死锁的避免

静态策略:死锁预防——破坏产生死锁的必要条件;静态策略的缺点是降低资源利用率和减少系统吞吐量。

动态策略:不限制进程有关申请资源的命令,而是对进程所发出的每个申请资源命令加以检查,根据检查结果决定是否进行资源分配。

关键是确定资源分配的安全性

安全状态

进程可以按安全序列的顺序一个接一个的完成,即便某个进程Pi因所需的资源量超过系统当前所剩余的资源总量,但可以等待前面所有进程Pj(j<i)运行完毕,释放所占有的资源,从而满足Pi的需求。
存在安全序列,系统处于安全状态,不会死锁。
找不到安全序列,系统处于不安全状态。
系统进入不安全状态,并不意味着此时死锁了。
死锁是不安全状态的特例。

安全状态举例:

  • T0时刻系统资源分配情况如下:
    • 系统中共有10台磁带机;
    • 三个进程P1,P2,P3,占有3台、2台、2台;
    • 最大需求是9台、4台和7台。
  • 问T0时刻系统是否处于安全状态?
  • 思路:如果能找到安全序列,系统就安全。

43

① 死锁状态是不安全状态。
② 如果系统处于不安全状态,并不意味着它就在死锁状态,而是表示存在导致死锁的危机。
③ 如果一个进程申请的资源当前是可用的,但为了避免死锁,该进程也可能必须等待。此时资源利用率会下降。

资源分配图

资源分配图的构成:

  • 该图由结对组成: G = (V, E)。式中,V是顶点的集合,E是边的集合。顶点集合可分为两部分:P={p1, p2, …, pn},它由系统中所有活动进程组成;R={r1, r2, …, rm},它由系统中全部资源类型组成。
  • 有向边pi →rj称为申请边,而有向边rj →pi称为赋给边。
  • 在资源分配图中,通常用圆圈表示每个进程,用方框表示每种资源类型。

44

45

环路与死锁:

  • 如果每类资源的实体都只有一个,那么图中出现环路就说明死锁了。
  • 如果每类资源的实体不止一个,那么资源分配图中出现环路并不表明一定出现死锁。

死锁的避免算法:

  • 单体资源类:
    • 系统中的资源都只有一个,可用资源分配图算法。
  • 多体资源类
    • 系统中的资源都有多个,可用银行家算法。

资源分配图算法

46

47

算法描述:设进程Pi申请资源rj,仅当申请边pi——>rj转换为赋给边且不会导致资源分配图中出现环路时,申请才可实现。

银行家算法

银行家算法的设计思想是:当用户申请一组资源时,系统必须做出判断;如果把这些资源分出去,系统是否还处于安全状态。若是,就可以分出这些资源;否则,该申请暂不予满足。

48

49

50

银行家算法的优点:

  • 允许存在死锁必要条件的前三个,即互斥条件、占有且申请条件、不可抢占条件;
  • 限制条件少了,资源利用率提高了。

银行家算法的缺点:

  • 要求进程数保持不变,在多道程序系统中难以做到;
  • 算法仅保证所有进程在有限的时间内得到满足,不一定能够快速响应(如实时进程);
  • 要寻找安全序列,增加了系统开销。

死锁的检测和恢复

死锁检测与恢复是指系统设有专门的机构,当死锁发生时,该机构能够检测到死锁发生的位置和原因,且能通过外力破坏死锁发生的必要条件,从而使并发进程从死锁状态中解脱出来。

算法:

  • 对单体资源类的死锁检测——等待图
  • 对多体资源类的死锁检测——检测算法(与安全性算法类似)

对单体资源类的死锁检测

等待图:它是从资源分配图中去掉表示资源类的节点,且把相应边折叠在一起得到的。
检测依据:当且仅当等待图中有环路,系统存在死锁。

51

对多提资源类的死锁检测

检测算法采用若干随时间变化的数据结构,与银行家算法中所用的结构相似:

  • ① Available是一个长度为m的向量

  • ② Allocation是一个n×m的矩阵

  • ③ Request是一个n×m的矩阵

检测算法只是简单地调查尚待完成的各个进程所有可能的分配序列。

52

53

54

55

死锁检测的时机

取决两个因素:

  • 死锁出现的频繁程度
  • 有多少个进程受死锁的影响

检测时机:

  • 有资源请求时就检测
  • 定时检测
  • CPU使用率低于规定下限值时,进行检测
    • 死锁涉及较多进程时,CPU经常闲置

从死锁中恢复

三种恢复方式:

  • 通过抢占资源实现恢复
  • 通过回退执行实现恢复
  • 通过杀掉进程实现恢复

通过抢占资源实现恢复:

  • 挂起某些死锁进程,并抢占它的资源,将这些资源分配给其他的死锁进程,直至死锁环路被打破。
  • 注意:要防止被挂起的进程长时间得不到资源

通过回退执行实现恢复:

  • 让一个或多个进程回退到足以回避死锁的地步,进程回退时自愿释放资源而不是被剥夺。
  • 注意:要求系统保持进程的历史信息,设置还原点。

通过杀掉进程实现恢复:

  • 杀掉进程,回收资源:
    • 终止所有的死锁进程。
    • 一次终止一个进程,直至消除死锁环路。
  • 终止进程的选择依据:
    • 进程优先级;
    • 已运行时间,剩余时间;
    • 使用资源及资源类型;
    • 还需要多少资源?
    • 进程是交互式的,还是批处理程序?

“饥饿”状态

在某些策略下,系统会出现这样一种情况:在可以预计的时间内,某个或某些进程永远得不到完成工作的机会,因为它们所需的资源总是被别的进程占有或抢占。这种状况称做“饥饿”或者“饿死”(Starvation)。

饥饿不同于死锁:

  • 死锁的进程必定处于阻塞状态,而饥饿进程不一定被阻塞,可以在就绪状态;
  • 可以利用FCFS资源分配策略来避免饥饿。

处理死锁的综合方式

针对不同资源类采用不同策略:

  • 可对换空间:硬盘上用于对换进程的存储块
    • 采用预先一次性分配,破坏占有且等待条件。
  • 进程资源:磁带机、文件
    • 进程预先声明需要的数量,采用死锁避免。
  • 内存:
    • 利用抢占内存的方式进行死锁预防。
  • 内部资源:如I/O通道
    • 通过资源编号预防死锁。

56

第四章 调度

调度(Scheduling)是多道程序操作系统的基础,是操作系统设计的核心问题。

调度的概念

调度的基本概念

处理器调度:

  • 对处理器进行分配,就是从就绪队列中,按照一定的算法(公平、高效)选择一个进程并将处理器分配给它运行,以实现进程并发地执行。

调度的层次

一个作业从提交开始直到完成,一般要经历三级调度:

  • 高级调度(作业调度)
  • 中级调度(内存调度、进程挂起与对换)
  • 低级调度(进程调度)

高级调度(作业调度):

  • 主要任务:按照一定的原则从外存上处于后备状态的作业中挑选一个或多个,给它们分配内存、外设等必要的资源,并建立相应的进程,使它们获得竞争处理器的权利。
  • 多道批处理系统中大多配有作业调度,其他系统通常不需要作业调度。
  • 调度程序选择不同的作业进行合理搭配,使系统中各部分资源得到均衡使用,提高并行性。
  • 作业调度的执行频率较低,通常为几分钟一次。

中级调度(内存调度):

  • 主要任务:在内存使用紧张时,将那些暂时不能运行的进程,调至外存等待,把此时的进程称为挂起状态(suspend)。将当前所需部分换入到内存。
  • 提高了内存的利用率和系统吞吐量。

低级调度(进程调度):

  • 主要任务:根据一定的算法,将CPU分派给就绪队列中的一个进程,执行低级调度功能的程序称做进程调度程序。
  • 进程调度是操作系统中最基本的一种调度。时间上通常是毫秒。因为执行频繁,要求在实现时达到高效率。

57

三级调度的联系

作业调度为进程活动做准备,进程调度使进程正常活动起来,中级调度将暂时不能运行的进程挂起。
作业调度次数少,中级调度次数略少,进程调度频率高。
进程调度是最基本的,不可或缺。

按操作系统的类型分类:

  • 批处理调度
  • 交互式系统调度
  • 实时调度
  • 多处理机调度

进程调度时机、切换与过程

进程调度的试时机

调度时机(引起进程调度的原因):

  • (1)当前进程运行结束。
  • (2)当前运行进程因某种原因(I/O请求、P操作、阻塞原语等),从运行状态进入阻塞状态。
  • (3)执行完系统调用等系统程序后返回用户进程,这时可以看做系统进程执行完毕,从而可以调度一个新的用户进程。
  • (4)在采用抢占调度方式的系统中,一个更高优先级的进程要求使用cpu,则使当前运行进程进入就绪队列。
  • (5)分时系统中,分配给该进程的时间片用完。

进程调度过程:

  • (1)保存运行进程的现场信息。
  • (2)在就绪队列中选择一个最有资格运行的进程,使其占用cpu。
  • (3)为新选中的进程恢复现场。

进程调度的方式

进程调度方式:

  • 指当一个进程正在处理器上执行时,若有某个更为重要或紧迫的进程需要处理,即有优先权更高的进程进入就绪队列,此时应如何分配处理器。

通常由两种进程调度方式:

  • 非抢占方式
    • 一旦把CPU分配给一个进程,该进程就会保持CPU直到完成或转到等待状态。
    • 优点是实现简单,系统开销小。
    • 适用于大多数的批处理系统,但不能用于分时系统和大多数实时系统。
  • 抢占方式
    • 当一个进程正在 CPU上执行时,若有某个更为重要或紧迫的进程需要使用CPU,则立即暂停正在执行的进程,让出CPU。
    • 抢占必须遵循一定的原则,主要有优先权原则、短进程优先原则、时间片原则。
    • 能防止一个进程长期占用处理机,调度更合理。但开销较大。

调度的基本准则

面向系统准则:

  • CPU利用率
  • 系统吞吐量:
    • 单位时间内CPU完成作业的数量。长作业消耗处理器的时间长,会降低系统的吞吐量。相反,短作业会提高系统吞吐量。

面向用户的准则:

  • 周转时间

    • Ti= tci – tsi
      tsi表示作业i的提交时间
      tci表示作业i的完成时间

      • 平均周转时间
        • 58
      • 带权周转时间
        • W=T/R
          T:周转时间
          R:CPU运行时间(在本进程即运行时间)
      • 平均带权周转时间
        • 59
    • 周转时间是指作业从提交到作业完成所经历的时间,包括作业等待、在就绪队列中排队、在处理器上运行以及输入/输出操作所花费时间的总和。

  • 就绪等待时间

    • 每个作业在就绪队列中的等待时间(等待处理器的时间之和),等待时间越长,用户满意度越低。
    • 处理器调度算法实际上并不影响作业执行或输入\输出操作的时间,只影响作业在就绪队列中等待所花的时间。
    • 衡量一个调度算法优劣常常只简单地考察等待时间
  • 响应时间

    • 用户输入一个请求(如击键)到系统给出首次响应(如屏幕显示)的时间。
    • 在交互式系统中,周转时间不是最好的评价准则,一般采用响应时间作为衡量调度算法的重要准则之一。
    • 从用户的角度看,调度策略应尽量降低响应时间,使响应时间处在用户能接受的范围之内。

周转时间=等待时间+完成时间在图上的刻度

周转时间=完成时间-到达时间

典型调度算法

先来先服务法FCFS(非抢占式)

实现思想:排队买票(非抢占式)

  • 每次从就绪队列中选择一个最先进入该队列的进程,把CPU分给它,令其运行。该进程一直运行下去,直至完成或由于某些原因而阻塞,才放弃CPU。

60

61

FCFS的特点:

  • 非抢占式
  • 简单,易于理解,容易实现。效率低。
  • 有利于长作业(进程),不利于短作业(进程),
  • 有利于CPU繁忙型作业(进程),不利于I/O繁忙型作业(进程)。
  • 适用于作业调度、进程调度。通常不单独使用,与其他算法结合起来使用。

短作业优先法SJF(非抢占式)

所谓长短是指作业(进程)要求运行时间的多少。

实现思想:

  • 当分配CPU时,选择所需处理时间最短的进程。短进程将越过长进程,跳到队列头。一个进程一旦分得处理机,便执行下去,直到该进程完成或阻塞时,才释放处理机。

练习↓

62

63

64

最短剩余时间优先法SRTF(抢占式)

实现思想:

  • 当新进程进入就绪队列时,如果它需要的运行时间比当前运行的进程所需的剩余时间还短,则执行切换,当前运行进程被剥夺CPU的控制权,调度新进程运行。

SRTF特点:

  • 优点:
    • 保证新的短作业一进入系统就能很快得到服务,平均等待时间短。
  • 缺点:
    • 为保存进程断点现场,统计进程剩余时间增加了系统开销。
    • 不利于长作业。
  • 适用于作业调度和进程调度。作业调度用的少,进程调度用的多。

高响应比优先法HRRF(非抢占式)

用户给出估计服务时间,为每个作业计算一个响应比:

  • 65
    • w是作业等待处理机所用的时间
    • s是作业要求的服务时间
  • 调度思想:在调度作业时,挑选响应比最高的作业运行。
  • 若作业等待时间相同,则要求服务的时间越短,其响应比越高,有利于短作业。
  • 当要求服务的时间相同时,作业的响应比由其等待时间决定,等待时间越长,响应比越高,因而它实现的是先来先服务。

HRRF特点:

  • 非抢占式
  • 优点
    • 是对FCFS和SJF调度算法的综合平衡,同时考虑每个作业的等待时间和估计需要的运行时间。
  • 缺点
    • 调度前需要计算作业的响应比,增加系统开销。
  • 适用于作业调度和进程调度。作业调度用的多。

优先级法HPF(抢占、非抢占)

实现思想:

  • 优先级调度算法是从就绪队列中选出优先级最高的进程,让它在CPU上运行。

确定优先级有静态优先级和动态优先级两种:

  • 静态优先级:
    • 静态优先级是在创建进程时就确定下来的,而且在进程的整个运行期间保持不变。
      • 进程类型(系统进程优先级较高)
      • 对资源的需求(对CPU和内存需求较少的进程,优先级较高)
      • 用户要求(紧迫程度和付费多少)
  • 动态优先级:
    • 动态优先级随进程的推进而不断改变。
      • 在就绪队列中,随着等待时间延长,进程的优先级提高。(解决饥饿问题)
      • 进程每执行一个时间片,就降低其优先级。(实现负反馈,防止长期占用CPU)

在进程运行过程中,若就绪队列中出现优先级较高的进程可采用两种处理方法:

  • 非抢占式优先级法
  • 抢占式优先级法

轮转法RR(抢占式)

实现思想:

  • 将系统中所有的就绪进程按照FCFS原则,排成一个队列。每次调度时将CPU分派给队首进程,让其执行一个时间片。
  • 在一个时间片结束时,发生时钟中断。调度程序据此暂停当前进程的执行,将其送到就绪队列的末尾,并通过上下文切换执行当前的队首进程。
  • 进程可以未使用完一个时间片,就让出cpu(如阻塞)。

时间片转轮法主要用于分时系统中的进程调度。时间片是一个小的时间单位,通常时10-100ms。

例题↓

66

67

进程周转时间依赖于时间片的大小。

时间片长度变化的影响:

  • 过长->退化为FCFS算法,进程在一个时间片内都执行完。
  • 过短->用户的一次请求需要多个时间片才能处理完,上下文切换次数增加。
  • 使单个时间片内多数进程能够完成它们的运行工作,平均周转时间会得到改进。

时间片的大小直接影响轮转法的性能,对系统性能影响也很大。

时间片的长短由以下四个因素决定:

  • 系统的响应时间
    • 在进程数目一定时,时间片的长短直接正比于系统对响应时间的要求。
  • 就绪队列中的进程数目
    • 当系统要求的响应时间一定时,时间片的大小反比于就绪队列中的进程数目。
  • 进程的转换时间
    • 若执行进程调度时的转换时间为t,时间片为q,为保证系统开销不大于某个标准,应使比值t/q不大于某一数值,如1/10。
  • CPU运行指令速度
    • CPU运行速度快,则时间片可以短些;反之,长些。

多级队列法MQ(抢占式)

实现思想:

  • 调度算法把就绪队列划分成几个单独的队列,一般根据进程的某些特性,如占用内存大小、进程优先级和进程类型,永久性地把各个进程分别链入不同的队列中。
  • 每个队列都有自己的调度算法。比如前台进程队列可采用轮转法,后台进程队列可采用先来先服务法。
  • 队列之间通常采用固定优先级的抢占式调度。

队列之间,采用固定优先级的抢占式调度。

  • 68

多级反馈队列法MFQ(抢占式)

实现思想:

  • ① 系统中设置多个就绪队列,每个队列对应一个优先级,优先级依次递减;
  • ② 每个队列都采用时间片轮转法,但时间片都不同,高优先级队列的时间片小,低优先级队列的时间大;
  • ③ 新进程进入系统后,先放入第1个队列的末尾,如果在时间片内工作未完成,则转入下一个队列尾,依此类推;
  • ④ 系统先运行第1个队列中的进程,若第1队列为空,才运行第2队列,依次类推。

69

特点:

  • 抢占式调度,使用动态优先级机制。
  • 是时间片轮转和优先级调度算法的综合和发展。
  • 通过动态调整进程优先级和时间片大小,兼顾多方面系统指标。是最通用的CPU调度算法,也最复杂。
  • 需要解决“饥饿”问题。

线程调度

多线程系统中,提供了进程和线程两级并行机制。

用户级线程

核心只为进程提供服务,即从就绪队列中挑选一个进程(例如A),为它分配一个时间片,然后由进程A内部的线程调度程序决定让A的哪一个线程(如A1或A2)运行。

最常用的算法是轮转法和优先级法时钟中断对运行线程不起作用

70

核心级线程

由核心调度线程,不同进程的线程之间可能发生切换。

71

用户及线程调度和核心级线程调度的特点

性能:

  • 用户级线程切换可以用机器指令,速度快;核心级线程切换需要全部上下文切换,速度慢。

阻塞:

  • 在核心级线程方式下,一个线程因等待I/O而阻塞时,不会挂起整个进程;而用户级方式下会挂起整个进程。

实时调度

实时调度概述

实时调度:满足实时任务各自时间约束条件的调度。

实时任务类型

实时任务的分类:

  • 根据对截止时间的要求不同分类:
    • 硬实时任务:指系统必须满足任务对截止时间的要求,否则后果要命。
    • 软实时任务:任务与预期的截止时间相关联,但不是绝对严格。
  • 根据任务执行是否呈现周期性来分类
    • 周期性任务:以固定的时间间隔出现的事件,如每周期T出现一次。
    • 非周期性任务:事件的出现无法预计,但规定了必须完成或开始的时间。

实时调度算法

实时调度算法分为静态和动态两种:

  • 静态调度:在系统开始运行之前做出调度决策。
  • 动态调度:在运行时做出调度决策。

优先级随速率单调的调度算法(Rate Monotonic Scheduling, RMS):

  • RMS是针对可抢占的周期性进程而采用的经典算法,用于满足下述条件的进程:
    • 每个周期性进程必须在其周期内完成
    • 进程间彼此互不依存
    • 每个进程在每次运行时需要相同的CPU时间
    • 非周期性进程都没有截止时间限制
    • 进程抢占瞬间完成,开销可以不计
  • 该算法未每个进程分配一个固定的优先级,等于出发事件发生的频度。
  • 调度思想:
    • 任务周期最短的进程优先级最高,调度程序总是运行优先级最高的进程,必要时抢占。

最早截止时间优先调度算法(Earliest Deadline First, EDF)

调度思想:

  • 每当一个进程需要占用CPU时,要表明自己的存在和截止时间等信息;
  • 调度程序把就绪进程按截止时间先后顺序放在一个表格中;
  • 调度时,选择表中的第一个进程,其截止时间最近。

多处理器调度

多处理器系统的类型

多处理器系统与单处理器系统相比,在速度、性能、可靠性等方面有很大提高,但结构和管理也变得更复杂。

多处理器系统主要分为三种类型:

  • 松散耦合多处理器系统(集群系统)
    • 每台处理器有自己的内存、I/O和OS
  • 紧密耦合多处理器系统
    • 一组处理器共享内存,在一个OS的集中控制下工作(如对称多处理器结构)。
  • 主从多处理器系统
    • 有一个主处理器Master,多个从处理器 Slaver;操作系统和它的表格只放在主控机上;从机仅执行主控机指派的计算任务;所有的系统调用由主控机完成。

与单处理器调度的区别

注重整体运行效率(而不是个别处理机的利用率)
具有更多样的调度算法
调度单位广泛采用线程

多处理器调度方法

与多处理器调度相关的主要内容:

  • 给处理器分配进程:
    • 静态分配:把一个进程固定地分给一个处理器,每个处理器只保持一个就绪队列。调度开销小,但各处理器可能忙闲不均。
    • 动态分配:把系统中所有就绪进程放入一个全局队列,从中选出进程分派到任何可用的处理器上。一个进程在其生命周期内可能在不同时间、不同处理器上执行。
  • 在单个处理器上使用多道程序技术
    • 传统的多处理器中没有线程,每个处理器在若干进程之间切换,可获得高利用率和良好性能。
    • 如果一个应用程序由多线程的单个进程实现,则让组成一个应用程序的所有线程同时运行,性能最好。
  • 实际分派进程或线程(采用调度算法)
    • 调度算法越简单,开销越小,效率就越高。
    • 一般采用先来先服务和静态优先级算法。

多处理器系统中线程调度通常有四种方式:

  • 负载共享
    • 系统维护一个全局就绪线程队列,当某个处理器空闲时,就从该队列中选择一个线程。
  • 成组调度
    • 把一组相关线程作为一个单位同时调到一组处理器上运行,所有线程一起开始和结束它们的时间片。
  • 专用处理器分配
    • 当一个进程被调度时,它的每个线程被分配到一个处理器上,在该进程完成之前,处理器由相应的线程专用。
  • 动态调度
    • 允许在进程执行期间动态改变其线程的数目。

UNIX/Linux进程调度

UNIX进程调度

一般策略:多级反馈队列轮转法

实现思想:

  • 系统中的就绪进程按照不同种类分成多个就绪队列,每个队列的优先级不同,每个队列都采用轮转法。
  • 核心从最高优先级的就绪进程队列中选择一个进程,分配一个时间片,当时间片用完后,CPU被另外进程抢占,而该进程被送回相同优先级队列的末尾。
  • 核心动态调整用户态进程的优先级。

LINUX进程调度

一般策略:抢占式优先级

实现思想:

  • 系统为每个进程都计算一个优先级,核心从就绪队列中挑选一个优先级最高的进程,为其分配一个时间片,使其运行。
  • 在运行过程中,当前进程的优先级随时间递减,实现负反馈,即经过一段时间后,原来级别较低的进程就相对“提升”了级别。
  • 当所有进程的优先级都变为最低时,就重新计算一次所有进程的优先级。

针对不同类别的进程提供了三种不同的调度策略:

  • 短实时进程:SCHED_FIFO策略(先来先服务)。
  • 长实时进程:SCHED_RR策略(时间片轮转法)。
  • 交互式的分时进程:SCHED_OTHER策略,是传统的UNIX调度策略——优先级反馈法。

系统中规定,实时进程的优先级高于其他类型进程的优先级。

多种调度特点↓

72

中断处理

终端概述

在不同的系统中,中断的分类和处理方式不完全相同,但基本原则相同。中断的典型实例是I/O中断。

中断的概念:

  • 中断是指CPU对系统发生的某个事件做出的一种反应,它使CPU暂停正在执行的程序,保留现场后自动执行相应的处理程序,处理该事件后,如被中断进程的优先级最高,则返回断点继续执行被“打断”的程序。

73

引起中断的事件或发出中断请求的来源称为中断源。中断源向CPU提出的处理请求称为中断请求。发生中断时,被打断程序的暂停点称为断点。

中断最初是作为通道与CPU之间进行通信的工具。

  • 为使CPU摆脱繁忙的I/O事务,现代大中型计算机都设置了专门处理I/O操作的机构——通道。
  • 它相当于一台小型处理机,接受主机的任务,对外部设备的I/O操作进行控制。
  • 当主机委托的I/O任务完成后,通道发出中断信号,请求CPU处理。这使得CPU基本上摆脱了I/O处理工作,提高了CPU和外设工作的并行程度。

终端系统的作用:

  • 提高主机的利用率,使高速CPU可以和低速的外部设备并行工作。

  • 及时进行事故处理。

  • 实现分时操作。

  • 实现实时操作。

    • 在实时控制系统中,很多信号是随机产生的,只有通过中断系统才能对它做出及时的处理。
  • 方便程序调试。

    • 可人为设置断点,随时中断程序的执行,查看中间结果,了解机器的状态,输入临时命令。

中断类型:

  • 按中断事件来源划分:
    • 中断。它是由CPU以外的事件引起的。
    • 异常(Exception)。它是来自CPU内部的事件或程序执行中的事件引起的过程。
  • 系统调用也称为陷入

中断的处理过程

中断的硬件结构↓

74

中断响应

硬件对中断请求做出反应的过程,称为中断响应。具体动作如下:

  • 中止当前程序的执行;
  • 保存原程序的断点信息(主要是程序计数器PC和程序状态寄存器PS的内容);
  • 转到相应的处理程序。

中断处理

中断响应之后就进行相应处理。

中断处理过程大致分为四个阶段:

  • 保存现场

    • ① 集中式保存:在系统内存区中设置一个中断现场保存栈,所有中断的现场信息统一保存在这个栈中。

    • ② 分散式保存:在每个进程的PCB中设置一个核心栈,一旦其程序被中断,它的中断现场信息就保存在自己的核心栈中。

  • 分析原因

    • 确定“中断源”或查证中断发生,识别中断类型(确定是时钟中断还是盘中断)和中断设备号(哪个磁盘引起的中断)。
  • 处理中断

    • 调用中断处理程序进行处理
  • 中断返回

    • ① 选取可以立即执行的进程。
    • ② 恢复工作现场。

75

中断优先级和多重中断

中断优先级:

  • 硬件设计时,一般把紧迫程度大致相当的中断源归并为一组,称为一个中断级。
  • 与某种中断相关的优先权称做它的中断优先级。

中断屏蔽和中断禁止:

  • 中断屏蔽是事件提出中断请求后,CPU不予响应。
  • 中断禁止是硬件禁止事件提出中断请求。

中断屏蔽的作用:

  • ① 延迟或禁止对某些中断的响应。
  • ② 协调中断响应与中断处理的关系。
  • ③ 防止同类中断的相互干扰。

中断屏蔽的方式:

  • 可以用于整级屏蔽,也可用于单个屏蔽。

信号机制

信号机制是在软件层次上对中断控制的模拟。进程之间可以通过信号机制实现某些控制,利用传送信号方式进行简单通信。

信号机制概念

信号的概念:

  • 信号(也称软中断)机制是在软件层次上对中断机制的一种模拟,信号的发送者(一个进程)相当于中断源,接收者(另一个进程)相当于CPU。
  • 异步进程可以通过彼此发送信号来实现简单通信。
  • 系统预先规定若干不同类型的信号,表示发生了不同的事件。
  • 76

信号与中断机制的异同:

  • 相似之处:
    • 信号与中断在概念上是一致的。一个进程接收到一个信号与一个处理器接收到一个中断请求是一样的。
    • 二者都是“异步”的。处理器在处理一段程序时,不知道中断在何时发生,同样一个进程也不知道什么时候会有信号到达。
    • 二者在实现上都采用“向量表”的方式。通过中断向量表,可以找到处理相应中断的入口地址,进而转入中断处理程序。信号也如此。
    • 都有屏蔽手段。在中断机制中对每种中断请求都可进行屏蔽。信号也如此。
  • 差别:
    • 中断机制是通过硬件和软件的结合实现的,信号完全由软件实现。
    • 中断向量表在系统空间中,每个中断向量所对应的中断处理程序也在系统空间中。信号的“向量表”在系统空间中,信号处理程序在用户空间中。
    • CPU接到中断请求后,一般会立即做出响应和处理。信号的检测和响应要在特定情况下进行,如退出中断之前。

信号分类

UNIX S_5的信号分类及含义见下表:

77

信号处理方式

在unix系统中,进程user结构中有一个signal数组,信号的编号对应数组下标,数组元素的值规定了该进程收到信号时采取的动作。如下:

78

信号的检测和处理

79

第五章 储存管理器

内存管理

内存管理的基础

内存管理的概念

内存管理就是操作系统对内存的划分和动态分配。

内存管理的功能

内存空间的分配与回收(包括分配与共享)

  • 当用户需要内存时,系统为之分配相应的存储空间;不需要时,及时回收,以供其它用户使用。
  • 不仅能使多道程序动态地共享主存,提高主存利用率,还能共享主存中某个区域的信息。

地址转换:

  • 把逻辑地址转换成相应的物理地址。

储存保护:

  • 确保多道程序都在各自分配到存储区域内操作,互不干扰,防止一道程序破坏其它作业或系统文件的信息。

内存空间的“扩充”:

  • 利用虚拟存储技术(早期用自动覆盖技术),从逻辑上扩充内存。为用户提供比主存物理空间大得多的地址空间,使用户感觉他的作业是在一个大的存储器中运行。

用户程序的主要处理阶段

在进行具体的内存管理之前,需要了解进程运行的基本原理和要求。
用户程序的主要处理阶段如下图所示。

80

编译阶段:

  • 由编译程序将用户源代码编译成若干个目标模块。

链接阶段:

  • 由链接程序将编译后形成的一组目标模块,及所需库函数链接,形成完整的装入模块。
  • 程序的链接有以下三种方式:
    • 静态链接
      • 在程序装入之前,先将各目标模块及他们所需的库函数链接成一个完整的可执行程序,以后不再拆开。
    • 装入时动态链接
      • 在装入内存时,边装入边链接。
    • 运行时动态链接
      • 在程序执行中需要该目标模块时才对它进行链接。

装入阶段:

  • 82
  • 81
  • 用户程序经编译之后的每个目标模块都以0为基地址顺序编址,其余指令中的地址都相对于首地址而编址。这种地址称为相对地址或逻辑地址。
  • 内存中各物理存储单元的地址是从统一的基地址开始顺序编址的,这种地址称为绝对地址或物理地址。

程序装入内存有以下三种方式:

  • ① 绝对装入方式
    • 编译时,如果知道程序将驻留在内存的某个位置,编译程序将产生绝对地址的目标代码。绝对装入程序按照装入模块中的地址,将程序和数据装入内存。装入模块被装入内存后,因为程序中的逻辑地址与实际内存地址完全相同,故不需要对程序和数据的地址进行修改。
    • 绝对装入方式只适用单道程序环境。
    • 程序中使用的绝对地址,可在编译或汇编时给出,也可由程序员直接赋予。
    • 在程序中采用符号地址,编译或汇编时转换为绝对地址。
    • 83
  • ② 可重定位装入方式
    • 重定位:对目标程序中的指令和数据进行修改,把目标程序中的逻辑地址转换为物理地址。
    • 由装入程序根据内存当时的使用情况,决定将装入模块放在放在内存的什么地方。装入模块内使用的地址都是相对地址。
    • 84
  • ③ 动态运行时装入方式
    • 为使内存利用率最大,装入内存的程序可以换出到磁盘上,以后再换入内存中,对换前后在内存中的位置可以不同。
    • 程序在内存中位置变了,就需要采用动态的装入方式。
    • 85

重定位

把作业地址空间中使用的逻辑地址变换成内存空间中的物理地址的过程。又称地址映射。

重定位的类型:

  • 静态重定位
    • 当用户程序被装入内存时,一次性实现逻辑地址到物理地址的转换,以后不再转换(一般在装入内存时由软件完成)作业i在执行前一次变址,直到该作业完成退出内存为止。
    • 86
    • 优点
      • 不需硬件地址转换机构,便于实现程序的静态链接。
    • 缺点
      • 一个作业装入内存时,必须分配其要求的全部内存空间,否则不能装入。
      • 需要占用连续的内存空间,程装入内存后不能移动。
      • 不易实现共享。
  • 动态重定位
    • 在程序运行过程中要访问数据时再进行地址变换。由地址变换机构进行的地址变换,硬件上需要重定位寄存器的支持。
    • 87
    • 优点
      • OS可以将一个程序分散存放于不连续的内存空间,可以移动程序。有利用实现共享。
    • 缺点
      • 需要硬件支持, OS实现较复杂。
    • 动态重定位是虚拟储存的基础
      • 在程序运行之前可以只装入它的部分代码即可运行,然后再运行期间,根据需要动态申请内存。

内存保护

内存分配前,需要保护操作系统不受用户进程的影响,同时保护用户进程不受其他用户进程的影响。

需要硬件支持实现保护。

硬件支持:

  • 基址寄存器(重定位寄存器):存放用户程序在内存的起始地址。
  • 限长寄存器(界地址寄存器):存放用户程序逻辑地址的最大范围。

实际上,实现动态重定位也需要这对寄存器的支持。

当CPU调度程序选择进程执行时,派遣程序会初始化基址位寄存器和限长寄存器。
每一个地址都需要与寄存器进行核对。
每个逻辑地址值必须小于限长寄存器。

88

89

覆盖与交换

基本思想:

  • 把处于等待状态(或在CPU调度原则下被剥夺运行权利)的进程从内存移到辅存,把内存空间腾出来,这一过程叫换出;把准备好竞争CPU运行的进程从辅存移到内存,这一过程叫换入。
  • 交换技术主要是在不同进程(或作业)之间进行。
  • 90

连续分配管理方式

区分:连续分配和非连续分配

把内存分为一些大小相等或不等的分区(partition),每个进程占用一个分区。操作系统占用其中一个分区。

分区法特点:适用与多道程序系统和分时系统。

  • 支持多个程序并发执行。
  • 难以进行内存分区的共享。

连续分配:使用分区技术(分区法):

  • 固定分区
  • 动态分区
  • 可重定位分区

固定分区法

基本思想:

  • 预先把可分配的主存储器空间分割成若干个连续区域,每个区域是一个分区。
  • 内存中分区的个数固定不变
  • 各个分区的大小也固定不变
  • 每个分区只可装入一个进程

分区大小:

  • 等分方式
  • 不等分方式

储存分配:

  • 对于分区等分方式,进程装入内存很简单。
  • 对于分区不等分方式,为进程分配分区的方法有两种。
    • 多个输入队列法
    • 单一输入队列法
      • 91
    • 优点:
      • 易于实现,,开销小。
    • 缺点:
      • 分区总数固定,限制了并发执行的程序数目。
      • 小作业不能充分利用分区空间。
      • 内碎片造成浪费。

动态分区法

基本思想:内存不是预先划分好的,而是当进程装入时,根据进程的需求和内存空间的使用情况来决定是否分配。若有足够的空间,则按需要分割一部分分区给该进程;否则令其等待主存空间。

系统中分区的大小和数目是可变的

内存管理:设置内存空闲块表——记录了空闲区起始地址和长度。
内存分配:动态分配。
内存回收:当某一块归还后,前后空间合并,修改内存空闲块表。

92

数据结构

空闲分区表:

93

空闲分区链:

94

分配算法

寻找某个空闲分区,其大小需大于或等于进程的要求。 若等于要求,则从空闲表中取消该项;若是大于要求,则将该分区分割成两个分区,其中一个分区为要求的大小并标记为“占用”,而另一个分区标记为“空闲”,需更新分区大小和分区地址。

分配算法:

  • 最先适应法——首次适应法
    • 空闲表按空闲块地址递增排序。
    • 分配内存时,顺序查找满足大小要求的第一个可用块。
    • 该算法的分配和释放的最初时间性能较好,较大的空闲分区可以被保留在内存高端。
    • 但随着低端分区不断划分而产生较多小分区,每次分配的查找时间开销会增大。
  • 循环法——邻近适应法
    • 由首次适应法演变而成,不同之处是,分配内存时从上次查找结束的位置开始继续查找。
    • 该算法的分配和释放的时间性能较好,使空闲分区分布得更均匀,但较大的空闲分区不易保留。
  • 最佳适应法
    • 空闲表以空闲块大小为序,按增量形式排列。
    • 接到内存申请时,顺序查找第一个满足大小要求的空闲块。
    • 特点:用最小空间满足要求。
      选择分区时总是寻找其大小最接近所要求的存储区域。
    • 个别来看,碎片较小,但从整体来看,会形成较多外碎片。较大的空闲分区可以被保留。
  • 最坏适应法——最大适应法
    • 空闲表以空闲块大小为序,按递减形式排列。
    • 接到内存申请时,找到第一个满足要求的分区,即挑选出最大的分区。
    • 较大的空闲分区不被保留。

可重定位分区

可重定位分区是动态分区法的一种。
可重定位分区是借助紧缩技术和动态重定位技术实现的分区分配方法。
重要概念:

  • 碎片
  • 紧缩
  • 动态重定位
碎片问题

经过一段时间的分配回收后,内存中存在很多很小的空闲块。它们每一个都很小,不足以满足分配要求;但其总和满足分配要求。这些空闲块被称为碎片。
造成存储资源的浪费

内部碎片与外部碎片:

  • 在一个分区内部出现的碎片(即被浪费的空间)称做内部碎片,固定分区法会产生内部碎片。
  • 在所有分区之外新增的碎片称做外部碎片,动态分区法会产生外部碎片。
紧缩

移动某些已分配区的内容,使所有进程的分区紧挨在一起,而把空闲区留在另一端。这种技术称为紧缩(或拼凑)。
类似于windows系统中的磁盘整理程序(对外存空间的紧缩)。

95

什么时候进行紧缩?有两种方案
当进程结束、释放所占用的分区时
在分配进程的分区时进行(当各个空闲区都不能满足该进程的需求时才进行)

可重定位分区法的优缺点

优点:可以消除碎片,能够分配更多的分区,有助于多道程序设计,提高内存的利用率。
缺点:紧缩花费了大量CPU时间;当进程大于整个空闲区时,仍要浪费一定的内存;进程的存储区内可能放有从未使用的信息;进程之间无法对信息共享。

非连续分配管理方式

分 页 技 术

分页技术的引入

在动态分区的存储空间中,存在“碎片”问题。尽管采用“紧凑”技术可以解决这个问题,但要为移动大量信息花去不少的处理机时间,代价较高。

分页技术:允许一个进程的存储空间不必连续,可以分散地放在各个空闲的内存区域中。解决了外部碎片,并提高了内存的利用率。

分页存储管理的基本概念

(1)逻辑空间分页

把进程的逻辑地址空间划分成若干个大小相等的部分,每个部分称为页。
每个页有一个编号。从0开始编制页号。
页内地址是相对于0编址。

96

(2)内存空间分块

内存按页的大小划分为大小相等的区域,称为内存块(页框)。
每个块有一个编号。从0开始编制块号。

97

页面(或块)的大小是由硬件(系统)确定的。
一般,页面大小应是2的若干次幂。

(3)内存分配原则

在为进程分配内存时,以块为单位将进程中的若干个页分别装入到多个可以不邻接的物理块中。

98

(4)页表

页表的作用是实现从页号到物理块号的地址映射。
系统为每个进程分配一个页表。在进程控制块(PCB)中存放指向该页表的指针。当调度一个进程运行时,就必须重新加载其各个寄存器,使硬件页表取得正确的值。
通常将页表保存在内存中,由一个页表基址寄存器PTBR指向该页表。整个系统只有一个PTBR。当发生切换时,只需要改变PTBR的指向——使它指向选中进程的页表。

99

(5)内存块表

整个系统有一个内存块表。每个内存块在内存块表中占一项,表明该块当前空闲还是已分出去了。

(6)逻辑地址表示

CPU运行进程时,读到的是一维的逻辑地址。由系统硬件对这个地址进行计算,表达成数对的形式:(页号,页内地址)

100

若给定一个逻辑地址空间中的地址为A,页面的大小为L,则页号p和页内地址d可按下式求得:

  • p = INT[A/L] , d = [A] MOD L

例子↓

例1:设某系统的页面大小为1KB,给定的逻辑地址为3456B,请给出该逻辑地址的页号和页内地址。
解答:
页的大小 L=1KB=1024B
逻辑地址A=3456B
页号p= INT[A/L] = INT[3456/1024]=3
页内地址d = [3456] MOD 1024 =384

分页系统中的地址映射

101

逻辑地址到物理地址的变换过程:

  • 地址变换机构自动地将有效地址分为页号和页内偏移量两部分,再用页号去检索页表。在执行检索之前,先将页号与页表长度比较,如果页号大于或等于页表长度,则表示地址越界并中断。
  • 若未越界,则页表起始地址+页号*页表项长度=该表项在页表中的位置,于是可从中得到该页的物理块号,将之装入物理地址寄存器中。
  • 与此同时,再将有效地址中的页内偏移量送入物理地址寄存器的块内地址字段中。
  • 整个地址变换过程均是由硬件自动完成的。

分页存储管理存在的两个主要问题:

  • 1.每次访存操作都要进行逻辑地址到物理地址的转换,地址转换过程必须足够快,否则访存速度会降低。
  • 2.每个进程引入页表,用于存储映射机制,页表不能太大,否则内存利用率会降低。

采用分页技术不存在外部碎片。每个进程平均有半个页面的内部碎片。

页面尺寸

页面尺寸对系统性能有影响。

  • 如果页面太小,会使进程的页面数过多,页表过长,占用大量的内存。也会增加硬件地址转换的开销,降低页面换入/换出的效率。
  • 如果页面过大,会使页面碎片增大,降低内存的利用率。

当只考虑进程大小和页表项的大小时,可以计算出一个相对最佳的页面尺寸公式。
设进程的平均大小为s字节,页面尺寸为p字节,每个页表项占e字节,由页表和内部碎片带来的总开销是:es/p + p/2
s
e /p + p/2对p求导,令其等于0,得到方程:- s *e / p2 + 1/2=0。从方程得到最佳页面尺寸公式:

  • p=$(\sqrt{2se})$
  • 如果s = 1 MB,e = 8 B,则最佳页面尺寸是4 KB。

随着内存空间的增大,页面尺寸也逐渐增大,但非线性增长。

硬件支持

页表基址寄存器PTBR
快表

内存中放置页表会带来存取速度下降的矛盾。

  • 因为存取一个数据(或指令)至少要访问两次内存。
  • 这时的存取速度为通常寻址方式速度的1/2。

解决方法:在地址变换机构中增设一个具有并行查找能力的高速缓冲寄存器——快表(Translation Lookaside Buffer, TLB)

  • 专用的、高速的、小容量的联想存储器
  • 用于存放当前访问的若干页表项
  • 存储项数少,一般为64-1024项

102

在具有快表的机制中,地址变换过程:

  • 1.CPU给出有效地址后,由硬件进行地址转换并将页号送入高速缓存寄存器,并将此页号与快表中的所有页号同时比较。
  • 2.如果找到匹配的页号,则直接读出对应的内存块号,送到物理地址寄存器。存取数据实现一次访存。
  • 3.如果没找到,则访问主存中的页表,读出页表项后,同时放入快表。若快表已满,则按照一定的算法替换其中的旧表项。

有些处理器设计为快表和主存同时查找,若在快表中匹配成功则终止主存的查找。
一般快表的命中率可以达到90%,这样,分页带来的速度损失就降低到10%。
快表的有效性是基于著名的局部性原理。

保护方式

(1)利用页表本身进行保护

  • 每个进程有自己的页表,页表的基址信息放在该进程的PCB中。访问内存需要利用页表进行地址转换,使得各进程在自己的存储空间内活动。
  • 为了防止进程越界访问,某些系统还提供页表长度寄存器PTLR,记载页表的长度。

(2)设置存取控制位

  • 在页表的每个表项中设置存取控制字段。
  • 有只读(R)、读写(RW)、读和执行(RX)等。

(3)设置合法标志

  • 在页表的每项中设置合法/非法位。
  • 设置为“合法”时,表示相应的页在该进程的逻辑地址空间中是合法的页。
  • 设置为“非法”时,表示该页不在该进程的逻辑空间内。利用这一位可以捕获非法地址。
  • 操作系统为每一页面设置这一位,从而规定允许或禁止对该页的访问。
  • 例如,系统的地址空间为14位(0-16383B),程序使用的地址空间是0-10468B。页面大小为2KB。
    在页表中,0~5号页面是合法的,可以进行正常的地址转换。6、7号页面应设置“非法”标志,禁止对这两个空页面进行访问。
页表的构造

页表可以构造成多种形式:

  • (1) 多级页表

    • 在逻辑地址空间较小的情况下,每个进程只使用一个页表实现地址转换即可。
    • 例1:逻辑地址空间用32位表示,页面大小为4KB。
      问题1:逻辑地址空间可分成多少页?
      232 / 212 = 220个页面。
    • 103
    • 问题2:若页表每项占4B,则页表大小为多少?
      4B* 220 =4MB。
    • 104
    • 问题3:页表分成多少页?
      4MB/4KB= 210个页面。
    • 105
  • (2) 散列页表

    • 处理大于32位地址空间的通用方式。
      需要散列函数。

    • 以页号作为参数,通过散列函数形成散列值。散列页表中记录不同的散列值,一个散列值对应一项。

    • 不同的页号,可能对应相同的散列值。散列表中每一项有一个链表,它把有相同散列值的元素链接起来。

    • 每个链表元素由三部分组成:页号,对应的内存块号,指向链表中下一个元素的指针。

    • 地址转换:以页号p作为散列函数的参数,得到一个散列值,作为检索散列页表的索引。把p与相应链表的第一个元素内表示页号的字段进行比较,匹配则进一步生成物理地址,不匹配则沿着链表指针向下搜索,直至找到匹配的页号。

    • 106

  • (3) 倒置页表

    • 为了减少页表占用过多的内存空间,可以采用倒置页表。
      普通页表是按照虚拟页号排序的,而倒置页表是按照内存块号排序的。
      普通页表是一个进程对应一个,而倒置页表所有进程对应一个。
    • 系统中只有一个页表,依据内存来设置表项,每个内存块对应唯一的表项,表项按内存块号排序。
    • 每个虚拟地址由三部分组成:进程标识符pid,虚拟页号p,页内地址d。
    • 每个表项包括两部分:进程标识符pid,虚拟页号p 。
    • 地址转换:用pid和p去检索页表,若找到匹配项,则该表项的序号i就是对应的内存块号,进一步生成物理地址;若搜索完整个页表,没有找到匹配项,则说明此页尚未调入内存。
    • 107
    • 倒置页表减少了页表占用的内存,却增加了检索页表时所耗费的时间,可能要查找完整个页表才能找到匹配项。为了改善性能,可以跟快表一起使用。
页面共享

共享方法:使这些相关进程的逻辑空间中的页指向相同的内存块,该块中放有共享程序或数据。

图为三个进程共享大小为三个页面的编辑器的情况,每个进程都有自己的私有数据页。

108

存在问题:作业或进程的逻辑地址空间是连续的,当系统将进程的逻辑地址空间划分成大小相同的页面时,被共享的程序文本不一定刚好在完整的页面中。

分页系统中实现页的共享比较困难.

分 段 技 术

分段存储管理的基本概念

1.分段

  • 段是一组逻辑信息的集合。每段都有自己的名字和长度。每段都从0开始编址,并采用一段连续的地址空间。
  • 用户程序需要进行编译,编译程序自动为输入的程序构建各个段。

2.程序的地址结构

  • 因为整个进程的地址空间分成多个段,所以逻辑地址要用两个成分来表示:段号s和段内地址d。
  • 在分段的情况下,进程的逻辑地址空间是二维的。
  • 109

3.内存分配

  • 内存以段为单位进行分配,每段单独占用一块连续的内存分区。各分区的大小由对应段的大小决定。
  • 各个段在内存中不必连续,可以离散存放。

4.段表和段表地址寄存器

  • 系统为每个进程建立一个段映射表,简称“段表”。每个段在段表中占有一项,段表项中包含段号、段长和段起始地址(又称“基址”)等。
  • 系统还要建立一个段表地址寄存器。
    • 存放该段表在内存的起始地址和该段表的长度(有几段,长度就是几)。
  • 110
地址转换

地址转换过程:

  • 1.将段号S与段表长度TL进行比较。若S>=TL,地址越界,发出越界中断信号;否则根据段表的始址和该段的段号,计算出该段对应段表项的位置,从中读出该段在内存的起始地址。
  • 2.检查段内地址W是否超过该段的段长SL。若W>=SL,地址越界;否则将该段的基址d与段内地址相加,得到物理地址。
  • 111
段的共享和保护

1.段的共享

  • 共享是在段一级实现的,任何共享信息可以单独成为一段。
  • 112

2.段的保护
段的保护措施有三种:

  • ① 存取控制

  • ② 段表本身可起保护作用

  • 表项中设置该段的长度限制。

  • 段表地址寄存器中有段表长度的信息。

  • ③ 保护环

    • 把系统中所有信息按照其作用和调用关系分成不同的层次(环),低编号的环具有高优先权,操作系统内核位于0环内;重要的实用程序和操作系统服务位于中间环;一般的应用程序(包括用户程序)位于外环上。
    • 一个环内的段可以访问同环内或环号更大的环中的数据段;一个环内的段可以调用同环或环号更小的环中的服务。

分页和分段的主要区别

页是信息的物理单位。
段是信息的逻辑单位。
页的大小是由系统确定的。
段的长度因段而异。
页的地址空间是一维的。
段的地址空间是二维的。
分页系统很难实现过程和数据的分离。
分段系统却可以很容易实现这些功能。
分页有内部碎片。
分段有外部碎片。

段页式技术

分页存储管理能够有效地提高内存利用率,而分段存储管理能够很好地满足用户需要,把这两种技术有机地结合起来,就形成了段页式存储管理系统。

段页式技术的基本原理

1.等分内存
2.进程的地址空间采用分段方式
3.段内分页
4.内存的分配单位是内存块
5.逻辑地址由三部分组成:段号s、页号p和页内地址d

6.段表、页表、段表地址寄存器

  • 为实现地址转换,系统为每个进程建立一张段表,为每个分段建立一张页表。
    • 段表至少包括:段号、段长(页表长度)、页表起始地址
    • 页表至少包括:页号、块号
  • 系统有一个段表寄存器
    • 段表起始地址
    • 段表长度

113

面向用户的地址空间是段式划分,面向物理实现的地址空间是页式划分。
用户程序逻辑上分为若干段,每段又分成若干页。
逻辑上连续的段存放在分散的内存块中。

115

地址转换过程:

  • 1.将段号S与段表长度L进行比较。若S>=L,地址越界;否则,将段号S与段表基址B相加,得到访问第S段的入口地址。
  • 2.将段号S表项中的页表长度与段号p进行比较。如果p>=页表长度,地址越界;否则将该段的页表基址与页号p相加,得到访问第p页的入口地址。
  • 3.读出该页所在的物理块号f,用块号f和页内地址d拼接成访内地址。
  • 如果对应的页不在内存,则发生缺页中断。如果该段的页表未在内存中建立起来,则发生缺段中断,由系统为该段在内存建立页表。(虚存管理的思想)
  • 进行一次访问实际需要三次访问内存,可以使用快表加快访问速度。

114

基本分页、分段、段页式技术的主要特点

采用动态重定位:进程中的所有存储器访问都是逻辑地址,这些逻辑地址在运行时动态地被转换为物理地址。
离散分配:一个进程可以被划分成多个页(或段),这些页或段不需要连续地位于主存中。
一次性:作业必须一次性全部装入内存,才能启动运行。
驻留性:作业被装入内存后,就一直驻留在内存中,其任何部分都不会被换出,直至作业运行结束。

虚拟内存管理

虚拟内存概念

局部性原理

程序的执行过程具有局部性

  • 大部分程序结构是顺序的,只有少数部分为转移或过程调用
  • 过程调用一般不超过5层
  • 程序中存在循环,反复执行
  • 对于数组的处理将局限于较小范围
  • 基于局部性原理,可以将程序的一部分装入内存,就启动程序运行,其余部分放在外存,当执行的指令不在内存时,由系统自动完成将它们从外存调入内存的工作。
  • 好处:
    用户编制程序时不必过多考虑内存容量的限制
    在一定容量的内存中就可同时装入更多的进程

虚拟存储器(虚拟内存)的概念

虚拟存储器:

  • 就是用户能作为可编址内存对待的虚拟存储空间,它是操作系统给用户提供的一个比真实内存空间大得多的地址空间。虚拟存储技术建立了“内存+外存”的两级存储器结构,并将二者有机地结合在一起,从而得到一个容量相当于外存,速度接近于内存的存储体系。

“虚拟”:

  • 并非实际内存。只是由于系统提供了部分装入、请求调入和置换功能后,用户感觉能使用的内存非常大,实际是对逻辑内存的扩充。

虚拟存储器的特征

① 虚拟扩充

  • 扩大逻辑内存的容量,即用户编程时用到的地址空间可以远大于实际内存的容量。

② 部分装入
③ 离散分配
④ 多次对换

  • 在一个进程运行期间,它所需要的全部程序和数据分成多次调入内存。而暂时不被使用的部分,可以换出到外存的对换区。

虚拟存储器容量不是无限大的,它主要受两方面的限制:

  • 指令中表示地址的字长
    • 如:若CPU的有效地址长度为32位,则程序可以寻址范围是0~ 232-1 ,即虚存容量为 4GB。
  • 外存的容量
    • 用户的程序和数据都必须完整地保存在外存中(如硬盘),因为外存容量有限,所以虚拟空间不可能无限大。

虚拟存储技术的实现

虚拟内存的实现主要有三种方式:

  • 请求分页存储管理

  • 请求分段存储管理

  • 请求段页式存储管理

请求分页管理方式

请求分页存储管理的基本思想

基本思想:

当一个进程的部分页面在内存时就可调度它运行;在运行过程中若用到的页面不在内存,则把它们动态换入内存。因为这种页面是根据请求被装入的,所以称之为请求分页存储管理。

为了实现请求分页,系统必须提供一定的硬件支持,包括:

  • 一定容量的内存和外存

  • 页表机制

  • 缺页中断机构

  • 地址变换机构

硬件支持及缺页处理

1.页表机制

  • 页表项通常包含下列几种信息:
  • 116
  • 禁止缓存位:用于禁止该页被缓存

2.缺页中断机构

缺页中断处理是由硬件和软件共同实现的。
在硬件中增加了对缺页中断进行响应的机构,一旦发现所访问的页面不在内存中,立即产生中断信号,随后转入缺页中断处理程序进行处理。

117

请求分页技术的性能

请求分页会对计算机系统产生重要影响

缺页率

  • 缺页中断的概率,用p表示(0≤p≤1),它等于缺页次数与全部访问内存次数之比。

有效存取时间

  • 如果不出现缺页中断,有效存取时间等于内存存取时间。内存存取时间ma一般为10~200ns。
  • 如果发生缺页中断,则首先必须从外存读入该页,然后才能进行内存存取。
  • 有效存取时间= (1-p)×ma + p×缺页中断处理时间
  • s、ms、μs、ns之间的进率是1000

在任何情况下,缺页中断处理所花费的时间主要有以下三部分:

  • (1)处理缺页中断的时间
  • (2)调入该页的时间
  • (3)重新启动该进程的时间
  • (1)和(3)每项执行的时间约为1~100 μs

调入该页的时间是将页面从盘上读到内存,这个过程花费的时间包括三部分:

  • 1.磁盘寻道时间(即磁头从当前磁道移至指定磁道所用的时间),典型寻道时间约为15 ms。
  • 2.旋转延迟时间(即磁头从当前位置落到指定扇区开头所用的时间),典型磁盘的旋转延迟时间约为8 ms。
  • 3.数据传输时间,典型传输时间是1 ms。

全部换页时间将近25 ms,包括硬件和软件处理的时间。

如果把平均缺页服务时间取为25 ms,内存存取时间取为100 ns,那么

  • 有效存取时间= (1- p)×100 + p×25 000 000

                      = 100 + 24 999 900×p
    
  • 如果缺页率为千分之一,则有效的存取时间约为多少?

  • 答:25000ns。
    由于请求分页使计算机慢了250倍。

  • 有效的存取时间直接正比于缺页率。

  • 为使存取速度下降在10%以内,缺页率不能超过千万分之四。

页面置换算法

页面置换

请求分页必须解决两个主要问题:

  • 内存块的分配
    • 如果有多个进程在内存,必须决定为每个进程分配多少内存块,由内存块分配算法完成。
  • 页面置换
    • 当需要置换页面时,必须确定淘汰哪个页面,由页面置换算法完成。

页面置换的应用

  • 例如,大多数计算机都有一个或多个内存的高速缓存,用来存放最近访问过的32字节或64字节的内存块。如果高速缓存满了,就必须选择一个数据块移出去,即置换。这个问题的时间规模更短,因为它需要的数据块来自于内存。
  • 又如,浏览器会在磁盘的缓存区中保留一些以前访问过的Web页面的副本。如果缓存区满了,就必须挑选一个页面删除,即置换。被删除的页面不必写回到Web服务器中,因为缓存区中的Web页面从来不会被修改。

页面置换过程

  • 118

置换算法的好坏直接影响系统的性能。

  • 若采用的置换算法不合适,可能出现这样的现象:刚被换出的页,很快又被访问,为把它调入而换出另一页,之后又访问刚被换出的页,……如此频繁地更换页面。这种现象称为 “抖动”。

页面走向

  • 为评价一个算法的优劣,可将该算法应用于一个特定的存储访问序列上,并计算缺页数量。存储访问序列也叫页面走向。
  • 为了减少计算量,对页面走向进行如下简化:
    • 对于给定的页面大小,仅考虑其页号,不关心完整的地址。
    • 如果当前对页面p进行了访问,那么,马上又对该页访问就不会缺页。这样连续出现的同一页号就简化为一个页号。

最佳置换法(OPT)

思想:为调入新页面而必须预先淘汰某个老页面时,所选择的老页面应在将来不被使用,或者是在最远的将来才被访问。以此保证获得最低的缺页率。

优点:
性能最佳,缺页中断率最低。
缺点:
理想化的算法,无法实现。
因为它需要预先知道一个进程整个运行过程中页面走向的全部情况。
作用:
模拟实验分析或理论分析其他算法的优劣。

先进先出法(FIFO)

思想:为调入新页面而必须预先淘汰某个老页面时,总是淘汰在内存中停留时间最长的一页,即先进入内存的页,先被换出。

优点:
容易理解,实现简单,方便程序设计。
缺点:
性能不好。因为常被访问的页,通常在内存中停留最久。
仅当按线性顺序访问地址空间时,才是最理想的,否则效率不高。
作用:
作为基础算法被应用在其他算法中。

如何记录哪个页面在内存停留时间最久?

  • 实现方法
    计时器。在页面上加计时器记录最早进入的页。
    队列。只需把调入内存的页面根据先后次序链接成队列,设置一个指针总是指向队首的页面。

存在Belady异常现象,即缺页率随内存块增加而增加

最近最少使用置换法(LRU)

思想:当需要置换一页时,选择在最近一段时间里最久没有使用过的页面予以淘汰。
理由:认为过去一段时间内未被访问过的页面,在最近的将来可能也不会被访问。

依据程序的局部性原理,利用过去的、已知的页面访问情况,预测将来的情况。

怎样确定每个页面最后的访问时间?

实现方法

  • 计数器。
    要求在硬件上有一个64位的计数器C(给CPU增加一个计数器C),每条指令执行完后,C的值自动加1 。
    在每个页表项中,增加一个“使用时间”字段(时间戳)。每一次内存访问后,C的值就被复制到被访问页面的“使用时间”字段中。
    系统始终保留着每个页面最后被访问的“时间”,淘汰该时间值最小的页面,即最近最久未被使用的页面。
  • 栈。
    • 用一个栈保留页号,每访问一个页面时,就把它从栈中取出,放入栈顶。要用具有首指针和尾指针的双向链把各个栈单元连起来。

优点:
是与OPT接近的算法,性能较好,应用较多。
缺点:
为确定最后访问以来所经历时间的顺序,通常需要硬件的支持,同时需要一定的软件开销。
作用:
实际应用中,使用的都是简单有效的LRU近似算法。即用软件模拟实现LRU。

三种基本置换算法的比较

119

理想情况:接近LRU的性能,开销又比较小。

页面分配策略

缺页率与什么有关?
页面置换算法
进程分得的内存块数目

内存块的分配

内存块的分配算法

  • 等分法
  • 等分内存块
    例:内存块为93,进程数为5
          每个进程分得18块,剩余3块
    
  • 比例法
    • 设进程pi的地址空间大小为si,则总地址空间 S=∑si
      若可用块的总数是m,则分给进程pi的块数是ai ≈m . si /S
      例:内存块为62,进程P1的逻辑空间占20页,P2占10页。 P1分得41块,P2分得21块。
  • 优先权法
  • 根据进程的优先级按比例分配内存块。可加速高优先级进程的执行速度。

内存块的分配策略

  • 固定分配策略:分配给进程的内存块数是固定的,且在最初装入时(即进程创建时)确定块数。
  • 可变分配策略:允许分给进程的内存块数随进程的活动而改变

页面置换范围

  • 全局置换:允许一个进程从全体存储块的集合中选取页面淘汰,尽管该块当前分配给其他进程,还是能强行占用。
  • 局部置换:是每个进程只能从分给它的一组内存块中选择页面淘汰。

内存块的分配策略+页面置换范围

  • 固定分配+局部置换
    • 主要问题:进程开始前要依据进程类型决定分配多少内存块。多了会影响并发水平,少了会使缺页率过高。
  • 可变分配+局部置换
    • 局部置换,但在大尺度上进行可变分配。
  • 可变分配+全局置换
    • 主要问题:置换策略的选择,选择哪个进程的页面被调出,较好的选择是页面缓冲算法。
  • 不包括“固定分配+全局置换”

抖动

抖动:在虚存中,页面在内存与外存之间频繁调度,以至于调度页面所需时间比进程实际运行的时间还多,此时系统效率急剧下降,甚至导致系统崩溃。这种现象为“抖动或颠簸(Thrashing)” 。

产生抖动的原因

  • 页面淘汰算法不合理
  • 分配给进程的内存块数太少

防止抖动的方法

  • ① 采用局部置换策略
    一个进程出现抖动,它不能从其他进程那里获取内存块,不会引发其他进程出现抖动,使抖动局限于一个小范围内。
  • ② 利用工作集策略防止抖动
  • ③ 挂起某些进程
    当出现CPU利用率很低、而磁盘I/O非常繁忙时,可能因为多道程序度太高而造成抖动。挂起一个或几个进程,腾出内存空间供抖动进程使用。
  • ④ 采用缺页频度法(Page Fault Frequency, PFF)
    抖动发生时缺页率会很高,通过控制缺页率可防止抖动。

规定一个缺页率,设置上限和下限。缺页率超出上限,就为进程分配内存块;低于下限,就从该进程的驻留集中取走一个内存块。通过直接测量和控制缺页率,避免抖动。

120

请求分段管理方式

请求分段的基本原理

在段式虚存系统中,一个进程的所有分段的副本都保存在外存上。当它运行时,先把当前运行的一段或几段装入内存,其他段仅在调用时才装入。

  • 一般过程:当访问的段不在内存时,便产生缺段中断;操作系统接到中断信号后,进行相应处理,按类似于申请分区的方式,在内存中找一块足够大的分区,用于存放所需分段。

段表机制

  • 121

  • 增补位:请求分段特有的字段,表示本段在运行过程中是否有动态增长。

  • 外存基址:本段在外存的起止地址。

  • 共享位:表示段的共享方式。

动态链接和链接中断处理

动态链接

  • 采用段式虚存系统可以实现程序的动态链接。仅当用到某个分段时才对它进行链接,避免不必要的链接。
  • 为了支持动态链接,需要附加间接编址和链接故障指示位两个硬件设施。

122

直接编址:指令中的地址就是所要存取数据的直接地址。

间接编址:指令中的地址不是所要存取数据的直接地址,而是间接地址——存放直接地址的地址,即它所指向的单元中存放所需数据的地址。

间接字:包括直接地址的字。

链接故障指示位:设在间接字中,用于表示所访问的段是否已链接上,0为链接上,1为没链接上。

链接中断处理:若相应指令采用间接字寻址时,发现链接故障指示位是1,则硬件产生链接中断,转向操作系统的链接故障处理程序去处理。

动态地址转换机构:若要访问的段不在内存,则由动态地址转换机构产生缺段中断,由操作系统进行相应的处理。

链接中断处理

123

Linux系统的存储管理

Linux的多级页表结构

Linux系统采用虚拟内存管理机制,使用交换和请求分页存储管理技术。

地址码采用32位,每个进程的虚拟存储空间可达4GB,Linux内核将其分成两部分:最高地址的1GB是系统空间,其余是用户空间。

124

Linux系统中页面大小为4KB。
采用三级页表的方式。

125

内存页的分配与释放

Linux系统采用位图和链表两种方式来管理内存页。

位图:利用一串二进制位值反映磁盘空间的分配情况,也称位向量(Bit Vector)法。

位示图的优点是在寻找第一个空闲块或几个连续的空闲块时相对简单有效。

  • 每个盘块对应一个二进制位,1表示盘块空闲,0表示已分配。
  • 设下列盘块是空闲的:2, 3, 4, 5, 8, 9, 10, 11, 12, 13, 17, 18, 25, 26, 27,…,则位示图向量是:
           0011110011111100011000000111…
    

126

  • 第1个元素(项0)描述孤立出现的单个(20)内存页的信息,第2个元素描述以2个(21)连续内存页为一组的页组信息,依此类推,页组中内存页的数量按2的倍数递增。

  • 位图

    • 例,某内存大小为1024KB,内存块大小为4KB,则可以用多少字节构成的位图来记录内存的使用情况?
      1024/4=256个内存块,需要256个二进制位的位图,8位一个字节,则256/8=32个字节。
  • 链表:用于记录已分配的内存单元和空闲的内存单元。可采用双向链表将内存单元链接起来,加快查找和处理。

  • 数组free_area的每一项描述某内存页组的使用状态信息(即由相邻空闲内存页构成的组)。

  • 当分配内存页组时,如果系统中有足够的空闲内存页满足请求,分配程序首先在free_area数组中搜索等于要求数量的最小页组的信息,然后再对应的双向链表中查找。
    如果没有所需数量的内存页组,则继续查找下一个页组,找到的页组大于所需,则把页组分成两部分:满足请求的部分返回给调用者,剩余部分插入空闲页组队列中。

  • 当释放一个页组时,页面释放程序会检查其上下,如有邻接的空闲页组,则合并,并修改有关队列。

第六章 文件系统

第七章 输入输出系统

修改docker容器的占用内存

在双核2g的服务器上用docker启动nacos时候,docker老是给nacos关了,查了一下是OOMKILL,自动杀死进程(内存占用过多)。

指令如下↓

1
journalctl -k | grep -i -e memory -e oom

方法一:使用docker-compose

暂时没有使用这种方法,可以自行百度。

方法二:修改hostconfig.json

hostconfig.json是容器的配置文件,每个容器都有,可以进行配置。

查找到对应的hostconfig.json文件

1
2
find / -name hostconfig.json #查找hostconfig.json文件
docker ps -a #查看对应的容器ID

1

修改hostconfig.json文件

先关闭docker(切记)

1
vim /var/lib/docker/containers/31227729d313c0d15b42acc177a67da0e87b1707280d0ab9edaaf4074088c975/hostconfig.json

2

内存最小为4m,即4*1024*1024

若向修改为Xm,即X*1024*1024

第一章 概述

计算机网络在现在的作用

互联网概述

基本概念

计算机网络:

  • 由若干节点和连接这些节点的链路(link)组成。
  • 节点可以是计算机、集线器、交换机或者路由器等。

互连网(与互联网不同):

  • 多个网络通过一些路由器相互连接起来,构成一个覆盖范围更大的计算机网络。
  • “网络的网络”(network of networks)
    img
    基本概念:
  • 网络把许多计算机连接在一起。
  • 互连网则把许多网络通过路由器连接在一起。
  • 与网络相连的计算机常称为主机。
    img

    发展阶段

    第一阶段(1969-1990):
  • ARPANET:最初只是一个单个的分组交换网,不是一个互连网。
  • 1983年,TCP/IP协议成为ARPANET上的标准协议,使得所有使用TCP/IP协议的计算都能利用互连网相互通信。
  • 人们把1983年作为互连网的诞生时间。
  • 1990年,APRANET正式宣布关闭。
    img

第二阶段(1985-1993):

  • 国家科学基金网NSFNET.
  • 三界结构:主干网、地区网和校园网(或企业网)。
  • 覆盖了全美国主要的大学和研究所,并且成为互联网中的主要组成部分。
    img

第三阶段(1993-现在):

  • 出现了互联网提供者ISP(Internet Service Provider):
    • 提供接入到互联网的服务。
    • 需要收取一定的费用。
  • 多层次的ISP结构:
    • 主干ISP、地区ISP、和本地ISP。
    • 覆盖面积大小和所拥有的IP地址数目的不用
  • 互联网交换点IXP(Internet eXchange Point):允许两个网络直接相连并快速交换分组。
    • 常采用工作在数据链路层的网络交换机。
    • 世界上较大的IXP的峰值吞吐量在Tbit/s量级。
  • 内容提供者(Content Provider):在互联网上向所有用户提供视频等内容的公司。不向用户提供互联网的转接服务。

万维网(20世纪90年代):

  • 由欧洲原子核研究组织(CERN)开发。
  • 成为互联网指数级增长的主要驱动力。
  • 2019年3月底,互联网的用户已经超过了43.8亿。
    img

    互联网的标准化工作

    标准发表以RFC的形式:
  • RFC:RequestForComments(请求评论)。
  • 所有的RFC文档都可以从互联网上免费下载。
  • 任何人都可以用电子邮件随时发表对某个文档的意见或者建议。
  • 但并发所有的RFC文档都是互联网标准。只有很少部分的RFC文档最后才能变成互联网标准。
  • RFC文档按发表时间的先后编上序号(即RFCXXXXX,XXXX是阿拉伯数字)。

互联网的组成

边缘部分

img
端系统:

  • 处在互联网边缘部分的就是连接在互联网上的所有主机,这些主机又称为端系统(end system)。
  • 端系统在工程上可能由很大差别:
    • 小的端系统:普通个人电脑、智能手机、网络摄像头等。
    • 大的端系统:非常昂贵的大型计算机或者服务器。
  • 端系统的拥有者:可以是个人、单位或者某个ISP。

“计算机之间通信”的含义:

  • “运行在主机A上的某个程序和运行在主机B上的另一个程序进行通信”。简称“计算机之间的通信”。

端系统之间的两种通信方式:

  • 客户-服务器方式(C/S方式)即Client/Server方式,简称C/S方式。
  • 对等方式(P2P方式) 即Peer-to-Peer方式,简称位P2P方式。

客户-服务器方式:

  • 客户服务器都是指通信中所设置的两个应用进程。
  • 客户-服务器方式所描述的是进程之间服务和被服务的关系。
  • 客户是服务的请求方,服务器是服务的提供方。
  • 服务请求方和服务提供方都要使用网络核心部分所提供的服务。
    img

客户软件的特点:

  • 被用户嗲用后运行,在打算通信时主动向远程服务器发起通信(请求服务)。因此,客户程序必须知道服务器程序的地址。
  • 不要特殊的硬件和很复杂的操作系统。

服务器软件的特点:

  • 一种专门用来提供某种服务的程序,可同时处理多个远地或本地客户的请求。
  • 系统启动后即自动调用并一直不断地运行着,被动地等待并接受来自各地地客户地通信请求。
    因此,服务器不需要知道客户程序的地址。
  • 一般需要强大的硬件和高级的操作系统支持。
  • 客户和服务器的通信关系建立后,_通信可以是双向的_,客户和服务器都可发送和接受数据

img
对等连接方式:

  • 对等连接方式(p2p)是指两个主机在通信时并不区分哪个时服务请求方哪个时服务提供方。
  • 只要两个主机都运行对等连接软件(p2p软件),他们就可以进行平等的、
    对等连接通信。
  • 双方都可以下载对方已经储存在硬盘中的共享文档。
  • 特点:
    • 对等连接方式从本质上看仍然是使用客户服务器的方式,只是对等
      连接中的每个主机既是客户机有事服务器。
    • 如C请求D,C时客户,D是服务器。如果C同时向F提供服务,那么C又是
      起着服务器作用。
    • 对等连接方式可支持大量对等用户(如上百万个)同时工作。

      核心部分(1)

      互联网核心部分:
  • 网络核心部分是互联网中最复杂的部分。
  • 网络中的核心部分要向网络边缘中的大量主机提供连通性,
    使边缘部分中的任何一个主机都能够向其他主机通信(即传送
    或接受各种形式的数据)。
  • 在网络核心部分起特殊作用的使路由器(router)。
  • 路由器是实现分组交换(packet switching)的关键
    构件,其任务是转发收到的分组,这是网络核心部分最重要
    的工能。
  • 为了理解分组交换,首先理解电路交换的基本概念。

电路交换

电路交换:

  • 和原来的座机一样,使用电话线连接起来
  • N部电话两两相连需要n*(n-1)/2对电话线,需要电线数量和座机
    数量的平方成正比。

交换机:

  • 当电话数量增多时使用交换机。
    img

交换:

  • 交换含义就是转接—–把一条条电话线转接到另一条
    电话线,使他们连通起来。
  • 从通信资源分配角度看,“交换”就是按照某种方式动态地
    分配
    传输线路的资源。

电路交换特点:

  • 电路交换必须时面向连接的。
  • 电路交换分为三个阶段:
    • 建立连接:建立一条专用的物理通路,以保证通信时
      所需通信资源不被其他用户占用;
    • 通信:主叫和被叫双方就能互相通电话;
    • 释放连接:释放刚才使用的这条专用的物理通路(
      释放刚才占用的所有通信资源)。
      img

电路交换缺点:

  • 计算机数据具有突发性。
  • 导致传送数据的时候通信线路的利用率很低(用来传送数据的
    时间往往不到10%)

分组交换

分组交换主要特点:

  • 分组交换采用储存转发技术。
  • 在发送端,先把较长的报文*划分成较短的、固定长度的数据段。
  • 每一个数据段前面加上首部构成分组(packet)
    img
  • 分组交换网以分组作为数据传输单元。
  • 依次把各分组发送到接收端(假定接收端在左边)
    img
    • 每一个分组的首部都含有地址(诸如目的地址和源地址)
      等控制信息。
    • 分组交换网中的结点交换机根据收到的分组首部中的地址信息
      ,把分组转发到下一个结点交换机。
    • 每个分组在互联网中独立的选择传输路径
    • 用这样的储存转发方式,最后分组就能到达最终目的地
  • 接收端收到分组后剥去首部还原成报文。
  • 最后,在接收端把收到的数据恢复成远来的报文
  • 假定分组在传输过程中没有出现差错,在转发中也没有被
    丢弃

    分组交换的优点↓
    img
    分组交换问题↓
    img

    核心部分(2)

    互联网核心部分:
  • 互联网的核心部分是由许多网络和他们互连起来的路由器组成
    ,而主机所处在互联网的边缘部分
  • 互联网核心部分中的路由器一般都用高速链路相连接,而在网络
    边缘的主机接入到核心部分则通常以相对较低速率的链路相连接
  • 主机的用途是为用户进行信息处理的,并且可以和其他主机通过
    网络交换信息。路由器的用途是用来转发分组的,即进行分组交换。
    img

路由器:

  • 在路由器中的输入和输出端口之间没有直接连线
  • 路由器处理分组的过程是:
    • 把收到的分组先放入缓存暂时储存
    • 查找转发表,找出到某个目的地址从哪个端口转发;
    • 把分组送到适当的端口转发出去;

主机和路由器的不通:

  • 主机是为用户进行信息处理,并向网络发送分组,从网络接受分组。
  • 路由器对分组进行储存转发,最后把分组交付目的主机。

三种交换比较:
img
img

计算机网络在我国的发展

计算机网络的类别

计算机网络的定义

计算机网络定义:

  • 计算机网络的精确定义未统一。
  • 较好的定义:

计算机网络主要是由一些通用的,可编程的硬件互连而成的,而
这些硬件并非专门用来实现某一特定目的(如,传送数据或者视频信号)
这些可编程的硬件能够用来传送多种不同类型的数据,并能支持广泛
的和日益增长的应用。

  • 结论:
    • 计算机网络所连接的硬件,并不限于一般的计算机,而是包括了
      智能手机。
    • 计算机网络并非专门用来传送数据,而是能够支持很多种的应用
      (包括今后可能出现的各种应用)
    • 注意:上述的“可编程的硬件”表明这种硬件一定含有中央处理器
      (cpu)

      几种不同类别的网络

      按照作用范围分类

      广域网:几十到几千公里。
      域域网:5-50公里。
      局域网:一公里左右。
      个人局域网:十米左右。

***若中央处理机之间的距离非常近(如仅1m的数量级甚至更小)
则称为多处理机系统,而不称他为计算机网络。

按照使用者分类

公用网:

  • 按规定缴纳费用的人可以使用的网络。因此也可称为
    公众网。
    专用网:
  • 为特殊业务工作的需要而建造的网络。

公用网和专用网都可以提供多种服务。如传送的是计算机数据
,则分别是共用计算机网络和专用计算机网络。

接入网:

  • 接入网是一类比较特殊的计算机网网络,用于将客户接入互联网。
  • 接入网本身既不属于互联网的核心部分,也不属于互联网的边缘部分。
  • 接入网是从某个用户端系统到互联网中的第一个路由器(边缘路由器)
    之间的一种网络。
  • 从覆盖范围看,很多接入网是属于局域网。
  • 从作用上看,接入网只是起到让用户能够与互联网连接的“桥梁”作用。

    计算机网络的性能

    计算机网络的性能指标

    计算机网络的性能一般是指他的几个重要的性能指标,主要包括:
  • 速率
  • 带宽
  • 吞吐率
  • 时延
  • 时延带宽积
  • 往返时间RTT
  • 利用率

    速率

    速率:
  • 比特(bit)是计算机中数据量的单位,也是信息论中使用的信息量
    的单位。
  • 比特(bit)是一个“二进制数字”,一个比特是二进制数字中的1或0.
  • 速率是计算机网络中最重要的一个性能指标,指的是数据传送的速率
    他也称为数据率比特率
  • 速率的单位是bit/s或kbit/s、Mbit/s、Gbit/s等。
  • ***速率往往是指额定速率或标称速率,非试剂运行速率。

带宽

带宽:

  • “带宽”本来是指信号具有的频带宽度,单位是赫。
  • 在计算机网络中,带宽用来表示网络中某通道传送数据的能力
    。表示在单位时间内网络中的某通信道所能通过的“最高数据率
    单位是bit/s。
  • ***在“带宽”的上述两种表述中,前者为频域称谓,后者为
    时域称谓,本质是相同的.也就是说,一条信道链路的“带宽”越宽
    ,其所能传输的“最高数据率”也越高。
  • 时间轴上的信号的宽度随带宽增大而变窄。(也就是传输
    速率变高,所需时间变短)

吞吐量

吞吐量:

  • 吞吐量表示在单位时间内通过某个网络(或信道、接口)的数据量
  • 吞吐量更经常的用于对现实世界中的网络的一种测量,以便知道

实际上到底有多少数据量能通过网络

  • 吞吐量受网络的带宽或网络的额定速率的限制。

时延

时延:

  • 时延是指数据从网络(或链路)的一段传到另一端所需的时间。
  • 有时也称为延迟或者迟延。
  • 网络中的时延由一下几部分组成:
    • (1)发送时延:
      • 也称为传输时延。
      • 发送数据时,数据帧从结点进入到传输媒体所需要的时间
      • 也就是从发送数据帧的第一个比特位算起,到该帧的最后
        一个比特发送完毕所需要的时间。
      发送时延=数据帧长度(bit)/发送速率(bit/s)
    • (2)传播时延:
      • 电磁波在信道中需要传播一定的距离而花费的时间
      • 发送时延与传播时延由本质上的不通
      • 信号发送速率和信号在信道上的传播速率
      完全不同的概念。
      • ***传播时延=信道长度(米)/信号在信道上的传播速率(米/秒)
    • (3)处理时延
      • 主机或路由器在收到分组时,为处理分组(例如分析首部、提取数据
        差错检验等)所花费的时间。
    • (4)排队时延
      • 分组在路由器输入输出队列中排队等待处理所经理的时延。
      • 排队时延的长短往往取决于网络中当时的信号量
  • 数据在网络中所经理的总时延等于上述的时延之和。
  • ***必须指出,在总时延中,究竟哪一种时延占主导地位,必须具体分析。
    时延发生地方↓
    img
    错误概念↓
    img

时延带宽积

时延带宽积:

  • 链路的时延带宽积又称为以比特为单位的链路长度
  • 时延带宽积=传播时延*带宽
  • ***只有在代表链路的管道都充满比特时,链路才得到了充分利用。

往返时间RTT

往返时间RTT:

  • 互联网上信息时双向交互的,有时需要知道双向交互一次所需要的时间
  • 往返时间表示从发送方发送数据开始,到发送方收到来自接收方
    的确认,总共经历的时间。
  • 在互联网中,往返时间还包括各中间结点的处理时延、排队时延。
  • 当使用卫星通信时,往返时间RTT相对较长,时很重要的一个性能
    指标

利用率

利用率:

  • 利用率分为信道利用率和网络利用率。
  • 信道利用率指出某信道有百分之几的时间是被利用的(有数据
    通过)。完全空闲的信道的利用率是零。
  • 网络利用率则是全网络的信道利用率的加权平均值,
  • 信道利用率并非越高越好。当信道利用率增大时,该信道引起的
    时延也就迅速增加。

时延与网络利用率的关系:

  • 根据排队论的理论,当某信道的利用率增大时,该信道引起的时延
    也就迅速增加。
  • 若令D0表示网络空闲时的时延,D表示网络当前的时延,则在适当条件下
    ,可用一下简单公式表示D和D0关系:↓
    D=D0/1-U

其中U是网络利用率,数值在0到1之间

  • img

网络的非性能特征

一些非性能指标:

  • 费用
  • 质量
  • 标准化
  • 可靠性
  • 可扩展性和可升级性
  • 易于管理和维护

计算机网络的体系结构

计算机网络体系结构的形成

基础知识

相互通信的两个计算机系统必须高度协调工作才行,而这种“协调”是非常复杂的。

“分层”可将庞大而复杂的问题,转化为若干较小的局部问题,而这些较小的局部问题就比较易于研究和处理。

1974年,IBM宣布系统网络体系结构SNA(System Network Architecture)。这个著名的网络标准就是按照分层的方法制定的。

由于网络体系结构的不通,不同公司的设备很难互相连通

开放系统互连参考模型OSI/RM

ISO成立专机构提出了著名的开放系统互连基本参考模型OSI/RM简称OSI。

只要遵行OSI标准,一个系统就可以和位于世界上任何一个遵循OSI的系统进行通信。

OSI理论研究成果很成功,市场化失败了,原因包括:

  • OSI的专家们在完成OSI标准时没有商业驱动力;
  • OSI协议实现起来太复杂而且效率低;
  • OSI标准的制定周期太长,因而使得按照OSI生产的设备无法及时进入市场;
  • OSI的层次划分不太合理,有些功能在多个层次中重复出现。

法律上的国际标准OSI并没有得到市场的认可,而非国际标准的TCP/IP却获得了最广泛的应用。TCP/IP常被称为___事实上的国际标准___

协议与划分层次

基础知识

计算机网络中的数据交换必须遵循事先约好的规则

这些规则明确规定了所交换的数据的格式以及有关的同步问题(同步问题含有时许的意思)。

网络协议简称协议是为进行网络中的数据交换而建立的规则、标准或约定。

网络协议的三个组成要素

语法: 数据与控制信息的结构或格式。

语义: 需要发出何种控制信息,完成何种动作以及做出何种响应。

同步: 事件实现顺序的详细说明。

网络协议是计算机网络的不可缺少的组成部分

协议的两种形式

一种是使用文字描述

一种是使用程序代码

以上两种都能对网络上的信息交换做出精确的解释

层次式协议结构

ARPANET的研制经验表明,对于非常复杂的计算机网络协议,其结构应该是层次式的

划分层次的概念举例

发送文件可以将要做的工作进行如下划分:

  • 第一类工作与传送文件直接有关。
    • 确信对方已做好接受和储存文件的准备。
    • 双方已协调好一致的文件格式。
  • 两个主机将文件传送模块作为最高的一层,剩下的工作由下面的模块负责。

示例图↓

img

img

img

img

分层的好处与缺点

好处:

  • 各层之间是独立的。
  • 灵活性好。
  • 结构上可以分割开。
  • 易于实现和维护。
  • 能促进标准化工作。

缺点:

  • 降低效率。
  • 有些功能会在不同的层次中重复出现,因而产生了额外开销。

各层完成的主要功能

① 差错控制:使相应层次对等方的通信更加可靠。
② 流量控制:发送端的发送速率必须使接收端来得及接收,不要太快。
③ 分段和重装 :发送端将要发送的数据块划分为更小的单位,在接收端将其还原。
④ 复用和分用:发送端几个高层会话复用一条低层的连接,在接收端再进行分用。
⑤ 连接建立和释放:交换数据前先建立一条逻辑连接,数据传送结束后释放连接。

计算机网络的体系结构

计算机网络的体系结构是计算机网络的各层协议的集合。

体系结构就是这个计算机网络及其部件所应完成的功能的精确定义

实现是遵循这种体系结构的前提下用任何硬件或软甲能完成这些功能的问题。

体系结构是抽象的,而实现则是具体的,是真正在运行的计算机硬件和软件

具有五层协议的体系结构

基础知识

TCP/IP是四层体系结构:应用层、运输层、网际层和网络接口层。但最下面的网络接口层没有具体内容。

因此往往采用折中的办法,即综合OSI和TCP/IP的有点,采用一种具有五层协议的体系结构

体系结构↓

img

数据传输过程

主机1向主机2发送数据:

应用层(加上应用层首部称为应用层PDU)—->运输层(加上运输层首部称为运输层报文)—–>网络层(加上网络层首部称为IP数据报(或分组))—–>数据链路层(加上数据链路层首部和尾部称为数据链路层帧)—–>物理层(把比特流传送到物理媒体)—->另一台主机逆序解析一下 ↓

img

27

传输解析:

  • OSI把对等层之间传送的数据单元称为该层的协议数据单元PDU
  • 任何两个同样的层次把数据(PDU加上控制信息)通过水平虚线直接传递给对方。这就是所谓的“对等层”
  • 各层协议实际上就是在各个对等层之间传递数据时的各项规定。

实体、协议、服务和服务访问点

基础:

  • 实体:表示任何可发送或接受信息的硬件或软件进程。
  • 协议:是控制两个对等实体进行通信的规则的集合。
  • 在协议的控制下,两个对等实体间的通信使得本层能够向上一层提供服务
  • 要实现本层协议,还需要使用下层所提供的服务

协议和服务:

  • 本层的服务用户只能看见服务而无法看见下面的协议。即下面的协议对上面的服务用户是透明的。
  • 协议是水平的,即协议是控制对等实体之间通信的规则。
  • 服务垂直,即服务是由下层向上层通过层间接口提供的。
  • 上层使用服务原语获得下层所提供的服务。

服务访问点:

  • 同意系统相邻两层的尸体进行交换的地方称为服务访问点SAP
  • 服务访问点SAP是一个抽象的概念,他实际上就是一个逻辑接口。
  • OSI把曾与层之间交换的数据的单位称为服务数据单元SDU
  • SDU可以与PDU不一样,例如,可以是多个SDU合成为一个PDU,也可以是一个SDU划分为几个PDU。
  • 28

TCP/IP的体系结构

基础知识

TCP/IP体系结构↓

30

第二章 物理层

物理层的基本概念

基础知识

物理层解决计算机之间传输媒体上的传输数据比特流而不是具体的传输媒体

物理层尽可能屏蔽掉不同传输媒体和通信手段差异

用于物理层的协议也常称为物理层规程

物理层的主要任务

主要任务:确定与传输媒体的接口的一些特性。

机械特性:指明接口所用接线器的形状尺寸、引线数目和排列、固定和锁定装置等。

电气特性:指明在接口电缆的各条线上出现的电压的范围。

功能特性:知名某条线上出现的某一电平的电压表式何种意义。

过程特性:指明对于不同功能的各种可能事件的出现顺序。

数据通信的基础知识

数据通信系统的模型

一个信道系统包括三大部分:原系统(发送端、发送方)、传输系统(或传输网络)和目的系统(接收端、接收方)。

31

常用术语:

  • 数据——运送消息的实体。
  • 信号——数据的电气的或电磁的表现。
  • 模拟信号——代表消息的参数的取值是连续的。
  • 数字信号——代表消息的参数的取值是离散的。
  • 码元——在使用时间域(简称时域)的波形表示数字信号时,代表不同离散数值的基本波形。

有关信道的几个基本概念

基础知识

信道——一般用来表示向某个方向传送信息的媒体。

单向通信(单工通信)——只能有一个方向的通信而没有反方向的交互。

双向交替通信(半双工通信)——通信的双方都可以发送消息,但不能双方同时发送(接受)。

双向同时通信(全双工通信)——通信的双方可以同时发送和接收信息。

基带信号(基本频带信号)——来自新元的信号。像计算机输出的代表各种文字或图像文件的数据信号都属于基带信号。

必须对基带信号进行调制

调制

调制分为两大类:

基带调制:

仅对基带信号的波形进行变换,使它能够与信道特性相适应。变换后的信号仍然是基带信号。我们把这种过程称为编码

带宽调制:

使用载波进行调制,把基带信号的频率范围搬移到较高的频段,并转换为模拟信号,这样就能够更好的在模拟信道中传输(仅在一段频率范围内能够通过信道)。

带通信号:经过载波调制后的信号。

常用编码方式

不归零制:正电平代表1,负电平代表0.

归零制:正脉冲代表1,负脉冲代表0.

曼彻斯特编码:位周期中心的向上跳表代表0,位周期中心的向下跳变代表1.但也可以反过来。

差分曼彻斯特编码:在每一位的中心处始终都有跳变。位开始边界有跳变代表0,而位开始边界没有跳变代表1.

图↓

32

曼彻斯特编码和差分曼彻斯特编码产生的信号频率比不归零制高。

从自同步能力来看,不归零制不能从信号波形本身中提取信号时钟频率(没有自同步能力)而曼彻斯特编码和差分曼彻斯特编码具有自同步能力

为了达到更高的信息传输速率,必须采用技术上更为复杂的多元制的振幅相位混合调制方法。

**不是码元越多越好。若每一个码元可表示的比特数越多,则在接收端进行解调时要正确识别每一种状态就越困难,出错率增加。 **

最基本的二元制调制方法有以下几种:

  • 调幅(AM):载波的振幅随基带数字信号而变化。
  • 调频(FM):载波的频率随基带数字信号而变化。
  • 调相(PM) :载波的初始相位随基带数字信号而变化。

信道的极限容量

基础知识

从概念上讲,限制码元在信道上的传输速率的因素有一下两个:

  • 信道能够通过的频率范围
  • 信噪比

信道能够通过的频率范围

奈氏准则。为了避免码间串扰,码元的传输速率的上限值。

在任何信道中,码元传输的速率是有上限的,否则就会出现码间串扰的问题,使接收端对码元的判决(即识别)称为不可能。

如果信道的频带越宽,也就是能够通过的信号高频分量越多,那么就可以用更高的速率传送码元而不出现码间串扰。

信噪比

噪声会使接收端对码元的判决产生错误。

信噪比是相对的。如果信号相对强,那么噪声的印象就比较小。

信噪比就是信号的平均功率和噪声的平均功率之比。记为S/N,并用分贝(dB)作为度量单位。即:

信噪比(dB)=$10\log_{10}(S/N)$

例,当S/N=10时,信噪比为10dB,而当S/N=1000时,信噪比为30dB。

S/N=XXXXX没有单位如果转换成dB,需要借助公式 $10\log_{10}(S/N)$

有高斯白噪声干扰的信道的极限、无差错的信息传输速率(香农公式)。

信道的极限信息传输速率C可表达为(香浓公式):

C=W $\log_2 (1+S/N)$ (bit/s)

W为信道的带宽(以hz为单位;

S为信道内所传信号的平均功率;

N为信道内的高斯噪声功率。

香农公式表明:

  • 信噪比越大,则信息的极限传输速率就越高。
  • 只要信息传输速率低于信道的极限信息传输速率,就一定可以找到某种办法来实现无差错的传输。
  • 若信道带宽 W 或信噪比 S/N 没有上限(当然实际信道不可能是这样的),则信道的极限信息传输速率 C 也就没有上限。
  • 实际信道上能够达到的信息传输速率要比香农的极限传输速率低不少。

注意

  • 对于频带宽度已经确定的信道,如果信噪比不能在提高,而且码元传输速率也不能提高了,也是有办法提高信息的传输速率。
  • 方法就是:用编码的方式让每个码元携带更多比特的信息量

物理层下面的传输媒体

导引型传输媒体

概念

传输媒体称为传输介质或传输媒介,他就是数据传输系统中在发送器和接收器之间的物理通路。

传输媒体分为导引型和非导引型。

导引型:电磁波被导引沿着固体媒体(铜线或光纤)传播。

非导引型:就是指自由空间。在非导引型传输媒体中,电磁波的传输常称为无线传输。

双绞线

双绞线:

  • 最常用的传输媒体。
  • 模拟传输和数字传输都可以使用双绞线,其通信距离一般为几到十几公里。
  • 屏蔽双绞线STP:
    • 带金属屏蔽层。
  • 无屏蔽双绞线UTP

图↓

33

双绞线标准

无屏蔽双绞线和屏蔽双绞线标准:EIA/TIA-568,1995年更新为:EIA/TIA-568-A.

此标准规定了五个种类的UTP标准(从一类线到五类线)。对于传输数据来说,现在最常用的UTP是五类线(Category5或CAT5).

34

同轴电缆

同轴电缆:

  • 同轴电缆的带宽取决于电缆的质量。
  • 50 Ω 同轴电缆 —— LAN / 数字传输常用
  • 75 Ω 同轴电缆 —— 有线电视 / 模拟传输常用

光缆

光纤是光纤通信的传输媒体。

一个光纤通信系统的传输带宽远远大于目前其他各种传输媒体的带宽。

光纤优点:

  • 通信容量大。
  • 传输损耗小,中继距离长。
  • 抗雷电和电磁干扰性能好。
  • 无传音干扰,保密性好。
  • 体积小,重量轻。

非导引型传输媒体

基础

将自由空间称为“非导引型传输媒体”。

短波通信(高频通信)主要是靠电离层反射,但短波通信的通信质量较差,传输速率低。

微波在空间是直线传播。

传统微波通信有两种方式:

  • 地面微博接力通信。
  • 卫星通信

信道复用技术

频分复用,时分复用和统计时分复用

复用

复用是通信技术中的基本概念。它允许用户使用一个共享信道进行通信,降低成本,提高利用率。

频分复用FDM

将整个带宽分为多份,用户在分配到一定的频带后,在通信过程中自始至终都占用这个频带。

频分复用的所有用户在同样的时间占用不通的带宽资源(这里的“带宽”是频率带宽而不是数据的发送速率)。

35

时分复用

时分复用则是将时间划分为一段等长的时分复用帧(TDM帧)。

每一个用户所占用的时隙是周期性出现(周期就是TDM帧长)。

TDM信号也称为等时信号。

时分复用的所有用户是在不同的时间占用同样的频带宽度

时分复用可能会造成线路资源浪费

36

37

统计时分复用STDM

统计时分复用:STDM帧不是固定分配时隙的而是按需动态的分配时隙,因此统计时分复用可以提高线路的利用率。

38

波分复用

波分复用就是光的频分复用。使用一根光纤来同时传输多个光载波信号。

39

码分复用CDM

基础

码分多址CMDA,各用户使用经过特殊挑选的不同码型,因此彼此不会造成干扰。这种系统发送的信号有很强的抗干扰能力。

码片序列

每一个比特时间划分为m个短的间隔,称为码片

每个站被指派一个唯一的mbit码片序列。:

  • 如发送比特1,则发送自己的mbit码片序列。
  • 如发送比特0,则发送该码片序列的二进制反码。

例如,S站的8bit码片序列是00011011.:

  • 发送比特1时,就发送序列00011011,
  • 发送比特0时,就发送序列11100100.

S站码片序列:(-1-1-1+1+1-1+1+1)

码片实现了扩频

假定S站要发送信息的数据率为 b bit/s。由于每一个比特要转换成 m 个比特的码片,因此 S 站实际上发送的数据率提高到 mb bit/s,同时 S 站所占用的频带宽度也提高到原来数值的 m 倍。这种通信方式就是扩频

扩频通信通常有两大类:

  • 一种是直接序列扩频DSSS,上面就是这一类
  • 一种是跳频扩频FHSS

CDMA的重要性:

  • 每个站分配的码片序列不仅必须各不相同,并且还必须互相正交
  • 在实用的系统中是使用伪随机码序列

码片序列的正交关系:

  • 令向量S表示站S的码片向量,令T表示其他任何站的码片向量。
  • 两个不通站的码片序列正交,就是向量S和T的规划内积等于0:40
  • 任何一个码片向量和该码片向量自己的规划内积都是141
  • 一个码片向量和该码片反码的向量的规划内积值是-1.

CDMA的工作原理:

42

数字传输系统

旧系统

脉码调制PCM体制最初是为了在电话局之间的中继线上传送多路的电话。

由于历史上的原因,PCM有两个互不兼容的国际标准:

  • 北美的24路PCM(简称为T1)
  • 欧洲的30路PCM(简称为E1)
  • 我国采用的是欧洲的E1标准

旧的数字传输系统存在许多缺点:

  • 速率标准不统一
    • 如果不对高次群的数字传输速率进行标准化,国际范围的基于光纤高速数据传输就很难实现
  • 不是同步传输
    • 在过去相当长的时间,为了节约经费,各国数字网主要是采用准同步方式。
    • 当数据传输的速率很高时,收发双方的时钟同步就会称为很大的问题

同步光纤网

同步光纤网SONET,的各级时钟都来自一个非常精确的主时钟。

SONET(同步光纤网)定义了同步传输的线路速率等级结构:

  • 对电信号称为第1级同步传送信号STS-1,其传输速率是51.84Mbit/S.
  • 对光信号则称为第1级光载波OC-1.

带宽接入技术

ADSL技术

非对称数字用户线ADSL技术就是用数字技术对现有的模拟电话用户线进行改造,使他们能够承载宽带业务。

DSL的几种类型:

  • ADSL (Asymmetric Digital Subscriber Line):非对称数字用户线
  • HDSL (High speed DSL):高速数字用户线
  • SDSL (Single-line DSL):1 对线的数字用户线
  • VDSL (Very high speed DSL):甚高速数字用户线
  • DSL (Digital Subscriber Line) :数字用户线。
  • RADSL (Rate-Adaptive DSL):速率自适应 DSL,是 ADSL 的一
  • 个子集,可自动调节线路速率)。

ADSL特点

上行和下行带宽做成不对称的。

ADSL在用户线的两端各安装一个ADSL调制器

DMT技术

我国目前采用的方案是离散多音调DMT

DMT调制采用频分复用的方法。

43

ADSL数据率

ADSL不能保证固定的数据率。

ADSL的组成

44

第二代ADSL

通过提高调制效率得到了更高的数据率

采用了无缝速率自适应技术SRA可在运营中不中断通信和不产生误码的情况下,自适应的调整数据率。

光纤同轴混合网(HFC网)

HFC网对CATV网进行了改造。

HFC基本

HFC网将原CATV网中的同轴电缆主干部分该换为光纤,并使用模拟光纤技术

在模拟光纤中采用光的振幅调制AM

模拟光纤从头端连接到光线节点,即光分配结点。在光纤结点光信号被转换为电信号。在光结点以下就是同轴电缆。

45

HFC网具有双向传输功能,扩展了传输频带。

电缆调制解调器

电缆调制解调器是为HFC网而使用的调制解调器。

FTTx技术

FTTx是一种实现宽带居民接入网的方案,代表多种宽带光纤接入方式。

FTTx表示Fiber To The (从光纤到…)例如:

  • 光纤到户FTTH
  • 光纤到大楼FTTB
  • 光纤到路边FTTC

46

第三章 数据链路层

使用点对点信道的数据链路层

数据链路层使用的信道主要是以下两种类型:

  • 点对点信道。这种信道使用一对一的点对点通信方式。
  • 广播信道。这种信道使用一对多的广播通信方式。广播信道上连接的主机很多,因此必须使用专用的共享信道协议来协调这些主机的数据发送。
  • 47

数据链路和帧

链路:是一条无源的点到点的物理线路段,中间没有任何的其他交换结点。一条链路只是一条通路的一个组成部分

数据链路:除了物理线路外,还必须有通信协议来控制这些数据的传输。协议的硬件和软件+链路=数据链路。

  • 使用适配器(网卡)来实现这些协议的硬件和软件。
  • 一般的适配器都包括了数据链路层和物理层这两层的功能。

数据链路层传送的是帧

48

三个基本问题

封装成帧

封装成帧就是在一段数据的前后分配添加首部和尾部,就构成了一个帧。

首部和尾部的一个重要作用就是进行帧定界

49

例子↓

50

透明传输

如果数据中某个字节的二进制代码恰好和边界一样,数据链路层就会错误地“找到帧地边界”。

解决透明传输问题办法:

  • 解决方法字节填充或者字符填充
  • 发送端地数据链路层在数据中出现控制字符前插入一个转义字符ESC
    • 接收端地数据链路层在将数据送往网络层之前删除插入地转义字符。
    • 如果转义字符也出现在数据中,那么再加一个转义字符,每当接收端收到连续地两个转义字符时,就删除其中前面的一个。
  • 51

差错控制

传输错误的比特占所传输比特总数的比率称为误码率

误码率与信噪比有很大关系。

为了保证数据传输的可靠性,必须采用各种差错检测措施。

循环冗余检验的原理:

  • 在数据链层传送的帧中,广泛使用循环冗余检验CRC的检错技术。
  • 在发送端先把数据划分为组。假定每组k个比特。
  • 假设待传送的一组数据M=101001(现在k=6)。我们在M的后面再添加供差错检测用的n位冗余码一起发送。
冗余码计算

冗余码的计算:

  • 用二进制的模2运算进行$2^n$乘M的运算。这相当于在M后面添加n个0。
  • 得到的(k+n)位的数除以事先预定好的长度为(n+1)位的除数P,得出是Q而余数是R,余数R比P少1位,即R是n位。
  • 将余数R作为冗余码拼接 在数据M后面发送出去。
  • 52
帧检验序列FCS

在数据后面添加上的冗余码称为帧检验序列FCS

循环冗余检验CRC和帧检验序列FCS并不是一个概念。CRC是一种检错方法,而FCS是添加在数据后面的冗余码,在检错方法上可以选用CRC,但也可以不用CRC。

接收端的检验

若得出的余数R=0,则判定这个帧没有差错,就接受

若余数R!=0就判定这个帧有差错,就丢弃

注意

使用CRC差错检测技术只能做到无差错接受

“无差错接受”是指:“凡是接受的帧(即不包括被丢弃的帧),我们都能非常接近于1的概率认为这些帧在传输过程中没有产生差错”。

也就是说:凡是接收端数据链路层接受的帧都没有传输差错

要做到“可靠传输”(即发送什么就接受什么)就必须再加上确认和重传机制

“无比特差错“与”无传输差错“是不同的概念。

在数据链路层使用CRC检验,能够实现无比特差错的传输,但这不是可靠传输。

本章介绍的数据链路层协议都不是可靠传输的协议。

点对点协议PPP

PPP协议的特点

目前数据链路层使用的最广泛的协议是点对点协议

用户到ISP的链路使用PPP协议

53

PPP协议应该满足的需求

需求:

  • 简单——这是首要的要求。
  • 封装成帧——必须规定特殊的字符作为帧定界符。
  • 透明性——能够在同一条物理链路上同时支持多种网络协议。
  • 多种网络层协议——能够在同一条物理链路上同时支持多种网络层协议。
  • 多种类型链路——能够在多种类型的链路上运行。
  • 差错检测——能够对接收端收到的帧进行检测,并立即丢掉有差错的帧。
  • 检测连接状态——能够及时自动检测出链路是否处于正常工作状态。
  • 最大传送单元——必须对每一种类型的的点对点链路设置最大传送单元MTU的标准默认值,促进各种实现之间的互操性。
  • 网络层地址协商——必须提供一种机制使通信的两个网络层实体能通过协商指导或能够配置彼此的网络层地址。
  • 数据压缩协商——必须提供一种方法来协商使用数据压缩算法。

PPP协议不需要的功能

纠错。

流量控制

序号

多点线路

半双工或单工链路

PPP协议的组成

PPP协议有三个组成部分:

  • 一个将IP数据包封装到穿行链路的方法。
  • 链路控制层协议LCP。
  • 网络控制协议NCP。

PPP协议的帧格式

PPP帧的首部和尾部分别为4个字段和2个字段。

PPP是面向字节的,所有的PPP帧的长度都是整数字节。

54

解决透明传输问题:

  • PPP在同步传输链路时,协议规定采用硬件来完成比特填充
  • PPP异步传输时,采用特殊的字符填充

字符填充

字符填充:

  • 将信息字段中出现的每一个 0x7E 字节转变成为 2 字节序列 (0x7D, 0x5E)。
  • 若信息字段中出现一个 0x7D 的字节, 则将其转变成为 2 字节序列 (0x7D, 0x5D)。
  • 若信息字段中出现 ASCII 码的控制字符(即数值小于 0x20 的字符),则在该字符前面要加入一个 0x7D 字节,同时将该字符的编码加以改变

零比特填充

PPP协议在SONET/SDH链路时,使用同步传输。这时PPP协议采用__零比特填充__方法来实现透明传输

在发送端,只要发现5个连续1,则立即填入一个0.

接收端对帧中的比特流进行扫描。发现5个连续1,就把这5个连续1后的0删除。

PPP协议的工作状态

工作:

  • 当用户拨号接入 ISP 时,路由器的调制解调器对拨号做出确认,并建立一条物理连接。
  • PC 机向路由器发送一系列的 LCP 分组(封装成多个 PPP 帧)。
  • 这些分组及其响应选择一些 PPP 参数,并进行网络层配置,NCP 给新接入的 PC 机分配一个临时的 IP 地址,使 PC 机成为因特网上的一个主机。
  • 通信完毕时,NCP 释放网络层连接,收回原来分配出去的 IP 地址。接着,LCP 释放数据链路层连接。最后释放的是物理层的连接。
  • 可见,PPP 协议已不是纯粹的数据链路层的协议,它还包含了物理层和网络层的内容
  • 55

使用广播信道的数据链路层

局域网的数据链路层

局域网

局域网最主要的特点是:

  • 网络为一个单位所拥有。
  • 地理范围和站点数目均有限。

优点:

  • 具有广播功能,从一个站点可很方便地访问全网。局域网上的主机可共享连接在局域网上的各种硬件和软件资源。
  • 便于系统的扩展和逐渐地演变,各设备的位置可灵活调整和改变。
  • 提高了系统的可靠性、可用性和残存性。

56

媒体共享技术

静态划分信道:

  • 频分复用
  • 时分复用
  • 波分复用
  • 码分复用

动态媒体介入控制(多点接入):

  • 随机接入
  • 受控接入,如多点线路探寻,或轮询。

数据链路层的两个子层

两个子层:

  • 逻辑链路控制LLC子层
  • 媒体接入控制MAC子层

传输媒体有关放在MAC层,其余的LLC层。

不管采用何种协议的局域网,对LLC子层来说都是透明的

57

适配器的重要功能;

  • 进行穿行/并行转换。
  • 对数据进行缓存。
  • 在计算机的操作系统安装设备驱动程序。
  • 实现以太网协议。

58

CSMA/CD协议

在具有广播特性的总线上实现了一对一的通信。

以太网采取了两种重要的措施

以太网采用两种重要措施:

  • 采用较为零互动的无连接的工作方式
    • 不必先建立连接就可以直接发送数据。
    • 对发送的数据帧不进行编号,也不要求对方发回确认。
    • 这样做的理由是局域网信道的质量很好,因信道质量产生差错的概率时很小的
    • 以太网提供的服务是不可靠的交付,即尽最大努力的交付。
    • 差错的纠正由高层来决定
  • 以太网发送的数据都使用曼彻斯特编码。
    • 缺点:他所占的频带宽度比原始的基带信号增加了一倍。

CSMA/CD协议

含义:载波监听多点接入/碰撞检测。

多点接入表示许多计算机以多点接入的方式连接在一根总线上。

载波监听:是指每一个站在发送数据之前先要检测一下总线上是否有其他计算机在发送数据,如果有,则暂时不要发送数据,以免发生碰撞。

碰撞检测

碰撞检测”就是计算机边发送数据边检测信道上的信号电压大小。

在发生碰撞时,总线上传输的信号产生了严重的失真,无法从中恢复出有用的信息来。

每一个正在发送数据的站,一旦发现总线上出现了碰撞,就要立即停止发送,然后等待一段随机时间后再次发送。

59

CSMA/CD重要特特性

使用CSMA/CD协议的以太网不嫩恶搞进行全双工通信只能进行双工交替通信(半双工通信)

这种发送的不确定性使整个以太网的平均通信量远小于以太网的最高数据率。

争用期

最先发送数据帧的站,在发送数据帧后至多经过时间2Π(两倍的端到端的往返时延)就可指导发送的数据帧是否遭受了碰撞。

以太网的端到端往返时延2Π称为争用期,或碰撞窗口

经过争用期这段时间还没有检测到碰撞,才能肯定这次发送不会发生碰撞

二进制指数类型退避算法

发生碰撞的站在停止发送数据后,要推迟一个随机时间才能再发送数据。

  • 基本退避时间取为争用期2Π。
  • 从整数集合[0,1……,($2^k$-1)中随机取一个数,记为r。重传所需的时延就是r倍的基本退避时间。
  • 参数k按下面的公式计算:
    • k=Min[重传次数,10]
  • 当k<=10时,参数k等于重传次数。
  • 当重传达16次仍不能成功时即丢弃该帧,并向高层报告。

最短有效帧长

以太网规定了最短有效帧长时64字节,凡长度小于64字节的帧都是由于冲突而一场终止的无效帧

使用集线器的星型拓扑

采用双绞线的以太网采用星形拓扑,在星形的中心则增加了一种可靠性非常高的设备,叫做集线器 (hub)。

集线器的一些特点

(1) 集线器是使用电子器件来模拟实际电缆线的工作,因此整个系统仍然像一个传统的以太网那样运行。
(2) 使用集线器的以太网在逻辑上仍是一个总线网,各工作站使用的还是 CSMA/CD 协议,并共享逻辑上的总线。
(3) 集线器很像一个多接口的转发器,工作在物理层。
(4) 集线器采用了专门的芯片,进行自适应串音回波抵消,减少了近端串音。

以太网的信道利用率

设帧长为L(bit),数据发送速率为C(bit/s),则帧的发送时间为$T_0$=L/C(s)。

以太网信道被占用的情况

一个站在发送帧时出现了碰撞。经过一个争用期 2Π 后,可能又出现了碰撞。这样经过若干个争用期后,一个站发送成功了。假定发送帧需要的时间是 $T_0$。

60

成功发送一个帧需要占用信道的时间时$T_0$+Π,比发送时间多一个单程端到端时延Π。这是因为当一个站发送完最后一个比特时,这个比特还要再以太网上传播。

参数a与利用率

要提高以太网的信道利用率,就必须减小Π与$T_0$,之比。

a是以太网单程端到端时延Π与帧的发送时间$T_0$之比:

a=Π/$T_0$

对以太网参数a的要求

对以太网参数a的要求是:

  • 当数据率一定时,以太网的连线的长度受到限制,否则Π的数值会太大。
  • 以太网的帧长不能太短,否则$T_0$的值会太小,使a值太大。

信道利用率的最大值$S_{max}$

发送一帧占用线路的时间是$T_0+Π$,而帧的发送时间是$T_0$。于是我们可以计算出理想情况下的极限信道利用率:

61

以太网的MAC层

MAC层的硬件地址

在局域网中,硬件地址又称物理地址,或MAC地址

62

MAC帧的格式

常用的MAC帧格式有两种标准:

  • DIX Ethernet V2 标准
  • IEEE 的 802.3 标准

常用的MAC帧是以太网V2的格式

63

无效的MAC帧

数据字段的长度与长度字段的值不一致;
帧的长度不是整数个字节;
用收到的帧检验序列 FCS 查出有差错;
数据字段的长度不在 46 ~ 1500 字节之间。
有效的 MAC 帧长度为 64 ~ 1518 字节之间。

扩展的以太网

在物理层扩展以太网

使用光纤扩展

64

使用集线器扩展

使用多个集线器可连成更大的、多级星形结构的以太网。

65

优点:

  • 使原来属于不同的碰撞域的以太网上的计算机能够进行跨碰撞域通信。
  • 扩大了以太网覆盖的地理范围。

缺点:

  • 碰撞域增大了,但总体吞吐量并未提高。
  • 如果不同 的碰撞域使用不同的数据率,那么就不能用集线器将他们互连起来。

在数据链路层扩展以太网

早期使用网桥,现在使用以太网交换机

网桥:

  • 网桥工作在数据链路层
  • 他根据MAC帧的目的地址对接收到的帧进行转发和过滤。
  • 当网桥收到一个帧时,并不是向所有的接口转发此帧,而是先检查此帧的目的 MAC 地址,然后再确定将该帧转发到哪一个接口,或把它丢弃。

交换机:

  • 交换式集线器常称为交换机或第二层交换机,强调他工作在数据链路层。

以太网交换机的特点

以太网交换机实质上就是一个多接口的网桥。通常由十几个甚至更多的接口。

一般都工作在全双工方式

以太网交换机具有并行性。能同时联通多对接口使多对主机能同时通信。

相互通信的主机都是独占传输媒体,无碰撞地传输数据。

交换机的接口有储存器,能进行帧缓存。

以太网交换机是一种即插即用设备,其内部的帧交换表(又称为地址表)是通过自学习算法自动地逐渐建立起来的。

优点:

  • 用户独享带宽,增加了总容量。
    • 普通10Mbit/s共享以太网,若有N个用户,则每个用户为10/N(Mbit/s)。
    • 以太网交换机,每个接口还是10Mbit/s,所以拥有N个接口的以太网交换机总容量为NX10Mbit/s。
  • 从共享总线以太网转换到交换式以太网时,所有的接入设备的软件、硬件和适配器等不需要做改动。
  • 以太网交换机一般都具有多种速率的接口。
以太网交换机的交换方式

交换方式:

  • 储存转发。先把整个数据帧缓存然后再进行处理。
  • 直通方式
    • 接收数据帧的同时就立即按数据帧的目的mac地址决定该帧的转发接口,提高帧的转发速度。
    • 缺点是没有检查差错就转发,有可能转发一些无效帧给其他站。
以太网交换机的自学习能力

以太网交换机运行自学习算法自动维护交换表。

归纳:

  • 交换机收到一帧后先进行自学习。查找交换表中收到帧的源地址有无相匹配的项目。
    • 如果没有,就在交换表中增加一个项目(源地址,进入的接口和有效时间)。
    • 如果有,则把原有的项目进行更新(接入的接口或有效时间)。
  • 转发帧。查找交换表中与收到帧的目的地址有无相匹配的项目
    • 如果没有,则向所有其他接口(接入的接口除外)转发。
    • 如果有,则按交换表中给出的接口进行转发。
    • 若交换表中给出的接口就是该帧进入交换机的接口,则应丢弃这个帧(因为这时不需要经过交换机进行转发)

66

交换机使用了生成树协议:

  • 要点:不改变网络的实际拓扑,但在逻辑上则切断某些链路,使得从一台主机到所有其他主机的路径是无环路的树状结构,从而消除了兜圈子现象。
从总线以太网到星形以太网

以前的总线以太网是半双工工作方式。

现在的星形以太网是全双工方式工作。

虚拟局域网

虚拟局域网VLAN。

虚拟局域网歧视只是局域网给用户提供的一种服务,并不是一种新型局域网。

虚拟局域网使用的以太网帧格式

虚拟局域网协议允许再以太网的帧格式中插入一个4字节的标识符,称为VLAN标记(tag),用来指明发送该帧的计算机属于哪个虚拟局域网。

67

高速的以太网

100BASE-T 以太网

速率达到或者超过100Mbit/s的以太网称为高速以太网。

100BASE-T以太网又被称为快速以太网

100BASE-T以太网的特点

可在全双工方式下工作而无冲突发生。在全双工工作方式下工作时,不适用CSMA/CD协议

MAC帧格式仍然是802.3标准规定的。

保持最短帧长不变,但将一个网段的最大电缆长度减少到100m。

100Mbit/s以太网的三种不同的物理层标准

68

吉比特以太网

概念

允许在1Gbit/s下以全双工和半双工两种方式工作。

半双工使用CSMA/CD协议,全双工方式不适用CSMA/CD协议。

吉比特以太网可用作现有网络的主干网,也可在高带宽(高速率)的应用场合中。

吉比特以太网的物理层

69

半双工方式工作的吉比特以太网

吉比特以太网工作在半双工方式时,必须进行碰撞检测。

吉比特以太网增加了两个功能:

  • 载波延伸
    • 最短帧长为64字节,争用时间增大为512字节。
    • 70
  • 分组突发
    • 很多短帧要发送时,第一个短帧采用载波延伸填充,随后的一些就一个接一个发送。这样就形成了一串分组的突发,直到1500字节或稍多一些为止。

10吉比特以太网(10GE)和更快的以太网

10吉比特以太网(10GE)并非把吉比特以太网的速率简单的提高到10倍,其特点为:

  • 与10、100、1Gbit/s以太网的帧格式完全相同。
  • 保留了802.3标准规定的以太网最小和最大帧长,便于升级。
  • 不再使用铜线而只使用光纤作为传输媒体。
  • 只工作再全双工方式,因此没有争用问题,也不使用CSMA/CD协议。

10吉比特以太网的物理层

71

更快的以太网

10GE之后又定制了40GE/100GE的标准。

40GE/100GE只工作再全双工传输方式,不适用CSMA/CD协议。

100GE在使用单模光纤传输时,仍然可以达到40KM的传输距离,但这使需要波分复用(4个波长复用一根光纤,没根速率使25Gbit/s)。

端到端的以太网传输

以太网实现了端到端的以太网传输

这种工作方式的好处有:

  • 技术成熟。
  • 互操作性很好。
  • 在广域网中使用以太网时价格很便宜。
  • 采用统一的帧格式,简化了操作和管理。

以太网从10Mbit/s到100Gbit/s的演进

使用以太网进行宽带接入

以太网宽带接入具有一下特点:

  • 可以提供双向的宽带通信。
  • 可以根据用户对带宽的需求灵活的进行带宽升级
  • 可以实现端到端的以太网传输,中间不需要进行帧的格式的转换。提高了效率降低了成本。
  • 但是不支持用户身份鉴别

PPPoE

PPPoE意思是“在以太网上运行PPP”。

第四章 网络层

网络层提供的两种服务

一种让网络负责可靠交付

让网络负责可靠交付,计算机网络应模仿电信网络,使用面向连接的通信方式。

通信之前先建立虚电路,以保证双方通信所需的一切网络资源。

虚电路是一条(逻辑上的连接),分组都沿着这条逻辑连接按照存储转发方式传送,而这并不是真正建立了一条物理连接。

注意,电路交换的电话通信是建立了一条真正的连接

另一种观点网络提供数据包服务

网络层向上提供简单灵活的、无连接的、尽最大努力交付的数据报服务

网络在发送分组时,不需要先建立连接。

网络层不提供服务质量的承诺

72

网际协议IP

网际协议IP是TCP/IP体系中两个重要协议之一。

与IP协议配套使用的还有三个协议:

  • 地址解析协议ARP
  • 网际控制报文协议ICMP
  • 网际组管理协议IGMP

73

虚拟互联网络

将网络互连并能够互相通信,会遇到许多问题需要解决。

如何将异构网络互相连接起来:

  • 使用一些中间设备进行互连。
    • 中间设备又被称为中间系统中继系统
    • 有一下五种不同的中间设备
      • 物理层中级系统:转发器
      • 数据链路层中继系统:网桥或桥接器
      • 网络层中继系统:路由器
      • 网桥和路由器混合物:桥路器
      • 网络层以上的中继系统:网关

分类的IP地址

在TCP/IP中,IP地址是一个最基本的概念。

IP地址及其表示方法

IP 地址就是给每个连接在互联网上的主机(或路由器)分配一个在全世界范围是唯一的 32 位的标识符

IP地址现在由互联网名字和数字分配机构ICANN进行分配。

IP地址编制方法

方法:

  • 分类IP地址
  • 子网划分
  • 构成超网
分类IP

将IP地址分为若干个固定类。一个IP地址在整个互联网范围是唯一的。

两级IP地址结构为:网络号+主机号

各类IP地址的网络号字段和主机号字段

74

机器中存放的IP地址是32位二进制代码组成,每8位为一组。

常用的三种类别的ip地址

75

一般不使用的特殊的IP地址

76

IP地址的一些重要特点

(1)IP地址是一种分等级的地址结构。

(2)实际上IP地址是标志一个主机(或路由器)和一条链路的接口。

(3)用转发器或网桥连接起来的若干个局域网仍为一个网络,这些局域网都具有同样的网络号net-id。

(4)所有分配到网络号 net-id 的网络,无论是范围很小的局域网,还是可能覆盖很大地理范围的广域网,都是平等的。

IP地址与硬件地址

IP地址与硬件地址不同。

层次角度:

  • 硬件地址(物理地址)是数据链路层使用的地址。
  • IP地址是网络层和以上各层使用的地址,是一种逻辑地址。

77

路由器只根据目的站的IP地址的网络号进行路由选择。

在具体的物理网络层只能看见MAC帧看不见IP数据报。

IP层屏蔽了下层很复杂的细节。直接研究主机和主机或主机和路由器之间的通信。

地址解析协议ARP

通信时使用了两个地址:

  • IP地址(网络层)
  • MAC地址(数据链路层)

ARP协议就是用来找到对应的MAC地址。

每个主机都设有一个ARP高速缓存里面有所在的局域网上的个主机和路由器的IP地址到硬件地址的映射表。

ARP高速缓存的作用:存放最近获得的IP地址到MAC地址的绑定以减少ARP广播的数量

ARP是解决同一局域网上的主机或路由器的IP地址和硬件地址的映射问题。如果不在同一局域网,那么就要找到一个位于本局域网上的硬件地址,然后分组发送给这个路由器,让这个路由器分组转发给下一个网络

IP数据报的格式

一个IP数据报由首部数据两部分组成。首部的前一部分是固定长度,共20字节,是所有IP数据报必须具有的。

78

IP层转发分组流程

查找路由表

根据目的网络地址就能确定下一跳路由器,这样结果:

  • IP数据报最终一定可以找到目的主机所在路由器(经过多次间接交付)。
  • 只有到达最后一个路由器时,才试图向目的主机直接交付。

路由表

路由表指出,到某个网络应当先到某个路由器(即下一跳路由器)。在到达吓一跳路由器后,再记录查找其他路由知道再下一步应该到哪一个路由器。

划分子网和构造超网

划分子网

从两级IP地址到三级IP地址

1985年起在IP地址中增加了一个“子网号字段”,使两级的IP地址变成为三级的IP地址这种做法叫划分子网

划分子网的基本思路

79

然后根据IP数据报的目的网络号,先找到网络上的路由器,然后此路由器收到后,再按目的网络号和子网号找到目的子网。

子网掩码

使用子网掩码可以找出IP地址中的子网部分。

规则:

  • 子网掩码长度=32位
  • 某位=1:IP地址中的对应位为网络号和子网号
  • 某位=0:IP地址中的对应位为主机号

80

81

82

子网划分方法

有固定长度子网和变长子网两种子网划分方法。

划分子网增加了灵活性,却减少了能连接再网络上主机总数。

使用子网时分组的转发

在划分子网情况下,从IP地址却不能唯一得出网络地址来,这是因为网络地址取决于那个网络所采用的子网掩码,但数据报的首部并没有提供子网掩码的信息

在划分子网情况下路由器转发分组的算法

(1) 从收到的分组的首部提取目的 IP 地址 D。

(2) 先用各网络的子网掩码和 D 逐位相“与”,看是否和相应的网
络地址匹配。若匹配,则将分组直接交付。否则就是间接交付,
执行 (3)。

(3)重复(1)(2)如果找不到就报告转发分组出错。

无分类编制CIDR(构造超网)

CIDR特点:

  • 消除了ABC类地址以及划分子网的概念,因而可以更加有效地分配IPv4地址空间。
  • CIDR使用各种长度地网络前缀来代替分类地址中地网络号和子网号。

CIDR使用斜线记法又称为CIDR记法,在IP地址后加上一个斜线“/”,然后写上网络前缀所占位数。如220.78.168.0/24

CIDR地址块

CIDR把网络前缀想追相同的连续IP地址组成CIDR地址块

128.14.32.0/20 表示的地址块共有 212 个地址(因为斜线后面的 20 是网络前缀的位数,所以这个地址的主机号是 12 位)。

  • 这个地址块的起始地址是128.14.32.0。
  • 在不需要指出地址块的起始地址时,也可将这样的地址块简称为“/20 地址块”。
  • 128.14.32.0/20 地址块的最小地址:128.14.32.0
  • 128.14.32.0/20 地址块的最大地址:128.14.47.255
  • 全 0 和全 1 的主机号地址一般不使用。

83

路由聚合

一个CIDR地址块可以代表很多地址,这种地址的聚合常称为路由聚合。

路由聚合也成为构成超网

CIDE虽然不适用子网,但使用掩码这一词(不叫子网掩码)。

常用CIDR地址块

84

构成超网

前缀地址不超过23位的CIDR地址块包含了多个C类地址,这些C类地址合起来就构成了超网。CIDR地址数一定是2的整数次幂。

最长前缀匹配

使用CIDR时,路由表由网络前缀下一跳地址组成。在查找路由表时可能会得到不止一个匹配结果。

应当从匹配结果中选择具有最长网络前缀的路由:最长前缀匹配。又称为最长匹配或最佳匹配

85

86

选第二个因为他的相同位数比较长。

使用二叉线索查找路由表

类似于二叉树,略……

网际控制报文协议ICMP

ICMP报文的种类

ICMP时互联网的标准协议。但ICMP不是高层协议,他是IP层的协议。

87

分为ICMP差错报文和ICMP询问报文。

ICMP差错报告报文有四种

  • 重点不可达
  • 时间超时
  • 参数问题
  • 改变路由(重定向)

ICMP询问报文有两种:

  • 回送请求和回答报文。
  • 时间戳请求和回答报文。

88

ICMP的应用举例

ping两个主机之间的连通性。

Tracetoute用来追踪一个分组从源头到终点的路径。

互联网的路由选择协议

有关路由选择协议的几个基本概念

理想算法

最佳路由

分层次的路由选择协议

互联网采用分层次的路由选择协议。

自治系统

互联网两大类路由选择协议:

  • 内部网关系IGP(在一个自治系统内部)
    • 如RIP,OSPF等
  • 外部网关协议EGP(源站和目的站处在不同的自治系统)
    • 在外部网关协议中目前使用最多的时BGP-4
  • 89

内部网关协议RIP

工作原理

RIP协议时一种分布式的、基于距离向量的路由选择协议,它要求网络中的每一个路由器都要维护从他自己到其他每一个网络的距离记录。

“距离”的定义

从一个路由器直接连接的网络的距离定义为1,距离也称为跳数。

RIP认为一个好的路由就是它通过的路由数目少即距离短。

RIP允许一条路径最多只能包含15个路由器,距离的最大值为16时即相当于不可达

RIP不能在两个网络之间同时使用多条路由。

RIP协议的三个特点

1、仅和相邻路由器交换信息。

2、交换信息时当前路由器所知道的全部信息,即自己的路由表

3、按固定的时间间隔交换路由信息。

路由表的建立

距离向量算法

路由器收到相邻路由器(其地址为 X)的一个 RIP 报文:
(1) 先修改此 RIP 报文中的所有项目:把“下一跳”字段中的地址都改为 X,并把所有的“距离”字段的值加 1。
(2) 对修改后的 RIP 报文中的每一个项目,重复以下步骤:
若项目中的目的网络不在路由表中,则把该项目加到路由表中。
否则
若下一跳字段给出的路由器地址是同样的,则把收到的项目替换原路由表中的项目。
否则
若收到项目中的距离小于路由表中的距离,则进行更新,
否则,什么也不做。
(3) 若 3 分钟还没有收到相邻路由器的更新路由表,则把此相邻路由器记为不可达路由器,即将距离置为 16(表示不可达)。
(4) 返回。

例↓

90

91

先将路由器发来的路由表中的距离+1,然后生成新的表,用新的表去和目前路由器的表进行比较。如果目前路由器表中没有就添加;如果表中有,且下一条的路由器是发送信息来的路由器,就更新;如果表中有,且下一条的路由器不是发送信息来的路由器,就需要比较距离,取较短距离的;最后更新表

RIP2协议的报文格式

92

RIP协议的特点:好消息传播的快,坏消息传播的慢。

内部网关协议OSPF

OSPF协议的基本特点

开放:公开发表。

最短路径优先:使用Dijkstra提出的SPF算法。

采用分布式链路状态协议。

OSPF的区域

OSPF将一个自治系统再划分为若干个更小的范围,叫做区域。

区域不能太大,在一个区域内的路由器最好不要超过200个。

OSPF直接用IP数据报发送

OSPF不用UDP而是用IP数据报传送。

93

OSPF的五种分组类型

类型一,问候分组。

类型二,数据库描述分组。

类型三,链路状态请求分组。

类型四,链路状态更新分组,用洪泛法对全网更新链路状态。

类型五,链路状态确认分组。

94

外部网关协议BGP

BGP是不同自治系统的路由器之间交换信息的协议。

BGP发言人

每一个自治系统的管理员至少选择一个路由作为该自治系统的“BGP发言人”

BGP交换路由信息

一个BGP发言人要和其他系统中的发言人交换路由信息,就要建立TCP连接。

BGP协议的特点

BGP协议交换路由信息的结点数量级是自治系统数的量级,这要比自治系统内部网络数少很多。

每个自治系统中的BGP发言人(或边界路由器)数目很少。

BGP支持CIDR,BGP刚运行时,BGP的临站是交换整个BGP路由表,但以后只需要在发生变化时更新有变化的部分。

BGP-4共使用四种报文

1、打开。

2、更新。

3、保活。

4、通知。

95

路由器构成

路由器是一种典型的网络层设备。

路由器主要作用:

  • 联通不同的网络。
  • 选择信息传送的线路。

路由器的结构

路由器可以分为两大部分:

  • 路由选择部分
    • 也叫控制部分,核心构件是路由选择处理机。
    • 路由选择处理机的任务是根据所选定的路由选择协议构造出路由表,同时经常或定期地和相邻路由器交换路由信息而不断地更新和维护路由表。
  • 分组转发部分
    • 交换结构
    • 一组输入端口
    • 一组输出端口

交换结构

交换方法有三种:

  • 通过储存器
  • 通过总线
  • 通过纵横交换结构

IPv6

IPv6的基本首部

ipv6扔支持无连接的传送,但将协议数据单元PDU称为分组。

主要变化:

  • 更大的地址空间,ipv6将地址从ipv4的32位增大到128位。
  • 扩展的地址层次结构。
  • 灵活的首部格式。
  • 改进的选项。
  • 允许协议继续扩充。
  • 支持即插即用。(自动配置)
  • 支持资源的预分配。
  • ipv6首部改为8字节对齐。

ipv6数据报的一般形式

ipv6数据报由两大部分组成:

  • 基本首部

    • 首部长度位固定的40字节
    • ipv6首部的字段数减少到只有8个。
  • 有效载荷(净载荷)。有效载荷允许有零个或多个扩展首部,在后面是数据部分。

IPv6的地址

ipv6数据包的目的地址可以是以下三种基本类型地址之一:

  • 单播:传统的点对点通信。
  • 多播:一点对多点的通信。
  • 任播:任播的目的站是一组计算机,但数据报在交付时只交付其中一个,通常是距离最近的一个。

结点与接口

ipv6将实现ipv6的主机和路由器均称为结点

ipv6地址是分配给节点上面的接口的。

  • 一个接口可以有多个单播地址。
  • 其中的任何一个地址都可以当作到达该结点的目的地址。

冒号十六进制记法

ipv6使用冒号十六进制记法。

96

ipv6地址分类

未指明地址:

  • 这是16字节的全0地址,可缩写为两个冒号“::”。
  • 这个地址只能为还没有配置到一个标准IP地址的主机当作源地址使用。
  • 这类地址仅此一个。

环回地址:

  • 即0:0:0:0:0:0:0:1(记为::1)。
  • 作用和IPV4的环回地址一样。
  • 这类地址也是仅此一个。

多播地址:

  • 功能和IPV4的一样。
  • 这类地址站IPv6地址总数的1/256.

本地链路单播地址:

  • 有些单位的网络使用TCP/IP协议,但没有连接到互联网。只能进行内部通信,不能和互联网上的主机通信。
  • 这类地址占IPv6地址总数的1/1024。

全球单播地址:

  • IPv6这类单播地址是使用的最多的一类。

从IPv4向IPv6过度

两种向IPv6过度策略:

  • 使用双协议栈
    • 装有两个协议栈,一个IPv4,一个IPv6.
    • 双协议栈的主机记为IPv4/IPv6,表明他同时具有两种IP地址:一个4和一个6.
  • 使用隧道技术
    • IPv6数据报进入IPv4网络时,把IPv6数据报封装成为IPv4数据报的数据部分。
    • 当 IPv4 数据报离开 IPv4 网络中的隧道时,再把数据部分(即原来的 IPv6 数据报)交给主机的 IPv6 协议栈。

ICMPv6

IPv6也不能保证数据报的可靠交付,因为路由器可能会丢弃数据报。因此IPv6也需要使用ICMP来反馈一些差错信息。

97

ICMPv6报文的分类

IPv6报文:差错报文,信息报文,邻站发现报文,组成员关系报文。

IP多播

IP多播的基本概念

目的:更好的支持一对多通信。

一对多通信:一个源点发送到许多个终点。

在互联网上进行多播就叫IP多播

IP多播所传送的分组需要使用多播IP地址。

多播组的标识符就是IP地址中的D类地址(多播地址)。

多播地址只能用于目的地址,不能用于源地址。

多播数据报

多播数据报使用D类IP地址,并且不产生ICMP差错报文。

在局域网上进行硬件多播

TCP/IP协议使用的以太网多播地址块范围是从00-00-5E-00-00-0000-00-5E-FF-FF-FF

由于多播IP地址与以太网硬件地址的映射关系不是唯一的,因此还要在IP层利用软件进行过滤,把不是本主机要接收的数据报丢弃。

网际组管理协议IGMP和多播路由选择协议

IP多播需要两种协议:

  • 网际组管理协议IGMP。
  • 多播路由选择协议。

IGMP的使用范围

IGMP协议是让连接在本地局域网上的多播路由器知道本局域网上是否有主机(严格讲,是主机上某个进程)参加或退出了某个多播组。

多播路由选择协议更复杂

多播路由选择协议更复杂。多播转发必须动态的适应多播组成员变化。

网际组管理协议IGMP

IGMP工作可以分为两阶段:

  • 第一阶段:加入多播组。
  • 第二阶段:探寻组成员变化情况。

虚拟专用网VPN和网络地址转换NAT

虚拟专用网VPN

RFC1918指明了一些专用地址。专用地址只能用作本地地址而不能用作全球地址。在互联网中的所有路由器,对目的地址是专用地址的数据报一律不进行转发。

三个转月IP地址块↓

98

本地的IP地址叫做专用网。

利用公用的互联网作为本机构各专用网之间的通信载体,这样的专用网又称为虚拟专用网

内联网intranet和外联网extranet

他们都是基于TCP/IP协议的。

由部门A和B的内部网络构成的虚拟专用VPN又称为内联网,表示部门A和B都是在同一机构的内部

一个机构和某些外部机构共同建立的虚拟专用网VPN又称为外联网

99

远程接入VPN

远程接入VPN可以满足外部流动员工访问公司网络的需求。

网络地址转换NAT

问题:在专用网上使用专用地址的主机如何与互联网的上主机通信(并不需要加密)。

解决:

  • 再申请全球IP(不可能)。
  • 采用网络地址转换NAT。(使用最多的方法)

NAT需要再专用网连接到互联网的路由器上安装NAT软件,装有NAT软件的路由器叫做NAT路由器,他至少由一个有效的外部全球IP地址。

所有使用本地地址的主机在和外界通信时,都要再NAT路由器上将其本地地址转换成全球IP地址才能和互联网连接。

网络地址转换的过程

内部主机A用本地地址$IP_A$和互联网上主机B通信所发送的数据报必须经过NAT路由器。

NAT路由器将数据报的源地址$IP_A$转换成全球地址$IP_G$,并把转换结果记录到NAT地址转换表中,目的地址$IP_B$,保持不变,然后发送到互联网。

NAT路由器收到主机B发回的数据报时,知道数据报中的源地址是$IP_B$而目的地址是$IP_G$。

根据NAT转换表,NAT路由器将**目的地址$IP_G$转换为$IP_A$,转发给追钟的内部主机A。

发生了两次地址转换:

  • 离开专用网时:替换源地址,将内部地址替换为全球地址;
  • 进入专用网络时:替换目的地址,将全球地址替换为内部地址;

多协议标记交换MPLS

MPLS的工作原理

“多协议”表示再MPLS的上层可以采用多种协议;可以使用多种数据链路层协议

标记是指每个分组被打上一个标记,根据该标记对分组进行转发。

MPLS特点

MPLS并没有取代IP,而是作为一种IP增强技术,被广泛的应用再互联网中。

MPLS具有以下三个方面的特点:

  • 支持面向连接的服务质量;
  • 支持流量工程,平衡网络负载;
  • 有效的支持虚拟专用网VPN。

基本工作过程

IP分组转发。

转发等价类FEC。

MPLS首部的位置与格式

100

SpringBoot2.4+Nacos2.0以上注册Nacos配置中心

版本说明

https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E
github上查看对应版本
img
我们选择最新的2021.0.4.0
如果不清楚springcloudalibaba的版本可以从下面网址中搜索
https://developer.aliyun.com/mvn/search找到想要的对应版本
img

添加依赖

只写了部分重要依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<!--服务注册发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--nacos config配置-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<exclusions>
<exclusion>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--springcloudalibaba-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2021.0.4.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

配置yml文件

springboot2.4之后推荐使用import方式注入配置只需要在application.yml文件里开启就行
官方文档(springboot2.4以上)https://github.com/alibaba/spring-cloud-alibaba/tree/2021.x/spring-cloud-alibaba-examples/nacos-example/nacos-config-2.4.x-example
img

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
spring:
datasource:
username: root
password: root
url: jdbc:mysql://192.168.127.129:3307/sms?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
driver-class-name: com.mysql.cj.jdbc.Driver
cloud:
nacos:
discovery:
server-addr: 192.168.127.129:8848
config:
server-addr: 192.168.127.129:8848
application:
name: shop-coupon
config:
import:
- optional:nacos:shop-coupon.properties
mybatis-plus:
mapper-locations: classpath*:/mapper/**/*.xml
#自增
global-config:
db-config:
id-type: auto
server:
port: 7000

在nacos添加配置文件

添加配置文件的dataid要和- optional:nacos:后的名字一致
img

验证

写个controller验证一下

1
2
3
4
5
6
7
8
@Value("${default.password}")
private String password;


@RequestMapping("/test")
public R test(){
return R.ok().put("password", password);
}

img

注意

Nacos2.0版本相比1.X新增了gRPC的通信方式,因此需要增加2个端口。新增端口是在配置的主端口(server.port)基础上,进行一定偏移量自动生成端口 与主端口的偏移量

1
docker run --env MODE=standalone --name nacos -d -p 8848:8848 -p 9848:9848 nacos/nacos-server

ubuntu手动安装rabbitmq

ubuntu:16
erlang:25
rabbitmq:3.10.7

erlang安装

准备可能需要的库

1
apt install gcc libncurses5-dev g++ unixodbc-dev freeglut3-dev libssl-dev libwxgtk3.0-dev make

查看erlang和rabbitmq对应的版本信息

https://www.rabbitmq.com/which-erlang.html
img

下载erlang的tar

https://github.com/erlang/otp/releases
img

安装erlang

解压

1
tar -zxvf otp_src_25.0.tar.gz

进入解压后的文件

1
cd otp_src_25.0

创建想要安装的目录

1
mkdir /app/erlang_22.5

使用configure

1
./configure --prefix=/app/erlang_22.5 --with-ssl --enable-threads --enable-smp-support --enable-kernel-poll --enable-hipe --without-javac

可能会出现缺少部分库的情况
img
缺少openssl

1
apt-get install libssl-dev

img
缺少curses

1
apt-get install libncurses5 libncurses5-dev

最后成功会出现
img
编译

1
make

安装

1
make install

进入安装的文件夹下(新建的app那个下面)查看是否成功

1
cd /app/erlang_22.5/bin/erl

出现下图则成功
img
设置软链

1
ln -s /app/erlang_22.5/bin/erl /usr/bin/erl

img

安装rabbitmq

找自己想要的版本
https://github.com/rabbitmq/rabbitmq-server/releases
img
解压

1
tar -xvf rabbitmq-server-generic-unix-3.10.7.tar.xz -C /app

进入app文件夹启动

1
/app/rabbitmq_server-3.10.7/sbin/rabbitmq-serve

img
成功
安装web界面管理

1
/app/rabbitmq_server-3.10.7/sbin/rabbitmq-plugins enable rabbitmq_management 

添加用户

1
/app/rabbitmq_server-3.10.7/sbin/rabbitmqctl add_user  admin 123456

授权
应该是在关闭rabiitmq下进行

1
/app/rabbitmq_server-3.10.7/sbin/rabbitmqctl set_user_tags admin administrator

访问页面输入刚才设置的用户名admin和密码123456
虚拟机ip:15672
img

docker实现mysql主从复制

主db端口3307
从db端口3308

主mysql设置

1、启动mysql

1
2
3
4
5
6
docker run -p 3307:3306 --name mysql-master 
-v /mydata/mysql-master/log:/var/log/mysql
-v /mydata/mysql-master/data:/var/lib/mysql
-v /mydata/mysql-master/conf:/etc/mysql
-e MYSQL_ROOT_PASSWORD=root
-d mysql:5.7

2、进入/mydata/mysql-master/conf目录下新建my.cnf

my.conf文件内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=101
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能
log-bin=mall-mysql-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062

3、重启mysql,进入mysql进行配置

1
docker restart mysql-master

进入mysql进行配置

1
2
docker exec -it mysql-master /bin/bash
mysql -uroot -proot

创建从数据库用户\

1
2
REATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';

从数据库配置

1、启动mysql

1
2
3
4
5
6
docker run -p 3308:3306 --name mysql-slave 
-v /mydata/mysql-slave/log:/var/log/mysql
-v /mydata/mysql-slave/data:/var/lib/mysql
-v /mydata/mysql-slave/conf:/etc/mysql
-e MYSQL_ROOT_PASSWORD=root
-d mysql:5.7

2、进入/mydata/mysql-slave/conf目录下新建my.cnf

my.conf文件内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=102
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用
log-bin=mall-mysql-slave1-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
## relay_log配置中继日志
relay_log=mall-mysql-relay-bin
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
## slave设置为只读(具有super权限的用户除外)
read_only=1

3、重启mysql,进入mysql进行配置

1
2
3
4
5
docker restart mysql-slave
docker exec -it mysql-slave /bin/bash
mysql -uroot -proot
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';

在从数据库中配置主从复制

查看pos从哪开始

在master数据库查看position,获取到pos

1
show master status;

img
查看本机ip(master的ip)

1
ifconfig

img
回到slave数据库

在slave配置主从复制

1
change master to master_host=' 192.168.127.129', master_user='slave', master_password='123456', master_port=3307, master_log_file='mall-mysql-bin.000001', master_log_pos=154, master_connect_retry=30;

master_host(刚才查看的宿主机ip);master_log_pos(刚才在master数据库查看的pos)

在slave查看主从同步状态

1
show slave status \G;

img
此时连接状态为no
开启slave,查看主从同步状态.

1
2
start slave;
show slave status \G;

img
此时连接为yes,即同步成功

4、建表查看

master建表,slave查看
img
img
成功