操作系统 -- 进程和线程同步

简介: 操作系统 -- 进程和线程同步

同步


多道程序设计:现代操作系统的重要特性


并行


进程和线程:操作系统抽象出来用于支持多道程序设计


CPU调度:实现多道程序规则


调度算法:不同的策略


  • 独立的线程


不和其他线程共享资源或者状态

确定性:输入决定状态

可重现:能够重现起始条件

调度顺序不重要


  • 合作线程


在多个线程中共享状态

不确定性

不可重现


  • 不确定性和不可重现意味着bug可能是间歇性发生的


为什么要合作


  • 进程和线程,计算机和设备需要合作
  • 优点1:共享资源
  • 优点2:加速
  • 优点3:模块化


程序可以调用fork()函数来创建一个新的进程


假设两个进程并发执行


Race Condition (竞态条件)


系统缺陷:结果依赖于并发执行或者事件的顺序/时间


  • 不确定性和不可重现


如何避免竞态?


  • 让指令不会被打断


Atomic Operation(原子操作)


  • 原子操作是指一次不存在任何中断或者失败的执行


该执行成功结束

或者根本没有执行

并且不应该发现任何部分执行的状态


  • 实际上的操作往往不是原子的


有些看上去是原子操作,实际上不是

连X++这样的简单语句,实际上都是由3条指令构成

有时候甚至连单挑指令都不是原子的


Critical Section(临界区)


临界区是指进程中的一段需要访问共享资源并且当另一个进程处于相应的代码区域时不会被执行的代码区域


  • 互斥:同一时间临界区最多存在一个线程
  • Progress:如果一个进程、线程想要进入临界区,那么它最终会成功
  • 有限等待:如果一个线程i处于入口区,那么在i的请求被接受之前,其他线程进入临界区的时间是有限制的
  • 无忙等待:如果一个进程在等待进入临界区,那么在它可以进入之前会被挂起


临界区对代码的保护:


  • 禁用硬件中断:


没有中断,没有上下文切换,没有并发

硬件将中断处理延迟到中断被启用之后

大多数现代计算机体系结构都是提供指令来完成


进入临界区

禁用中断


离开临界区

启用中断


一旦中断被禁用,线程就无法被停止

要是临界区可以任意长怎么办?

一定要慎用


基于软件的解决方案


  • 更高级的抽象


硬件提供了一些原语:中断禁用,原子指令等


操作系统提供更高级的编程抽象来简化并行编程:锁,信号量等


锁是一个抽象数据结构

使用锁来编写临界区


大多数现代计算机体系结构都提供了特殊的原子操作指令

test-and-set测试和位置

交换:交换内存中的两个值


Mutual exclusion(互斥)


当一个进程处于临界区并访问共享资源时,没有其他进程会处于临界区并且访问任何相同的共享资源


Dead Lock(死锁)


两个或者以上的进程,在相互等待完成特定的任务,而最终没办法将自身的任务进行下去


Starvation(饥饿)


一个可执行的进程被调度器持续忽略,以至于隋斐然处于可执行状态但是却不被执行

目录
相关文章
|
7天前
|
算法 调度 UED
探索操作系统核心:进程管理与调度
【9月更文挑战第28天】在数字世界的心脏跳动着无数进程,它们像是细胞一样构成了操作系统的生命体。本文将深入探讨操作系统中进程管理与调度的奥秘,揭示如何通过精心设计的数据结构和算法来维护系统的稳定性和效率。我们将从进程的基本概念出发,逐步解析进程状态转换、进程同步机制,以及进程调度策略,旨在为读者呈现一幅清晰、生动的操作系统内部工作机制图景。
|
7天前
|
存储 消息中间件 资源调度
「offer来了」进程线程有啥关系?10个知识点带你巩固操作系统基础知识
该文章总结了操作系统基础知识中的十个关键知识点,涵盖了进程与线程的概念及区别、进程间通信方式、线程同步机制、死锁现象及其预防方法、进程状态等内容,并通过具体实例帮助理解这些概念。
「offer来了」进程线程有啥关系?10个知识点带你巩固操作系统基础知识
|
1天前
|
消息中间件 Linux 调度
深入理解操作系统的进程管理
【9月更文挑战第34天】本文将深入浅出地介绍操作系统中的进程管理,从进程的概念开始,逐步展开到进程调度、进程同步与通信等核心内容。我们将通过简单的代码示例,帮助读者更好地理解进程管理的原理和实践。无论你是初学者还是有一定基础的开发者,这篇文章都将为你提供有价值的参考。
23 12
|
1天前
|
算法 调度 UED
深入理解操作系统的进程调度策略
【9月更文挑战第34天】在计算机科学中,操作系统是硬件与用户之间的桥梁,它管理着系统资源和提供各项服务。本文旨在通过浅显易懂的语言和实际代码示例,揭示操作系统的核心机制之一——进程调度策略。我们将探讨进程调度的目的、常见的调度算法以及它们如何影响系统性能和用户体验。无论你是编程新手还是资深开发者,这篇文章都将帮助你更好地理解并运用这些知识来优化你的应用程序和系统配置。
23 11
|
3天前
|
算法 调度 UED
探索操作系统的心脏:进程调度算法
【9月更文挑战第32天】在数字世界的每一次心跳中,都隐藏着一个不为人知的英雄——进程调度算法。它默默地在后台运作,确保我们的命令得到快速响应,应用程序平稳运行。本文将带你走进操作系统的核心,一探进程调度的奥秘,并通过代码示例揭示其背后的智慧。准备好跟随我一起深入这趟技术之旅了吗?让我们开始吧!
|
5天前
|
算法 Linux 调度
深入理解操作系统的进程调度
【9月更文挑战第30天】本文将带你进入操作系统的核心—进程调度。我们将探讨其工作原理,分析几种常见的调度算法,并通过实际代码示例来揭示这些理论是如何在真实系统中实现的。无论你是初学者还是有经验的开发者,这篇文章都能帮助你更好地理解操作系统的这一关键组成部分。
|
5天前
|
消息中间件 算法 调度
探索操作系统核心:进程管理与调度策略
【9月更文挑战第30天】在数字化时代的心脏,操作系统扮演着至关重要的角色。本文将深入探讨操作系统的基石之一——进程管理,以及如何通过调度策略优化系统性能。我们将从进程的基本概念出发,逐步解析进程状态、进程控制和进程间通信等关键要素。同时,我们会探讨几种常见的进程调度算法,并分析它们的优缺点。最后,文章将展示一个简单的代码示例,以加深对理论部分的理解和应用。
|
1天前
|
算法 Linux 调度
操作系统的心脏:深入理解进程调度
本文将深入探讨操作系统中最核心的概念之一——进程调度。通过简明扼要的语言和具体实例,帮助读者理解进程调度的基本原理、算法及其在现代操作系统中的应用。我们将从简单的轮转调度到复杂的多级反馈队列调度,一步步揭开这个复杂系统的面纱。
12 4
|
1天前
|
算法 调度
深入理解操作系统:进程管理与调度
【9月更文挑战第34天】操作系统是计算机系统的核心,负责管理和控制计算机硬件和软件资源。本文将探讨操作系统中的一个重要概念——进程管理与调度。我们将了解进程的概念、进程状态以及进程调度算法。通过学习这些知识,我们可以更好地理解操作系统的工作原理,为进一步学习和研究打下基础。
|
6天前
|
算法 调度 UED
探索操作系统的心脏:进程管理与调度
【9月更文挑战第29天】在数字世界的海洋中,操作系统是支撑软件与硬件和谐共舞的桥梁。本文将深入探讨操作系统的核心功能—进程管理及其调度机制,揭示它们是如何影响计算机性能和用户体验的。通过浅显易懂的语言和生动的比喻,我们将一起遨游在进程的生命周期、调度算法以及优先级等概念之间,旨在为读者呈现一个清晰的操作系统内部运作图景。
17 6
下一篇
无影云桌面