
读书笔记
文章平均质量分 77
扫地聖
make your heart ...
展开
-
读书笔记(11)—— kernel 全局开关中断
全局开关中断特点:通过结合使用本地开关中断和自旋锁来实现主要API全局关中断:cli()全局开中断:sti()大读者锁是对读者自旋锁的改进,它将读者所使用的数据结构分开放到不同的cache上面,避免缓存颠簸。(缓存颠簸:)主要API读者加锁操作:br_read_lock()读者解锁操作:br_read_unlock()写者加锁操作:br_write_lock()写着解锁操作:br_write_unlock()与中断开关结合使用的:br_read_lock_bh()/br_read_原创 2020-12-25 09:25:49 · 634 阅读 · 0 评论 -
读书笔记(10)—— kernel 完成量
完成量完成量特点自旋锁信号量在内的各种锁类机制都有一个共同的特点即加锁者和解锁者必须是同一个进程,而完成量不同,A进程加锁,B进程解锁的同步原语操作,主要用于进程间通信。数据结构struct completion { unsigned int done; wait_queue_head_t wait;}其中done字段表示完成状态,wait字段代表等待队列。工作原理就是:A进程将done设置为未完成,然后将自己挂接到wait队列上并进入睡眠(类似于信号量的加锁操作down),B进程完原创 2020-12-24 10:34:31 · 254 阅读 · 0 评论 -
读书笔记(9)—— kernel RCU
RCU原理RCU特点:RCU全称Read Copy Update 读复制更新,是一种完全不同于锁的并发控制机制。主要保护的对象:动态申请的内存,即指针变量。是扩展性最好的并发控制机制。RCU主要适用于读者多,写着少的场景不像锁那样将进程串行化来保护资源,是允许进程并发的。在一些必须串行化才能保护临界区的场景RCU是不适合使用的。RCU只能保证每个读者读到的数据是有效的,但是不能保证每个数据是最新的。大量的copy数据,占用了大量的内存,极端情况下可能会出现OOM(out of memory)的原创 2020-12-24 10:27:41 · 1224 阅读 · 0 评论 -
读书笔记(8)—— kernel 互斥量
互斥量从功能上讲,互斥量等价于二值信号量。然而用信号量来做互斥量有点大材小用,并且由于信号量的内存足迹(Foot Print)比较大,不利于性能优化。因此,Linux-2.6.16 开始专门引入了互斥量 Mutex。其数据结构定义如下:struct mutex { atomic_t count;spinlock_t wait_lock;struct list_head wait_list;#ifdef CONFIG_MUTEX_SPIN_ON_OWNERstruct task_struct *原创 2020-12-24 10:19:08 · 253 阅读 · 0 评论 -
读书笔记(7)—— kernel 信号量
信号量Linux 内核中应用最广泛的同步原语除了自旋锁就是信号量(Semaphore)。可以说自旋锁和信号量在很大程度上是一种互补的关系,它们有各自适用的场景,两者的场景加起来基本上可以覆盖一切内核中的所有场景。信号量可以是多值的(多值信号量),当其为二值信号量(只有两个值)时,类似于锁:一个值代表未锁,另一个值代表已锁。其工作原理与自旋锁最大的不同在于:获取锁的进程(内核的一个执行路径),若不能立即得到锁,就会发生调度转入睡眠;另外的进程释放锁时,唤醒等待该锁的进程。前面已经说过自旋锁的使用的限制主原创 2020-12-24 10:18:03 · 522 阅读 · 0 评论 -
读书笔记(6)—— kernel 顺序锁
顺序锁读写自旋锁是对普通自旋锁的改进,它对锁的竞争者进行了区分,允许多个读者同时进入临界区。但是读写自旋锁并没有区分读者和写者的重要性(优先权),因此带来一个新的问题:大量的读者持有读锁的时候,写者可能需要等待很长时间,直到所有读者都退出临界 区以后才能得到写锁。顺序锁就是为了解决这个问题来设计的,它同样适合读者多而写者少的场景,但是赋予了写者比读者高的优先权。顺序锁的数据类型定义如下:typedef struct {struct seqcount seqcount; spinlock_t lock原创 2020-12-24 10:16:18 · 194 阅读 · 0 评论 -
读书笔记(5)—— kernel 自旋锁
自旋锁自旋锁 Spinlock 是 Linux 内核中使用最广泛的同步原语。具有以下基本特征:1,获取锁的过程(即上锁的过程)是自旋(自旋就是忙等的意思)的,不会引起当前进程睡眠和调度。也就是说,当前进程一直出于活动状态中。2,持有自旋锁的临界区中不允许调度和睡眠,因为一旦发生调度,临界区什么时候能够继续运行是不确定的(什么时候解锁是不确定的),这会导致其他竞争者死锁。因此,自旋锁的加锁操作会禁止抢占,解锁操作时再恢复抢占。也因此,自旋锁既可以用于进程上下 文,又可以用于中断上下文。自旋锁的主要用途原创 2020-12-24 10:14:25 · 583 阅读 · 0 评论 -
读书笔记(4)—— kernel 开关抢占
开关抢占开关抢占主要面向单处理器系统上的并发控制。单处理器上不存在真正的并发执行,宏观上 表现出来的并发实际上是交错执行的。单处理器系统上的并发主要是异常/中断和抢占导致的。 异常/中断具有高优先级,会打断当前上下文,转入另外一个上下文环境去执行另一个内核路径。即便没有异常/ 中断,进程也有优先级高低之分,高优先级进程抢占低优先级进程同样会导致内核执行路径的切换。不同的上下文之间如果存在共享资源,那么就必须进行并发控制。在不加控制的情况下,硬中断上下文可以抢占软中断上下文和任意进程上下文的执行,软中断上下原创 2020-12-24 10:13:25 · 291 阅读 · 0 评论 -
读书笔记(3)—— kernel每CPU变量
每CPU变量为了减少不必要的共享,从而减少不必要的并发控制达到增强内核的性能和稳定性。每 CPU 变量就是为了达到这种目的而设计的,每个 CPU 都拥有一个同名的本地变量副本。在概念上,每 CPU 变量类似于一个长度为 CPU 个数的普通数组,比如:current_task[NR_CPUS];每个 CPU 根据自己的编号引用数组里面属于自己的元素:CPU0 用 current_task[0],CPU1 用 current_task[1],CPU2 用 current_task[2],但是每 CPU原创 2020-12-24 10:12:28 · 1238 阅读 · 0 评论 -
读书笔记(2)—— kernel 原子操作
原子操作如果共享资源(临界区)非常小,小到只有一个变量的话,就可以不用重量级的加锁- 解锁操作,而是直接使用原子操作。原子操作意味着整个操作的执行过程是原子的,不可中断的。原子操作分为以下几种,下面一一介绍:(1)通用原子操作Linux 内核定义了 32 位的原子变量类型 atomic_t 和 64 位的原子变量类型 atomic64_t,另外还有 atomic_long_t,在 32 位内核中等价于 atomic_t 而在 64 位内 核中等价于 atomic64_t。其代码如下:typede原创 2020-12-24 10:10:59 · 1843 阅读 · 0 评论 -
读书笔记(1)—— kernel 屏障问题
内核中的同步和并发其实并发和同步是操作系统设计中的一个核心问题,随着CPU的发展,多核多线程已经成为了主流,因此并发和同步是操作系统和内核开发者必须面临的问题。其实并发包括两类:一类是真正的同时发生, 在宏观尺度和微观尺度上都是并行执行的,这是多核CPU多级流水的情况;另一类是时分复用导致的交错发生,并不是真正的并发。在宏观尺度上是并行 但在微观尺度上是串行,这是单核处理器,只有一个流水线在执行。不管是哪类并发,都存在一个共享资源(临界区)保护的问题。临界区保护通常采用的手段就是串行化,其中最常见原创 2020-12-24 10:09:21 · 789 阅读 · 0 评论 -
计算机系统启动过程分析
本文基于MIPS架构龙芯3号处理器为例,介绍启动过程。启动过程分析无论采用何种指令系统的处理器,复位后的第一条指令都会从一个预先定义好的特定地址去取指。处理器的执行就从这条指令开始。处理器的启动过程实际上就是一个特定程序的执行过程,这个程序被成为固件,也就是BIOS,现在主流的BIOS都是采用UEFI软件架构。龙芯也自己研制了在MIPS架构上的UEFI版本。龙芯3号处理器的上电执行的第一条指令...原创 2019-03-02 15:53:34 · 1675 阅读 · 1 评论 -
读书笔记之计算机体系结构
知识要点此文章内容摘抄自计算机体系结构基础(胡伟武著),有些地方可能介绍的不是很详细,如果读者想仔细的了解,请自己阅读原著。第二章 指令系统无论是在什么架构上,都有自己的指令系统,如x86采用的是复杂指令集,而ARM/PowerPc等架构均采用的是精简指令集,这里面提到的指令集就是所谓的指令系统。因此不同平台上的要实现同样功能的指令可能会大部相同。指令是介于软件和硬件之间的桥梁,对于一个程序...原创 2019-03-02 14:11:47 · 1171 阅读 · 0 评论