普通人

《Operating Systems: Three Easy Pieces》学习笔记(二十七) 基于事件的并发(进阶)

基于事件的并发(event-based concurrency),在一些现代系统中较为流行,比如 node.js,但它源自于 C/UNIX 系统,我们下面将讨论。 基于事件的并发针对两方面的问题。一方面是多线程应用中,正确处理并发很有难度。 正如我们讨论的,忘加锁、死锁和其他烦人的问题会发生。另一方面,开发者无法控制多线程在某一时刻的调度(由系统调度)。 基本想法:事件循环 我们使用的...

《Operating Systems: Three Easy Pieces》学习笔记(二十五) 信号量

由锁和条件变量两篇文章可知条件变量必须和锁配合使用,那为什么不直接封装在一起呢?于是就有个信号量。 信号量只是将锁和单值条件的条件变量封装在一起,所以它不是一个全新的概念,它能实现的事锁加条件变量都能实现。对于比较复杂情况下的条件判断无法使用信号量解决,因为其只内置了一个简单的整型的 value 条件。 信号量的定义 信号量是有一个整数值的对象,可以用两个函数来操作它。在 POSIX ...

《Operating Systems: Three Easy Pieces》学习笔记(二十二) 锁

锁的基本思想 lock()和 unlock()函数的语义很简单。调用 lock() 尝试获取锁,如果没有其他线程持有锁(即它是可用的),该线程会获得锁,进入临界区 当持有锁的线程在临界区时,其他线程就无法进入临界区。 Pthread 库 POSIX 库将锁称为互斥量(mutex),因为它被用来提供线程之间的互斥。即当一个线程在临界区,它能够阻止其他线程进入直到本线程离开临界区。 p...

《Operating Systems: Three Easy Pieces》学习笔记(二十) 并发:介绍

单个线程的状态与进程状态非常类似。线程有一个程序计数器(PC),记录程序从哪里获取指令。每个线程有自己的一组用于计算的寄存器。所以,如果有两个线程运行在一个处理器上,从运行一个线程(T1)切换到另一个线程(T2)时,必定发生上下文切换(context switch)。线程之间的上下文切换类似于进程间的上下文切换。对于进程,我们将状态保存到进程控制块(Process Control Block...

《Operating Systems: Three Easy Pieces》学习笔记(十九) VAX/VMS虚拟内存系统

数字设备公司(DEC)在 20 世纪 70 年代末推出了 VAX-11 小型机体系结构。该系统的操作系统被称为 VAX/VMS(或者简单的 VMS),其主要架构师之一是 Dave Cutler,他后来领导开发了微软 Windows NT 只讲重点,直接看原文就行 分段的 FIFO 防止有“自私贪婪的内存”(memory hog)—— 一些程序占用大量内存, 使其他程序难以运行。 每个...

《Operating Systems: Three Easy Pieces》学习笔记(十八) 超越物理内存:策略

由于内存压力(memory pressure)迫使操作系统换出(paging out)一些页,为常用的页腾出空间。确定要踢出(evict)哪个页(或哪些页)封装在操作系统的替换策略(replacement policy)中。 这章讲的是 cache,就是加速硬盘读取,以页为单位,在内存中创建硬盘页的缓存 缓存管理 将物理内存页作为硬盘内存页的缓存cache 能直接从物理内存页中找到即...

© Kai. 保留部分权利。

浙ICP备20006745号-2,本站由 Jekyll 生成,采用 Chirpy 主题。