热门标签 | HotTags
当前位置:  开发笔记 > 人工智能 > 正文

操作系统之进程管理(2)-mysql教程

上篇博文我们主要共同学习了进程的一些基本概念,这次我们就要来分析一下进程间的相互作用,即进程的互斥、同步与通信。进程互斥是进程之间所发生的一种间接性相互作用,这种相互作用是进程本身所不希望的,也是运行进程感觉不到的。进程互斥既可能发生在相

上篇博文我们主要共同学习了进程的一些基本概念,这次我们就要来分析一下进程间的相互作用,即进程的互斥、同步与通信。 进程互斥是进程之间所发生的一种间接性相互作用,这种相互作用是进程本身所不希望的,也是运行进程感觉不到的。进程互斥既可能发生在相

上篇博文我们主要共同学习了进程的一些基本概念,这次我们就要来分析一下进程间的相互作用,即进程的互斥、同步与通信。

进程互斥是进程之间所发生的一种间接性相互作用,这种相互作用是进程本身所不希望的,也是运行进程感觉不到的。进程互斥既可能发生在相关的进程之间,也可能发生在不相关的进程之间。

几个概念需要了解:

共享变量:多个进程均需访问的变量称为共享变量。

临界区:访问共享变量的程序段称为临界区,也称为临界段。

临界资源:一次只允许一个进程使用的资源。

进程互斥:两个或者两个以上的进程不能同时进入关于同一组共享变量的临界区,否则可能发生与时间有关的错误,这种想象称为进程互斥。

那么如何实现进程互斥呢?

先给出临界区的框架:

实现互斥就是要编写entryp和exit p,保证同一时刻最多只有一个进程处于临界区内。

下面从软件和硬件两个方面来描述进程互斥的实现:

l 进程互斥的软件实现

(1) Dekker互斥算法

判断一个算法的正确性从三个方面来说明:

u 互斥性原则:任意时刻至多只能有一个进程处于关于同一组共享变量的临界区之中。

u 进展性原则:当临界区空闲时,只有那些执行entry p和exit p的进程参与下一个进入临界区进程的决策,该决策不能被无限期的推迟。

u 有限等待性原则:一个请求进入临界区的进程应当在有限的等待时间内获得进入该临界区的机会。

我们来看看上述算法是否符合这些原则:

先解释一下定义的数据结构:intflag[2];//初值为0 int turn;//初值为0或1

前者表示进程是想进入或者已经进入临界区,后者表示当前轮流次序。

1. 互斥性:假定P0已经进入临界区,此时flag[0]=1成立,P1欲进入临界区必将在其外层while循环处等待,因而满足互斥性;

2. 进展性:若只有一个进程(设为P0)想要进入其临界区,由于flag[1]=0,P0结束外层while循环,进入其临界区。若两个进程都想进入临界区,假设turn=0,进程P1的if条件成立,将自己的flag[1]置为0,并动态等待P0。P0获得处理器资源运行时,检测到flag[1]不成立,结束外层while循环,进入临界区,因而满足进展性。

3. 有限等待性:假设P0处于临界区中,P1正在执行entry p代码试图进入其临界区。P0离开临界区时,将turn的值置为1,flag[0]=0,这将使P1的内层while循环条件不成立。若P1在判断外层while循环条件之前P0没有再次提出进入临界区的请求,则flag[1]的值为0,P1结束外层while循环进入其临界区;反之,若P1判断外层while循环条件之前P0再次执行entry p代码,则会将flag[0]再次置为1,但是因为flag[1]条件和turn==1条件成立,P0将在其flag[0]标志为0后忙式等待P1,直到P1进入并离开其临界区。因而P1在P0再度进入临界区之前,必能得到进入临界区的机会。

关于软件实现的算法还有很多,诸如Peterson互斥算法、Lamport面包店算法等等,

大家可以自己尝试分析一下,这需要很强的逻辑能力。

l 进程互斥的硬件实现

下面给出一个我认为形式最为简单的算法,开关中断硬件互斥算法


由于中断是实现进程切换的必要条件,所以关中断后,不会发生进程的切换,进入临界区的进程将连续执行临界区中的全部指令,因而满足互斥性。易于证明,也满足进展性。

关于进程互斥的硬件实现算法也有很多,诸如:基于测试并设置指令的互斥算法、基于“交换”指令的硬件互斥算法等,大家感兴趣也可以找来算法描述自己分析。

关于进程互斥的问题我们先了解到这,以后再PV操作中还会涉及到,到时候我们就可以自己写原语,来找出现实问题的求解……

推荐阅读
  • 深入解析JVM垃圾收集器
    本文基于《深入理解Java虚拟机:JVM高级特性与最佳实践》第二版,详细探讨了JVM中不同类型的垃圾收集器及其工作原理。通过介绍各种垃圾收集器的特性和应用场景,帮助读者更好地理解和优化JVM内存管理。 ... [详细]
  • 使用Numpy实现无外部库依赖的双线性插值图像缩放
    本文介绍如何仅使用Numpy库,通过双线性插值方法实现图像的高效缩放,避免了对OpenCV等图像处理库的依赖。文中详细解释了算法原理,并提供了完整的代码示例。 ... [详细]
  • 本文将介绍如何使用 Go 语言编写和运行一个简单的“Hello, World!”程序。内容涵盖开发环境配置、代码结构解析及执行步骤。 ... [详细]
  • 线性Kalman滤波器在多自由度车辆悬架主动控制中的应用研究
    本文探讨了线性Kalman滤波器(LKF)在不同自由度(2、4、7)的车辆悬架系统中进行主动控制的应用。通过详细的仿真分析,展示了LKF在提升悬架性能方面的潜力,并总结了调参过程中的关键要点。 ... [详细]
  • 本文探讨了Hive中内部表和外部表的区别及其在HDFS上的路径映射,详细解释了两者的创建、加载及删除操作,并提供了查看表详细信息的方法。通过对比这两种表类型,帮助读者理解如何更好地管理和保护数据。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • C++实现经典排序算法
    本文详细介绍了七种经典的排序算法及其性能分析。每种算法的平均、最坏和最好情况的时间复杂度、辅助空间需求以及稳定性都被列出,帮助读者全面了解这些排序方法的特点。 ... [详细]
  • 本文介绍如何利用动态规划算法解决经典的0-1背包问题。通过具体实例和代码实现,详细解释了在给定容量的背包中选择若干物品以最大化总价值的过程。 ... [详细]
  • 本文详细探讨了Java中的24种设计模式及其应用,并介绍了七大面向对象设计原则。通过创建型、结构型和行为型模式的分类,帮助开发者更好地理解和应用这些模式,提升代码质量和可维护性。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • 深入理解C++中的KMP算法:高效字符串匹配的利器
    本文详细介绍C++中实现KMP算法的方法,探讨其在字符串匹配问题上的优势。通过对比暴力匹配(BF)算法,展示KMP算法如何利用前缀表优化匹配过程,显著提升效率。 ... [详细]
  • 探讨一个显示数字的故障计算器,它支持两种操作:将当前数字乘以2或减去1。本文将详细介绍如何用最少的操作次数将初始值X转换为目标值Y。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 本文探讨如何设计一个安全的加密和验证算法,确保生成的密码具有高随机性和低重复率,并提供相应的验证机制。 ... [详细]
author-avatar
天河体育场里的执波仔_287
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有