操作系统-笔记

我们在这里完整地过一遍操作系统的课程内容。主要的参考资料就是看网课:王道计算机考研 操作系统_哔哩哔哩_bilibili

操作系统的概念和功能------什么是操作系统?有什么用?

操作系统(Operating System,简称OS)是管理计算机硬件与软件资源的系统软件,同时也是计算机系统的内核与基石。它就像是计算机的"大管家",负责协调和分配所有资源,并为用户和其他软件提供一个方便、高效、安全的工作环境。

操作系统的功能如下:

操作系统有哪些特征?

操作系统的四大基本特征是并发、共享、虚拟和异步

操纵系统的运行机制?

核心思想是通过严格的权限分层来实现对硬件的安全管控 :它将运行环境划分为核心态 (管态)和用户态 (目态),在核心态下运行的内核程序 可以执行所有特权指令 (如直接操作硬件),从而全面管理系统资源;而在用户态下运行的应用程序 则被限制只能执行非特权指令(普通运算)。当应用程序需要操作系统提供服务(如读写文件)时,必须通过"系统调用"等方式,主动触发从用户态到核心态的切换,将控制权交给内核,待内核完成特权操作后再切换回用户态。

中断和异常分别是什么?

在计算机系统中,中断和异常是操作系统用来响应突发事件的两种重要机制。

区别中断和异常,最根本的一点在于它们与 CPU 正在执行的指令 之间的关系,即同步异步之别。

操作系统的系统调用是什么?

简单来说,系统调用是运行在用户空间的应用程序,向操作系统内核请求更高权限服务的唯一合法接口。它就像是用户程序与内核之间的一道"安全门",用户程序必须通过这扇门才能使用底层硬件资源(如读写文件、创建进程等)。

系统调用有非常多的种类,常见的如下:

一个系统调用的工作流程如下:

始于用户态程序通过库函数(如glibc)准备参数(如系统调用号存入eax寄存器,其他参数按顺序放入ebx、ecx等寄存器),接着执行一条特殊指令(如x86架构的int 0x80或现代的syscall)触发软中断,迫使CPU从用户态(Ring 3)切换到内核态(Ring 0);内核随后保存用户程序上下文(如寄存器状态),根据系统调用号在系统调用表(sys_call_table)中查找对应的内核函数(如sys_write),在严格验证参数合法性后执行实际操作(如文件写入、进程创建等);完成功能后,内核将返回值存入eax寄存器,恢复之前保存的用户上下文,最后通过iretsysret指令返回用户态,库函数再将结果传递给应用程序。

操作系统的体系结构?

所谓的操作系统的体系结构,其核心正是在回答"内核应该做什么、用户空间可以做什么"以及"这两者之间如何互动"这个根本问题。如图:

宏内核 将所有核心功能集成在内核态运行,性能最高但稳定性风险大;微内核 将大部分服务移出内核,仅保留最核心功能,通过进程间通信调用,其可靠性、安全性最好,但通信开销导致性能较低;分层结构 将系统分为若干层次,每层仅能调用相邻下层,结构清晰但不够灵活;模块化 则在宏内核基础上,将功能拆分为可动态加载的内核模块,兼顾了性能与扩展性,是Linux等现代系统的选择;而外核最为激进,其内核仅负责安全分配原始硬件资源,由用户态库直接管理,以实现极致性能与定制,但开发难度极大,是前沿探索方向。

操作系统引导是什么?

操作系统引导(System Boot)是计算机从通电到操作系统完全就绪 的完整过程。它的核心任务是将存储在硬盘等外部存储设备上的操作系统内核加载到内存中运行,并完成一系列初始化工作,最终为用户提供一个可交互的桌面或命令行界面。

这个过程环环相扣,像一个精密的接力赛:

  1. 初始引导与硬件自检

    当你按下电源键,CPU首先会执行主板上一块特殊芯片(ROM)里固化的程序,这就是BIOS 或更现代的UEFI 。它首先进行通电自检 ,检查CPU、内存、显卡等关键硬件是否正常工作。随后,BIOS/UEFI会按照预设的启动顺序(如优先从硬盘启动),读取硬盘的第一个扇区,即主引导记录

  2. 引导程序与内核加载

    MBR中存储着很小一段引导程序 以及硬盘的分区表信息。这段小程序的任务是找到硬盘上那个被标记为活动分区 (通常是我们熟知的C盘)的位置,并加载该分区更复杂的第二阶段引导程序 (如Windows系统的NTLDR或BOOTMGR,Linux系统的GRUB)。接下来,引导程序会定位到磁盘上操作系统内核文件(如Windows的ntokrnl.exe,Linux的vmlinuz)的具体位置,将其加载到内存中,然后把CPU的控制权交给它。

  3. 内核初始化与用户界面启动

    操作系统内核接管后,首先会初始化自身运行所需的各种数据结构(如页表),并检测和初始化所有的硬件设备,加载必要的驱动程序。之后,内核会启动第一个用户态进程(在Linux中是systemdinit),由它来拉起所有的系统服务(如网络、图形显示服务等)。最终,系统会启动用户接口 ,根据设置呈现图形登录界面 (如Windows)或命令行登录界面,等待用户输入凭证登录。至此,整个引导过程完成,计算机交由用户控制。

什么是虚拟机?

简单来说,虚拟机(Virtual Machine,常缩写为 VM)就是通过软件模拟出来的一台虚拟计算机。你可以在一台实体电脑上同时运行多个虚拟机,每个都可以安装不同的系统,就像拥有了多台独立的电脑一样。

进程的概念、组成和特征?

进程是操作系统中最核心的概念之一,它深刻影响着程序的执行方式。

一个进程实体主要由程序段、数据段和进程控制块(PCB)三部分组成:程序段包含了要执行的指令代码;数据段存放执行过程中所需的变量和结果;而PCB则是进程存在的唯一标志,记录了进程的描述信息、资源清单和处理机状态等所有管理控制信息。

进程具有动态性(有其创建、执行、终止的生命周期)、并发性(多个进程实体在一段时间内能交替执行)、独立性(是资源分配和调度的独立单位)、异步性(各进程以不可预知的速度向前推进)等基本特征。

进程的状态有哪些?如何转换?

一个进程在其生命周期中会经历几种核心状态,主要包括创建态 (新建进程,分配资源)、就绪态 (已获除CPU外所有资源,等待调度)、运行态 (正占用CPU执行)、阻塞态 (等待I/O等事件而暂停,也称等待态)以及终止态(执行结束,等待系统回收资源)。

这些状态之间的转换由操作系统内核根据系统资源和事件动态控制。其生命周期通常始于创建态,当获得必要资源后进入就绪态;调度器为就绪进程分配CPU时间片后,它便进入运行态;若运行进程需要等待I/O操作等事件完成,则主动放弃CPU,进入阻塞态;当所等待的事件发生后,进程从阻塞态返回就绪态,重新等待调度;而运行进程在时间片用完后,会从运行态切换回就绪态;当进程完成任务或因错误终止时,进入终止态,最终由系统回收其所有资源。

什么是进程控制?

进程控制是操作系统的核心职能,它负责管理进程从"生"到"死"的整个生命周期,确保多个进程能够高效、有序地并发执行。其本质是通过一系列原语操作,实现对进程状态转换的有效管理 。原语是一种执行过程不可中断的原子操作,这确保了进程状态转换的准确性和安全性。

关于具体有哪些进程控制的原语,我们暂时先按下不表,后续再来总结。

什么是进程通信(IPC)?

进程通信​ 是指运行在操作系统中的多个进程之间进行数据交换、信息传递或协调同步的机制。由于操作系统为每个进程分配了独立的内存空间,一个进程通常无法直接访问另一个进程的数据,进程通信就像是架设在各个"信息孤岛"之间的桥梁,使它们能够协同工作 。

这些通信机制的核心思想是由操作系统内核为进程搭建数据交换或协调行动的通道 。其中,管道命名管道 是内核管理的一个单向字节流缓冲队列 ,数据像水流一样顺序通过。消息队列 则更结构化,它是内核维护的一个消息链表 ,允许进程按类型发送或接收格式化数据块。为了实现最高效的数据共享,共享内存 机制会将同一段物理内存映射到多个进程的地址空间中 ,让它们能直接读写同一区域,但需自行同步。信号量 本身不传数据,它作为内核中的一个计数器 ,用于协调多个进程对共享资源的访问顺序。信号 是内核向目标进程发送的一个异步通知事件 ,仅携带编号。套接字 是功能最强大的通信端点,它抽象了网络协议栈 ,可支持跨网络的全双工字节流或数据报传输。最后,内存映射文件通过将同一个文件映射到进程内存,在文件读写的同时自然实现了进程间通信。

什么是线程?

线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单元 。

线程具有以下特点:

线程具备几个关键属性:轻量性 ,自身基本不拥有系统资源,创建、切换和销毁开销远小于进程;共享性 ,同一进程内的所有线程共享该进程的地址空间和大部分资源(如全局变量、打开的文件),使得数据交换高效便捷;独立性 ,作为独立的调度单位,每个线程拥有自己的线程ID、程序计数器、寄存器集合和栈,能独立参与操作系统的调度并并发执行;结构性,操作系统会为每个线程维护一个线程控制块(TCB),用于记录其状态和管理信息。

如何实现线程?

线程的实现主要分为两种:用户级线程内核级线程用户级线程 完全在用户空间的线程库中实现和管理,操作系统内核感知不到它们的存在。其优点是切换无需陷入内核,速度极快且调度算法灵活;致命缺点是**"一个线程阻塞,整个进程阻塞"** ,且无法被调度到多个CPU核心上真正并行。内核级线程则直接由操作系统内核支持和管理,线程的创建、调度、同步都在内核中完成。其优点是内核能将不同线程调度到不同CPU核心上实现真正并行,一个线程阻塞不影响其他线程;缺点是所有线程操作都需要系统调用,切换开销较大。

什么是多线程模型?有哪些常见的多线程模型?

多线程模型描述了用户级线程(ULT)与内核级线程(KLT)之间的映射关系,主要有三种:多对一模型 (多个ULT映射到一个KLT),实现简单、切换快,但无法利用多核,一个ULT阻塞会导致整个进程阻塞,并发度低。一对一模型 (一个ULT映射到一个KLT),直接由内核调度,能实现真正并行、高并发,一个线程阻塞不影响其他线程,是现代操作系统(如Windows、Linux)的主流模型,但创建内核线程开销较大。多对多模型(多个ULT映射到数量相等或更少的KLT),折中了前两者的优缺点,既避免了用户级线程的阻塞问题,又比一对一模型更灵活、资源消耗更少,但实现最为复杂。

线程又有哪些状态呢?如何切换?

线程和进程的状态也一样,都分为创建,销毁,运行,就绪,阻塞五种状态。

线程如何组织?

通过为每个线程维护一个TCB来保存其独立的执行现场,再通过线程表将所有TCB组织起来进行统一管理,同时让这些TCB关联到其所属进程的PCB,从而实现资源共享与独立调度的分离。

处理机调度是什么?有哪些层次?

处理机调度是操作系统的核心功能,它解决"当有多个任务需要CPU时,该让谁上、上多久"的问题,其本质是由操作系统作为"总调度官",高效、公平地在多个程序间分配CPU资源

其调度工作分为三个层次,由宏观到微观,协同完成:

  1. 高级调度(作业调度) :决策是否将一个程序(作业)接纳进系统 ,并为其创建进程。它决定了系统内并发任务的"入口"和数量,就像工厂决定是否接新订单并开设新车间

  2. 中级调度(内存调度) :管理进程在内存和外存(如磁盘)间的"换入换出" 。当内存紧张时,它会将暂时不运行的进程调到外存"挂起",以平衡内存使用,相当于仓库管理员将暂时闲置的车间整体搬进/搬出仓库

  3. 低级调度(进程调度) :这是最频繁、最核心的调度,决定就绪队列中哪个进程/线程获得下一个CPU时间片 。它直接负责任务在CPU上的执行切换,就像车间内的工长,决定下一刻由哪条流水线使用中央机床

进程的挂起态和七状态模型是什么?

挂起态 是指一个进程的整个实体被暂时移出内存 ,保存到磁盘交换区(Swap Space)的状态。这通常是操作系统为了缓解内存压力而采取的主动行为。

七状态模型是在经典的五状态模型(运行、就绪、阻塞、新建、终止)基础上,增加了两种与挂起相关的状态而构成的:

  • 静止就绪:进程处于就绪状态,但不在内存中。当内存有足够空间时,它可被系统"激活",换回内存,变为活动就绪状态。

  • 静止阻塞 :进程处于阻塞状态,且已被换出到外存。即使它等待的事件发生了,由于它不在内存,也无法立即运行,其状态会先变为静止就绪,等待被换入内存。

进程调度的机制?

所谓进程调度的机制主要探讨以下问题:

什么时候需要进程调度呢?

当进程的状态发生改变,导致CPU空闲或需要重新选择运行进程时,就需要进行调度。

主要时机包括:

  1. 主动放弃:进程正常终止或运行中出现异常而终止。

  2. 主动让出 :进程因等待某事件(如I/O完成)而主动阻塞自己。

  3. 被动让出 :在抢占式 调度中,进程因时间片用完、或有更高优先级进程就绪,而被系统强制剥夺CPU使用权。

  4. 等待结束:进程所等待的事件发生,从阻塞态变为就绪态,此时可能需要调度来决定是继续运行当前进程,还是运行这个刚就绪的进程。

什么时候不能进行进程调度呢?

在操作系统内核的某些关键代码段执行期间,不能进行调度,否则可能破坏内核数据结构的完整性。具体来说,比如处理中断 时,或者进程在临界区 中,又或者在原子操作中。

这里补充说明一下这里提到的内核程序的临界区:内核代码中访问和操作那些一次只能被一个执行流(如进程、线程、中断处理程序)使用的"共享资源"的程序片段。如果多个执行流同时进入同一个临界区,就会导致数据混乱或系统崩溃,因此必须用特殊的同步机制来保护。

说完了什么时候可以进程调度什么时候不可以,我们来讨论进程调度的方式,主要分为两大类,非抢占式和抢占式。

关于进程调度,似乎和进程切换在概念上有所联系,现在让我们区分得更清楚一些:简单来说,调度解决的是"接下来该谁运行"的决策问题,而切换解决的是"如何交接工作"的执行问题 。一旦调度程序选定了下一个要运行的进程B,便启动进程切换,这本质上是一次完整的内核级任务切换,其开销远大于同一进程内用户态到内核态的模式切换。

调度器和闲逛进程是什么?

调度器是负责分配任务的"大脑" ,而闲逛进程则是确保CPU永不"空转"的待机指令

调度器是操作系统中负责分配工作所需资源的核心程序。它的核心目标是提高CPU利用率,保证系统吞吐量,并让用户感到响应及时。

关于闲逛进程:

调度的目的是什么?或者说调度算法的性能指标是什么?

关于调度算法,有多项性能指标:

CPU利用率衡量CPU用于执行有效任务的时间百分比。高利用率意味着CPU这个核心资源"物尽其用",闲置时间少,是系统高效运行的基础。

系统吞吐量指单位时间内系统成功完成的进程或作业数量。吞吐量越高,代表系统的整体处理能力和工作效率越强。

周转时间计算一个作业从提交给系统到最终完成所经历的全部时间。较短的周转时间意味着用户提交的任务能更快地完成,是批处理系统关注的重点。

等待时间特指进程在就绪队列中等待获得CPU服务的总时间。调度算法的目标之一就是减少平均等待时间,让进程更快地获得服务。

响应时间对于交互式系统(如桌面操作系统),这个指标至关重要。它衡量从用户发出指令(如敲击键盘)到系统首次产生响应(如屏幕更新)的时间间隔。响应时间越短,用户体验越流畅。

有哪些调度算法?

我们首先搞清楚调度算法的概念:

调度算法是操作系统的"决策核心",它决定了如何分配有限的计算资源(特别是CPU时间)给多个竞争的任务(如进程或线程),以达成特定的系统目标。

关于具体的调度算法的思想,都可以单出一篇博客了,这里先暂且跳过。

什么是多处理机调度?

多处理机调度 是操作系统管理多个CPU(或处理机核心)协同工作的核心机制,其核心目标是高效、公平地将多个任务分配到可用的处理单元上执行,以充分发挥硬件性能。而"处理机"是一个比"CPU"更宽泛的概念,它指的是一个可以独立执行指令的完整计算单元

单处理机调度和多处理机调度的差异是什么呢?

简单来说,我们来得额外考虑CPU的分配问题,多处理机调度的主要思路,或者说主要目标就是:

主要的方案包含两个:公共就绪队列与私有就绪队列。公共就绪队列和私有就绪队列是多处理器操作系统中用来管理待运行进程(或线程)的两种不同策略,核心区别在于任务资源是集中管理还是分散管理

下面来分别介绍这两种策略的优劣:

对于公共就绪队列 ,其核心问题是进程可能在不同CPU核心间频繁跳跃,导致缓存数据反复失效。解决方案的核心思想是在调度决策中引入"亲和性"作为重要考量 。具体来说,调度器会尝试将进程尽可能长时间地固定在同一个CPU核心上运行。即使它被暂时换下,当再次被调度时,系统也会优先将其放回之前运行的那个核心。这样,该进程之前缓存在该核心CPU(L1、L2缓存)中的数据就有很大概率还能被复用,从而显著减少缓存未命中(Cache Miss)的开销,提升运行效率 。

对于私有就绪队列 ,其核心问题是可能因进程分配不均,导致某些CPU核心"忙死"而另一些核心"闲死"。解决方案的核心是引入动态的进程迁移机制和工作窃取技术 。操作系统会周期性地检查各个CPU私有队列的长度或负载情况。当发现某个CPU的队列过长、负载过重,而另一个CPU的队列空闲或负载很轻时,系统会将一个或多个进程从繁忙CPU的私有队列中迁移 到空闲CPU的队列中 。更高级的策略是工作窃取,即空闲的CPU核心会主动去"窥探"其他繁忙核心的私有队列尾部,并"偷取"一些任务过来执行,从而在全局范围内实现负载的自动平衡 。

什么是进程的同步与互斥?

进程的同步与互斥是操作系统课程中非常核心的概念,它们解决了多进程环境下,如何安全、高效地协作和共享资源的问题。

不难想到之前的临界区似乎和这里的互斥产生了一定的概念上的联系,事实上,临界区互斥 是紧密关联、相辅相成的两个核心概念。简单来说,互斥是一种访问规则或目标,而临界区是实现这一规则的具体代码区域

进程互斥访问临界区有那么几条核心准则:

这四条准则是实现进程互斥、确保共享资源被安全访问的基石 。它们共同构建了一个既安全高效公平合理 的访问框架:"空闲让进" ​ 确保了资源的可用性,当临界区无人使用时,应立即允许请求者进入;"忙则等待" ​ 是互斥的核心,强制规定同一时刻只能有一个进程进入,从而保证了数据的一致性;"有限等待" ​ 则体现了公平性,防止任何进程因长期得不到访问权限而"饿死";最后,**"让权等待"**​ 着眼于系统整体性能,要求等待中的进程主动让出CPU,避免无意义的"忙等"消耗计算资源。

什么是锁?

锁是协调多线程或多进程环境下对共享资源访问的核心机制,不同种类的锁在性能、开销和适用场景上各有不同。

以下是常见的锁的种类:

互斥锁 ​ 在获取失败时会使线程休眠,让出CPU资源,避免了空转消耗,这使其非常适合保护执行时间较长的临界区;但正因如此,它也会带来显著的线程上下文切换开销 ,在锁竞争激烈时可能成为性能瓶颈。与之相对,自旋锁 ​ 通过线程循环尝试获取锁,省去了切换开销,在锁持有时间极短的多核环境下响应极快;但其致命缺点是若锁被长时间占用,等待线程将持续空转,白白消耗CPU计算能力

为了兼顾读写操作的差异,读写锁 ​ 应运而生,它允许多个读操作并发进行,在"读多写少"的场景下能极大提升吞吐量;然而其实现相对复杂,且如果写操作频繁,读线程可能会因持续等待写锁而遭遇**"饥饿"问题** 。更为巧妙的乐观锁 ​ 则完全不加锁,它假设操作冲突概率很低,仅在提交更新时验证数据是否被修改(例如通过版本号),在冲突确实稀少的场景下性能最高;但一旦冲突频繁,不断重试的代价会非常高昂

什么是信号量?

信号量是操作系统中用于协调多线程或多进程环境下对共享资源访问的一种重要同步机制。它的核心思想是通过一个简单的计数器来控制多个执行流对临界区的访问,确保同一时刻只有一个或指定数量的执行流能访问共享资源。

整型信号量 是最基础、最直观的信号量形式。它本质上就是一个普通的整型变量 ,用来表示当前可用资源的数量。对它的P操作(申请资源)和V操作(释放资源)在逻辑上是原子的,通常通过硬件指令或关中断来保证。

这种信号量机制的最大问题是存在"忙等待"(Busy-Waiting) 。当一个进程执行P操作发现 S <= 0时,它不会放弃CPU,而是持续占用CPU循环执行测试指令,直到其他进程执行V操作使 S变为正数。这就像你在只有一个隔间的厕所门口,不是排队等待,而是不停地敲门问"好了没?",极其浪费CPU时间

记录型信号量 是对整型信号量的重大改进 ,是实际操作系统(如Unix/Linux)中采用的实现方式。它不再是一个简单的整数,而是一个数据结构(记录),通常包含两个成员:

  1. 整型值:表示当前可用资源的数量。

  2. 等待队列:一个进程链表,用于存放所有因等待该资源而被阻塞的进程。

//暂时更新到这里

相关推荐
听麟3 小时前
HarmonyOS 6.0+ 跨端智慧政务服务平台开发实战:多端协同办理与电子证照管理落地
笔记·华为·wpf·音视频·harmonyos·政务
risc1234564 小时前
认识一个事物,需要哪些基本能力与要素?
笔记
firewood20245 小时前
共射三极管放大电路相关情况分析
笔记·学习
Hello_Embed5 小时前
libmodbus STM32 主机实验(USB 串口版)
笔记·stm32·学习·嵌入式·freertos·modbus
risc1234565 小时前
思维脚手架
笔记
risc1234565 小时前
只身走过多少的岁月,弹指一梦不过一瞬间
笔记
小陈phd5 小时前
多模态大模型学习笔记(一)——机器学习入门:监督/无监督学习核心任务全解析
笔记·学习·机器学习
崎岖Qiu5 小时前
【计算机网络 | 第九篇】PPP:点对点协议
网络·笔记·计算机网络·ppp
听麟6 小时前
HarmonyOS 6.0+ PC端虚拟仿真训练系统开发实战:3D引擎集成与交互联动落地
笔记·深度学习·3d·华为·交互·harmonyos
一个人旅程~6 小时前
我存在吗?你存在吗?
笔记·程序人生·电脑·ai写作