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

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

相关文章

Mysql中设计数据表的过程解析

《Mysql中设计数据表的过程解析》数据库约束通过NOTNULL、UNIQUE、DEFAULT、主键和外键等规则保障数据完整性,自动校验数据,减少人工错误,提升数据一致性和业务逻辑严谨性,本文介绍My... 目录1.引言2.NOT NULL——制定某列不可以存储NULL值2.UNIQUE——保证某一列的每一

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分

Java中的xxl-job调度器线程池工作机制

《Java中的xxl-job调度器线程池工作机制》xxl-job通过快慢线程池分离短时与长时任务,动态降级超时任务至慢池,结合异步触发和资源隔离机制,提升高频调度的性能与稳定性,支撑高并发场景下的可靠... 目录⚙️ 一、调度器线程池的核心设计 二、线程池的工作流程 三、线程池配置参数与优化 四、总结:线程

WinForm跨线程访问UI及UI卡死的解决方案

《WinForm跨线程访问UI及UI卡死的解决方案》在WinForm开发过程中,跨线程访问UI控件和界面卡死是常见的技术难题,由于Windows窗体应用程序的UI控件默认只能在主线程(UI线程)上操作... 目录前言正文案例1:直接线程操作(无UI访问)案例2:BeginInvoke访问UI(错误用法)案例

Linux线程之线程的创建、属性、回收、退出、取消方式

《Linux线程之线程的创建、属性、回收、退出、取消方式》文章总结了线程管理核心知识:线程号唯一、创建方式、属性设置(如分离状态与栈大小)、回收机制(join/detach)、退出方法(返回/pthr... 目录1. 线程号2. 线程的创建3. 线程属性4. 线程的回收5. 线程的退出6. 线程的取消7.

Linux下进程的CPU配置与线程绑定过程

《Linux下进程的CPU配置与线程绑定过程》本文介绍Linux系统中基于进程和线程的CPU配置方法,通过taskset命令和pthread库调整亲和力,将进程/线程绑定到特定CPU核心以优化资源分配... 目录1 基于进程的CPU配置1.1 对CPU亲和力的配置1.2 绑定进程到指定CPU核上运行2 基于

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

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

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

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

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

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