操作系统

主要是学习掌握:进程管理与内存管理这两部分;关于IO管理只需了解即可

CH1 操作系统概述

操作系统的概念

image-20240329101703565

image-20240329102306616

image-20240329102505147

操作系统向上层提供的简易服务:

  • 图像化用户接口
  • 命令接口
    • 联机命令接口:类似于CMD,交互的方式,用户输入一个命令,操作系统执行对应的操作
    • 脱机命令接口:批处理命令接口,比如Windows下执行.bat脚本或者Linux下执行.sh脚本
  • 程序接口:在程序中通过系统调用来使用程序接口,执行相关的功能
    • 比如执行print函数,将内容输出时,内部就进行了系统调用

image-20240329103245727

操作系统的基本特征

并发

image-20240329103933052

共享

image-20240329104338488

在一定程度上并发和共享是相互存在的前提条件

异步

image-20240329110214579

虚拟

image-20240329105335225

image-20240329105528794

操作系统的运行机制

image-20240329110743123

image-20240329112117138

核心:内核态与用户态之间的切换

CPU如何实现内核态和用户态之间的切换?

image-20240330160907592

image-20240330161220818

中断和异常

中断的作用

image-20240330161359620

中断是让操作系统内核夺回CPU使用权的唯一途径

image-20240330161703444

发生中断,CPU会暂停当前程序的执行,转而执行对应的中断处理程序

中断的类型

image-20240330162024172

内中断的例子

image-20240330162407138

image-20240330162754820

外中断的例子

image-20240330163648701

image-20240330163940308

中断机制的原理

image-20240330172636154

中断总结

image-20240330172822246

系统调用

image-20240331092830406

什么是系统调用

image-20240331093109959

系统调用与库函数的区别

image-20240331093401427

什么功能需要系统调用?

image-20240331093820510

系统调用的过程

image-20240331094313271

操作系统的体系结构

计算机系统的层次结构

image-20240331095203052

一般可以分为大内核和微内核这两种体系结构

image-20240331100203297

image-20240331100343140

操作系统的引导

image-20240331100544668

image-20240331102542575

虚拟机

image-20240331104423948

CH2 进程管理

进程的概述

要理解以下几个问题:

  • 进程的概念:理解进程与程序的区别
  • 进程的组成:一个进程由哪些部分组成
  • 进程的特征:进程有哪些重要的特征

进程的概念

程序:是静态的,是存放在磁盘里的可执行文件,就是一系列的指令集合

进程:是动态的,是程序的一次执行过程

同一个程序多次运行会对应多个进程

Q:操作系统作为这些进程的管理者,他是如何区分各个进程?

进程的组成

PCB:进程控制块

image-20240331184210902

image-20240331184306253

程序段、数据段

image-20240331184625343

                                 <img src="操作系统/image-20240331184952014.png" alt="image-20240331184952014" style="zoom:33%;" />

进程的特征

image-20240331185302328

进程的状态与转换

进程的状态以及状态之间的转换

image-20240331185532434

image-20240331190255612

image-20240331190659103

操作系统如何将各个进程的PCB组织起来?

进程的组织方式一:链接方式

链表的形式存放不同状态的进程

image-20240331190854657

进程的组织方式二:索引方式

image-20240331191108337

进程组织方式总结

image-20240331191136504

进程控制

image-20240331191531974

image-20240331191713944

如何实现进程的控制

原语:

1
原语是操作系统内核中的一直特殊程序,它的执行具有原子性,也就是这段程序的运行必须是一气呵成,不可中断

为什么进程控制需要用原语来实现(或者为什么这个过程需要一气呵成、不可中断?)

image-20240331192400695

操作系统是如何实现原语的原子性?

背景:

1
正常情况下:CPU每执行完一条指令都会例行检查是否有中断信号需要处理,如果有,则暂停运行当前程序,转而去执行相应的中断处理程序

操作系统利用开中断和关中断指令去保证原语的原子性

image-20240331193415950

进程控制相关的原语

进程创建(创建原语)

image-20240331193717795

进程的终止(撤销原语)

image-20240331194410242

阻塞原语和唤醒原语

image-20240331194602482

切换原语

image-20240331194736908

总结

无论是哪种进程原语,在进程状态切换时无非做的三类事情:

  • 更新PCB中的信息
    • 修改进程状态state,保存恢复进程的运行环境
  • 将PCB插入合适的队列
  • 分配/回收资源

扩充:程序是如何执行的以及进程之间的切换会发生什么?

image-20240331195409640

image-20240331195522798

进程通信

概念:进程间通信(IPC,Inter-Process Communication)是指两个进程之间产生数据交互

背景:

1
进程是资源分配的基本单位,因此各个进程拥有的内存地址空间是相互独立的,为了保证安全,一个进程是不能直接访问另一个进程的地址空间

进程之间是如何进行通信的?

image-20240331200027954

进程通信方式一:共享存储

image-20240331201150098

image-20240331201430938

进程通信方式二:消息传递

image-20240331201745944

image-20240331202322351

image-20240331202521007

进程通信方式三:管道通信

                                         <img src="操作系统/image-20240331203332343.png" alt="image-20240331203332343" style="zoom:33%;" />

线程概念

image-20240331204009917

为什么引入线程?

image-20240331204304470

image-20240331204439565

image-20240331204720727

线程的属性

image-20240331204924114

线程的实现方式

image-20240331205012635

用户级线程

image-20240331205602438

用户级线程的特点:

  • 线程的管理工作是由线程库来完成的
  • 线程的切换不需要CP变态(由用户态->核心态)
  • 操作系统无法意识到用户级线程的存在

image-20240331210012233

内核级线程

                                     <img src="操作系统/image-20240331210233658.png" alt="image-20240331210233658" style="zoom:33%;" />

多线程模型

一对一模型

image-20240331210459845

多对一模型

image-20240331210646253

多对多模型

image-20240331210823048

线程的状态与转换

线程的状态以及各个状态之间的转换与进程基本一致

image-20240331211122746

线程的组织与控制

进程的组织与控制是通过PCB来实现的,而线程的组织与控制是通过TCB(线程控制块)来实现的

image-20240331211602274

处理器调度

image-20240331220650527

调度的概念

image-20240331221435911

调度层次

image-20240331222521655

高级调度

image-20240331221904732

低级调度

image-20240331221955990

中级调度

image-20240331222155365

进程调度的时机、切换与过程、方式

image-20240331222739796

进程调度的时机

image-20240331223151270

进程调度方式

image-20240331224337647

进程的切换与过程

image-20240331224639448

调度器和闲逛进程

调度器/调度程序

image-20240331225213245

image-20240331225541506

闲逛进程

image-20240331225622880

调度算法的评价指标

image-20240331230015428

CPU利用率

image-20240331230417364

系统吞吐量

image-20240331230640212

周转时间

image-20240331231214518

image-20240331231351719

等待时间

等待时间=周转时间-运行时间

image-20240331231537845

响应时间

image-20240331232308693

调度算法

先来先服务(FCFS)

image-20240331233004559

短作业优先(SJF)

image-20240331233326887

高响应比优先(HRRN)

image-20240331233451122

image-20240331233939491

时间片轮转(Round-Robin)

image-20240331235211864

image-20240331235248536

优先级调度

image-20240331235416056

多级反馈队列

image-20240331235950486

进程的同步和互斥

进程同步

image-20240401092423993

进程互斥

image-20240401092616916

image-20240401092927040

进程互斥的软件实现方法

  • 单标志法
  • 双标志先检查
  • 双标志后检查
  • Peterson算法

单标志法

image-20240401094254630

缺陷:

image-20240401094619192

双标志先检查法

image-20240401095010555

双标志后检查法

image-20240401095241562

Peterson算法

image-20240401095953874

总结

image-20240401100017982

进程互斥的硬件实现方法

  • 中断屏蔽方法
  • TestAndSet(TS指令/TSL指令)
  • Swap指令

中断屏蔽方法

image-20240401100430216

TestAndSet指令

image-20240401100808496

Swap指令

image-20240401101100489

总结

image-20240401101134298

互斥锁

image-20240401101350222

image-20240401101412640

信号量机制

  • 整型信号量
  • 记录型信号量

背景

image-20240401102402021

信号量机制

                                             <img src="操作系统/image-20240401103540739.png" alt="image-20240401103540739" style="zoom:33%;" />

整型信号量

image-20240401104524695

记录型信号量

image-20240401105112654

总结

image-20240401105734937

信号量机制实现进程互斥、同步和前驱关系

image-20240401110923594

信号量机制实现进程互斥

image-20240401111219479

信号量机制实现同步

image-20240401111738525

信号量机制实现进程前驱关系

image-20240401112004610

总结

image-20240401112250329

生产者消费者问题

问题描述

image-20240401113201092

解决方案

image-20240401144331656

不能改变相邻P、V操作的顺序,因为可能会发生死锁

                                             <img src="操作系统/image-20240401144625031.png" alt="image-20240401144625031" style="zoom:33%;" />

多生产者多消费者问题

问题描述

                                 <img src="操作系统/image-20240401150006736.png" alt="image-20240401150006736" style="zoom:33%;" />

问题解决

image-20240401150314106

image-20240401150731670

本题中缓冲区大小为1,所以在任何时刻,apple、orange、plate三个同步信号量做多只有一个是1,因此在任何时刻,做多只有一个进程的p操作不会被阻塞,并顺利进入临界区

吸烟者问题

问题描述

image-20240401151540571

问题解决

image-20240401152727525

读者写者问题

问题描述

image-20240401154621589

解决方案

这个问题比前面几个问题都要复杂,因为写进程与写进程之间是可以同时进行的,读进程与写进程之间是互斥的

image-20240401155355869

上述方案存在的潜在问题:只要有读进程还在读,写进程就要一直阻塞,可能饿死,在这种算法中,读进程是优先的

写进程优先的解决方案

                                 <img src="操作系统/image-20240401155954921.png" alt="image-20240401155954921" style="zoom:33%;" />

哲学家进餐问题

问题描述

image-20240401160425529

存在的问题:如果5个哲学家并发执行,都拿起了自己左手边的筷子,那么就会出现死锁问题

那么如何防止死锁的发生?

方案一:

可以对哲学家进程施加一些限制,比如每次做多允许四个哲学家同时进餐。这样可以保证至少有一个哲学家能够同时拿到左右两只筷子

方案二:

要求奇数号哲学家先拿左边的筷子,然后再拿右边的筷子,而偶数号哲学家正好相反。用这种方法可以保证如果相邻的两个奇偶号哲学家都想吃饭,那么只会有一个可以拿起第一只筷子,另一个会直接阻塞。

方案三:仅当一个哲学家左右两只筷子都可用时,才允许他抓起筷子

管程

背景:什么要引入管程?

image-20240401161846510

管程的定义和特征

image-20240401162249333

管程例子:解决生产者消费者问题

image-20240401162512261

image-20240401162828756

死锁

死锁的概述

image-20240401163512406

死锁 vs 死循环 vs 饥饿

image-20240401163719224

死锁产生的必要条件

image-20240401164054846

发生死锁的例子

image-20240401164221699

死锁的处理策略

image-20240401164300209

预防死锁
破坏互斥条件

image-20240401170030811

破坏不剥夺条件

image-20240401170102218

破坏请求和保持条件

image-20240401170129540

破坏循环等待条件

image-20240401170223020

避免死锁

image-20240401170416397

image-20240401170648093

银行家算法

image-20240401170721430

image-20240401170935904

死锁检测和解除

image-20240401171058693

image-20240401171208372

image-20240401171234908

CH3内存管理

内存的基础知识

什么是内存?内存有什么作用?

image-20240402093505547

相对地址的转换

程序经过编译、链接之后生成的指令中指明的是相对地址,是相对进程起始地址而言的地址,那么如何将相对地址转换为物理地址?

常见的装入方式:

  • 绝对装入
  • 可重定位装入
  • 动态运行时装入
绝对装入

image-20240402095545432

灵活性低,如果绝对装入,换了一台电脑运行,可能就不行了

可重定位装入

image-20240402095748633

动态运行时装入

image-20240402100032950

写程序到程序运行流程

image-20240402100340432

链接的方式

image-20240402100452123

内存管理

内存空间的分配与回收

image-20240402101453649

虚拟技术:操作系统需要提供某种技术从逻辑上对内存空间进行扩充

                                     <img src="操作系统/image-20240402101637091.png" alt="image-20240402101637091" style="zoom:33%;" />

操作系统需要提供地址转换功能,负责程序的逻辑地址和物理地址的转换

image-20240402101744861

操作系统需要提供内存保护功能,保证各个进程在各自存储 空间运行,互不干扰

image-20240402102319744

image-20240402102446478

总结

image-20240402102545024

内存空间扩充

  • 覆盖技术
  • 交换技术
  • 虚拟存储技术

覆盖技术

                                 <img src="操作系统/image-20240402110123096.png" alt="image-20240402110123096" style="zoom:33%;" />

image-20240402110435908

交换技术

image-20240402111427650

image-20240402143107871

内存空间的分配与回收

连续分配管理方式

连续分配:指为用户进程分配的必须是一个连续的内存空间

单一连续分配

image-20240402144828511

固定分区分配

image-20240402145124314

image-20240402145943111

动态分区分配

image-20240402150217254

image-20240402150408786

image-20240402151307492

内存分配

image-20240402151406451

image-20240402151522519

内存回收

image-20240402151643847

image-20240402151751962

image-20240402151826215

                                              <img src="操作系统/image-20240402151853579.png" alt="image-20240402151853579" style="zoom:33%;" />

image-20240402152235712

非连续分配管理方式

非连续分配:为用户进程分配的可以是一些分散的内存空间

动态分区分配算法

image-20240402152725479

首次适应算法

image-20240402153358523

最佳适应算法

image-20240402153753646

最坏适应算法

image-20240402153957703

邻近适应算法

image-20240402154435594

连续分配管理方式

基本分页存储管理

image-20240402163232103

问题一:如何存储逻辑页面与物理页面的对应关系—页表

image-20240402163600999

image-20240402163820921

image-20240402163929309

image-20240402164132995

如何实现地址的转换?

image-20240402164513364

image-20240402164826838

image-20240402165123334

image-20240402165359715

总结

image-20240402165457383

基本地址转换结构

image-20240402170125722

image-20240402171018980

具有快表的地址变换机构

image-20240402191211264

image-20240402192026060

                                      <img src="操作系统/image-20240402192314710.png" alt="image-20240402192314710" style="zoom:33%;" />

image-20240402192744066

两级页表
单级页表存在的问题

image-20240402193228050

如何解决单级页表存在的问题

采用多级页表解决页表必须连续存放的问题

image-20240402193605231

image-20240402194124240

image-20240402194304083

采用虚拟技术解决没有必要让整个页表常驻内存的问题

image-20240402194512651

例题:

image-20240402194923971

两级页表与一级页表相比的缺点:

一级页表只需访问两次内存,二级页表需要访问三次内存

总结

image-20240402195140403

基本分段存储管理

分段管理
                                     <img src="操作系统/image-20240402195537504.png" alt="image-20240402195537504" style="zoom:33%;" />

image-20240402200425466

image-20240402200816780

image-20240402202256535

分段 vs 分页管理

image-20240402202836672

image-20240402202950649

image-20240402203051009

image-20240402203140419

段页式存储管理

分页、分段的优缺点
                                         <img src="操作系统/image-20240402203837533.png" alt="image-20240402203837533" style="zoom:33%;" />
分段+分页—-段页式管理方式

image-20240402203935865

段表、页表

image-20240402204159873

image-20240402204452230

如何实现地址转换

image-20240402204546951

虚拟内存

传统存储管理方式的特征、缺点

                                         <img src="操作系统/image-20240402205246881.png" alt="image-20240402205246881" style="zoom:33%;" />

虚拟内存的定义和特征

image-20240402205721274

如何实现虚拟内存技术?

image-20240402205925768

请求分页管理方式

image-20240402210152436

请求页表

image-20240402210344072

缺页中断机制

image-20240402210803244

                                             <img src="操作系统/image-20240402211008408.png" alt="image-20240402211008408" style="zoom:33%;" />

地址变换机构

image-20240402211124688

image-20240402211224479

页面置换算法

image-20240402211306225

最佳置换算法

image-20240402211637510

先进先出置换算法

image-20240402211707918

最近最久未使用置换

image-20240402211737449

时钟置换算法

image-20240402211814968

改进型的时钟置换算法

image-20240402211946798

总结

image-20240402212043180