OS1_进程与线程的管理

序言

1.OS以进程、线程的方式在CPU中执行静态保存在外存(内存)中的程序,进程的构成与状态转化,特别是进程的切换;
2.当有多个进程处于就绪态,有哪些常见的挑选以执行方式;
3.并发执行(乱序发射)的进程,共享内存等资源,很可能修改其他程序的变量,需作同步处理来控制;
此外有些资源如打印机不能共享,需作互斥处理;

Question

  1. 程序分割成线程执行的代码怎么写?用进程管理程序实现,python如何可以实现多线程并行吗,如何实现?
  2. 为什么用户级线程中,1个线程因系统调用被阻塞会导致其他线程也被阻塞?

因为在大多数操作系统中,内核是单线程运行的,所以当一个线程被阻塞时,它会释放CPU资源。这将导致其他线程在等待CPU资源时也被阻塞,其他线程只能要么等待,无法保存现场(工作在用户层)再切换,produce block。
在内核级线程中,中断的保存/恢复现场为内核的功能,可以实现线程间的调度,且支持多处理机。
在组合方式中,
a. 用户进程的多个线程对应内核级的多个线程,用户1个线程系统调用的内核级线程A被阻塞,CPU可以切换到其他线程的不同内核级线程B;
b. 多核处理器可对应多个内核级线程;
在这里插入图片描述

  1. 系统动态DLL库是个玩意?

进程

  • 进程是一段指令流,还是?process=PCB+data section+code section
    PCB=处理器(时间片轮转比其他设备周期短,单成1列)+其他资源+进程控制与管理信息+PIDUUID
  • 不同的进程是如何利用系统资源(IO,MM,CPU)的?
  • 进程之间如何通信?进程如何运转?
    在这里插入图片描述

线程

  • 线程是处理器调度与分配的基本单元
  • 进程是除了处理器之外其他资源的分配单位——IO,MM的分配单元在这里插入图片描述

进程调度

  • 线程的调度类似,不过同一个进程的线程切换不用替换进程上下文,运行时间的算法需要更新(更复杂了)
    在这里插入图片描述

同步与互斥

同步与互斥都围绕共享资源的使用:
1.对于那些只能被单独访问的共享资源,要做互斥处理;
2.对于那些可以被共享访问的资源,虽然RAR没问题,但RAW,WAR,WAW 均可能导致最终的共享资源结果不同,要作同步处理。
互斥可通过用户程序中使用API实现lock和release

  1. 数据库中,为了防止数据的脏读,需要给数据表或表项加上二阶段锁或S锁,
  2. 为什么要引入同步与互斥?——进程之间共享资源,不同进程并发执行,封闭性丧失,为了得到逻辑正确的结果。
  3. 临界资源:一次只能被1个进程访问的资源
  4. 临界区:访问临界资源的代码;
  5. 进入区:访问临界资源前,要把临界区的标志设置为正在访问;
  6. 退出区:将正在访问的临界区的signal清除;
  7. 剩余区:代码中的其余部分?
  8. 同步:如A和B通过缓冲区实现数据传送,缓冲区满了,A必须等待B读取数据,才能接着传送;缓冲区空,B必须等待A传入数据,才能接着传送;缓冲区相比于📫机制,再与缓冲区大小固定。
  9. 互斥:对临界资源的访问;而同步,是为了正确完成任务而协调工作次序;

双标志互斥alg的问题是进程的线程乱序执行导致的,只有Peterson alg能在所有乱序执行保证同步的3大准则:
空则让进,忙则等待,有限等待,(让权等待)。

硬件实现有中断屏蔽和硬件指令2种方法:

  1. 中断屏蔽:关中断,临界区,开中断。
  2. 硬件指令方法:TestandSet或Swap原子操作
boolean TestandSet(boolean *lock){boolean old;old=*lock;*lock=true;return old;;
}
while TestandSet(&lock);
临界区
lock=false;
剩余区

comment:

  1. 为每个临界资源设置一个共享布尔变量
  2. 和下面的Swap都是互斥锁
Swap(boolean *a,boolean *b){boolean temp;temp=*a;*a=*b;*b=temp;
}
key=true;
while(key!=false)swap(&key,&lock);
临界区
lock=false
剩余代码

comment:

  1. 当lock=false(代表资源空闲),设置key=false,lock=ture,标识该进程独占临界资源;
  2. swap和testandset其实是硬件原子操作,不可分,不会出现多个进程进入lock=false的swap函数,不会出现共用临界资源;
  3. 当lock=true,未得到临界资源的进程会一直while查询,占用处理机资源,不能实现让权等待;

对比

实现临界区互斥的硬件方法和软件方法各有什么优势?

硬件方法的优势:
原子性操作:硬件方法通常使用特定的指令或硬件机制来实现原子操作,如原子交换(Atomic Exchange)或测试并设置(Test-and-Set)。这些操作在硬件级别上保证了操作的原子性(不会出现共用临界资源),无需额外的软件开销。
性能:硬件方法通常比软件方法更高效,因为它们直接利用了硬件的特性,如高速缓存和并行处理能力。这使得硬件方法更适合于对性能要求较高的应用场景。

软件方法的优势:
可移植性:软件方法不依赖于特定的硬件指令或机制,因此更易于在不同的平台上实现和移植。这使得软件方法更具通用性,可以应用于不同类型的系统和架构。
灵活性:软件方法通常可以更灵活地实现复杂的同步机制,如信号量、条件变量等。这些机制提供了更多的控制和功能,可以满足不同线程同步需求。
容错性:软件方法可以在一些特殊情况下提供更好的容错性。例如,当硬件出现故障或不支持某些原子操作时,软件方法可以通过算法和复杂的同步机制来弥补。

需要注意的是,硬件方法和软件方法并不是互斥的选择,它们可以结合使用来提供更可靠和高效的同步机制。例如,硬件指令可以用于实现基本的原子操作,而软件方法可以用于构建更复杂的同步机制。选择何种方法取决于具体的应用需求、平台特性和性能要求。

解决临界区——互斥锁+信号量

互斥锁更easy

acquire(){//锁被占用则等待while(available!=true);	//锁空闲,占用后,将锁设为falseavailable=false}
release(){	//释放锁available=true}

信号量(系统中的资源数目)mechanism

采用两个不可中断(软件中由屏蔽中断方法实现)的原语——wait和signal来管理

整形信号量

wait(S){	//请求资源while(S<=0)//若没有资源,则等待S--;		//占用资源,S--
}
signal(S){S++;	//释放资源
}

Defect:wait在无资源可用,会一直occupy cpu——while query,违背 让权等待

记录型信号量

  • S.value>0,表示可用的资源数目;
  • S.value<=0,标识阻塞的进程数目;
  • 每种资源对应1个S
typedef struct{int value;struct process *L;
} semaphore(信号量);

请求资源

void wait(semaphore S){S.value--;	//S>0则资源数--;S<0则阻塞进程数++;if(S.value<0){	add this process to S.L;block(S.L);}
}

释放资源

voic signal(semaphore S){S.value++;	//资源数++或阻塞进程数--if(S.value<0){	//若为后者,唤醒该进程——资源来临remove process P from S.L;wakeup(P);}
}

信号量的饮用

只有互斥用到了临界资源;
同步和前驱只关于特定变量的逻辑序;

同步
——进程按照(资源的)特定顺序执行

semaphore S=0;
P1(){x;V(S);...
}
P2(){...P(S);y;...
}

互斥——只有1个进程能进入临界区

  • P(S)请求资源;V(S)释放资源
semaphore S=1;
P1(){...P(S);critical area;V(S);
}
P2(){...P(S);critical area;V(S);
}

用同步实现前驱关系——每个偏序关系用1个资源

S1(){V(a1);
}
S2(){P(a1);V(b1);V(b2);
}

分析同步、互斥、前驱关系,设置信号量,确定P,V

管程

背景:针对每个共享变量,所有使用变量都要设置P(),V()操作;
改进:每个共享资源,只要1个共享数据结构demo来管理;

管程=类,成员变量为共享资源的数目,成员函数为对共享资源的操作,如对互斥变量的take_away和release,

多个共享资源可以用记录型信号量表示,

不知道为什么要把条件变量单独拎出来,用来表示进程被阻塞的原因,

  • 如果两个进程有先后关系,它们之间可以一个条件变量的lock和release,
  • 互斥资源可以且应该用条件变量表示,就是整数型信号量

互斥问题的求解

  • 互斥资源的访问用锁表示,
  • 像生产者、消费者问题,明明可以用num表示缓冲区的数目,为了符合P(锁),V(释放)的形式(值得唾弃),
    用full和empty两个信号量,并用mutex实现对full和empty的互斥修改(simultaneously 只有一个生产者/消费这个能访问缓冲区)——然鹅并不是~~
  • 像放苹果橘子问题,可以把事件的同步与互斥用箭头表示,每个同步关系用一个针对互斥资源的P(),V()表示;
  • 读者-写者问题,终于用count表示资源读者的数量,为了count错误修改,自然加个mutex的PV锁;
    写者与其他人的互斥用rw锁表示,读者与写者的互斥,读者的同步(on count)非常秀——but only分条件,进行rw的判断,所以应该放开编程,appleorange也可以进行while(apple=0 and orange=0)的判断,不用和书上一致;
  • 吸烟者问题,吸完烟要向供应商发信号,也要用个锁~~

死锁

  • 可剥夺资源:优先级高的可以抢占优先级低的进程的资源;
    在这里插入图片描述
  • 有循环等待未必构成死锁,
  • 若每类资源只有1个资源,资源分配图含圈 ↔ \leftrightarrow 系统出现死锁
    PS:CSDN图片id用的是128位的散列值

死锁处理

在这里插入图片描述


安全状态:按照某种推进顺序,能满足每个进程对资源的最大需求,使每个进程可顺序完成;
死锁避免在分配资源给进程的过程中拒绝进入dangerous state

banker’s alg一般都是DFS+回溯,可以用BFS?


破圈法是为了寻找有环图的最小生成树,

死锁检测定理——待证
1)找出非阻塞(请求的资源数量均不大于系统的空闲资源数量)的非孤立进程Pi,释放Pi所有资源;
2)重复1),若消去所有边,图可完全简化 ↔ \leftrightarrow 不死锁;

预防中的消除循环等待和请求并保持,均不可行,
在这里插入图片描述

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

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

相关文章

Pytorch深度学习------torchvision中dataset数据集的使用(CIFAR10)

文章目录 一、什么是TorchVision二、以torchvision.datasets子模块下的CIFAR10数据集为例1、CIFAR10数据集参数2、代码中使用 一、什么是TorchVision torchvision是pytorch的一个图形库&#xff0c;用来处理图像&#xff0c;主要用来构建计算机视觉模型。 从下面的官网截图可以…

手写设计模式

单例模式 饿汉式 public class SingleTon {private static SingleTon instance new SingleTon();private SingleTon(){};public static SingleTon getInstance(){return instance;} }要点&#xff1a; 静态 private instance私有的构造器方法返回 instance 懒汉式 public…

TCP/UDP的首部

TCP/UDP首部信息 TCP首部第一个4字节第二个4字节与第三个4字节第四个4字节第五个4字节选项最大报文段长度&#xff08;MSS&#xff09;选项窗口扩大选项时间戳选项 什么时候发送RST包UDP首部 TCP首部 TCP 首部长度为20字节&#xff0c;加上选项部分最大可达60字节。 第一个4…

微服务远程调用openFeign简单回顾

目录 一. OpenFeign简介 二. OpenFeign原理 演示使用 provider模块 消费者模块 配置全局feign日志 示例源代码: 一. OpenFeign简介 OpenFeign是SpringCloud服务调用中间件&#xff0c;可以帮助代理服务API接口。并且可以解析SpringMVC的RequestMapping注解下的接口&#x…

接口漏洞-DVWS(XXE+鉴权)+阿里云KEY

dvws靶场 靶场&#xff1a;https://github.com/snoopysecurity/dvws-node 开启靶场&#xff0c;注册一个普通用户&#xff0c;登录成功 来到首页点击admin area 发现进入几秒钟之后又跳转回到首页&#xff0c;只有管理员admin用户才能进入。 点击admin area抓包&#xff0c;发现…

C# List 详解四

目录 18.FindLast(Predicate) 19.FindLastIndex(Int32, Int32, Predicate) 20.FindLastIndex(Int32, Predicate) 21.FindLastIndex(Predicate) 22.ForEach(Action) 23.GetEnumerator() 24.GetHashCode() 25.GetRange(Int32, Int32) C#…

实验二十四、滞回比较器电压传输特性的测量

一、题目 滞回比较器电压传输特性的测量。 二、仿真电路 电路如图1所示。 为便于观察电压传输特性的变化&#xff0c;输入信号采用信号发生器产生的幅值为 10 V 10\,\textrm V 10V、频率为 20 Hz 20\,\textrm{Hz} 20Hz 的三角波电压。采用虚拟的运算放大电路&#xff0c;其…

js中的数据结构之栈

js中的数据结构之栈 一、定义 栈是一种限定仅在表尾进行插入和删除操作的线性表&#xff0c;遵循后入先出的原则。 二、描述 栈是和列表类似的一种数据结构&#xff0c;也可以说栈就是一种特殊的列表。 栈里面的元素只能通过列表的一端访问&#xff0c;这一端称为栈顶。相…

树莓派 使用 docker安装showdoc

最近在使用showdoc时感觉挺方便的&#xff0c;但是在树莓派上拉取showdoc对应的镜像时特别慢&#xff0c;熬了一天半发现镜像倒在了最后一步&#xff0c;重试了好几次都没有拉去下来。后来仔细阅读了官网操作文档再加一点小运气今天成功给安装成功了。 showdoc的安装环境&…

Windows系统实现唤醒+合成+命令词智能语音交互

1、之前写过离线能力调用&#xff0c;今天来个终极版&#xff0c;实现智能交互或者结合大模型的智能交互示例&#xff0c;下面进入正题。上B站效果离线唤醒离线合成离线命令词实现智能交互_哔哩哔哩_bilibili 2、到讯飞开放平台下载唤醒合成命令词的离线组合包&#xff0c;找到…

【华为OD机试】按单词下标区间翻转文章内容【2023 B卷|100分】

【华为OD机试】-真题 !!点这里!! 【华为OD机试】真题考点分类 !!点这里 !! 题目描述: 输入一个英文文章片段,翻转指定区间的单词顺序,标点符号和普通字母一样处理。 例如输入字符串 “I am a developer.”,区间[0,3]则输出 “developer. a am I”。 输入描述: 使用换…

【趟坑记录】d3.zoom()的正确使用姿势 @d3.v7

【趟坑记录】d3.zoom()的正确使用姿势 d3.v7 文章目录 【趟坑记录】d3.zoom()的正确使用姿势 d3.v7问题重现原因分析解决方案放缩平移写法特殊修改transform函数的写法 总结 在开发一个D3应用的时候遇到了一个 zoom相关的问题&#xff0c;记录解决思路与方案 问题重现 最近在…

动态监控U盘重启容器

需求背景 Ubuntu机器需要动态根据插入的U盘进行导入数据, 路径是约定为U盘内的固定路径. 但是服务是docker服务, 插入U盘并不会直接挂在到容器内部, 需要重启容器才能生效, 每次手动重启很麻烦, 自动检测U盘路径变化来操作容器. 配置动态监控脚本和服务 编写脚本 vim moni…

Windows 10, version 22H2 (updated Jul 2023) 中文版、英文版下载

Windows 10, version 22H2 (updated Jul 2023) 中文版、英文版下载 Windows 10 22H2 企业版 arm64 x64 请访问原文链接&#xff1a;https://sysin.org/blog/windows-10/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org Window…

FPGA——verilog实现格雷码与二进制的转换

文章目录 一、格雷码简介二、二进制转格雷码三、格雷码转二进制四、仿真 一、格雷码简介 格雷码是一种循环二进制码或者叫作反射二进制码。跨时钟域会产生亚稳态问题&#xff08;CDC问题&#xff09;&#xff1a;从时钟域A过来的信号难以满足时钟域B中触发器的建立时间和保持时…

python实现远程服务器的操作

前言 测试过程中经常会遇到需要将本地的文件上传到远程服务器上&#xff0c;或者需要将服务器上的文件拉到本地就行操作&#xff0c;以前安静经常会用到xftp工具。今天介绍一种python库Paramiko&#xff0c;可以帮助我们通过代码的方式进行完成对远程服务器的上传和下载操作。…

MongoDB University课程M310 MongoDB Security 学习笔记

环境准备 此课程需要两台虚机。因此需要提前安装Vagrant和VirtualBox&#xff0c;这些我已经有了。因此只需要下载课程提供的Vagrant文件m310-vagrant-env.zip就可以了。 解压文件&#xff0c;进入目录&#xff0c;运行以下命令即可&#xff1a; $ cd m310-vagrant-env $ va…

elementui el-table 封装表格

ps: 1.3版本 案例&#xff1a; 完整代码&#xff1a; 可直接复制粘贴&#xff0c;但一定要全看完&#xff01; v-slot"scopeRows" 是vue3的写法&#xff1b; vue2是 slot-scope"scope" <template><!-- 简单表格、多层表头、页码、没有合并列行…

flutter开发实战-Stagger Animation实现水波纹动画

flutter开发实战-实现水波纹动画&#xff0c;使用到了交织动画&#xff0c;实现三个圆逐渐放大与渐变的过程。 一、效果图 二、实现水波纹效果 实现水波纹动画&#xff0c;使用到了交织动画&#xff0c;实现三个圆逐渐放大与渐变的过程。 交织动画 有些时候我们可能会需要一些…

线程系列 7 - JUC高并发容器类

线程系列 7 - JUC高并发容器类 1、JUC高并发容器1.1、为什么需要JUC高并发容器1.2、什么是 JUC 高并发容器1.3、CopyOnWriteArrayList1.4、BlockingQueue1.4.1、阻塞队列的常用方法1.4.2、ArrayBlockingQueue1.4.3、LinkedBlockingQueue1.4.4、DelayQueue1.4.5、PriorityBlocki…