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

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

相关文章

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

Spring Boot3虚拟线程的使用步骤详解

《SpringBoot3虚拟线程的使用步骤详解》虚拟线程是Java19中引入的一个新特性,旨在通过简化线程管理来提升应用程序的并发性能,:本文主要介绍SpringBoot3虚拟线程的使用步骤,... 目录问题根源分析解决方案验证验证实验实验1:未启用keep-alive实验2:启用keep-alive扩展建

Java终止正在运行的线程的三种方法

《Java终止正在运行的线程的三种方法》停止一个线程意味着在任务处理完任务之前停掉正在做的操作,也就是放弃当前的操作,停止一个线程可以用Thread.stop()方法,但最好不要用它,本文给大家介绍了... 目录前言1. 停止不了的线程2. 判断线程是否停止状态3. 能停止的线程–异常法4. 在沉睡中停止5

JAVA封装多线程实现的方式及原理

《JAVA封装多线程实现的方式及原理》:本文主要介绍Java中封装多线程的原理和常见方式,通过封装可以简化多线程的使用,提高安全性,并增强代码的可维护性和可扩展性,需要的朋友可以参考下... 目录前言一、封装的目标二、常见的封装方式及原理总结前言在 Java 中,封装多线程的原理主要围绕着将多线程相关的操

kotlin中的模块化结构组件及工作原理

《kotlin中的模块化结构组件及工作原理》本文介绍了Kotlin中模块化结构组件,包括ViewModel、LiveData、Room和Navigation的工作原理和基础使用,本文通过实例代码给大家... 目录ViewModel 工作原理LiveData 工作原理Room 工作原理Navigation 工

Java的volatile和sychronized底层实现原理解析

《Java的volatile和sychronized底层实现原理解析》文章详细介绍了Java中的synchronized和volatile关键字的底层实现原理,包括字节码层面、JVM层面的实现细节,以... 目录1. 概览2. Synchronized2.1 字节码层面2.2 JVM层面2.2.1 ente

Java捕获ThreadPoolExecutor内部线程异常的四种方法

《Java捕获ThreadPoolExecutor内部线程异常的四种方法》这篇文章主要为大家详细介绍了Java捕获ThreadPoolExecutor内部线程异常的四种方法,文中的示例代码讲解详细,感... 目录方案 1方案 2方案 3方案 4结论方案 1使用 execute + try-catch 记录

MySQL的隐式锁(Implicit Lock)原理实现

《MySQL的隐式锁(ImplicitLock)原理实现》MySQL的InnoDB存储引擎中隐式锁是一种自动管理的锁,用于保证事务在行级别操作时的数据一致性和安全性,本文主要介绍了MySQL的隐式锁... 目录1. 背景:什么是隐式锁?2. 隐式锁的工作原理3. 隐式锁的类型4. 隐式锁的实现与源代码分析4