OS1_进程与线程的管理

这篇具有很好参考价值的文章主要介绍了OS1_进程与线程的管理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

序言

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

Question

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

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

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

进程

  • 进程是一段指令流,还是?process=PCB+data section+code section
    PCB=处理器(时间片轮转比其他设备周期短,单成1列)+其他资源+进程控制与管理信息+PIDUUID
  • 不同的进程是如何利用系统资源(IO,MM,CPU)的?
  • 进程之间如何通信?进程如何运转?
    OS1_进程与线程的管理,408,系统架构
  • 通信方式的对比
  1. 共享存储只有OS提供存储空间和互斥工具(P(S),V(S)),数据的交换由用户实现
  2. 消息传递中进程通过发送和接受信息原语,数据交换由OS完成,网络中的通信就是由OS的网络部分完成的
  3. 管道通信=共享存储’s upgraded version,管道为半双工通信的存储区域,且写满buffer才会release,因此不会出现其他进程写而导致读取被阻塞的现象
  • 另外有意思的是父进程与子进程的权限继承,进程的权限to a file comes from 用户标识和文件属性collaborative determination.

线程

  • 线程是处理器调度与分配的基本单元
  • 进程是除了处理器之外其他资源的分配单位——IO,MM的分配单元
  • 进程分割为线程的猜测——线程=循环指令流中不交叉的最小块
    OS1_进程与线程的管理,408,系统架构

进程调度

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

      共享存储只有OS提供存储空间和互斥工具(P(S),V(S)),数据的交换由用户实现
      消息传递中进程通过发送和接受信息原语,数据交换由OS完成,网络中的通信就是由OS的网络部分完成的;
      管道通信的管道,为半双工通信的存储区域,因此不会出现进程阻塞的现象
    

OS1_进程与线程的管理,408,系统架构

同步与互斥

同步与互斥都围绕共享资源的使用:
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大准则:
空则让进,忙则等待,有限等待,(让权等待)。

硬件实现——简单可靠,但不能实现让权等待,perform low efficiency

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

  1. 中断屏蔽:关中断,临界区,开中断,那一个进程进入critical area其他进程不能交替执行
  2. 硬件指令方法:TestandSet或Swap原子操作
boolean TestandSet(boolean *lock){
	boolean old;
	old=*lock;
	*lock=true;
	return old;;
}
while TestandSet(&lock);
临界区
lock=false;
剩余区

postscript:只有lock==false(原先不被占用),才能获得锁,并将lock置为ture
premium:TestandSetfunction必须为原子操作,不可分割,can be only accessed by one function,否则导致多进程同时占用lock,把这个设为一条指令,单CPU不会出现the scene.
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查询,占用处理机资源,不能实现让权等待;

software implement/enforcement

approach defect offended rule
单标志-turn 互斥两进程必须同时进入临界区 空闲让进
双标志先检查法 可能同时进入临界区 忙则等待
double-symbol
examined later
flag1,2==true,无法进入临界区 有限等待
peterson(双标志+turn) none
hardware command 一个指令进入临界区耗费处理机时间
可能一直选不上
让权等待
有限等待
  • review:peterson utilize turn to settle starvation phenomenon,double-symbol examined later to solve enter critical area simultaneously.

对比

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

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

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

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

临界区互斥的其他方法

mutually exclusive lock

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

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

采用两个不可中断(为软件method,achieved by 屏蔽中断方法)的原语—wait和signal来管理
There are two signal realization mechanism as integral and record-type.

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

Defect:wait在无资源可用,will continuously occupy cpu(conduct while query),offend 让权等待

记录型信号量
  • 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);
	}
}

Application of signal mechanism

  1. 同步

进程按照(资源的)特定顺序执行
each synchronous relationship is confered with an exclusive resource with num=1

semaphore S=0;
P1(){
	x;
	V(S);
	...
}
P2(){
	...
	P(S);
	y;
	...
}
  1. further,用同步实现前驱关系——每个偏序关系用1个资源
S1(){
	V(a1);
}
S2(){
	P(a1);
	V(b1);V(b2);
}
...

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

  1. 互斥—只有1个进程能进入临界区
  • P(S)请求资源;V(S)释放资源
semaphore S=1;
P1(){
	...
	P(S);
	critical area;
	V(S);
}
P2(){
	...
	P(S);
	critical area;
	V(S);
}
Note
  1. in internal part of a process 不用set synchronous signal superfluously
  2. sender are required to release entity (signal(Sx)) only,while receiver are requested to request (wait(Sx)) merely.

管程—信号量的封装类

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

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

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

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

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

经典同步问题

Essence: 用信号量机制表示 1)互斥资源的访问;2)偏序关系

生产者、消费者

  • 明明可以用num表示缓冲区的数目,为了符合P(锁),V(释放)的形式(值得唾弃),

缓冲区为互斥资源,expressed as mutex;
缓冲区的单元为一种资源,为什么消费者和生产者不share一种资源?
消费者需要的是满的块,producer需要的是空的块,故用两种资源full and empty表示
只有consumer之间与producer之间才公用一种资源,用signal(full)和wait(full) to describe competitive relation;

放苹果橘子

  • 可以把事件的同步与互斥用箭头表示,每个同步关系用一个针对互斥资源的P(),V()表示;

桌子一个时刻只有一个人能占用,为互斥资源,用一个table变量express
Dad放了apple daughter才能吃,用信号量 apple 表示偏序,

OS1_进程与线程的管理,408,系统架构

读者-写者

  • 终于用count表示资源读者的数量,为了count错误修改,自然加个mutex的PV锁;

文件为特定条件下的互斥资源,写者与其他人的互斥用rw锁表示读者与写者的互斥,
第一个读者访问时需要互斥,读者可以共同访问,因此后续的读者访问不用申请rw lock
不过这样需要用count记录读者的数量,不同的读者间对count的访问用mutex来避免差错
OS1_进程与线程的管理,408,系统架构

summary to universal solution

  1. 对每个互斥资源用一个信号量表示,name it rw
  2. 对每个偏序关系用一个信号量表示
  3. 对每个共享变量加一个互斥锁来避免RAW等差错
  4. 根据context 自定义变量来控制对互斥资源的特殊访问

rest questions

  • 哲学家就餐就非常social了,一个时刻只有一个人能pick up 筷子~~
  • 吸烟者问题,吸完烟要向供应商发信号,也要用个锁~~
    OS1_进程与线程的管理,408,系统架构

死锁

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

死锁处理

OS1_进程与线程的管理,408,系统架构


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

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


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

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

预防中的消除循环等待和请求并保持,均不可行,
OS1_进程与线程的管理,408,系统架构文章来源地址https://www.toymoban.com/news/detail-600922.html

到了这里,关于OS1_进程与线程的管理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++进程、线程、内存管理

    目录 进程和线程区别 进程和线程切换的区别 系统调用流程 系统调用是否会引起线程切换 为什么需要使用虚拟内存 本质区别: 进程是资源分配的基本单元。 线程是操作系统调度的基本单元。 地址空间: 进程具有独立的虚拟地址空间。 线程共享进程的虚拟地址空间。 内存

    2024年02月10日
    浏览(30)
  • (学习笔记-进程管理)线程

    在早期的操作系统都是以进程为独立运行的基本单位,直到后面,计算机科学家们提出了更小的能独立运行的基本单位: 线程   举个例子,假设要编写一个视频播放软件,那么软件功能的核心模块有三个: 从视频文件中读取数据 对读取的数据进行解压缩 把压缩后的视频数

    2024年02月14日
    浏览(23)
  • 操作系统进程线程(一)—进程线程协程区别、多进程多线程、进程调度算法、进程线程通信

    定义上 进程: 资源分配和拥有 的基本单位,是调度的基本单位。 运行一个可执行程序会创建一个或者多个进程;进程就是运行起来的程序 线程:程序 执行 基本单位,轻量级进程。 每个进程中都有唯一的主线程 ,主线程和进程是相互依赖的关系。 协程: 用户态 的轻量级

    2024年02月01日
    浏览(39)
  • (学习笔记-进程管理)多线程冲突如何解决

    对于共享资源,如果没有上锁,在多线程的环境里,很有可能发生翻车。 在单核 CPU 系统里,为了实现多个程序同时运行的假象,操作系统通常以时间片调度的方式,让每个进程每次执行一个时间片,时间片用完了,就切换下一个进程运行,由于这个时间片的时间很短,于是

    2024年02月13日
    浏览(33)
  • openxr runtime Monado 源码解析 源码分析:整体介绍 模块架构 模块作用 进程 线程模型 整体流程

    monado系列文章索引汇总: openxr runtime Monado 源码解析 源码分析:源码编译 准备工作说明 hello_xr解读 openxr runtime Monado 源码解析 源码分析:整体介绍 模块架构 模块作用 进程 线程模型 整体流程 openxr runtime Monado 源码解析 源码分析:CreateInstance流程(设备系统和合成器系统)C

    2024年02月11日
    浏览(68)
  • 汽车电子笔记之:AUTOSA架构下的多核OS操作系统

    目录 1、AUTOSAR多核操作系统 1.1、OS Application 1.2、多核OS的软件分区 1.3、任务调度 1.4、核间任务同步 1.5、计数器、报警器、调度表 1.6、自旋锁与共享资源 1.7、核间通信IOC 1.8、OS Object中元素交互 1.9、多核OS的启动与关闭 2、多核OS注意事项 2.1、最小部署单元 2.2、核间通信及影

    2024年02月11日
    浏览(29)
  • 操作系统进程线程(三)—进程状态、同步互斥、锁、死锁

    原子操作的概念 原子操作就是不可中断的一个或者一系列操作。 原子操作如何实现 总线锁定 使用处理器提供的一个LOCK#信号,当一个处理器在总线上输出此信号的时候,其他处理器的请求将被阻塞住,那么该处理器可以独占内存。 缓存锁 总线锁开销比较大,因为把CPU和内

    2024年02月04日
    浏览(31)
  • 【操作系统——进程与线程(一)】

    2.1.1 进程的概念和特征 进程是指正在执行中的程序的实例。它是计算机系统进行资源分配和调度的基本单位。每个进程都有自己的地址空间、堆栈和数据区域,以及与其他进程通信和同步所需要的操作系统资源。 进程具有以下特点: 独立性:进程是独立的执行实体,拥有自

    2024年02月11日
    浏览(35)
  • 《深入Linux内核架构》第2章 进程管理和调度 (2)

    目录 2.4 进程管理相关的系统调用 2.4.1 进程复制 2.4.2 内核线程 2.4.3 启动新程序 2.4.4 退出进程 本专栏文章将有70篇左右,欢迎+关注,订阅后续文章。 1. _do_fork函数         fork vfork clone都最终调用_do_fork                 clone:通过CLONE_XX标志精确控制父子进程共享哪

    2024年04月11日
    浏览(28)
  • 操作系统-进程和线程-同步、互斥、死锁

    目录 一、同步互斥  二、互斥的实现方法 2.1软件实现 2.1.1单标志法 2.1.2双标志先检查 2.1.3双标志后检查 2.1.4Petersons算法 2.2硬件实现 2.2.1 TestAndSet指令 2.2.2 Swap指令   三、信号量机制 3.1整形变量  3.2 记录型变量  3.3用信号量实现进程互斥、同步、前驱关系 3.3.1互斥  3.3.2同步

    2024年02月08日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包