TUPELO Blog

Thinking will not overcome fear but action will.

Linux内核13_1-进程切换是对FPU单元的处理_X86

Linux对FPU硬件单元的处理

每一种技术的出现必然是因为某种需求。正因为人的本性是贪婪的,所以科技的创新才能日新月异。 1 简介 从英特尔80486DX开始,算术浮点单元(FPU)就已经被集成到CPU中了。但是之所以还继续使用数学协处理器,是因为以前使用专用芯片进行浮点运算,所以这算是旧习惯的沿用吧。为了与旧CPU架构模型兼容,指令的使用方式与整数运算一样,只是使用了转义指令,也就是在原有的指令基础上加上前缀,组成新...

Linux内核35-Completion机制

Linux同步之Completion机制的工作原理以及实现

每一种技术的出现必然是因为某种需求。正因为人的本性是贪婪的,所以科技的创新才能日新月异。 1 Completion机制的工作原理 内核编程中的一个常见模式就是在当前进程中,再去启动另外一个活动,比如创建新的内核线程或用户进程、向已存在的进程发起请求、再或者操作某些硬件。针对这些情况,内核当然可以尝试使用信号量同步两个任务,代码如下所示: struct semaphore sem; i...

Linux内核34-读/写信号量

Linux-读/写信号量的工作原理以及实现机制

每一种技术的出现必然是因为某种需求。正因为人的本性是贪婪的,所以科技的创新才能日新月异。 1 读/写信号量的工作原理 读/写信号量和读/写自旋锁类似,不同的地方是进程在等待读/写信号量的时候处于挂起状态,而在等待读/写自旋锁的时候是处于忙等待,也就是自旋的状态中。 那也就是说,读/写信号量同读/写自旋锁一样,对于读操作,多个内核控制路径可以并发请求一个读写信号量;而对于写操作,每个内核...

Linux内核33-信号量

Linux-信号量的工作原理以及应用场合

1 什么是信号量? 对于信号量我们并不陌生。信号量在计算机科学中是一个很容易理解的概念。本质上,信号量就是一个简单的整数,对其进行的操作称为PV操作。进入某段临界代码段就会调用相关信号量的P操作;如果信号量的值大于0,该值会减1,进程继续执行。相反,如果信号量的值等于0,该进程就会等待,直到有其它程序释放该信号量。释放信号量的过程就称为V操作,通过增加信号量的值,唤醒正在等待的进程。 ...

Linux内核32-读-拷贝-更新(RCU)

Linux-读-拷贝-更新(RCU)工作原理以及应用场合

每一种技术的出现必然是因为某种需求。正因为人的本性是贪婪的,所以科技的创新才能日新月异。 1 引言 seqlock锁只能允许一个写操作,但是有些时候我们可能需要多个写操作可以并发执行。所以,Linux内核引入了读-拷贝-更新技术(英文是Read-copy update,简称RCU),它是另外一种同步技术,主要用来保护被多个CPU读取的数据结构。RCU允许多个读操作和多个写操作并发执行。更...

Linux内核31-Seqlock

Linux-Seqlock锁工作原理以及应用场合

1 什么是seqlock锁? 上一篇文章中,我们已经学习了读/写自旋锁的工作原理和实现方式(基于ARM架构体系)。但是,有一个问题我们不得不考虑,那就是read锁和write锁的优先级问题:它们具有相同的优先级,所以,读操作必须等到写操作完成后才能执行,同样,写操作必须等到读操作完成后才能执行。 Linux2.6内核版本引入了Seqlock锁,与读写自旋锁基本一样,只是对于写操作来说,具...

Linux内核30-读写自旋锁

Linux读写自旋锁工作原理以及应用场合

1 读/写自旋锁概念 自旋锁解决了多核系统在内核抢占模式下的数据共享问题。但是,这样的自旋锁一次只能一个内核控制路径使用,这严重影响了系统的并发性能。根据我们以往的开发经验,大部分的程序都是读取共享的数据,并不更改;只有少数时候会修改数据。为此,Linux内核提出了读/写自旋锁的概念。也就是说,没有内核控制路径修改共享数据的时候,多个内核控制路径可以同时读取它。如果有内核控制路径想要修改这...

Linux内核29-原子操作

Linux有哪些原子操作

1 引言 汇编指令读写内存变量的过程我们称为read-modify-write,简称为RMW操作。也就是说,它们读写一个内存区域两次,第一次读取旧值,第二次写入新值。 假设有两个不同的内核控制路径运行在两个CPU上,同时尝试RMW操作相同的内存区域且执行的是非原子操作。起初,两个CPU尝试读取相同位置,但是内存仲裁器(促使串行访问RAM的电路)确定一个可以访问,让另一个等待。但是,当第一...

Linux内核28-自旋锁

自旋锁的工作原理和使用场景

1 引言 使用最广泛的同步技术就是加锁。对于锁概念,我相信大家已经不陌生了,不论是实时嵌入式系统还是服务器上的操作系统,都使用了这个概念。所以对于锁的理解就不再赘述了。 自旋锁是设计用来在多核系统中工作的一种特殊锁。如果内核控制路径发现自旋锁空闲,则申请加锁然后执行。相反,如果发现锁已经被其它CPU上的内核控制路径占用,它就会一直自旋,就是在循环查看锁是否已经释放,直到该锁被释放。 自...

Linux内核27-优化和内存屏障

内核中优化和内存屏障的工作原理和使用场景

1. 引言 我们都知道,带有优化的编译器,会尝试重新排序汇编指令,以提高程序的执行速度。但是,当在处理同步问题的时候,重新排序的指令应该被避免。因为重新排序可能会打乱我们之前想要的同步效果。其实,所有的同步原语都可以充当优化和内存屏障。 优化屏障保证屏障原语前后的C语言转换成汇编语言之后,指令序列不会发生变化。比如说,对于Linux内核的barrier()宏,展开后就是asm volat...