操作系统笔记(1)进程相关

进程同步:多个相关进程在执行次序上进行协调,使并发执行的进程之间能按照一定的规则共享系统资源,并能很好的合作,从而使进程的执行具有可再现性。

进程之间可能存在互斥或者同步的关系。

互斥(间接相互制约关系):访问临界资源。临界资源:一段时间内只允许一个进程访问的资源。

同步(直接相互制约关系):进程合作。

临界区:临界资源必须互斥访问,访问临界资源的代码称为临界区。

进入区:每个进程在进入临界区钱,应先对临界资源进行检查,看是否正被访问。

退出区:在临界区后,用于将临界区正被访问的标志恢复为未被访问的标志。

while(TRUE){
   进入区;
   临界区;
   退出区;
   剩余区;
}

同步机制应遵循的规则:

(1)空闲让进:临界区无进程访问,让请求进入的进程立即进入

(2)忙则等待:临界区有进程访问,请求进入的进程必须等待

(3)有限等待:要求请求访问临界资源的进程,在有限时间内进入临界区,以免陷入死等。

(4)让权等待:当进程不能进入自己的临界区,应立即释放处理机。

进程同步机制:

硬件实现:关中断

在进入锁测试之前关闭中断,直到完成锁测试并上锁后才打开中断。进程在临界区执行期间,计算机系统不响应中断,不会引发调度或进程切换。

优点:保证了对锁的测试和关锁的连续性和完整性,保证互斥。

缺点:(1)滥用关中断导致严重后果(2)关中断时间过程,影响系统效率,限制处理机交叉执行程序的能力(3)关中断不适用于多CPU系统,因为在一个处理器上关中断并不能防止进程

(2)利用Test and Set指令

通过专门提供的TS指令(原语)

boolean TS(boolean *lock):
   boolean old;
   old=*lock;
   *lock=TRUE;
   return old;

*lock是FALSE时,表示该资源空闲;

*lock是TRUE时,表示该资源正在被使用;

用 TS指令管理临界区时,为每个临界区设置一个布尔变量lock,由于变量lock代表资源的状态,所以可以把它看成一把锁。

do{
  ...
  while TS(&lock);
  critical sectiom;
  lock=FALSE;
  remainder section;
}while(TRUE);

(3)利用swap指令实现进程互斥

该指令称为对换指令,在intel8086中又称XCHG指令,用于交换两个字的内容。

void swap(boolean *a,boolean *b){
     boolean temp;
     temp=*a;
     *a=*b;
     *b=temp;
}

为每个临界资源设置一个全局的布尔变量lock,,初值为false,在每个进程中再利用一个局部布尔变量key

do{
  key=TRUE;
  do{
    swap(&lock,&key);
  }while(key!=FALSE);
  临界区操作
  lock=FALSE;
}

当lock为TRUE时,说明有进程在占用临界区,swap指令执行后key依然是TRUE。如果占用临界却的进程一直不释放临界区,那么lock一直为 TRUE,那么会一直在循环中等待。

利用上述硬件能够有效地实现进程互斥,但是临界资源忙碌时,其他访问进程必须不断地测试,处于忙等的状态。

信号量实现:

 信号量机制:

进程同步工具。从整型信号量经记录型信号量,进而发展为“信号量集"机制。

(1)整型信号量:

表示资源数目的整型量S。除初始化外,仅能通过两个标准的原子操作wait(S)和signal(S)来访问。又称为PV操作。

P操作:

wait(S):
   while s<=0;
   S--;

V操作:

signal(S):
  S++

(2)记录型信号量 

在整型信号量机制中的wait操作,只要是信号量S<=0,就会不断的测试。

因此,该机制并未遵循让权等待的准则,而是使进程处于忙等的状态。

但在采取让权等待的策略后,又会出现多个进程等待访问同一临界资源的情况。

为此,在记录型信号量机制中,除了需要一个用于代表资源数目的整型变量value外,还应该增加应该进程链表指针List,用于链接所有的等待进程。

typedef struct{
   int value;
   struct process control *list;
}semaphore;

相应的wait(S)和signal(S)操作描述如下:

wait(semaphore *S){
  S->value--
  if(S->value<0)block(S->list);
}
signal(semaphore *S){
  S->value++;
  if(S->value<=0)wakeup(S->list);
}

说明:

S:资源信号量。

S->value的初值:系统中某类资源的数目

wait操作:     进程请求一个单位资源。

S->value--:  使系统中可供分配的该类资源减1

S->value<0:表示该类资源已分配完毕,因此调用block原语进行自我阻塞,放弃处理机,并插入到信号量链表S->list中。

若加1后仍是S->value<=0,则表示在该信号量链表中仍有等待该资源的进程被阻塞,所以还应该调用wakeup原语,将S->list链表中的第一个等待进程唤醒。

S->value初值为1:只允许应该进程访问临界资源,此时的信号量转化为互斥信号量,用于进程互斥。

(3)AND型信号量:

将进程在整个运行过程中需要的所有资源,一次性全部地分配给进程,待进程使用完后再一起释放。

要么把它所请求的资源全部分配到进程,要么一个也不分配。这样可以避免死锁的发生。

Swait(s1,s2,...,sn);
Ssignal(s1,s2,...,sn);

(4)信号量集

Swait(s1,t1,d1,...,sn,tn,dn);
Ssignal(s1,d1,...,sn,dn);

Swait(si,ti,di):如果资源si个数小于t1,则不予分配。如果允许分配,进程对该资源的需求值为di,即进行si=si-d操作。

管程实现:

  管程定义:

代表共享数据资源的【数据结构】以及由对该共享数据结构实施操作的【一组过程】组成的资源管理程序。

(1)进程对共享资源的申请、释放和其他操作必须通过这组过程,间接地对共享数据结构实现操作。

(2)每次只能由一个进程进入管程,执行这组过程,使用共享资源,达到对共享资源所有访问的统一管理,有效地实现进程互斥。

管程构成:名称、共享数据结构、操作数据的一组过程、数据初始化

条件变量:

一个进程被阻塞或挂起的条件由多个,因此在管程中设置了多个条件变量,对这些条件变量的访问只能在管程中进行。

每个条件变量保存了一个链表,用于记录因该条件变量而阻塞的所有进程,同时提供操作wait和signal。

(1)x.wait:调用管程的进程因条件x需要被阻塞或挂起,则调用x.wait将自己插入到x条件的等待队列上,并释放管程,直到x条件变化。此时其他进程可以使用该管程。

(2)x.signal:正在调用管程的进程发现x条件发生了变化,则调用x.signal,重新启动一个因x条件而阻塞或挂起的进程,如果存在多个这样的进程,则选择其中一个,如果没有,继续执行原进程。(信号量singal执行s++,而管程不执行)

管程中包含面向对象的思想,将数据和操作都封装在一个对象的内部,隐藏了实现的细节。

管程内部数据只能通过管程的进程访问;管程的过程只能访问内部的数据。

【管程的特性】

模块化:管程是一个基本程序单位,可以单独编译

抽象数据类型:管程中不仅由数据,而且由对数据的操作

信息掩蔽:管程中的数据只能被管程的过程调用

进程和管程的不同

题目:

进程调度

 进程调度的任务:

(1)保存处理机的现场信息:保存当前进程的处理机的现场信息,如程序计数器,多个通用寄存器的内容。

(2)按某种算法选取进程:按某种算法从就绪队列中选取一个进程,将其状态改为运行状态,并准备把处理机分配给它。

(3)把处理器分配给进程:PCB现场信息装入处理器响应的各个寄存器中,把处理器的控制权交予该进程,让它从上次的断点处恢复运行。

进程调度方式:

(1)非抢占方式:一旦处理机分配给某进程后,一直让它运行下去,直至该进程完成。

(2)抢占方式:允许调度程序按某种原则,去暂停某个正在执行的进程,将已分配给该进程的处理机重新分配给另一进程。

优点:

(1)在批处理系统,可以防止一个长进程长时间占用处理机。

(2)在分时系统中使用抢占式可以实现人机交互。

(3)在实时系统中,抢占方式能满足实时任务的需求。

抢占的常见情况:

优先权高的进程抢占、短进程抢占、时间片抢占。各进程按时间片轮流运行,当一个时间片用完后,便停止了该进程的执行而重新进行调度。抢占的本质是进程还没运行完就被暂停运行,换其他进程运行

进程调度算法:

作业调度算法同样适用于进程调度:FCFS,SJF,HRRN

时间片轮转调度算法(RR):分时系统,常用时间片轮转调度算法。

在RR调度算法中,系统根据FCFS策略,将所有的就绪进程排成一个就绪队列,并可设置每隔一定时间间隔产生一次中断,激活系统中的进程调度程序,将CPU分配给队首进程。

如果时间片未用完,进程运行完,并从就绪队列删除,调度其他进程运行。如果时间片用完,进程未运行完,进程放入队尾。

采用公平的分配方式,即让就绪队列上的每个进程每次仅运行一个时间片。

如果就绪队列上有n个进程,则每个进程每次大约都可获得1/n的处理机时间。

RR调度不会产生饥饿现象,因为就绪队列采用FCFS策略,每个进程都可以获得CPU时间片,只不过短进程可以在时间片内完成,而长进程在时间片内完不成就放到就绪队列末尾,等待下一轮调度。RR调度可以实现人机交互(抢占式调度)。

时间片大小的确定:略大于一次典型的交互所需要的时间

大多数交互式进程能在一个时间片内完成,从而可以获得很小的响应时间。

时间片小,有利于短作业,但是会频繁地执行进程调度和进程上下文的切换,会增加系统的开销。

时间片太长,RR算法退化为FCFS算法。所有进程都能在一个时间片内完成,无法满足短作业和交互式用户的需求。

时间片的引入:

如果进程阻塞或结束,需要进行切换,不会造成CPU资源浪费。但由于只有一个CPU一次只能处理程序要求的一部分,为了能够公平,一种方法就是引入时间片每个程序轮流执行。
 

优先级调度算法:

非抢占式优先级调度算法:

一旦把处理机分配给就绪队列中的优先级最高的进程后,该进程便一直执行下去直至完成。

抢占式优先级调度算法:

在执行期间,只要出现了另一个优先级更高的进程,调度程序就将处理机分配给新到的优先级最高的程序。

优先权的类型:

静态优先权:在创建进程时确定,在进程的整个运行期间保持不变。

确定静态进程优先权的依据:

进程类型:系统进程优先权高于一般用户进程的优先权

进程对资源的需求:要求少的进程应赋予较高的优先权

用户要求:根据用户要求

动态优先权:在创建进程时所赋予的优先权,可以随进程的推进或随其等待时间的增加而改变。

例:在就绪队列中的进程,随其等待时间的增长,其优先权以速率a提高。优先权初值低的进程可能升为最高,从而获得处理机。

例:当采用抢占式优先权调度算法时,如果再规定当前进程的优先权随运行时间的推移以速率b下降,可防止一个长作业长期垄断处理机。

多级反馈队列调度算法:使短作业和长作业都可以满意

设置多个就绪队列,并为每个队列赋予不同的优先级。第一个队列的优先级最高,第二个次之。优先级越高,时间片越小。每个队列都采用FCFS算法。

当新进程进入内存后,首先将它放入第一队列的末尾,按FCFS等待调度。

当轮到该进程执行时,如它能在该时间片内完成,便可撤离系统。否则,转入第二队列的末尾等待调度。否则,放入第三队列队尾....。当进程最后被降到第n队列后,在第n队列中便采取按RR方式运行。调度程序首先调度最高优先级队列中的诸进程运行,仅当第一队列空闲时才调度第二队列中的进程运行.....

性能:

终端型作业用户:作业通常较小,系统只要使这些作业在第一队列所规定的时间片内,便可使终端型作业用户都感到满意。

短批处理作业用户:对于稍长的短作业,只需在第2-3队列各执行一时间片完成,其周转时间仍然较短。

长批处理作业用户:最后在第n个队列按轮转方式运行。用户不必担心长期作业得不到处理。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

f4pga环境搭建教程

f4pga环境搭建教程 背景介绍 FOSS Flows For FPGA (F4PGA) project&#xff0c;是一套开源的FPGA工具链&#xff0c;号称the GCC of FPGAs&#xff0c;作用是将写的硬件描述语言&#xff08;verilog或VHDL&#xff09;转化为可以在FPGA上运行的可执行文件&#xff08;bit文件…

如何在Google App Engine上构建一个简单的应用

一位用户在学习使用Python语言进行Google App Engine开发时遇到了困难&#xff0c;他希望构建一个简单的应用程序&#xff0c;该应用程序可以从用户处获取姓名&#xff0c;将姓名写入数据存储&#xff0c;然后检索姓名并显示页面。他尝试了教程&#xff0c;但仍然不了解如何实现…

day2数据结构

双链表的插入 循环链表&#xff0c;判断循环链表是否为空 指向的是自己 仅设表尾指针的循环链表合并 代码举例 删除线性表的最小值&#xff0c;并由函数返回删除的值&#xff0c;空的位置&#xff0c;由最后一个元素填补&#xff0c;若表为空显示出错信息 &L 因为L会发生…

排序算法——快速排序(队列和栈实现非递归)

一、背景 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法&#xff0c;其基本思想为&#xff1a;任取待排序元素序列中的某元素作为基准值&#xff0c;按照该排序码将待排序集合分割成两子序列&#xff0c;左子序列中所有元素均小于基准值&#xff0c;右子序列中…

【php实战项目训练】——thinkPhP的登录与退出功能的实现,让登录退出畅通无阻

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

对新手友好的最简单方便的本地项目关联git远程仓库教程

对新手友好的最简单方便的本地项目关联git远程仓库教程 前置条件1.本地项目2.gitee上创建同名项目 关联操作1.在本地进行clone远程仓库操作2.把本地项目下的目录和文件都复制到这个克隆自git的项目文件夹里面3.查看文件状态和提交文件 在我们创建项目时&#xff0c;一般都是在本…

Java IO流的基本概念和使用,包括文件读写、序列化等

Java 输入输出&#xff08;IO&#xff09;系统提供了一套丰富的类和接口&#xff0c;用于处理文件读写、网络通信、数据序列化等各种数据操作。 IO 操作在任何编程语言中都扮演着重要角色&#xff0c;而 Java 的 IO 系统以其强大的灵活性和扩展性&#xff0c;成为开发者进行数…

【全开源】Fastflow工作流系统(FastAdmin+ThinkPHP)

&#x1f680;Fastflow工作流系统&#xff1a;高效协作&#xff0c;流程无忧​ 一款基于FastAdminThinkPHP开发的可视化工作流程审批插件&#xff0c;帮助用户基于企业业务模式和管理模式自行定义所需的各种流程应用&#xff0c;快速构建企业自身的流程管控体系&#xff0c;快…

短剧cps系统搭建开发,热门短剧推广分销系统。短剧分销是怎么操作的?

目录 前言&#xff1a; 二、短剧是怎么推广分销的&#xff1f; 二、 短剧分销系统有什么功能&#xff1f; 三、怎么搭建&#xff1f; 总结&#xff1a; 前言&#xff1a; 短剧分销项目目前的现状是多元化且充满活力的。随着短剧市场的快速发展和观众接受度的提高&#xff0…

浏览器打不开网页是什么原因?这里有详细解答!

在日常使用电脑的过程中&#xff0c;我们经常需要通过浏览器访问各种网站。然而&#xff0c;有时会遇到浏览器无法打开网页的情况&#xff0c;这可能导致工作中断或者无法获取所需的信息。那么浏览器打不开网页是什么原因呢&#xff1f;其实浏览器无法打开网页的原因可能有很多…

stm32-DMA转运数据

在配置前要记得先定义一下DMA转运的源端数组和目标数组两个数组哦。 接下来我们就开始准备配置吧 配置 初始化 1.RCC开启时钟&#xff08;开启DMA的时钟&#xff09; void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState) 作用&#xff1a;开启时…

JUC 笔记 8

1. Semaphore 信号量 基本使用 [ˈsɛməˌfɔr] 信号量&#xff0c;用来限制能同时访问共享资源的线程上限。 public static void main(String[] args) {// 1. 创建 semaphore 对象Semaphore semaphore new Semaphore(3);// 2. 10个线程同时运行for (int i 0; i < 10; …

一款史上最强的智能优化算法软件,MATLAB APP Designer开发

很久没有整理干货了&#xff0c;原因是最近一直在精心打磨一款智能优化算法APP&#xff0c;前前后后改了很多次&#xff0c;今天终于完工了&#xff01;接下来跟我一起来看看这款软件吧&#xff01; 目录 引言 01 单个算法测试介绍 02多种算法对比介绍 03软件安装及一些限…

深入解析ETL与ELT架构:数据集成技术的演进与发展

摘要&#xff1a;随着大数据时代的到来&#xff0c;数据集成成为企业信息化建设的重要环节。本文将深入探讨ETL与ELT两种架构&#xff0c;分析它们在数据处理、性能、可扩展性等方面的差异&#xff0c;为企业数据集成提供技术指导。 一、引言 在大数据时代&#xff0c;企业需要…

slf4j等多个jar包冲突绑定的排查方法使用IDEA的maven help解决

1.安装 2.使用maven help解决&#xff0c;找到对应包存在的冲突 使用exclude直接解决即可

HTML跨年烟花

目录 写在前面 关于小编 HTML简介 程序设计 系列文章 写在后面 写在前面 学会了这个html烟花秀&#xff0c;跨年就不缺文案喽~ 关于小编 平易近人&#xff0c;慈眉善目&#xff0c;爱交朋友&#xff0c;舍己为人&#xff0c;和蔼可亲&#xff0c;能说会道&#xff0c;…

解决 Mac Django 连接Mysql 出现 image not found 问题

最近在使用 Django 框架&#xff0c;因为升级到4.2版本了&#xff0c;对应的本机 Mysql 5.7 就不适用了&#xff0c;于是升级到了 Mysql 8.0&#xff0c;写好代码之后出现如下错误&#xff1a; 仔细分析一下错误的描述&#xff1a; ImportError: dlopen(/Library/Frameworks/P…

【安装笔记-20240529-Windows-Electerm 终端工具】

安装笔记-系列文章目录 安装笔记-20240529-Windows-Electerm 终端工具 文章目录 安装笔记-系列文章目录安装笔记-20240529-Windows-Electerm 终端工具 前言一、软件介绍名称&#xff1a;electerm主页官方介绍功能特性 二、安装步骤测试版本&#xff1a;electerm-1.39.35-win-x…

Pixi绘制地图和小车

之前已经用Pixi绘制出了各种图形以及通过图片绘制精灵&#xff0c;这节用pixi绘制网格地图&#xff0c;并通过图片制作一个Sprite&#xff0c;让这个Sprite在网格地图上运动。首先需要在页面中添加一个div用来后期展示canvas的画布&#xff0c;并将此div实例化为PIXI的Applicat…

Doris 少数SQL在Datagrip无法执行,而在DorisUI或程序调用可以执行的问题

问题&#xff1a;Doris 少数SQL在Datagrip无法执行&#xff0c;而在DorisUI或程序调用可以执行 解决&#xff1a;Datagrip 执行SQL切分异常&#xff0c;设置默认执行语句方式&#xff0c;将分句改为整句执行 但是 支持多SQL批量分开执行更好用