当前位置: 首页 > news >正文

计算机操作系统进程(4)

系列文章目录

第二章:进程的描述与控制


文章目录

  • 系列文章目录
  • 前言
  • 一、临界区的概念和描述:
  • 二、硬件同步机制:
    • 1.关中断
    • 2.利用Test-and-Set指令实现互斥
    • 3.利用Swap指令实现进程的互斥
  • 总结


前言

  上一篇我们仅仅讲了一点关于线程同步的概念,临界区和同步机制应遵循的规则,这篇我们文章仅仅给大家讲一下软硬件的是如何实现同步机制的,下面我们会使用类c语言来进行实现,正好也复习了一下C语言的内容。


提示:以下是本篇文章正文内容,下面案例可供参考

一、临界区的概念和描述:

   临界区很重要,所以我还是想先给基础打好,带着大家再复习一下     

不论是软件临界资源还是硬件临界资源,多个进程必须互斥地对它进行访问。在每个进程中访问临界资源的那段代码称为临界区。

下面是对访问临界资源的循环进程描述如下:

   

 while(True){
 
   进入区//enter section
   临界区//critical section
   退出区//exit section
   剩余区//reminder section


}

   进入区是因为如果此刻该临界资源正在被某进程访问,则本进程不能进入临界区。所以必须在临界区前面添加一段用于检查上述的代码。

  退出区是为了用于将临界区正在访问的标志恢复为未被访问的标志。(下面都有具体实现

    剩余区就是进程中除上述进入区,临界区及退出区之外的其它部分的代码在这里都称为剩余区。

   至于同步机制应遵循的原则就看我上面进程(3)的内容吧

 1.空闲让进 2.忙则等待 3.有限等待 4.让权等待(例子: 释放CPU资源)

二、硬件同步机制:

1.关中断

     关中断是 实现互斥的最简单方法之一。在进入锁测试之前关闭中断,直到完成锁测试并上锁之后才能打开中断,这样进程在临界区执行期间,计算机系统不响应中断,从而不会引发调度,也就不会发生进程和线程切换。

但万事都有利有弊,缺点就是:

(1)滥用关中断权力可能导致严重后果

(2)关中断时间过长,会影响系统效率,限制了处理器交叉执行程序的能力

(3)关中断方法也不适用于多CPU系统,因为一个又阻止不了多个。

2.利用Test-and-Set指令实现互斥

     

boolean TS(boolean *lock){
   boolean old;
     old = *lock; 
   *lock = TRUE;
    return old;
}
do{
....

while TS(&lock);     


critical section;
Lock = FALSE;
remainder section;

}while(TRUE);

     以我的理解给大家解释一下,其实这里面按字面意思理解就行,就是我们把Lock变量当作一把锁,因为我们要实现互斥肯定要只能当前有一个线程来运行,然后刚开始的临界资源就是空闲的,所以Lock置为False,这时肯定能进入临界区,此时TS当中的Lock已经变成了TRUE,即上锁了,然后该进程访问完临界资源后就将Lock置为False,下一个线程就可以再进来了。

3.利用Swap指令实现进程的互斥

       

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

key = TRUE;
do{

swap(&lock,&key);

}while(key!=FALSE);
//临界区操作;
lock = FALSE;
......

}while(TRUE);

    swap函数是一个对换指令,用于交换两个字的内容。

 这其实本质也是一个设置一个锁,方法是为每一个临界资源设置一个全局的布尔变量Lock,其初值为false,在每个进程中再利用一个局部布尔变量Key。

当临界资源忙碌时,其他访问进程必须不断的进行测试,处于一种“忙等”状态,不符合“让权等待”的原则,造成处理机的浪费,同时也很难它们用于解决复杂的进程的同步问题。

    注意:这里面的Key是一个全局变量,所有进程都共享,进来的时候Key都先为TRUE,注意这里的每个进程都是会重头做的。


总结

以上就是今天要讲的内容,仅仅讲了一个硬件同步机制,时间太晚了,下节我们再讲信号量机制和进程的经典同步问题,生产者和消费者等等,谢谢大家,我会持续更新的。

相关文章:

  • 向量数据库原理及选型
  • 98.HarmonyOS NEXT跑马灯组件教程:MarqueeSection组件实现原理
  • Java基础编程练习第32题-定义接口(Biology、Animal)、类(Person)、子类(Pupil)(PTA选题)
  • Flask-WTForms表单验证中常见的正则表达式
  • 同一子网通信
  • 操作系统知识点31
  • 【漫话机器学习系列】142.Sigmoid 激活函数(Sigmoid Activation Function)
  • Kubernetes 中metrics-server的采集周期,采集链路是什么样的?
  • 【Hestia Project 数据集】美国化石燃料 CO₂ 排放数据
  • 《论语别裁》第01章 学而(27) 无所适从的礼俗
  • uboot中的.config文件
  • superset部署记录
  • min_element用法
  • pytorch快速入门——手写数字分类GPU加速
  • python-数据类型字符串和列表
  • 【Qt】qrc机制介绍
  • Java实现【将Markdown格式文本转换为纯文本】
  • Python跳动的爱心
  • go数据结构笔记
  • Spring(5)——IoC DI
  • “三桶油”一季度净赚966亿元:业绩分化加剧,有人欢喜有人愁
  • 案件发回重审,李在明参选韩总统之路再添波折
  • 周劼已任中国航天科技集团有限公司董事、总经理、党组副书记
  • “铁血防守”制造8年最快丢球,恐惧中的阿森纳什么也做不了
  • 五一假期如何躺赚利息?来看国债逆回购操作攻略
  • 新希望去年归母净利润4.74亿同比增逾九成,营收降27%