【操作系统OS】学习笔记第二章 进程与线程(下)【哈工大李治军老师】

news2024/9/30 9:20:18

基于本人观看学习 哈工大李治军老师主讲的操作系统课程 所做的笔记,仅进行交流分享。

特此鸣谢李治军老师,操作系统的神作!

如果本篇笔记帮助到了你,还请点赞 关注 支持一下 ♡>𖥦<)!!

主页专栏有更多,如有疑问欢迎大家指正讨论,共同进步!

给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ

第二章 进程与线程(下)

第二章 进程与线程(上):【操作系统】学习笔记:第二章 进程与线程 (上)【哈工大李治军老师】

更多操作系统笔记:【哈工大李治军老师】操作系统笔记专栏汇总


如果有需要markdown或者PDF可以私信我,可以在此基础上自己添加补充笔记(●’◡’●)

进程与线程(下) 目录

  • 第二章 进程与线程(下)
  • 课程链接:
  • 一、CPU调度策略
    • 1.多进程图像与CPU调度
    • 2.如何设计调度算法
    • 3.先到先服务FCFS
    • 4.短作业优先SJF
    • 5.提高响应速度——时间片轮转法RR
    • 响应时间和周转时间同时存在,怎么办?
  • 二、一个实际的schedule函数
    • 优先级动态调整
    • counter作用总结
  • 三、进程同步与信号量
    • 1.进程合作:多进程共同完成一个任务
    • 2.信号量
    • 3.P V操作
  • 四、信号量临界区保护
    • 1.竞争
    • 2.临界区
    • 3.轮换法
    • 4.标记法
    • 5.Peterson算法
    • 6.面包店算法
    • 关中断
    • 硬件原子指令法
  • 五、信号量的代码实现
    • sleep_on:
  • 六、死锁处理

课程链接:

b站: 【哈工大】操作系统 李治军(全32讲)

大学MOOC:大学慕课—操作系统—主讲:哈工大李治军



一、CPU调度策略

1.多进程图像与CPU调度

当PID:1执行结束/阻塞,切换到其他进程去执行

此时2、3都在就绪队列中,应该选择谁执行?——这就是调度策略

image-20230502215921848

例: 两种进程调度策略

image-20230502220208952

调度策略问题很难穷尽,我们研究的就是对一个实际的系统面对这些任务应该如何设计调度算法

2.如何设计调度算法

面对进程:CPU调度的目标应该是进程满意

核心:时间复杂度小,执行速度尽量快

image-20230502221654417

关键问题:操作系统在CPU调度中,需要折中,需要综合

image-20230502224142312

IO约束型任务:需要大量的输入和输出操作,例如从磁盘读取或写入大量数据、向网络发送请求等。这些操作需要较长时间完成,CPU 的使用率较低,因此这种任务的瓶颈通常在于 IO 操作的速度。解决这种任务的方法通常是使用异步 IO 操作,以便在等待 IO 操作完成时释放 CPU 资源。

CPU约束型任务:这种任务通常需要大量的计算,并且需要快速完成,例如图像处理、视频编码、加密解密等。这些操作需要大量的 CPU 时间,因此 CPU 的使用率较高,而 IO 操作通常只是一个辅助操作。解决这种任务的方法是使用多线程或分布式计算,利用多个 CPU 核心同时进行计算,提高计算速度。

3.先到先服务FCFS

平均周转时间即作业从进入系统到完成的时间,完成时间减去到达时间再除以任务个数

计算公式:平均周转时间 = (作业完成时间 - 作业提交时间)/ 作业数

其中,作业完成时间指作业执行完毕的时刻,作业提交时间指作业进入系统的时刻

周转时间越短,系统的效率就越高

image-20230502233357051

4.短作业优先SJF

image-20230502233637544

5.提高响应速度——时间片轮转法RR

RR算法采用抢占式调度,即每个进程被分配一个时间片,当时间片用完后,该进程会被挂起并放回就绪队列,等待下一次调度。同时,RR算法会按照就绪队列中进程的顺序依次调度每个进程。这样,每个进程都能够在一定程度上得到公平的CPU时间,避免了某些进程长时间占用CPU的情况,提高了系统的响应速度和吞吐量。 注意合理设置时间片大小

无论是否执行完一个进程,每次都执行一个时间片,切换下一个时间片执行其他进程

image-20230502234129559

响应时间和周转时间同时存在,怎么办?

Word很关心响应时间,而gcc更关心周转时间,两类任务同时存在怎么办?

一个调度算法让多种类型的任务同时都满意,怎么办?

image-20230502234405974

如果前台任务绝对优先: 会造成饥饿

image-20230502234523546

因此需要对优先级进行动态调整,而后台任务往往响应时间很长

image-20230502234700498

此时应该后台任务执行一段时间,优先级下降,释放出cpu,让前台任务再次执行

既要以轮转调度为核心,又要在轮转调度的基础上增加一些优先级,前台任务与后台任务协调

image-20230502235114077

二、一个实际的schedule函数

优先级动态调整

counter既作为优先级,又作为时间片,只需要维护一个counter变量

image-20230502235455360

image-20230502235702941

image-20230502235713719

counter作用总结

image-20230503000133286

三、进程同步与信号量

1.进程合作:多进程共同完成一个任务

对多个进程的推进需要有合理有序的约束

司机需要等待售票员发出信号:

image-20230503170554310

实例:生产者–消费者

image-20230503170918010

2.信号量

只发信号还不能解决全部问题,单靠counter代表缓冲区空闲的个数还不够,还需要知道有多少个进程在sleep,使用信号量 记录一些更多的信息

image-20230503171340926

使用信号量来表达更丰富的信息,是一个计数器,可以控制对共享资源的访问量

除了睡眠和唤醒,还需要记录其他信息: 量

image-20230503171620977

记录有多少个进程在sleep:1 -> 2 -> 1 -> 0

image-20230503171823884

还有一个空闲缓冲区:

image-20230503172030018

P和C可以根据信号量可以实现进程同步!

如果信号量为负数,-几代表有几个进程在等待

如果信号量为正数,代表有几个资源可以使用

3.P V操作

image-20230503172717899

P:消费资源 减

V:产生资源 加

当缓冲区为空:

多个生产者和多个消费者共享缓冲区。生产者将数据项写入缓冲区中,而消费者则从缓冲区中读取数据项。

计数器 empty用于表示缓冲区中还有多少空闲,full 表示有多少缓冲区已被占用。使用了一个互斥信号量mutex,保证同时只有一个进程能够修改缓冲区的内容。

当生产者要向缓冲区中写入数据时,首先要尝试获取空闲缓冲区的数量(也就是执行 P(empty) 操作)。如果目前empty为 0,则说明缓冲区已满,生产者需要等待某个消费者释放后才能继续写入数据(也就是进入阻塞状态)。

如果目前有空闲缓冲区,则使用互斥信号量(即执行 P(mutex)),将数据写入缓冲区中,

释放互斥信号量(互斥锁)之后,通知消费者此时缓冲区已经有数据可消费(即执行 V(full) 操作),以便消费者读取缓冲区中的数据


当消费者要从缓冲区中读取数据时,首先尝试获取空闲缓冲区的数量(也就是执行 P(full) 操作)。如果目前已经full为 0,则说明缓冲区为空,消费者需要等待某个生产者写入数据后才能继续读取数据(也就是进入阻塞状态)。

如果有已经被写入数据的单元格,则使用互斥信号量(即执行 P(mutex)),将数据从缓冲区中读取出来

消费者将读取的数据项打印出来之后,释放互斥锁并通知生产者目前缓冲区中有空闲的单元格,以便生产者继续写入数据(即执行 V(empty) 操作)。

image-20230503173231177

四、信号量临界区保护

1.竞争

由于共享数据没有保护,造成数据竞争问题:

image-20230503183046161

解决竞争条件的直观想法:上锁

image-20230503183234330

2.临界区

临界区(Critical Section):一次只允许一个进程进入的该进程的那一段代码

保护共享数据——信号量

image-20230503183346584

临界区代码的保护原则

基本原则:

1.互斥进入:如果一个进程在临界区中执行,则其他进程不允许进入

​ 这些进程间的约束关系称为互斥(mutual exclusion)

​ 这保证了是临界区

好的临界区保护原则

2.有空让进:若干进程要求进入空闲临界区时,应尽快使一进程进入临界区

3.有限等待::从进程发出进入请求到允许进入不能无限等待

3.轮换法

每个进程被赋予一个次序号(也称时间片)

所有进程按照次序号依次排队。执行上下文切换时,当前进程将释放 CPU 时间,并将接下来 CPU 时间分配给下一个进程

当某个进程需要访问共享资源(也就是进入临界区)时,它首先要等待一定长度的时间,直到轮到它使用该资源为止

这样,即使多个进程尝试同时进入共享资源,也能够以轮流使用的方式完成。

image-20230503183744235

4.标记法

标记法的flag是 boolean 类型,初始值为 false。当一个进程想要进入临界区时,它首先要获取这个标记变量,并将其设置为 true,表示自己已经进入了临界区。此时,如果有其他进程想要进入临界区,就必须等待当前进程退出临界区并释放这个标记变量。

进程在退出临界区之后,需要将这个标记变量重新设置为 false,以便其他进程可以使用它。如果同时有多个进程试图获取这个标记变量并将其设置为 true,就会出现数据竞争的问题,因此标记法通常要和其它同步机制(如信号量、互斥锁)一起使用。

标记法过度使用可能会导致系统性能下降,因为每个进程都必须轮流尝试获取临界区标志,而这种轮流获取的过程可能导致等待时间过长

image-20230503183830229

可能会导致缓冲区空闲但进程AB都不会执行,因此需要规定名字

image-20230503184009590

image-20230503184241570

5.Peterson算法

Peterson算法通过在临界区的代码中让两个进程轮流执行,保证了不会同时进入临界区的情况。

当其中一个进程想要进入临界区时,另一个进程必须等待,直到当前进程完成临界区的操作并释放它的资源后才能进入,从而避免了死锁和数据竞争问题

Peterson算法维护了两个bool型的变量 turn 和 flag,分别表示当前轮到哪个进程进入临界区,和每个进程是否想要进入临界区:

image-20230503184429975

image-20230503184435914

i的flag为true,表示它想要进入临界区。然后进入 while 循环中进行判断,检查另一个进程 j是否也想要进入临界区,如果 flag[j] 为 true 并且轮到 j 进入临界区(即 turn==j),进程 i 就需要等待。一旦它获得了进入临界区的机会,就可以执行相应操作,并将自己的标志设置为 false,这样进程 j 就可以进入临界区。

6.面包店算法

仍然是标记和轮转的结合

如何轮转: 每个进程都获得一个序号,序号最小的进入

如何标记: 进程离开时序号为0,不为0的序号即标记

面包店: 每个进入商店的客户都获得一个号码,号码最小的先得到服务;号码相同时,名字靠前的先服务

image-20230503184710875

互斥进入: P在临界区内,P试图进入,一定有(num[i],i)<(num[k],k),P循环等待。

有空让进: 如果没有进程在临界区中,最小序号的进程一定能够进入。

有限等待: 离开临界区的进程再次进入一定排在最后(FIFO),所以任一个想进入进程至多等n个进程

关中断

关中断是指在处理器上禁止中断响应,以防止其他进程或线程干扰当前正在执行的进程或线程。

当一个进程或线程需要获取共享资源时,它可以通过关闭中断来确保自己在操作期间不会被中断。

在操作完成之后,它再重新打开中断,使其他进程或线程可以获取和使用共享资源。该机制是基于硬件实现的,并且只能在处理器级别上操作

但是当多个处理器时,关中断无法影响其他处理器中的进程,一个处理器关闭了中断,其他处理器还可以继续运行他们的进程或线程。

image-20230503184955799

硬件原子指令法

硬件原子指令法提供了一组原子性的操作指令,可以在一个确保操作不会被中断的环境下,原子地执行某个操作,避免数据竞争和死锁等问题

image-20230503185305907

五、信号量的代码实现

Semaphore值是否大于0,如果不是,则将自身设为阻塞状态并加入相应的等待队列中,最后调用schedule()函数切换到其他进程或线程来运行。而在sti()指令中断后,Semaphore已经被占用,防止了其他进程或线程的访问。

image-20230503185347238

启动磁盘读以后睡眠,等待磁盘读完由磁盘中断将其唤醒,也是一种同步

image-20230503185430573

sleep_on:

image-20230503185450696

sleep_on形成的队列

image-20230503185535455

六、死锁处理




更新中…明天再写…(✿◠‿◠)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/485648.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于rke部署的k8s集群如何配置kube-proxy工作在ipvs模式

kube-proxy默认工作在iptables模式下&#xff0c;在集群配置文件cluster.yml中添加如下配置项即可开启ipvs模式。然后执行 rke up 命令使配置生效。

软件测试的ABC

文章目录 一. 衡量软件测试结果的依据—需求1. 什么是需求2. 案例 - 平台支持邮箱注册3. 从测试人员角度看需求 二. 测试用例1. 测试用例的概念2. 案例3. 为什么要有测试用例 三. 软件错误 (BUG)1. 什么是bug2. 如何描述一个bug3. bug的级别4. bug的生命周期5. 如果因为bug和开…

Java面试题总结 | Java面试题总结8- Redis模块(持续更新)

Redis 文章目录 Redisredis的线程模型Redis的Mysql的区别Redis和传统的关系型数据库有什么不同&#xff1f;Redis常见的数据结构zset数据结构Redis中rehash过程redis为什么不考虑线程安全的问题呢Redis单线程为什么还能这么快&#xff1f;为什么Redis是单线程的&#xff1f;red…

【SpringMVC】| SpringMVC执行流程原理 | 常用注解 剥析

MVC目录 一. &#x1f981; MVC模型二. &#x1f981; SpringMVC1. SpringMVC执行流程&#xff08;重点&#xff09;Ⅰ. SpringMVC四大组件Ⅱ. 执行流程 2. RequestMapping3. RequestParam4. ReuqestHeader & CookieValue5. RESTful风格支持Ⅰ. 传统 vs restfulⅡ. PathVar…

5. Docker——先快速入门

本章讲解知识点 Docker 是什么为什么要使用 DockerDocker 引擎Docker 常用命令Docker 生命周期详解虽然我们上一章教大家搭建好了 Kubernetes + Docker 环境,但是我们本章是先从 Docker 讲起,为后面学习 Kubernetes 打好基础。 1. Docker 是什么 Docker 是一种开源的容器化…

spring5源码篇(9)——mybatis-spring整合原理

spring-framework 版本&#xff1a;v5.3.19 spring和mybatis的整合无非主要就是以下几个方面&#xff1a; 1、SqlSessionFactory怎么注入&#xff1f; 2、Mapper代理怎么注入&#xff1f; 3、为什么要接管mybatis事务&#xff1f; 文章目录 一、SqlSessionFactory怎么注入SqlSe…

离散数学_九章:关系(4)

9.4 关系的闭包 1、闭包(closure)的定义2、不同类型的闭包1. 自反闭包(reflexive closure)2. 对称闭包(symmetric closure)3. 传递闭包(transitive closure) 3、闭包的几个定理定理1定理2定理3 - R1∪R2定理4定理5&#x1f4d8;例题&#xff1a; 4、有向图中的路径5、传递闭包1…

2000-2019年30省研发资本存量(含计算过程和原始数据)

2000-2019年30省份研发资本存量&#xff08;含计算过程和原始数据&#xff09;/2000-2019年30个省市R&D资本存量或研发资本存量数据 1、时间&#xff1a;2000-2019年 2、范围&#xff1a;包括30个省市不含西藏 3、指标&#xff1a;省研发资本存量 4、参考文献&#xff…

家用 NAS 服务器搭建 | 网络 | DNS域名解析

1、前言 使用NAS&#xff0c;一般除了在家里通过局域网访问&#xff0c;还会有外网访问的需求&#xff0c;即在外面通过移动网络或者其他网络访问家中的NAS。 正常情况下在外面是没有办法访问家庭网络的&#xff0c;甚至是nas&#xff0c;因为nas获取的是局域网IP&#xff0c;…

【Python】flask

一、Flask教程 Flask是一个免费的web框架&#xff0c;也是一个年轻、充满活力的小型框架&#xff0c;开发文档齐 全&#xff0c;社区活跃度高&#xff0c;有着众多支持者。 Flask的设计目标是实现一个WSGI的微框架&#xff0c; 其核心代码十分简单。 Flask框架在中小型企业中的…

pwn的kali64虚拟机环境搭建记录

自己记着备用&#xff0c;pwn的环境和工具 虚拟机&#xff1a;VMware Workstation Pro Linux版本&#xff1a;kali64 总参考&#xff1a; pwn 环境搭建&#xff08;wsl/vmware&#xff09; pwn入门之环境搭建 目前就装这些&#xff0c;以后改了再更新&#xff08;但愿 安装ka…

第 4 章 HBase 进阶

第 4 章 HBase 进阶 4.1 Master 架构1&#xff09;Meta 表格介绍&#xff1a;&#xff08;警告&#xff1a;不要去改这个表&#xff09; 4.2 RegionServer 架构1&#xff09;MemStore2&#xff09;WAL&#xff08;预写日志&#xff09;3&#xff09;BlockCache 4.3 写流程2&…

使用kubeadm搭建生产环境的多master节点k8s高可用集群

环境centos 7.9 目录 1.对安装 k8s 的节点进行初始化配置 2 通过 keepalivednginx 实现 k8s apiserver 节点高可用 3、kubeadm 初始化 k8s 集群 4.扩容 k8s 控制节点&#xff0c;把 xuegod62 加入到 k8s 集群 5、扩容 k8s 控制节点&#xff0c;把 xuegod64 加入到 k8s 集群…

06_Uboot顶层Makefile分析_前期所做内容

目录 U-Boot顶层Makefile分析 版本号 MAKEFLAGS变量 命令输出 静默输出 设置编译结果输出目录 代码检查 模块编译 获取主机架构和系统 设置目标架构、交叉编译器和配置文件 调用scripts/Kbuild.include 交叉编译工具变量设置 导出其他变量 U-Boot顶层Makefile分析…

Kafka架构原理(三)

三、Kafka架构原理 3.1 整体架构图 一个典型的kafka集群中包含若干个Producer&#xff0c;若干个Broker&#xff0c;若干个Consumer&#xff0c;以及一个zookeeper集群&#xff1b; kafka通过zookeeper管理集群配置&#xff0c;选举leader&#xff0c;以及在Consumer Group发…

软件多语言文案脚本自动化方案

开发高效提速系列目录 软件多语言文案脚本自动化方案 软件多语言文案脚本自动化方案 背景目标整体方案1. 创建文案资源文件2. python脚本开发3. Python脚本执行与管理4. 人员职责分配 PyCharm使用说明1. PyCharm下载2. PyCharm安装配置3. 异常情况解决 总结 博客创建时间&…

中间件漏洞(一)CVE-2013-4547(文件名逻辑漏洞)

目录 1. 了解nginx的工作原理 2. 漏洞原理及举例分析 3. 前端php源码分析 4. 注入思路 5. 漏洞复现 5.1 上传文件并抓包分析 5.2 通过访问文件执行php 注意一点 6. 漏洞修复 1. 了解nginx的工作原理 nginx是以PHP语言为主。像Apache一样&#xff0c;Nginx自身是不支持解…

基于黏菌算法的极限学习机(ELM)回归预测-附代码

基于黏菌算法的极限学习机(ELM)回归预测 文章目录 基于黏菌算法的极限学习机(ELM)回归预测1.极限学习机原理概述2.ELM学习算法3.回归问题数据处理4.基于黏菌算法优化的ELM5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;本文利用黏菌算法对极限学习机进行优化&#xff0c;并…

国民技术N32G430开发笔记(15)- IAP升级 树莓派串口发送数据

IAP升级 树莓派串口发送数据 1、树莓派接入usb转串口模块后&#xff0c;会生成/dev/ttyUSB0节点&#xff0c;因为树莓派内核已经编译usb_serial以及各模块的驱动。 我们直接对ttyUSB0节点编程即可。 2、协议同上一节 cmd data_lenght data0 … datax checksum 1、获取版本…

AutoDL-GPU租用平台使用(LLM 备用)

网址&#xff1a;AutoDL-品质GPU租用平台-租GPU就上AutoDL 1 打开网址 查看下显卡型号及价格&#xff1a;A100 ( 80 G 显存) 6.68/小时 、4090&#xff08;24G 显存&#xff09;2.68/小时 2 创建实例 1.注册登录后进入控制台&#xff08;页面右上角&#xff09;&#xff0…