使用操作系统提供的yield()调用让线程中运行态变为就绪态,从而允许其他线程运行,避免继续自旋浪费时间片 使用队列:休眠替代自旋 核心思想是在lock()函数中发现锁被其他线程占用时,将自己的threadID添加到一个队列,并利用park()系统调用让自己休眠;在unlock()函数中根据队列的threadID利用unpark()系统调用去唤醒对应的...
用PV操作是西安了进程间的互斥与同步,PV操作是非常重要的一个知识点 ;信号是唯一的异步通信机制,在APUE一书的第10章有非常详细的介绍说明,常用的信号包括SIGKILL、SEGSTOP等; Socket包括字节流SOCKSTREAM、数据包SOCKDGRAM等。
今天我们开始学习《操作系统导论》的第一个主题:虚拟化CPU。 虚拟化CPU的目的是为了将少量物理CPU,让用户看起来像是有无数多个CPU可用,以便能让多个进程可以同时运行。 操作系统要实现虚拟化CPU,要从三个方面要实现:抽象出“进程”的概念、底层(硬件)机制支持以及高层策略(OS对进程的调度算法)。 进程是底层机制和...
运行时间过长的进程被假定会定期放弃 CPU,以便操作系统可以决定运行其他任务。 进程通过调用系统调用的方式将cpu控制权转移给操作系统,例如使用yield系统调用。 抢占模式 操心系统通过时钟中断,时钟设备可以编程为每隔几毫秒产生一次中断。产生中断时,当前正在运行的进程停止,操作系统中预先配置的中断处理程序会运行。此时,...
当上一线程结束执行, 调用 unlock()释放了锁之后, flg 此时为 0, 当前线程在 TAS 执行中返回了 0, 跳出循环, 重新设置 flg=1, 持有锁, 开始进入临界区执行操作. 上面的 flg 设置操作都是原子的(atomic), 这是锁可行性的基础. 将测试(测试旧值), 和设置(设置新值)合并为一个原子操作, 这就保证了...
第一章 导论 1.1 操作系统做什么 计算机系统 计算机硬件 操作系统 系统程序和应用程序 用户 1.1.1 用户视角 个人PC 设计目的是为了用户使用方便,性能是次要的,而且不在乎资源使用率(如何共享硬件和软件资源 性能对用户来说非常重要,而不是资源使用率,优化单用户使用情况 ...
操作系统导论 Chapter5 插叙: 进程 API 声明: 本文为《Operating Systems: Three Easy Pieces》学习笔记。 原书更为详细,本文仅作学习交流使用。 5.1 fork()系统调用 系统调用fork()用于创建新进程。 新创建的进程成为子进程,原来的进程称为父进程。 子进程不会从main()函数开始执行,而是直接从fork()系统调用返...
本章将介绍一种著名的调度方法——多级反馈队列(Multi-level Feedback Queue,MLFQ)。该调度程序经过多年的一系列优化,出现在许多现代操作系统中。 多级反馈队列需要解决两方面的问题。首先,它要优化周转时间。在对进程调度策略的介绍中我们看到,这通过先执行短工作来实现。然而,操作系统通常不知道工作要运行多久,而这...
《操作系统导论》,一本被名字耽误的操作系统好书,本以为非常难啃,实际读下来发现深入浅出,还是比较容易理解的,整本书围绕三个话题。 虚拟化(CPU的时分调度,内存虚拟化) 并发(操作系统并发原语介绍) 持久化(磁盘,以及文件系统的原理性介绍) 作者讲这些技术点的思路也比较友好,从提出问题,到简单解决方案,到最后我们...
计算机开机的时候需要运行一个初始化程序,又名引导程序。这段程序用于初始化系统,包括CPU寄存器、设备控制器和内存。然后运行操作系统。通常,引导程序位于ROM或EEPROM中。装入操作系统的关键在于定位操作系统,即知道操作系统入口在哪里。记忆中,通常应该是在硬盘的引导扇区?