linux内核分析笔记----内核同步

Linux内核源代码情景分析笔记 Linux内核源代码情景分析笔记好吧,首先我承认我要是读者的话,这篇文章我看着也头疼,因为写的太长太泛(其主要部分集中在内存管理,进程管理,文件系统)!原本是想按自己理解的精简精简的,按照操作系统中两个核心的抽象概念“进程”和“文件”开始介绍的,可以说操作系统引入这两个概念是系统的核心,其中进程的管理可以说是对内存和cpu的抽象管理,当然基础内存管理是必须的。而文件可以说是对设备的一层抽象(不仅仅是 阅读详情

       内核同步讲的比较多了,我也就不太啰嗦了,先说一些概念,然后就是方法。

       同步就是避免并发和防止竞争条件。有关临界区的例子我就不举了,随便一本操作系统的书上都有。锁机制的提出也算解决了一些问题,我们待会再说,现在只要知道锁的使用是自愿的,非强制的。linux自身也提供了几种不同的锁机制,区别主要在于当锁被争用时,有些会简单地执行等待,而有些锁会使当前任务睡眠直到锁可用为止,这个后面细说。真正的困难在于发现并辨认出真正需要共享的数据和相应的共享区。先来说一些感性的话:大多数内核数据结构都需要加锁,如果有其他执行线程可以访问这些数据,那么就给这些数据加上某种形式的锁。如果任何其他什么东西能看到它,那么就要锁住它。简而言之,几乎访问所有的内核全局变量和共享数据都需要某种形式的同步方法。有关加锁的细节,在嵌套的锁时,要保证以相同的顺序获取锁,不要重复请求同一个锁,释放时,最好还是以获得锁的相反顺序来释放锁。加锁的粒度用来描述加锁保护的数据规模。接下来就开始讨论真正的同步方法:

       1.原子操作。就是指执行过程不被打断的操作,是 不能够被分割的指令。关于这个linux内核提供了两组原子操作接口:原子整数操作和原子位操作。好,先来说说这个原子整数操作。针对整数的原子操作只能对atomic_t类型的数据进行处理。需要说明的是,尽管linux支持的所有机器上的整形数据都是32位的,但是使用atomic_t的代码只能将该类型的数据当作24位来用,原因就不说了。使用原子操作需要的声明在asm/atomic.h中。原子整数操作列表如下;

      1

       在编写代码的时候,能使用原子操作的时候,就尽量不要使用复杂的加锁机制,因为大多数或者100%情况下,原子操作比更复杂的同步方法相比较而言,给系统带来的开销小,对高速缓存行(cache-line)的影响也很小。

       对应于原子整数操作,还有一种原子操作就是原子位操作,它们是与体系结构相关的操作,定义在文件<asm/bitops.h>,它是对普通的内存地址进行操作的。它的参数是一个指针和一个位号,第0位是给定地址的最低有效位。这里没有想atomic_t一样的数据结构,只要指针指向任何希望的数据,就可以进行操作。原子位操作函数列表如下:

      2

       同时,内核还提供了一组与上述操作对应的非原子位函数,操作完全相同,不同在于不保证原子性且名字前缀多了两个下划线,例如与test_bit()对应的非原子形式是__test_bit().如果不需要原子操作,这时这些函数的执行效率可能更高。内核还提供了两个函数用来从指定的地址开始搜索第一个被设置(或未被设置)的位:

int find_first_bit(unsigned long *addr,unsigned int size);
int find_first_zero_bit(unsigned long *addr,unsigned int size);

       其中,第一个参数是一个指针,第二个参数是要搜索的总位数。返回值分别是第一个被设置的(或没被设置的)位的位号。如果要搜素的范围仅限于一个字,使用_ffs()和__ffz()这两个函数更好,它们只需要给定一个要搜索的地址做参数。

       2.自旋锁。临界区远没有我们想象那样的那样简单,有时可能跨越多个函数。自旋锁是linux内核中最常见的锁。如果一个执行线程试图获得一个被争用的(已经被持有)的自旋锁,那么这个线程就会一直进行忙循环----旋转----等待锁重新可用。同一个锁可以用在多个位置,例如,对于给定数据的访问都可以得到保护和同步。上述的自旋过程是很费时间的,所以自旋锁不应该被长时间持有。我们前边所过也可以让请求线程休眠,CPU可以执行其他代码,直到锁可用时在唤醒它,但自旋锁由于忙等待,它是占用CPU的。上面的休眠过程也会带来上下文切换带来的开销,所以持有自旋锁的时间最好小于完成两次上下文切换的时间。自旋锁的实现和体系结构密切相关,代码往往用汇编实现,这些与体系结构相关的部分定义在<asm/spinlock.h>,实际需要用到的接口定义在文件<linux/spinlock.h>中。自旋锁操作列表如下:

      3

       自旋锁仅仅被当作一个设置内核抢占机制时候被启用的开关,如果禁止内核抢占,那么在编译时自旋锁会被完全剔除出内核。另外就是linux内核实现的自旋锁是不可递归的。自旋锁可是用在中断处理程序中(使用信号量,会导致睡眠)。在中断处理程序中使用自旋锁,一定要在获取锁之前禁止本地中断(当前处理器上的中断请求)。否则,中断处理程序会打断正持有锁的内核代码,有可能会试图去争用这个已经被持有的自旋锁。这样一来,中断处理程序就会自旋。但锁的持有者在这个中断处理程序执行完毕前不可能运行,这就是双重请求死锁。注意,需要关闭的只是当前处理器上中断,如果中断发生在不同的处理器上,即使中断处理程序在同一个锁上自旋,也不会妨碍锁的持有者(在不同处理器上)最终释放锁。最后两个函数spin_lock_bh()用于获取指定锁,同时它会禁止所有下半部的执行。相应的spin_unlock_bh()函数执行相反的操作。最后,提醒要注意自旋锁和下半部的关系。

       3.读--写自旋锁。有时,锁的用途是可以明确分为读取和写入的。当对某个数据结构的操作可以被划分为读/写两种类别时,就可以使用这里说的读---写自旋锁。这种机制为读和写分别提供了不同的锁。一个或多个读任务可以并发的持有读者锁,而写锁只能被一个写任务持有,而且此时不能有并发的读。操作函数列表如下:

      5  

       事实上,即使一个线程递归地获得同一读锁也是安全的。还是那句话,使用之前要能明确的分清读和写。如果在中断处理程序中只有读操作而没有写操作,那么,就可以混合使用“中断禁止”锁,使用read_lock()而不是read_lock_irqsave()对读进行保护。不过,你还是需要用write_lock_irqsave()禁止有写操作的中断,否则,中断里读操作就有可能锁死在写锁上(假如读者正在进行操作,包含写操作的中断发生了,由于读锁还没有全部被释放,所以写操作会自旋,而读操作只能在包含写操作的中断返回后才能继续,释放读锁,这时死锁就发生了)。最后需要说明的是,这种机制偏向与读锁:当读锁被持有时,写操作为了互斥访问只能等待,但是,读者却可以继续成功地占用锁。而自旋等待的写者在所有读锁释放锁之前是无法获得锁的。所以大量的读者会使挂起的写者处于饥饿状态。

       4.信号量。它是一种睡眠锁,实现和体系结构相关的,定义在<asm/semaphore.h>。如果有一个任务试图获得一个已经被占用的信号量时,信号量会将其推进一个等待队列,然后让其睡眠。这时的处理器会重获自由,从而去执行其他代码。当持有信号量的进程将信号量释放后,处于等待队列中的那个任务将被唤醒,并获得该信号量。如果需要在自旋锁和信号量中做出选择,应该根据锁被持有的时间长短做判断,如果加锁时间不长并且代码不会休眠,利用自旋锁是最佳选择。相反,如果加锁时间可能很长或者代码在持有锁有可能睡眠,那么最好使用信号量来完成加锁功能。信号量一个有用特性就是它可以同时允许任意数量的锁持有者,而自旋锁在一个时刻最多允许一个任务持有它。信号量同时允许的持有者数量可以在声明信号量时指定,当为1时,成为互斥信号量,否则成为计数信号量。操作函数列表如下:

      4

       信号量支持pv操作,我就不说了。

       5.读-写信号量。这个和信号量的关系是和自旋锁与读写自旋锁是一样的关系,由rw_semaphore结构表示的。定义在linux/rwsem.h中。所有的读写信号量都是互斥信号量。操作函数有:

DECLARE_RWSEM(name)				//声明名为name的读写信号量,并初始化它。
void init_rwsem(struct rw_semaphore *sem);	//对读写信号量sem进行初始化。
void down_read(struct rw_semaphore *sem);	//读者用来获取sem,若没获得时,则调用者睡眠等待。
void up_read(struct rw_semaphore *sem);		//读者释放sem。
int down_read_trylock(struct rw_semaphore *sem); //读者尝试获取sem,如果获得返回1,如果没有获得返回0。可在中断上下文使用。
void down_write(struct rw_semaphore *sem);	//写者用来获取sem,若没获得时,则调用者睡眠等待。
int down_write_trylock(struct rw_semaphore *sem);	//写者尝试获取sem,如果获得返回1,如果没有获得返回0。可在中断上下文使用
void up_write(struct rw_semaphore *sem);	//写者释放sem。
void downgrade_write(struct rw_semaphore *sem);	//把写者降级为读者。

       其实上面的就是分了两类:信号量和自旋锁,使用时选择的比较如下:

      6

       6.完成变量。如果内核中一个任务需要发出信号通知另外一个任务发生了某个特定事件,利用完成变量(complete variables)是使两个任务得以同步的简单方法。如果任务要执行一些工作时,另一个任务就会在完成量上等待,当这个任务完成工作后,会使用完成变量去唤醒在等待的任务,就像信号量一样,它们两者思想是一样的, 它仅仅提供了代替信号量的一个简单地解决方法。它有结构completion表示,定义在linux/completion.h中。操作接口列表如下:

      7

       完成变量的通常用法是将完成变量作为数据结构中的一项动态创建,而完成变量的初始化工作的内核代码将调用wait_for_completion()进行等待。初始化完成后,初始化函数调用completion()唤醒在等待的内核任务。

       7.BKL(大内核锁)。是一个全局自旋锁,年代有些久远了,使用它主要是为了方便实现从linux最初的SMP过度到细粒度加锁机制,有趣的特性如下:

1.持有BKL的任务可以睡眠。因为当任务无法调度时,所加锁会自动被丢弃,所加锁会自动被丢弃;当任务被调度时,锁又会被重新获得。当然,这不是
  说,当任务持有BKL时,睡眠是安全的,仅仅是这样做,因为睡眠不会造成任务死锁。
2.BKL是一种递归锁,一个进程可以多次请求一个锁,并不会像自旋锁那样产生死锁现象。
3.BKL可以在进程上下文中。
4.BKL是有害的。

       不要奇怪,这种机制在内核中已经几乎不存在了,也不鼓励使用。这里提到这样的思想和接口,是为了万一遇到呢?操作接口(linux/smp_lock.h)列表如下:

      8

       BKL在被持有的时候同样会禁止内核抢占。多数情况下,BKL更像是保护代码而不是保护数据。

       8.Seq锁。这种锁提供了一种简单机制,用于读写共享数据。实现这种锁主要依靠一个序列计数器。当数据被进行写入操作时,会得到一个锁,并且序列值会增加。在读取数据之前和之后,序列号都被读取。如果读取的序列号值相同,说明在读操作进行的过程中没有被写操作打断过。此外,如果读取的值是偶数,那么就说明写操作没有发生(要明白因为锁的初始值是0,所以写锁会使值为奇数,释放的时候变成偶数)。操作接口如下:

seqlock_t mr_seq_lock = SEQLOCK_UNLOCKED;    //定义顺序锁
write_seqlock(&mr_seq_lock);		     //写操作代码块…
write_sequnlock(&mr_seq_lock);

       这和普通自旋锁类似,不同的情况发生在读时,写自旋锁有很大不同:

unsigned long seq;
do{
	seq = read_seqbegin(&my_seq_lock);
}while(read_seqretry(&my_seq_lock,seq));

       在多个读者和少数读者共享一把锁的时候,seq锁有助于提供一种非常轻量级和具有可扩展性的外观。但是seq锁对写者更有利。只有没有其他写者,写锁总是能够被成功获得。读者不会影响写锁,这点和读写自旋锁及信号量是一样的。另外,挂起的写者会不断地使得读操作循环,知道不再有任何写者锁持有锁为止。

       9.禁止抢占:实际情况是这样的,有时我们不需要锁,但同时又不希望进程抢占(内核抢占)的修改某些数据,这时就要关闭内核抢占。可以通过preempt_disable()禁止内核抢占。这时一个可以嵌套调用的函数,可以使用任意次。每次调用都必须有一个相应的preempt_enable()调用,当最后一次preempt_enable()被调用时,内核抢占才重新启用。内核抢占相关操作如下:

      9

       抢占技术存放着被持有锁的数量和preempt_disable()的调用次数,当计数为0时,那么内核可以进行抢占。否则不能。为了用更简洁的方法解决每个处理器上的数据访问问题,你可以通过get_cpu()获得处理器编号(假定用这种编号来对每个处理器的数据进行索引的)。这个函数在返回当前处理器号前首先会关闭内核抢占:

int cpu = get_cpu();
...对每个处理器的数据进行操作
put_cpu();

       10.屏障。当处理多处理器之间或硬件设备之间的同步问题时,有时需要在程序代码中以指定的顺序发出读内存(写入)和写内存(存储)指令。在和硬件交互时,时常需要确保一个给定的读操作发生在其他读或写操作之前。另外,在多处理器上,可能需要按写数据的顺序读数据(通常确保后以同样的顺序进行读取)。但是编译器和处理器为了提高效率,可能对读和写重新排序,这样无疑是问题复杂化了。幸好,所有可能重新排序和写的处理器提供了机器指令来确保顺序要求。同样也可以指示编译器不要对给定点周围的指令序列进行重新排序。这些确保顺序的指令叫做屏障(barriers);这样的内存和编译屏障方法列表如下:

      10

       最后,说明的是,对于不同的体系结构,屏障的实际效果差别很大。但应该在最坏的情况下使用恰当的内存屏障,这样代码才能在编译时执行针对体系结构的优化。

Linux内核Makefile笔记 Linux内核Makefile笔记 周亦行 2014年11月参考文档 ① linux源码Makefile的详细分析 ② if_changed_rule/cc_o_c/any-prereq/arg-check ③ Makefile中的伪目标 ④ Linux kernel 3.18.5 一、Makefile组成 (一)基本组成 顶层 Makefile 它是所有Makefile文件的核 阅读详情

相关推荐

用Unity Wheel Collider做坦克转向?3步实现履带式载具物理效果

本文详细解析了如何利用Unity的Wheel Collider组件实现履带式载具的差速转向物理效果。通过思维转换、场景搭建和核心代码实现三步,将Wheel Collider从模拟轮式车辆转向改造为控制履带扭矩差的系统,并深入探讨了参数调试与真实感提升的方法,帮助开发者打造物理反馈扎实的坦克或特种车辆模拟。

weixin_29009971的博客 223

保持进程同步的方法有哪些?

1、同步和通讯的目的是一样的,实现进程间数据共享,同步只是为了做到处理协同。 2、Windows 环境下常用的同步方式有: 计时器、信号量、事件、互斥锁  3、在其他环境下进程同步的四种方法 1、临界区(Critical Section):通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。 优点:保证在某一时刻只有一个线程能访问数据的简便办法 缺点:虽然临界区同步速...

的博客 5499

VS2022离线环境下的NuGet包管理:从本地源到依赖项全解析

本文详细解析了在VS2022离线环境下如何高效管理NuGet包,包括搭建本地NuGet源的两种方案(本地文件夹源和私有NuGet服务器)、获取离线包的三大渠道以及依赖项处理的实战技巧。通过自动化脚本和依赖树分析工具,帮助开发者解决离线环境中的依赖项黑洞问题,提升开发效率。

5f4d3s2a1q的博客 1061

进程和线程同步的方法

1.前言     共有四种同步方法: 1.临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。 2.互斥量:为协调共同对一个共享资源的单独访问而设计的。 3.信号量:为控制一个具有有限数量用户资源而设计。 4.事 件:用来通知线程有一些事件已发生,从而启动后继任务的开始。 2.各种方法的详述 1、 Event       用事件(Even

zxk364961978的专栏 914

产品竞争策略方法论:构建“差异化 + 结构化 + 系统化”的竞争优势

本文系统探讨了IoT产品竞争策略,指出当前企业普遍存在硬件能力强但商业竞争能力不足的问题。文章构建了五层竞争模型(产品层、体验层、服务层、数据层、生态层),提出五大核心竞争策略(成本领先、差异化竞争、聚焦竞争、生态竞争、数据驱动竞争),并详细阐述了差异化设计方法。通过行业案例分析(小米、苹果、特斯拉)和五步落地方法,强调从硬件竞争向系统优势转变的重要性。文章指出IoT竞争胜负关键在后半场的数据运营和服务延伸,建议企业通过构建差异化能力、完善服务体系、建立数据体系、逐步构建生态来避免价格战陷阱,实现从跟随到领

专注智能硬件软硬件产品经理成长与实战,分享从需求定义到量产落地的真实日记。涵盖IoT趋势洞察、研发协作经验、产品方法论与工具箱,用轻松有趣的“汪式”视角,陪伴产品经理成长、避坑与升级。 360

eDP/DP接口简介

目前,在视频传输协议以及接口领域,外部接口主要是DP与HDMI两分天下,当然之前出现过很多接口-VGA, DVI等等,最新平台基本以这两个为主;笔记本内部接口就基本上使用eDP((Embedded Display Port))作为标准接口来驱动液晶屏了。那么问题来了,eDP和DP,是完全兼容的么?eDP,DP,HDMI,这三种接口的显示器,可以插在同一个接口上使用么?这篇文章,就会从硬件和一部分协议的角度分析一下这三大协议。

weixin_50518899的博客 2万+

关于linux内核中多进程(线程)间同步和互斥

<br />Linux设备驱动中必须解决的一个问题是多个进程对共享资源的并发访问,并发访问会导致竞态,linux提供了多种解决竞态问题的方式,这些方式适合不同的应用场景。<br /><br />Linux内核是多进程、多线程的操作系统,它提供了相当完整的内核同步方法。内核同步方法列表如下:<br />中断屏蔽<br />原子操作<br />自旋锁<br />读写自旋锁<br />顺序锁<br />信号量<br />读写信号量<br />BKL(大内核锁)<br />Seq锁<br />一、并发与竞态:<br

林学森的技术专栏 3134

django安装mysqlclient (Windows下正确安装mysqlclient)

由于本人也是初学Python和django。本人使用的Python版本是3.7所以连接MySQL数据库需要安装数据驱动,对应Python3的数据驱动是mysqlclient。因此本人习惯性的使用命令pip install mysqlclient,结果安装失败 (venv) C:\Users\songlihui\PycharmProjects\autotest&gt;pip install my...

songlh1234的博客 2万+

进程同步的方法有哪些

在操作系统中,是指在并发环境下,多个进程为了或而采取的机制,确保数据的和。由于多个进程可能同时访问共享资源,因此必须使用同步手段来避免。

Zero_pl的博客 1353

模型预测控制 (MPC, Model Predictive Control) 算法详解及案例分析

模型预测控制是一种基于模型的控制策略,通过在线求解一个有限时域的优化问题,预测系统的未来行为,并根据预测结果调整控制输入,以实现系统的稳定性和性能优化。

闲人编程的博客 2938

winform自定义控件(gdi+)(1)———设置透明背景色

本文详细讲解了如何在winform中设置控件的背景色为透明色

qq_34059233的博客 3688

操作系统之——进程管理:同步进程和进程互斥

操作系统进程管理-同步和互斥 在看了操作系统关于进程管理中的同步互斥机制章节之后,甚是困惑,今天通过视频、网上博客资料学习之后,整理一下相关知识点。 进程管理 一、进程互斥 由于进程具有独立性和异步性等并发特征,计算机的资源有限,导致了进程之间的资源竞争和共享,也导致了对进程执行过程的制约。 1.临界区相关概念: 临界资源:也就是一次只允许一个进程操作使用的计算机资源,这里的资源可...

善水的博客 5699

如何通过 GitHub Actions 使用 SSH 自动化部署到阿里云 ECS 实例

通过 GitHub Actions 和 SSH 自动化部署,可以显著提高你的开发效率和部署的可靠性。本文介绍了如何生成 SSH 密钥、将公钥添加到阿里云 ECS 实例、将私钥添加到 GitHub Secrets,以及编写 GitHub Actions 工作流来实现自动化部署。希望这篇文章对你有所帮助!

吃面不喝汤的博客 1511

linux内核 时间同步机理分析笔记

struct timekeeper定义在include/linux/timekeeper_internal.h中,保存了各种计时值。它是维护并操纵不同时间线的计时数据的主要数据结构,比如单调时间和原始时间《Linux内核精析》12.3.2 timeval和timespec当linux内核记录的时间比标准时间慢时,时间同步程序会修改内核的mult变量,让内核时间走的快一些;当linux内核记录的时间比标准时间快时,时间同步程序会修改内核的mult变量,让内核时间走的慢一些。

u010936265的博客 1504

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

【linux内核分析与应用-陈莉君】内核同步概述

1.内核同步机制的引入 如果把内核看做不断地对各种请求进行响应的服务器的话,那么正在CPU上执行的进程发出中断请求 的外部设备等相当于客户,正如服务器一直要响应客户的请求一样,内核 ...

Edidaughter的博客 553

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Linux内核分析期中总结

Linux内核分析期中总结 每周读书笔记链接汇总 第三周 http://www.cnblogs.com/lxq20135309/p/5284952.html 第四周 http://www.cnblogs.com/lxq20135309/p/5296846.html 第五周 http://www.cnblogs.com/lxq20135309/p/5335502.html 第六周 http://ww...

weixin_30758821的博客 83

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

linux内核源码分析笔记

一、内核源码目录结构 1、Linux 内核源代码包括三个主要部分 1)内核核心代码:包括linux内核整体架构分析笔记描述的各子系统和子模块,以及其他支撑子系统,如:电源管理、linux初始化等。 2)非核心代码:例如库文件(因为 Linux 内核是一个自包含的内核,即内核不依赖其它的任何软件,自己就可以编译通过)、固件集合、 KVM(虚拟机技术)等。 3)编译脚本、配置文件、帮助文档、版权说明等辅助性文件。 2、内核源代码顶层目录结构: include/ :内核头文件,需要提供给外部模块(例..

locahuang的博客 6533

Linux中的内核同步源码相关总结

Linux 内核同步是保障多并发场景下共享资源访问安全的核心技术,通过原子操作、自旋锁、互斥锁、RCU 等机制,针对不同场景提供了灵活高效的解决方案。理解这些机制的适用场景和实现原理,是编写稳定内核模块和驱动程序的基础。

qq_28576837的博客 1243

《 Linux内核完全剖析》、《linux内核完全注释》学习

《 Linux内核完全剖析》、《linux内核完全注释》学习

青少年趣味编程 1539

Linux内核分析及内核编程

倪继利著2005年8月出版ISBN 7-121-01518-5900页88.00元(估价)倪 倪继利著2005年8月出版ISBN 7-121-01518-5900页88.00元(估价)倪 内 容 简 介   本书作者在整理自己多年研发笔记的基础上,以精心挑选的典型开发实例向读者详细地讲述了内核源代码的各部分结构、原理及组成框架,主要分析了Linux最新版本(2.6.11)的内核源代码,帮助读者深入

cndeer的专栏 4686

《Linux内核精通》笔记

了解Linux内核由哪些组成?须知Linux内核源码(下载的链接👆👆👆)组织结构?重点需要学习地知识点有哪些?Linux内核架构和工作原理Linux内核Makefile系统文件详解计算机Intel CPU体系结构分析QEMU调试Linux内核环境搭建Linux Kernel内核整体架构(图文详解)Linux内核看socket底层的本质(IO)Linux用户空间与内核空间通信(Netlink通信机制)最后依据我为大家提供的的学习资料,开启我们的Linux学习之旅。

qq_34738754的博客 894

Linux内核之 内核同步

一、同步介绍 1、临界区与竞争条件 所谓临界区(critical regions)就是访问和操作共享数据的代码段。为了避免在临界区中并发访问,编程者必须保证这些代码原子地执行——也就是说,代码在执行结束前不可被打断,就如同整个临界区是一个不可分割的指令一样。如果两个执行线程有可能处于同一个临界区中同时执行,那么就是程序包含一个bug,如果这种情况发生了,我们就称之为竞争条件(race conditions,简称竞态),避免并发和防止竞争条件被称为同步(synchronization)。 在...

Linuxhus的博客 458

Linux 2.6 内核阅读笔记 内核同步

2014年7月26日 内核抢占和内核控制路径的设计 内核抢占的一种定义:如果进程正在内核态执行内核函数时,允许发生内核切换(就是被替换的进程是内核函数所在进程),这个内核就是抢占的。 linux内核提供了内核抢占的开启和关闭功能,在current_thread_info的preempt_count字段大于0时,内核就是不能抢占的。可以通过preempt_disable和preempt_

蚂蚁大战大象 846

《Linux内核分析》第六课笔记

读书是一个由厚读薄,再由薄读厚的过程。孟宁的《Linux内核分析》在课上把繁杂庞大的Linux内核抽像出主脉络,本文试图探索第六课中创建进程这一主题迷途幽径。同时本文也是《第四讲 进程管理 》的补充。一般操作系统都有类似于create_task()之类的API来凭空创造出进程。Linux沿袭自Unix,采用了另一种思路,即fork+exec。所有进程都先由一个现有进程复制而来,再改变一些属性形成新进

li_boxue的博客 2212

linux锁和内核同步

目录 1 基本概念 1.1 可重入内核 / 可重入函数 1.2 内核抢占 / 用户抢占 1.2.1 内核抢占 1.2.2 用户抢占 1.3 临界区 / 竞争条件 / 同步 1.4 原子操作 1.5 细粒度锁、粗粒度锁、锁的竞争和系统的扩展性 2 信号量(struct semaphore) 2.1 简介 2.2 注意点 2.3 进程状态 2.4 常用函数 3 读写信号量(struct rw_semaphore) 3.1 简介 3.2 常用函数 4 完成量(completion

u010936265的博客 571

Linux 内核同步简介

在使用共享内存的程序代码中,为了保护共享资源,放置共享资源的并发访问导致的错误逻辑,需要用到内核同步机制。   临界区 是访问和操作共享数据的代码段。多个执行线程并发访问同一个资源(读/写),通常是不安全的,为了避免这种隐患,编程人员必须保证这种访问是原子的(不可打断)。   造成并发的原因 造成并发有多种原因: 中断--------------------------------中...

StephenZhou 1212
上一篇: linux内核分析笔记----上半部与下半部(下)
下一篇: linux内核分析笔记----定时器和时间管理
wustdatamining
博客等级 码龄15年 12粉丝 81原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值