操作系统:精髓与设计原理 线程

2024-05-05 18:58

本文主要是介绍操作系统:精髓与设计原理 线程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

进程的概念 细划分为2个特点

  资源所有权   包括一组程序 数据 栈 进程控制块定义的集合   拥有对资源的控制权 (由操作系统提供保护功能 避免冲突)

  调度/执行   一个进程具有一个执行状态和一个被分配的优先级,它是一个可被操作系统调度和分派的实体

线程  调度单位    包括 线程执行状态  线程上下文 

线程优势    创建时间  终止时间  切换时间 小于进程      同一进程下效率更高 无需调用内核

线程分类    用户级线程(User-Level Thread)  内核级线程(Kernel-Level Thread)

线程状态    

派生(派生一个新进程时 为该进程派生了一个线程  线程拥有自己的寄存器上下文和栈空间)  

阻塞(当线程需要等待一个事件时,它将被阻塞(保存它的用户寄存器 程序计数器 栈指针) 此时处理器转而执行另一个就绪线程)

解除阻塞  (当阻塞一个线程的事件发生时,该线程被转移到就绪队列中)

结束  (当一个线程完成时 寄存器上下文和栈都被释放)


与并发相关的关键术语

原子操作  一个函数或者由一个或多个指令的序列实现的动作(对外不可见)  也就是说 没有其他进程能看到中间状态和中断该操作       要么作为一个组来执行,要么都不执行

对系统状态没有可见的影响   原子性保证了并发进程的隔离

临界区  是一段代码       在这段代码中 进程将访问共享资源 当另一个进程已经在该代码上运行时,该进程就不能在这段代码中执行

互斥  当一个进程进入临界区访问共享资源时,其他进程不能进入该临界区访问任何共享资源

死锁  两个或两个以上的进程因其中的每个进程都在等待其他进程做完某些事情而不能继续执行 

活锁  两个或两个以上的进程为了相应其他进程的变化而持续改变自己的状态但不做有用的工作

饥饿  一个可运行的进程被调度者无限期忽视 不能被调度执行

竞争条件 多个线程或多个进程读写一个共享数据时 其结果依赖于它们执行的相对时间


常用并发机制

信号量  用于进程间传递信号的一个整数值   可进行三种操作  初始化  递减  增加   操作均为原子操作    递减操作用于阻塞一个进程    增加操作用于解除阻塞进程

二元信号量     只取0和1的信号量

互斥量  类似于二元信号量 但加锁(设定值为0) 解锁(设定值为1)的进程均为同一进程

条件变量  一种数据结构  用于阻塞进程或线程  直到特定条件为真

管程  一种编程语言结构   封装了变量  访问过程 初始化代码      管程中的变量只能由管程自己访问过程来访问  每次只能有一个进程在其中执行 其他进程将被阻塞  

消息/信箱   两个进程交换信息的一种方法 可用于同步 (使用无阻塞的send和阻塞receive)

自旋转 一种互斥机制 进程在一个无条件循环中执行  等待锁变量的值变为可用


使用队列来保存在信号量上等待的进程

强信号量  strong semaphore      采取先进先出队列   被阻塞时间最久的进程先从队列中释放出来

弱信号量   weak semaphore   并没有规定进程从队列中移出顺序的信号量


生产者消费者问题 (producer/ consumer)

有一个或多个生产者生产某种类型的数据(记录、字符)并放置在缓冲区中

有一个消费者从缓冲区中取数据

保证当缓存已满时,生产者不会继续向其中添加数据  当缓冲为空时,消费者不会从中消耗数据


消息不是直接从发送者发送到接收者,而是发送到一个共享数据结构,该结构由临时保存信息的队列组成(成为信箱)

解决有界多生产者消费者问题    利用一个创建信息的信箱 一个消费信息的信箱 


读者写者问题(reader/writer)

有一个由多个进程共享的数据区,这个数据区可以是一个文件或者一块内存空间,甚至一组寄存器,一些进程只读这个数据区中的数据

任意多的读进程可以同时读这个文件      

一次只有一个写进程可以写文件   

如果一个写进程正在写文件 那么禁止其他进程读文件

两种思路  读者优先  写者优先


可重用资源  一次只能供一个线程使用并不会由于使用而耗尽的资源

可消耗资源  看可以被生产和消耗的资源

死锁产生条件   互斥 一次只有一个进程可以使用该资源,其他进程不能访问已分配给其他进程的资源   (为保证结果的一致性 互斥是非常必要的)

                           占有且等待    当一个进程等待其他进程时,继续占有已经分配的资源 

                           不可抢占  不能强行抢占进程所占有的资源       (设计数据资源 提供回滚机制保证恢复到适当的状态)

                           循环等待   存在一个封闭的进程链   使得每个进程至少占有此链中下一个进程所需要的资源   (充分条件)

死锁预防    间接预防   排除死锁产生的可能性   前三个条件

                    直接预防   防止循环等待的发生

死锁避免    需要知道进程资源的请求情况  

                    如果进程请求会导致死锁,则不启动此进程                          进程启动拒绝  (假设所有进程同时发出它们的最大请求)

                    如果进程增加的资源请求会导致死锁,则不允许此分配      资源分配拒绝  (银行家算法)    安全状态:至少有一个资源分配序列不会导致死锁

死锁检测   周期性的检测是否出现死锁   检测到死锁之后 修复死锁

综合的死锁策略     把资源分成几组不同的资源类   为预防在资源类之间由于循环等待产生死锁  定义线性排序策略         在一个资源类中,使用该类最适合的算法

 

哲学家就餐问题 

一大碗面  5个盘子   5个哲学家  5把叉子   每位想吃饭的哲学家需要2把叉子来吃面

1 增加一位服务员 同一时刻只允许4个哲学家进入餐厅

2 使用管程  同一时刻只有一个哲学家进入   拿起左边叉子时   右边叉子没人拿 就一定可以拿到

              

                                                          


                   






     

这篇关于操作系统:精髓与设计原理 线程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/962425

相关文章

Javaee多线程之进程和线程之间的区别和联系(最新整理)

《Javaee多线程之进程和线程之间的区别和联系(最新整理)》进程是资源分配单位,线程是调度执行单位,共享资源更高效,创建线程五种方式:继承Thread、Runnable接口、匿名类、lambda,r... 目录进程和线程进程线程进程和线程的区别创建线程的五种写法继承Thread,重写run实现Runnab

SpringBoot线程池配置使用示例详解

《SpringBoot线程池配置使用示例详解》SpringBoot集成@Async注解,支持线程池参数配置(核心数、队列容量、拒绝策略等)及生命周期管理,结合监控与任务装饰器,提升异步处理效率与系统... 目录一、核心特性二、添加依赖三、参数详解四、配置线程池五、应用实践代码说明拒绝策略(Rejected

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

MySQL中的表连接原理分析

《MySQL中的表连接原理分析》:本文主要介绍MySQL中的表连接原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、表连接原理【1】驱动表和被驱动表【2】内连接【3】外连接【4编程】嵌套循环连接【5】join buffer4、总结1、背景

深度解析Spring AOP @Aspect 原理、实战与最佳实践教程

《深度解析SpringAOP@Aspect原理、实战与最佳实践教程》文章系统讲解了SpringAOP核心概念、实现方式及原理,涵盖横切关注点分离、代理机制(JDK/CGLIB)、切入点类型、性能... 目录1. @ASPect 核心概念1.1 AOP 编程范式1.2 @Aspect 关键特性2. 完整代码实

Java Stream的distinct去重原理分析

《JavaStream的distinct去重原理分析》Javastream中的distinct方法用于去除流中的重复元素,它返回一个包含过滤后唯一元素的新流,该方法会根据元素的hashcode和eq... 目录一、distinct 的基础用法与核心特性二、distinct 的底层实现原理1. 顺序流中的去重

Spring @Scheduled注解及工作原理

《Spring@Scheduled注解及工作原理》Spring的@Scheduled注解用于标记定时任务,无需额外库,需配置@EnableScheduling,设置fixedRate、fixedDe... 目录1.@Scheduled注解定义2.配置 @Scheduled2.1 开启定时任务支持2.2 创建

Spring Boot 实现 IP 限流的原理、实践与利弊解析

《SpringBoot实现IP限流的原理、实践与利弊解析》在SpringBoot中实现IP限流是一种简单而有效的方式来保障系统的稳定性和可用性,本文给大家介绍SpringBoot实现IP限... 目录一、引言二、IP 限流原理2.1 令牌桶算法2.2 漏桶算法三、使用场景3.1 防止恶意攻击3.2 控制资源

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可