专栏首页陌无崖知识分享计算机操作系统——锁的进化

计算机操作系统——锁的进化

作者 | 陌无崖

转载请联系授权

导语

相信大家都知道金鱼是不知道饥饿的,如果有食物吃,金鱼就会不停的填饱肚子,哪怕被撑死。在计算机中锁的进化可以用金鱼生存的例子来引入。

金鱼生存

左一和右尔共同养了一条金鱼,该金鱼每天仅仅喂食一次,如果多喂了一次,鱼会被撑死,如果没有喂金鱼,则金鱼会饿死。那么左一和右尔必须约定好各自如何喂鱼。

当然左一和右尔都是喂鱼高手,仅仅查看鱼的状态,就知道今天鱼是否被喂,因此他们两个约定在喂鱼之前,必须先检查鱼的状态。当然这样的做法在现实生活中可以实行,但是如果切换到计算机操作系统时,可能就会出错了。

在操作系统中左一和右尔相当于两个线程,而金鱼相当于一个共享资源,因此这个问题就是两个或多个线程操作同一资源的问题。

在计算机中,线程是可以任意穿插的,因此对于金鱼问题,当线程切换到左一,左一检查鱼的状态时,发现鱼没有被喂,此时线程切换到右尔,右尔也检查鱼的状态,此时鱼没有被喂,因此成功喂了鱼,这时线程又切换到左一,左一现在的状态就是喂鱼,将继续执行这个指令,因此也喂了鱼,结果,鱼被撑死。

防止竞争

看来上述的方案不完善,导致的原因是什么呢?左一和右尔操作了同一个对象,即检查了鱼的状态。争相执行引起的结果。即在计算机中两个或多个线程同时执行了一段代码或访问了同一个资源,资源被称为临界区。

那么如何防止竞争呢?也就是说任何时候只能有一个线程在临界区。那么左一和右尔想了一个办法,每个人在喂鱼之前先留下字条,告诉对方自己将要检查鱼的状态。这样就可以了吗?仔细想想其实这样的作法并没有从根本上解决问题,仅仅减少了鱼被撑死的概率。为什么?我们可以看如下的步骤:

  • 左一检查是否有字条,发现没有字条
  • 线程切换
  • 右尔检查,没有字条,放了字条
  • 线程切换
  • 左一放了字条

导致的问题显而易见,最终左一和右尔都放了字条,鱼还是会被撑死。因此这样的作法并没有完成互斥。

互斥改进

左一和右尔仔细分析了结果,发现导致的以上结果的原因是检查字条和留字条之间发生了时间的间隙,那么可不可以杜绝这样的问题呢?很快他们又想到了办法,先留字条,后检查有没有对方的字条,左一和右尔非常开心,因为这样做了之后,无论线程如何切换,都会出现有过一张字条。

但是又出现了问题,金鱼似乎没有被撑死,但是被饿死了。发生了什么?

  • 左一留下字条
  • 线程切换,右尔留下字条
  • 左一检查字条,发现已经有了一张,线程切换
  • 右尔发现也有了字条,线程切换
  • 左一此时移除字条,线程切换
  • 右尔此时移除字条
  • 鱼被饿死

这样的作法,导致互斥过了头,因此这种方案是不行的,但至少相对于之前的方法,进步了不少,对于计算机来说,饿死总比撑死好。

等待

左一和右尔又仔细分析了原因,分析出,原来当他们放下字条后就离开了,那么不离开就可以了,当留下字条后,等待确认鱼是否被喂,不仅仅留下字条就离开。看起来这样的方法是可以的,但是在计算机中导致了什么问题呢?就是等待是一种资源的浪费,而且可能导致优先级倒挂,如果右尔先启动,留下字条,这时左一启动,如果左一的优先级高,左一在处于等待的过程中,右尔无法获得cpu的调度,因此出现循环等待。

升级

左一和右尔想了很久,似乎哪个方案都会出现问题。这时一位长者出现告诉他们,你们的方法都太局限于鱼身上了?左一和右尔突然一激灵,原来可以把保护鱼升级到保护放鱼的房间。那么如何防止两个人同时进入一个房间呢?很快他们想到了人类生活中的锁的原理。当他们进去之后,将房间上锁,这样其他的线程就无法进入了。但是仍然会有等待,那么如何解决呢?他们又想到了字条,当获得锁之后,留下一个字条,然后把锁释放,那么等待的时间就换成了留字条的时间。这样就不会导致一个线程执行速度慢,导致其他线程出现一直等待的情况。

于是左一和右尔每天开心的喂着鱼,虽然还会有等待的时间,但是这个等待时间是可以容忍的。

本文参考书籍《计算机操作系统之哲学原理》

本文分享自微信公众号 - golang技术杂文(gh_ebbdb61f463e),作者:无崖子天下无敌

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-02-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 计算机操作系统学习笔记_进程管理--死锁

    进程管理 --死锁 一、死锁的概念 1.死锁的概念   系统中两个或两个以上的进程无限期地相互等待永远不会发生的条件,系统处于一种停滞状态,这种情况称为死锁。 ...

    小小科
  • 计算机操作系统

    计算机系统由硬件系统和软件系统两大部分组成。操作系统(英语:Operating System,缩写:OS)是管理计算机硬件与软件资源的系统软件,同时也是计算机系...

    搬砖俱乐部
  • 计算机操作系统之进程管理

    当有了多道程序技术之后就得到了b图,每个程序各自独立的占用一个逻辑程序计数器,达到并发执行效果

    JavaEdge
  • 计算机操作系统——进程和线程

    为什么需要进程 在传统的计算机运行程序时,往往一次只能运行一个程序,这样对于CPU是极度不公平的,有可能一个程序需要进行计算仅仅需要简单的运算,而大部分都会进行...

    陌无崖
  • 计算机操作系统学习笔记 | 进程

    进程的静态描述由3部分组成:进程控制块 (Process Control Block, PCB) 、有关程序段和该程序段对其进行操作的数据结构集。而PCB(进程...

    玖柒的小窝
  • 001 计算机及操作系统

    编程语言是程序员与计算机沟通的介质 所有的计算机内部使用的都是二进制,不过大多数的人都是不擅长使用这种语言,我们需要一种更简便的方法来告诉计算机要做什么,所以人...

    py3study
  • 计算机操作系统学习笔记 | 操作系统特征

    正如并发和并行的名字,并发主要想着重描述的是出发,并发就是同时出发。而并行主要想着重描述的是运行,并行也就是同时运行。

    Regan Yue
  • 计算机操作系统的自举过程

    CPU的硬件都设计为加电即进入16位实模式状态运行。同时,还有一点非常关键的是,将CPU硬件逻辑设计为加电瞬间强行将CS的值置为0xF000、IP的值置为0xF...

    一个会写诗的程序员
  • 计算机操作系统概念初解

    一、存储系统 在计算机系统中存储层次可分为,处理器上的寄存器、高速缓冲存储器、主存储器(内存)、辅助存储器(外存)四级。高速缓冲存储器用来改善主存储器与中央处理...

    用户1687088
  • 操作系统——计算机硬件简介

    超标量CPU是这样工作的,多个取值和解码同时进行,取值解码完成后的指令会进入缓冲区,缓冲区对应多个执行单元,每当缓冲区中有指令且有空闲的执行单元时,就会从缓冲区...

    思想者杰克
  • 计算机操作系统之存储管理

    内存的回收与分配,地址变换(程序中的逻辑地址与内存中的物理地址之间的转换),内存扩充(借助虚拟技术或覆盖技术从逻辑上扩充内存容量),内存保护(保证进入内存的各道...

    intsmaze-刘洋
  • 银行家算法的C++实现 - 计算机操作系统

    ​ 银行家算法(Banker’s Algorithm)是一个避免死锁(Deadlock)的著名算法,是由艾兹格·迪杰斯特拉在1965年为T.H.E系统设计的一种...

    泰坦HW
  • 计算机操作系统(OS)安装机器人操作系统(ROS)实现物联网功能

    博客中大量介绍了将Ubuntu等Linux系统借助机器人操作系统ROS实现机器人控制设计开发和物联网功能案例,并可基于OpenAI等实现人工智能相关训练。

    zhangrelay
  • 深入理解计算机系统(1.3)------操作系统的抽象概念

      上一篇博客我们讲解了存储设备的层次结构,并详细讲解了高速缓存的原理,以及可以利用高速缓存来提高程序性能。如果对Java Web 熟悉的,我们可以理解高速缓存...

    IT可乐
  • 什么是计算机程序?操作系统、指令、进程、线程等

    不管你用了多少技术,框架,模式,实现了怎么样的协议与功能,原理是什么,也只是人类意识层面上的内容,到底层只有指令。

    一个会写诗的程序员
  • 计算机基础教程#001 操作系统概述

    应网友们需求,针对计算机的基础做一些知识上面的补充,这样可以更好地学习编程。老刘开始着手计算机基础系列教程,这是第一期,以后逐渐为小伙伴们讲解和演示有关计算机基...

    刘金玉编程
  • 操作系统--死锁避免(银行家算法)

    P1请求资源:P1发出请求向量Request1(1,0,2),系统按银行家算法进行检查:

    风骨散人Chiam
  • 深入理解计算机系统(3.4)------算术和逻辑操作

      上一篇博客  我们介绍了几种数据传送指令,包括MOV,MOVS,MOVZ,PUSH和POP等,理解起来也不算难。本篇博客我们来接着看汇编语言的算术与逻辑运算...

    IT可乐
  • 计算机系统基础作业

    void func(int *xptr, int *yptr, int *zptr);

    一只胡说八道的猴子

扫码关注云+社区

领取腾讯云代金券