操作系统基础知识(二)--进程/线程

本文深入探讨操作系统中的进程基础,详细解释了进程的概念、组成、状态转换和进程控制原语。重点讲解了进程通信的三种方式。接着转向线程基础,特别是组合实现的多线程模型。调度部分涵盖了各种调度算法,如FIFO、短作业优先、高响应比优先等。还讨论了死锁的概念、预防、避免策略以及银行家算法。最后,列举了经典问题如读者写者问题和哲学家就餐问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、进程基础

1.进程概念

当多道程序进入内存时,操作系统为方便管理这些程序为每道进程都创建了一个PCB来描述这些程序的管理信息。
在这里插入图片描述

2.进程组成

在这里插入图片描述

3.进程的特征

在这里插入图片描述

4.进程的状态转换(重点!)

在这里插入图片描述

5.进程控制相关原语

原语是原子性的(不可中断)!
靠开中断以及关中断完成

原语的功能:
1.更新PCB中的信息包括(修改进程状态标志、将运行环境保存至PCB,将PCB恢复至运行环境)
2.将PCB插入合适的队列
3.分配/回收资源

6.进程通信

6.1共享资源

在这里插入图片描述
在这里插入图片描述

6.2管道通信

在这里插入图片描述
在这里插入图片描述

6.3消息传递

在这里插入图片描述
在这里插入图片描述

二、线程基础

1.线程概念

线程也就是轻量级进程,线程是程序调度(执行流)的最小单位(进程是资源分配的最小单位)

1.1用户级线程

在这里插入图片描述

1.2内核级线程

在这里插入图片描述

1.3组合实现(重点!)

在这里插入图片描述

1.3.1多线程模型

在这里插入图片描述

三、调度

1.调度的概念

狭义上来说:调度指的是从就绪队列选择一个进程的这个过程
广义上来说:调度指的的选择加上切换过程
区别:
作业调度:将外存中的进程调入内存
进程调度:将内存中就绪队列的进程调入运行(分配CPU)

2.调度的三个级别

在这里插入图片描述

3.调度算法指标

  • CPU利用率: 忙碌时间/总时间
  • 吞吐量: 总共完成多少道作业/总共花费的时间(单位:道/秒)
  • 带权周转时间:周转越短、实际越长越好
    在这里插入图片描述
  • 等待时间:周转-运行-i/o操作

4.调度算法

图例:在这里插入图片描述

4.1 FIFO(先到先服务)非抢占

在这里插入图片描述

4.2 SJO(短作业优先)默认非抢占/抢占

在这里插入图片描述

周转时间:p1:16-0=16p2:7-2=5p3:5-4=1p4:11-5=6
带权周转时间-》周转/运行p1:16/7p2:5/4p3:1/1p4:6/4
等待时间p1:16-7=9p2:5-4=1p3:1-1=0p4:6-4=2
平均带权周转时间带权周转时间之和/作业总数
平均等待时间等待时间之和/作业总数

4.3 HHRN(高响应比优先算法)非抢占

响应比算法=(等待时间+要求服务时间)/ 要求服务时间
在这里插入图片描述

4.4对比

在这里插入图片描述

4.5 RR(时间片轮转)抢占

注1:
若时间片结束后进入就绪队列与新进程进入就绪队列同时发生,优先后者

注2:
若时间片过大:会导致算法退化成FIFO;
若时间片过小:会导致频繁的切换进程浪费资源

在这里插入图片描述

4.6 优先级调度算法(非抢占/抢占)

抢占式:
在这里插入图片描述
注:
操作系统会偏向I/O繁忙型进程,不偏向CPU繁忙型进程;因为优先I/O可以尽早的让I/O设备投入工作,增大系统的吞吐量、效率等等

4.7 多级反馈队列

在这里插入图片描述
在这里插入图片描述

四、经典题型:

1.读者写者问题:

在这里插入图片描述

Sempahore rw = 1;	//读写临界区的互斥
int count = 0;
Sempahore mutex = 1;
Sempahore w = 1;
//读者优先,写者可能会饿死
//写者优先,写者与读者由同等的优先级
 写者:
//V(w)	//写者优先
P(rw);V(rw);
//P(w)	//写者优先
 读者:
//P(w)	//写者优先
P(mutex)
count++;
if (count==1){P(rw)};
V(mutex)
//V(w)	//写者优先P(mutex)
count--
if(count==0){V(rw)};
V(mutex)

2.哲学家就餐问题

int[5]{1,1,1,1,1} person;
int[5]{1,1,1,1,1} util;
person[i]:
if(i!=4){
if(i%2==0){	P(i+1);P(i);}//偶数先拿左边的筷子
else{P(i);P(i+1);}//奇数数先拿右边的筷子
}else{P(0);P(4);}

五、死锁

1.死锁的概念

1.1死锁、饥饿、死循环的区别

在这里插入图片描述

1.2死锁产生的必要条件

在这里插入图片描述

2.预防死锁

在这里插入图片描述

3.避免死锁

3.1安全序列

安全状态:分配资源后只要能找到一个安全序列的状态就叫做安全状态
不安全状态:找不到任何安全序列

在这里插入图片描述
== 不安全状态下没有发生资源请求就不是死锁,并且若此时有资源释放可能会回到安全状态下==

3.2银行家算法(重点!)

3.2.1算法概念

在这里插入图片描述

3.2.2算法流程及其具体实现

在这里插入图片描述

//1.获得对应需要的5个数组
int[][] allocation = Arrayss.getAllocation();	进程已分配资源
int[][] max = Arrayss.getMax();					进程最大需求资源数
int[][] need = max - allocation;				进程还需要的资源数
int[][] available = Arrayss.getAvailable();		可分配的资源数
int[][] request = Arratss.getRequest();			进程请求的资源数
//2.判断请求数组是否虚假报数
if(request<=need){}else{阻塞}
//3.判断可分配资源是否大于请求资源
if(available>=request){}else{阻塞}
//4.假允许请求,判断请求后是否为安全状态
allocation += request;							进程已分配资源更新
need -= request;								进程需要资源更新
available -= request;							可分配的资源数更新
if(availavle > any need){}{剥夺这次更新,并返回阻塞该请求}
//5.安全状态,等待下次请求或资源释放,放回第二步


4.死锁检测算法

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值