《Operating Systems: Three Easy Pieces》学习笔记(二十二) 锁
锁的基本思想 lock()和 unlock()函数的语义很简单。调用 lock() 尝试获取锁,如果没有其他线程持有锁(即它是可用的),该线程会获得锁,进入临界区 当持有锁的线程在临界区时,其他线程就无法进入临界区。 Pthread 库 POSIX 库将锁称为互斥量(mutex),因为它被用来提供线程之间的互斥。即当一个线程在临界区,它能够阻止其他线程进入直到本线程离开临界区。 p...
锁的基本思想 lock()和 unlock()函数的语义很简单。调用 lock() 尝试获取锁,如果没有其他线程持有锁(即它是可用的),该线程会获得锁,进入临界区 当持有锁的线程在临界区时,其他线程就无法进入临界区。 Pthread 库 POSIX 库将锁称为互斥量(mutex),因为它被用来提供线程之间的互斥。即当一个线程在临界区,它能够阻止其他线程进入直到本线程离开临界区。 p...
pthread 库介绍 线程创建 #include <pthread.h> int pthread_create( pthread_t * thread, const pthread_attr_t * attr, void * (*start_routine)(void*), void * arg ); thread 指向 pth...
单个线程的状态与进程状态非常类似。线程有一个程序计数器(PC),记录程序从哪里获取指令。每个线程有自己的一组用于计算的寄存器。所以,如果有两个线程运行在一个处理器上,从运行一个线程(T1)切换到另一个线程(T2)时,必定发生上下文切换(context switch)。线程之间的上下文切换类似于进程间的上下文切换。对于进程,我们将状态保存到进程控制块(Process Control Block...
数字设备公司(DEC)在 20 世纪 70 年代末推出了 VAX-11 小型机体系结构。该系统的操作系统被称为 VAX/VMS(或者简单的 VMS),其主要架构师之一是 Dave Cutler,他后来领导开发了微软 Windows NT 只讲重点,直接看原文就行 分段的 FIFO 防止有“自私贪婪的内存”(memory hog)—— 一些程序占用大量内存, 使其他程序难以运行。 每个...
由于内存压力(memory pressure)迫使操作系统换出(paging out)一些页,为常用的页腾出空间。确定要踢出(evict)哪个页(或哪些页)封装在操作系统的替换策略(replacement policy)中。 这章讲的是 cache,就是加速硬盘读取,以页为单位,在内存中创建硬盘页的缓存 缓存管理 将物理内存页作为硬盘内存页的缓存cache 能直接从物理内存页中找到即...
交换空间 在硬盘上开辟一部分空间用于物理页的移入和移出。一般这样的空间称为交换空间(swap space)。 存在位 当硬件在 PTE 中查找时,可能发现页不在物理内存中。硬件(或操作系统,在软件管理 TLB 时)判断是否在内存中的方法,是通过页表项中的一条新信息,即存在位(present bit)。如果存在位设置为 1,则表示该页存在于物理内存中,并且所有内容都如上所述进行。如果...
假设一个 32 位地址空间(232 字节), 4KB(212 字节)的页和一个 4 字节的页表项。一个地址空间中大约有一百万个虚拟页面(232/212)。乘以页表项的大小,你会发现页表大小为4MB。回想一下:通常系统中的每个进程都有一个页表!有一百个活动进程(在现代系统中并不罕见),就要为页表分配数百兆的内存! 简单的解决方案:更大的页 再以 32 位地址空间为例,但这次假设用 16KB...
对每次内存访问,硬件先检查 TLB,看看其中是否有期望的转换映射,如果有,就完成转换(很快),不用访问页表 (其中有全部的转换映射)。因此,更好的名称应该是地址转换缓存(address-translation cache)。 TLB 的基本算法 TLB 命中(TLB hit),直接取 TLB 未命中,硬件访问页表来寻找转换映射,并用该转换映射更新 TLB,当 TLB 更新成功后,系统会...
一个简单例子 在这个例子中,有 8 个页帧(由 128 字节物理内存构成,也是极小的) 为了记录地址空间的每个虚拟页放在物理内存中的位置,操作系统通常为每个进程保存一个数据结构,称为页表(page table)。页表的主要作用是为地址空间的每个虚拟页面保存地址转换(address translation) 为了转换(translate)该过程生成的虚拟地址,我们必须首先将它分成两个...
要满足变长的分配请求,应该如何管理空闲空间?什么策略可以让碎片最小化?不同方法的时间和空间开销如何? 假设 通过 malloc()和 free()分配释放内存 只有外部碎片 分配后不能移动,大小固定 底层机制 空闲链表 分割: 合并: 追踪已分配空间的大小 为每块分配的空间添加头块,实际占用空间是头块大小加上分配大小。 头块包括分配大...