OSTEP-操作系统导论-并发
1. 线程与进程
1.1 线程
线程和进程在操作系统中的表现形式与应用场景有所不同。进程是操作系统中资源分配的基本单位,而线程是进程中的实际执行单元。
特性
进程
线程
资源独立性
各进程有独立的地址空间
线程共享进程的地址空间和资源
执行单元
每个进程一个程序计数器
每个线程有自己的程序计数器
调度单位
操作系统调度的基本单位
进程内的调度由线程完成
创建和销毁复杂度
创建开销较大,资源隔离明显
较轻量,资源共享
上下文切换
开销高(完整切换)
相对较低(部分切换)
独立性与鲁棒性
较高,一个崩溃不影响其他进程
较低,一个线程崩溃可能使整个进程失败
线程由进程创建、管理,同时完成资源的共享。同一进程内的线程虽共享数据,但并不能避免各自独立的栈和控制信息。因此在多线程程序中,为了避免线程之间的冲突,必须实施适当的同步控制。
1.2 线程的同步问题
在多线程用户程序中常见的两种同步问题包括:
竞态条件:
由于线程可能在执行中被打断,因此多个线程可能同一时间访问共享数据,导致数据的不确定性和数据竞争。
线程依赖关系:
某些线程需要等待其 ...
南京大学-操作系统-并发控制:互斥 (2) (内核中的自旋锁、Read-Copy-Update、互斥锁和 futex)
并发控制与锁机制
并发控制是操作系统中的一个核心概念,涉及多种锁机制的实现,包括互斥锁、自旋锁、读写锁等。这些机制确保了多个线程或进程在并发环境中能够正确地访问共享资源。
自旋锁与多处理器系统
在单处理器系统中,自旋锁可以通过关闭中断来实现互斥,从而阻止其他任务的执行。然而,在多处理器系统中,由于多个处理器可能同时争夺锁,自旋锁的性能会显著下降。为解决这一问题,操作系统内核采用了更复杂的机制,如读写锁和读-复制-更新(RCU)技术,这些技术能够在提升并发性能的同时,确保系统的稳定性。
应用程序开发者也可以利用系统调用来实现高效的互斥锁,从而避免无谓的自旋等待,这不仅提高了程序的性能,还减少了CPU资源的浪费。
并发编程中的互斥与可见性
互斥与可见性是并发编程中的关键概念。为了确保线程安全和数据一致性,锁的正确使用至关重要。自旋锁的实现依赖于原子操作,能够保证操作的原子性,避免数据竞争和程序异常行为。然而,并发编程中还存在死锁的问题,正确的锁使用以及避免数据竞争能够确保程序的正常运行。
并发编程需要开发者高度关注细节,任何并发bug都可能导致系统的不稳定。因此,在开发过程中,严格遵守编程 ...
南京大学-操作系统-并发控制:互斥 (1) (Peterson 算法、原子操作、自旋锁)
并发控制是计算机科学中一个复杂且重要的问题,设计和实现正确的并发控制机制需要仔细的思考与精巧的算法。经典的PETERSON算法虽然精妙,但在现代多处理器系统中存在一定的局限性。因此,使用硬件提供的原子指令,如CAS(Compare-and-Swap)和LOCK前缀,成为了一种更为简单高效的实现互斥锁的方法。这些硬件支持的解决方案已成为操作系统内核中常见的实践,能够有效避免复杂的软件层面逻辑问题。
并发编程的挑战与解决方案
并发编程自始至终都伴随着各种挑战,但人类总能创造出新的手段来应对这些问题。历史上提出了许多解决方案,其中包括了对互斥的处理。互斥机制是并发控制的基础,通过锁和解锁的操作来阻止多个进程或线程同时访问共享资源。随着多处理器硬件的发展,并发编程的挑战变得更加严峻,互斥成为解决这些问题的重要手段之一。
并发编程带来的挑战需要新的解决手段,历史解法和正确解法将被深入讨论。
互斥作为并发控制的基础,通过锁和解锁来阻止并发,确保程序的正确执行。
提高效率的并发编程
并发编程的一个关键目标是充分利用计算机的多处理器资源,通过合理的任务分配和并行处理来提高效率。虽然在某些情况下需要 ...
南京大学-操作系统-多处理器编程(线程库、理解并发程序执行、宽松内存模型)
1. 多处理器编程的入门
多处理器编程的基本内容包括线程的创建、理解并发程序的执行机制,以及应对宽松内存模型带来的挑战。在并发编程中,我们必须放弃常见的编程假设,如程序的顺序执行和状态的原子性,这使得并发程序的行为变得复杂和难以预测。
编译器和处理器通常会对代码进行优化,这进一步增加了并发编程的复杂性,特别是在涉及多处理器系统时。为了掌握并发编程,除了要具备数学建模的能力,还需借助工具的支持,理解并发程序的真实行为可能与直觉大相径庭。
2. 操作系统与多线程编程模型
操作系统是一个状态机的管理者,允许多个程序并发运行。为了正确处理这种并发性,操作系统通过系统调用实现线程调度,确保程序的正确执行。
在多线程编程模型中,每个线程拥有独立的堆栈并共享内存。程序员可以通过选择不同线程的执行步骤来定义多线程程序的行为,从而实现高效的并行计算。
3. 多线程编程的简化实现
入门多线程编程可以通过简化的线程API来实现。这种方法通过创建状态机并运行相关函数,充分利用多处理器的性能,达到超过100%的CPU利用率。
共享内存的多线程编程方式简单易懂,通过递归和指针操作,可以探讨堆栈的大小和位 ...
南京大学-操作系统-概论-数学视角
本节课深入探讨了操作系统从数学视角出发的严格性,并通过状态机模型来理解操作系统的基本原理。讲师展示了如何使用Python定义和实现状态机,以模拟进程的创建与执行,同时强调了数学方法在验证程序正确性方面的重要性。课程还介绍了模型检查技术来处理并发带来的不确定性,进一步探讨了如何通过数学证明来提高软件的可靠性。
操作系统的数学视角
数学视角的引入:操作系统可以被视为一种数学严格的对象,通过这种视角,我们能够更深入地理解计算机系统的运作和设计。尤其是在程序设计和资源管理方面,数学视角提供了可靠的基础。
系统调用与交互:应用程序通过系统调用与操作系统交互,操纵内部对象,这种交互形式在理解操作系统的运作中至关重要。了解这些机制可以帮助我们更有效地利用和管理计算机资源。
CPU复位的确定性:讲师详细讨论了CPU复位后的状态及其对固件执行的影响,这种机制保证了系统的稳定性和可预测性,从而为操作系统的启动提供了可靠的基础。
数学证明的可靠性:尽管数学具有严谨性,但其推导过程中的错误可能会影响程序的设计与实现。这一部分内容通过例子说明了数学视角在程序设计中的重要性,特别是在编写和验证代码时。
编程的 ...
南京大学-操作系统-概论-硬件视角
操作系统可以从多个视角来理解,其中包括硬件的视角。硬件视角下,操作系统被看作一个状态机模型,涵盖了固件、调试固件等内容。程序员与硬件之间有着明确的约定,操作系统实际上也是一个程序。通过状态机的视角,我们可以深入理解计算机系统的工作原理,例如CPU复位、中断等机制。此外,调试工具的使用和代码简化技巧也是学习操作系统的重要组成部分。
亮点解析
计算机系统中的状态机模型
状态机模型的普遍性:计算机系统中的一切都可以被视为状态机。从硬件的视角来看,操作系统是一个程序,通过了解计算机硬件和程序员之间的约定,可以帮助我们更好地理解操作系统的工作原理。
工具和资源的重要性:人工智能带来新的挑战,人类需要学会问出好问题,并掌握使用调试工具(如GDB)的技巧。互联网提供的文档和资料可以有效帮助学习者理解和使用这些工具。
状态机的数学定义:通过状态机的严格数学定义,我们可以精确理解计算机系统中的状态迁移,包括C代码、汇编代码、处理器等都是状态机。
CPU复位(Reset)状态的重要性
复位状态的关键作用:CPU的reset状态对计算机系统的运行至关重要。计算机系统在启动时,CPU总是从reset状态 ...
南京大学-操作系统-概论-应用视角
操作系统的三种视角
应用程序视角: 操作系统是一组API和对象,提供了程序运行的便利。它抽象了硬件细节,使得应用程序能够专注于业务逻辑而无需关注底层实现。
硬件视角: 从硬件角度看,操作系统其实就是一个普通的C程序。它直接运行在硬件之上,管理硬件资源并调度任务。
数学视角: 操作系统也可以被看作是一个严格的数学对象,具有明确的状态转移和逻辑关系。本课程将从这三个视角系统地介绍操作系统的核心概念。
亮点总结
操作系统的抽象与程序编译
操作系统的抽象功能: 操作系统通过API抽象底层硬件细节,为应用程序提供了一个简洁而强大的运行环境。通过深入学习程序和编译器的工作原理,可以更好地理解操作系统的作用和程序运行过程。
编译与链接: 静态链接和二进制文件分析工具有助于理解程序运行的复杂性。编译器选项和程序分析工具则可以深入揭示程序的编译过程以及执行环境的选择原因。
深入理解编译器与系统行为
程序员的作用: 在计算机系统中没有魔法,一切行为都是由程序员精心设计的,包括GCC编译器的行为。通过调试和实验,能够深入理解计算机系统的工作原理。
调试工具的应用: 使用verbose选项查看编译日 ...
南京大学-操作系统-概述-总起
本课程旨在通过从历史发展到现代技术的探讨,帮助学生深入理解操作系统的基本原理和功能。课程内容包括软硬件资源管理、程序执行等核心概念的讲解,并通过自主学习和实践操作等方式,培养学生的系统思维和解决问题的能力。
课程内容与评分方式
课程视频首先介绍了操作系统课程的概述,包括为什么学习操作系统以及课程的内容安排。教师分享了自身的教学背景和课程教材,详细说明了课程的评分方式和实验要求。课程的主题分为“为什么学”、“学什么”以及“如何学”三个部分,为学生提供了清晰的学习框架。教材推荐了开源书籍《Operating Systems: Three Easy Pieces》,并提供了学习建议和考试评分的相关细节。
学习操作系统的意义
理解操作系统的重要性在于透过学科发展历史,探讨各类技术和概念的产生原因。通过学习操作系统,可以更好地理解计算机科学基础的形成逻辑,这是建立在数学基础之上的。了解各种概念的历史背景和演变过程,能加深对技术发展和学科历史的理解。
数学概念与技术创新
学习数学概念的关键在于理解其基本动机和解决问题的方法,而不仅仅是简单的应用。操作系统的学习不仅仅为了掌握理论知识,更是为了应对现 ...
南京大学-操作系统-写在前面
在做项目的时候感觉有一些计算机系统底层的知识欠缺,所以打算补一补操作系统的知识,在知乎上检索后发现南京大学蒋炎岩老师开始的操作系统课程讲的非常好,于是打算跟着学习。
b站链接:https://www.bilibili.com/video/BV1HN41197Ko/
老师是直接现场coding,直接调虚拟机进行debug,结合知识点进行讲解和展示,第一次体验到这种上课模式。感觉挺有趣的,就像在听脱口秀一样。
MIT-算法导论-写在后面
daf9e1003c8b639b6138b233a833233965d135783ea2701cf91ced3bed71d1bb7964e998be7bc3a692d9d6bebf4176329edf02e57f3edeccd9b6f9ba5ddb7821c399c902a70ed6166c96cabdd680f045d8e81dec759ecdb142e8bf0ea4620dfbaee4362c2138add1b428484efd15b5c684d323508a98236f2f5adc301e5f176bcd38fddf7db3395cd268d3f8d0d479709cfa08398ba732b7664614730d255fa77ef2faa013d6205e27b0a8b2d7d72e5560431fdc12324e4401910818d9cacdd7cfaf0f19671dd9f54b27fe70318266f90173c94bead1de654981ba6f4aafdd895706be34483ca652978bb14b96ff28afc0a236482f50bb134 ...