Linux内核-进程通信_线程同步_多核通信
文章平均质量分 65
章节主要针对内核与应用层多进程和多线程编程,包含了基本的原理和具体事例开发工作。
生活需要深度
这个作者很懒,什么都没留下…
展开
-
使用OpenAMP多核框架来满足控制和通信要求
在 AMP 系统中,每个内核都运行自己的操作系统(或者可能根本不运行操作系统——“裸机”)。操作系统不需要相同。每个操作系统都可以根据内核的预期功能进行选择,它不需要是特殊的“支持多核”的版本。都是相同的,因此它只能在同构多核平台上使用。然而,在一个复杂的多核系统中,可能有一组相同的核可以使用 SMP 操作系统或管理程序进行管理,并使用多核框架链接到系统的其余部分。在AMP系统中,每个操作系统都不知道其他操作系统的存在,因此必须做出具体规定。SMP 系统只能在同构多核平台上实现(即,所有内核都是相同的)。原创 2024-01-19 09:41:13 · 1757 阅读 · 0 评论 -
linux pl320 mbox控制器驱动分析-(3) pl320驱动代码分析
注册pl320 mbox的中断处理函数。irq_stat & MBOX_MASK(IPC_TX_MBOX) 判断当前的中断是否来自于IPC_TX_MBOX mbox。原创 2023-10-11 10:19:34 · 139 阅读 · 0 评论 -
linux pl320 mbox控制器驱动分析 - (2) 消息传递示例
Core0 是源core,Core1 是目标core。Core0 使用 Channel ID1,Core1 使用 Channel ID2。邮箱 1-3 处于非活动状态,自动确认和自动链接被禁用。如果 Core0 要发送另一条消息,它可以通过保持 IPCM0SOURCE 寄存器设置并在第 14 步用新消息更新 IPCM0DSTATUS、IPCM0MODE、IPCM0MSTATUS 和 IPCM0DR0 寄存器来维护邮箱的所有权。Core0 是源core,向三个目标内核 1、2 和 3 发送消息。原创 2023-10-11 10:19:01 · 149 阅读 · 0 评论 -
linux pl320 mbox控制器驱动分析 - (1) pl320手册分析
自动链接提供了一种将邮箱链接在一起的机制,这样当一个邮箱中的一条消息被确认时,下一条消息将从链接的邮箱发送,而不是中断源core。当启用自动链接时,目标core会以通常的方式清除邮箱发送寄存器的位 0 并设置位 1,但是源内核的确认中断被屏蔽掉,邮箱发送寄存器的位 0 会在下一个邮箱中设置,发送该消息。当使用带有自动确认的自动链接时,邮箱会自动在第一个邮箱中设置邮箱发送寄存器位 1 以将确认发送回源内核,但是,由于还设置了自动链接,邮箱会自动在第一个邮箱中设置邮箱发送寄存器位 0链接邮箱。原创 2023-10-11 10:17:25 · 201 阅读 · 0 评论 -
Linux内核IPC源码——共享内存
0]. sem->count的数值>=0, 如果count>0, 说明当前信号量没有被占用, 可以获取;如果countlist来添加等待任务或者唤醒任务;[0]. 定义信号量结构体变量;[1]. 初始化信号量变量。原创 2023-02-08 11:32:32 · 709 阅读 · 0 评论 -
LInux内核IPC通信 - 信号
recalc_sigpending_tsk(t) 和 recalc_sigpending(): 第一个函数检查是 *t 进程描述符表示的进程有挂起信号(t->pending->signa),还是进程所属的线程组有挂起的信号(t->signal->shared_pending->signal),然后把 t->thread_info->flags 的 TIF_SIGPENDING 标志置位。处理程序终止时,setup_frame() 或 setup_rt_frame() 放在用户态堆栈中的返回代码被执行。原创 2023-02-08 11:23:39 · 625 阅读 · 0 评论 -
Linux 内核 IPC 通信源码分析-消息队列
因此对于 n 个页,设页大小的 M,struct msg_msg 结构大小为 a,msg_msgseg 数据结构的大小为 b,n 个页最大能用于存储数据的空间为:n*M - a – b *(n-1),每页最大值为 2^13 (8192)。消息队列将消息看作一个记录,具有特定的格式以及特定的优先级,对消息队列有写权限的进程可以向中按照一定的规则添加新消息;该函数用于从指定消息队列中接收信息,如果队列中没有消息,就会将进程加入到休眠进程列表中,等待队列中有新的消息加入。消息队列中睡眠的接受者进程数据结构。原创 2023-02-08 11:20:42 · 217 阅读 · 0 评论 -
linux进程间通信(IPC) -- 管道(pipe)源码分析
所谓管道,是指用于连接一个读进程和一个写进程,以实现它们之间通信的共享文件,又称 pipe 文件。向管道(共享文件)提供输入的发送进程(即写进程),以字符流形式将大量的数据送入管道;而接收管道输出的接收进程(即读进程),可从管道中接收数据。由于发送进程和接收进程是利用管道进行通信的,故又称管道通信。为了协调双方的通信,管道通信机制必须提供以下3 方面的协调能力。互斥。当一个进程正在对 pipe 进行读/写操作时,另一个进程必须等待。同步。原创 2023-02-08 11:20:04 · 398 阅读 · 0 评论 -
并发同步 - 操作系统
4、并发同步:如果有一台支持多处理器(SMP)的机器,那么两个进程就可以真正在临界区域中同时执行,这就叫做真并发;反之称为伪并发。并发产生的原因有:(1)中断(2)软中断和tasklet;(3)内核抢占;(4)睡眠及用户空间的同步;(5)对称多处理避免死锁的方式有:死锁和数据争夺只能尽量避免一般来说,如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。另外死锁有4个必要条件(要发生缺一不可) (...原创 2022-03-20 11:10:37 · 553 阅读 · 0 评论 -
进程间通讯
七、进程间通信方式总结:管道:速度慢,容量有限,只有父子进程能通讯;FIFO:任何进程间都能通讯,但速度慢;消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题;共享内存:能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题;信号:有入门版和高级版两种,区别在于入门版注重动作,高级版可以传递消息。只有在父子进程或者是共享内存中,才可以发送字符串消息;信号量:不能传递复杂消息,只能用来同步。用于实现进程间的互斥与同步,而不是用于原创 2021-12-19 16:19:41 · 269 阅读 · 0 评论 -
信号量 - 多进程同步编程(六)
匿 名管道是一种特殊的文件,存在内核中的缓冲区,传输数据是无格式的字节流数据,大小受限制。2、消息队列,实际上是内核中的一个消息链表,它克服了管道通信数据是无格式的字节流的问题。3、共享内存,通过直接在内存中分配一个共享内存空间,解决了数据拷贝的问题,多个进程都可以通过地址来直接访问这块共享的内存空间,但是多个进程同时竞争可能会出现数据的错乱。而有名管道,通过在文件系统中创建文件的方式,解决了匿名管道只能用于具有亲属关系的进程通信的 问题,从而无关系的进程也可以进行通信。共享内存是最高效的一种方式。...原创 2022-08-12 10:20:58 · 569 阅读 · 0 评论 -
Socket - 多进程编程(五)
详细编程内容查看链接。原创 2022-08-22 11:17:51 · 85 阅读 · 0 评论 -
共享内存 - 多进程编程(四)
操作系统将不同进程之间共享内存安排为同一段物理内存,进程可以将共享内存连接到它们自己的地址空间中,如果某个进程修改了共享内存中的数据,其它的进程读到的数据也将会改变。可以看出,write_shm.c 申请共享内存,并写入数据,read_shm获取共享内存标识号,并绑定进程,读取该共享内存中的数据。共享内存并未提供锁机制,也就是说,在某一个进程对共享内存的进行读写的时候,不会阻止其它的进程对它的读写,可能会出现数据的错乱。调用 shmget() 函数创建一个新共享内存段或取得一个现有的共享内存段的标识号。..原创 2022-08-12 10:36:31 · 1559 阅读 · 0 评论 -
信号 - 多进程编程(三)
从-34号信号开始,信号没有固定意义,可以手动设置,并且是可靠的(有信号的处理时,来了信号,则进入队列,取队头进行处理)、实时的,前面的信号是不可靠(同上,没有队列,直接执行新的信号,原信号消失)、不实时的。//-9 为SIGKILL 信号不能被忽略,也不能自定义处理,任何进程接收到该信号后默认行就是强制结束。(-15信号使进程正常退出)自定义处理(即给定某个信号指定一个信号处理函数,如果在某个时刻该进程接收到这个信号,进程就会暂停主程序的执行,转去调用信号处理函数,信号处理函数返回后再继续执行主程序)原创 2022-08-22 17:06:16 · 510 阅读 · 0 评论 -
消息队列 - 多进程编程(二)
其优势是对每个消息指定特定的消息类型,接收的时候可以根据自定义条件接收特定类型的消息,而不一定像管道那样必须以先进先出的方式接收数据。**消息队列,就是一个消息的链表,是一系列保存在内核中消息的列表。**用户进程可以向消息队列添加消息,也可以向消息队列读取消息。...原创 2022-08-12 10:21:56 · 267 阅读 · 0 评论 -
管道 - 多进程编程(一)
有名管道(FIFO)不同于匿名管道之处在于它提供了一个路径名与之关联,以FIFO的文件形式存于文件系统中,并且其打开方式与打开一个普通文件是一样的,这样即使与FIFO的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够通过FIFO相互通信。1、管道是一个在内核内存中维护的缓冲区,这个缓冲区的存储能力是有限的,不同操作系统的大小不一定相同(Linux64位系统下其大小是4k),可以使用shell命令:ulimit -a查看。6、只能在具有公共祖先的进程之间使用(父子进程,兄弟进程,具有亲缘关系的进程).原创 2022-08-12 10:35:18 · 756 阅读 · 0 评论 -
线程间通信 - 多线程编程(一)
当锁被占用时试图对其加锁的线程都进入阻塞状态(释放CPU资源使其由运行状态进入等待状态)。自旋锁上锁受阻时线程不阻塞而是在循环中轮询查看能否获得该锁,没有线程的切换因而没有切换开销,不过对CPU的霸占会导致CPU资源的浪费。当以写模式加锁而处于写状态时任何试图加锁的线程(不论是读或写)都阻塞,当以读状态模式加锁而处于读状态时“读”线程不阻塞,“写”线程阻塞。读模式共享,写模式互斥。对条件的测试是在互斥锁的保护下进行的。线程间的通信目的主要是用于线程同步,所以线程没有像进程通信中的用于数据交换的通信机制。..原创 2022-08-13 15:32:48 · 871 阅读 · 0 评论 -
资源同步 - 进程信息同步
因为现代操作系统是多处理器计算的架构,必然更容易遇到多个进程,多个线程访问共享数据的情况,如下图所示:图中每一种颜色代表一种竞态情况,主要归结为三类:进程与进程之间:单核上的抢占,多核上的SMP;进程与中断之间:中断又包含了上半部与下半部,中断总是能打断进程的执行流;中断与中断之间:外设的中断可以路由到不同的CPU上,它们之间也可能带来竞态;本章主要是学习的内容如下:原子锁解决什么问题,有什么缺陷自旋锁解决什么问题,原理和应用场景睡眠锁解决什么问题,mutex和Semapho.原创 2022-04-17 08:53:21 · 397 阅读 · 0 评论 -
多进程与多线程通信 - 概述
信号在操作系统当中通过,可以直接通过发送软件的信号到相关的进程,或者相关进程对数据进行监视,进而实现相关的数据处理。在嵌入式开发过程中,尤其是在复杂的中断网络中,实现不同硬件核心之间的数据通信可以通过中断的方式进行互通,这种也是类似于single方式进行通信。套接字会发送大量的数据完成不同数据之间的消息互通,在嵌入式系统当中一个复杂系统内部实现消息互通的机制还可以在其中通过一个转发芯片来实现数据之间的传送。的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。多进程之间的数据的方式。......原创 2022-08-12 10:17:49 · 1290 阅读 · 0 评论 -
信号概念、认识和处理 - 多进程通信(三)
一:信号的基本概念进程之间的常用通信手段:发送信号,kill 第二章第二节讲过;上节课讨论过 SIGHUP信号 :通知(事情通知),用来通知某个进程发生了某一个事情; 事情,信号都是突发事件, 信号是异步发生的,信号也被称呼为“软件中断”信号如何产生:a)某个进程发送给另外一个进程或者发送给自己;b)由内核(操作系统)发送给某个进程 b.1)通过在键盘输入命令ctrl+c[中断信号],kill命令 b.2)内存访问异常,除数为0等等,硬件都会检测到......原创 2022-04-29 08:46:09 · 237 阅读 · 0 评论 -
汇总 线程通信- Linux系统编程(一)
条件变量配合着互斥锁使用,是为了解决 :在线程A中调用了 pthread_cond_wait,但是线程A还没有进入wait cond的时候,线程B调用了pthread_cond_signal,如果不用mutex,这个cond_signal就丢失了,而如果加上了锁,则线程B必须要等到mutex被释放了的时候才能调用pthread_cond_signal。条件等待 int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)原创 2022-08-24 09:34:04 · 99 阅读 · 0 评论 -
RCU基础 - linux内核锁(七)
一、前言关于RCU的文档包括两份,一份讲基本的原理(也就是本文了),一份讲linux kernel中的实现。第二章描述了为何有RCU这种同步机制,特别是在cpu core数目不断递增的今天,一个性能更好的同步机制是如何解决问题的,当然,再好的工具都有其适用场景,本章也给出了RCU的一些应用限制。第三章的第一小节描述了RCU的设计概念,其实RCU的设计概念比较简单,比较容易理解,比较困难的是产品级别的RCU实现,我们会在下一篇文档中描述。第三章的第二小节描述了RCU的相关操作,其实就是对应到了RCU的外部原创 2022-04-01 21:50:54 · 1701 阅读 · 0 评论 -
读写锁 - linux内核锁(五)
一、源由:为何引入Per-CPU变量?1、lock bus带来的性能问题在ARM平台上,ARMv6之前,SWP和SWPB指令被用来支持对shared memory的访问:SWP <Rt>, <Rt2>, [<Rn>]Rn中保存了SWP指令要操作的内存地址,通过该指令可以将Rn指定的内存数据加载到Rt寄存器,同时将Rt2寄存器中的数值保存到Rn指定的内存中去。我们在原子操作那篇文档中描述的read-modify-write的问题本质上是一个保持对原创 2022-04-01 21:16:05 · 311 阅读 · 0 评论 -
mutex互斥锁接口API与使用对比 - linux内核锁(四)
原文链接:https://blog.csdn.net/yueni_zhao/article/details/127416219。//执行kthread_stop函数后,也会调度该线程,此时signal_pending也是0。//执行kthread_stop函数后,也会调度该线程,此时signal_pending也是0。版权声明:本文为CSDN博主「千册」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。上锁失败返回0,成功返回1,本次实验中,循环判断上锁。原创 2022-11-16 18:41:20 · 1340 阅读 · 0 评论 -
信号量 - linux内核锁(三)
无论是原子操作,还是自旋锁,都不适合长时间等待的情况,因为有很多资源(数据)它有一定的时间性,你想去获取它,CPU 并不能立即返回给你,而是要等待一段时间,才能把数据返回给你。这种情况,你用自旋锁来同步访问这种资源,你会发现这是对 CPU 时间的巨大浪费。下面我们看看另一种同步机制,既能对资源数据进行保护(同一时刻只有一个代码执行流访问),又能在资源无法满足的情况下,让 CPU 可以执行其它任务。如果你翻过操作系统的理论书,应该对信号量这个词并不陌生。信号量是 1965 年荷兰学者 Edsger Dijks原创 2022-04-01 20:15:41 · 1828 阅读 · 0 评论 -
自旋锁 - linux内核锁(二)
1. 资源2. 锁的基本概念互斥锁:当有一个线程要访问共享资源(临界资源)之前会对线程访问的这段代码(临界区)进行加锁。如果在加锁之后没释放锁之前其他线程要对临界资源进行访问,则这些线程会被阻塞睡眠,直到解锁,如果解锁时有一个或者多个线程阻塞,那么这些锁上的线程就会变成就绪状态,然后第一个变为就绪状态的线程就会获取资源的使用权,并且再次加锁,其他线程继续阻塞等待。读写锁:也叫做共享互斥锁,读模式共享,写模式互斥。有点像数据库负载均衡的读写分离模式。它有三种模式:读加锁状态,写加锁状态和不原创 2022-03-08 22:44:28 · 3225 阅读 · 1 评论 -
原子操作 - linux内核锁(一)
“原子”是不可分割的意思,原子操作是指一个实际运行的操作不可分割,这个运行必然会被执行并完成而不会被另外一个任务或者事件打断。也就说,它是最小的执行单位,不可能有比它更小的执行单位。linux原子操作的问题来源于中断、进程抢占以及多核SMP系统中程序并发执行访问临界区。为了防止临界区数据的混乱,通过原子操作来保证其数据的原子操作。这里的临界区域分为全局或者局部静态变量和其他的混合临界区,对于混合临界区的原子操作需要通过复杂的锁机制保证,对于变量其原子操作以来实际的硬件平台完成其数据的原子操作。这篇博客主要讨原创 2022-03-31 17:44:29 · 4525 阅读 · 0 评论 -
锁 - linux内核锁(零)
内核中实际信息操作会设计很多临界资源,这些临界资源进行访问的时候必须要进行数据防护。原创 2022-03-31 17:22:57 · 6286 阅读 · 0 评论 -
条件变量 线程通信- Linux系统编程-(pthread)
注意,是绝对时间,不是相对时间。pthread_cond_init函数 pthread_cond_destroy函数 pthread_cond_wait函数 pthread_cond_timedwait函数 pthread_cond_signal函数 pthread_cond_broadcast函数。条件变量之所以要和互斥锁一起使用,主要是因为互斥锁的一个明显的特点就是它只有两种状态:锁定和非锁定,而条件变量可以通过允许线程阻塞和等待另一个线程发送信号来弥补互斥锁的不足,所以互斥锁和条件变量通常一起使用。原创 2022-08-23 15:15:45 · 751 阅读 · 0 评论 -
读写锁 线程通信- Linux系统编程-(pthread)
l_whence SEEK_SET:以文件开头为锁定的起始位置;SEEK_CUR:以目前文件读写位置为锁定的起始位置;SEEK_END:以文件结尾为锁定的起始位置。版权声明:本文为CSDN博主「_深蓝.」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。l_type F_RDLCK:读取锁(共享锁);一个资源可以被多个读线程访问,也可以被一个写线程访问,但不能同时存在读写线程,读写互斥,读读共享。l_pid 当前占用锁的PID,只对F_GETLK命令有效。原创 2022-08-23 15:22:55 · 118 阅读 · 0 评论 -
互斥锁 线程通信- Linux系统编程-(pthread)
【代码】互斥锁 线程通信- Linux系统编程-(pthread)原创 2022-08-23 15:04:42 · 108 阅读 · 0 评论 -
信号量 线程通信- Linux系统编程-(pthread)
创建 sem_t *sem_open(const char *name, int oflag, mode_t mode,unsigned int value)初始化 int sem_init (sem_t *sem , int pshared, unsigned int value)获取信号量的值 int sem_getvalue(sem_t *sem, int *sval)获取信号量的值 int sem_getvalue(sem_t *sem, int *sval)原创 2022-08-23 15:24:04 · 522 阅读 · 0 评论 -
自旋锁 线程通信- Linux系统编程-(pthread)
自旋锁不管是内核编程,还是应用层编程都会用到;自旋锁和互斥量类似,它不是通过休眠使进程阻塞,而是在获取锁之前一直处于忙等(也就叫自旋)状态。自旋锁可用于下面的情况:锁被持有的时间短,并且线程不希望再重新调度上花费太多的成本。自旋锁通常作为底层原语用于实现其他类型的锁。根据他们所基于的系统架构,可以通过使用测试并设置指令有效地实现。当然这里说的有效也还是会导致CPU资源的浪费:当线程自旋锁变为可用时,CPU不能做其他任何事情,这也是自旋锁只能够被只有一小段时间的原因。自旋锁和互斥锁的使用框架、场景相似的。原创 2022-08-23 14:59:02 · 195 阅读 · 0 评论 -
原子操作 线程通信- Linux系统编程-(pthread)
上面的例子节点指针也属于引用类型,自然也存在ABA问题,比如在线程2执行pop操作,将A,B都删掉,然后创建一个新元素push进去,因为操作系统的内存分配机制会重复使用之前释放的内存,恰好push进去的内存地址和A一样,我们记为A’,这时候切换到线程1,CAS操作检查到A没变化成功将B设为栈顶,但B是一个已经被释放的内存块。原子类型:原子库中定义的数据类型,对这些类型的所有操作都是原子的,包括通过原子类模板std::atomic< T >实例化的数据类型,也都是支持原子操作的。原创 2022-08-23 15:11:12 · 434 阅读 · 0 评论 -
同步机制 - 放在特殊的位置。面试题:ConcurrentHashMap 既保证了线程安全,又兼顾了性能,它做了哪方面的工作
线程不安全的HashMap因为多线程环境下,使用Hashmap进行put操作会引起死循环,导致CPU利用率接近100%,所以在并发情况下不能使用HashMap。效率低下的HashTable容器HashTable容器使用synchronized来保证线程安全,但在线程竞争激烈的情况下HashTable的效率非常低下。因为当一个线程访问HashTable的同步方法时,其他线程访问HashTable的同步方法时,可能会进入阻塞或轮询状态。如线程1使用put进行添加元素,线程2...原创 2022-04-01 19:01:30 · 131 阅读 · 0 评论 -
memory barrier - linux内核同步机制(优化防止)
一、前言我记得以前上学的时候大家经常说的一个词汇叫做所见即所得,有些编程工具是所见即所得的,给程序员带来极大的方便。对于一个c程序员,我们的编写的代码能所见即所得吗?我们看到的c程序的逻辑是否就是最后CPU运行的结果呢?很遗憾,不是,我们的“所见”和最后的执行结果隔着:1、编译器2、CPU取指执行编译器将符合人类思考的逻辑(c代码)翻译成了符合CPU运算规则的汇编指令,编译器了解底层CPU的思维模式,因此,它可以在将c翻译成汇编的时候进行优化(例如内存访问指令的重新排序),让产出的汇编指令在原创 2022-04-01 21:23:49 · 458 阅读 · 0 评论 -
编译优化乱序 - ARM汇编同步机制实例(八)
编译器(compiler)的工作就是优化我们的代码以提高性能。这包括在不改变程序行为的情况下重新排列指令。因为compiler不知道什么样的代码需要线程安全(thread-safe),所以compiler假设我们的代码都是单线程执行(single-threaded),并且进行指令重排优化并保证是单线程安全的。因此,当你不需要compiler重新排序指令的时候,你需要显式告诉compiler,我不需要重排。否则,它可不会听你的。本篇文章中,我们一起探究compiler关于指令重排的优化规则。注:测试使用原创 2022-04-01 21:55:40 · 1088 阅读 · 0 评论 -
RCU机制 - ARM汇编同步机制实例(七)
在上篇博文中笔者分析了关于完成量和互斥量的使用以及一些经典的问题,下面笔者将在本篇博文中重点分析有关RCU机制的相关内容以及介绍目前已被淘汰出内核的大内核锁(BKL)。文章的最后对《大话Linux内核中锁机制》系列博文进行了总结,并提出关于目前Linux内核中提供的锁机制的一些基本使用观点。十、RCU机制本节将讨论另一种重要锁机制:RCU锁机制。首先我们从概念上理解下什么叫RCU,其中读(Read):读者不需要获得任何锁就可访问RCU保护的临界区;拷贝(Copy):写者在访问临界区时,写者“自己”将原创 2022-03-20 12:05:01 · 714 阅读 · 0 评论 -
信号量与互斥体 - X86_64同步机制实例(六)
Linux 中的信号量同样是用来保护共享资源,能保证资源在一个时刻只有一个进程使用,这是单值信号量。也可以作为资源计数器,比如一种资源有五份,同时最多可以有五个进程,这是多值信号量。单值信号量,类比于私人空间一次只进去一个人,其信号量的值初始值为 1,而多值信号量,相当于是客厅,可同时容纳多个人。其信号量的值初始值为 5,就可容纳 5 个人。信号量的值为正的时候。所申请的进程可以锁定使用它。若为 0,说明它被其它进程占用,申请的进程要进入睡眠队列中,等待被唤醒。所以信号量最大的优势是既可以使申请失败的进程睡原创 2022-04-01 20:10:42 · 766 阅读 · 0 评论 -
信号量与互斥体 - ARM汇编同步机制实现(六)
void down(struct semaphore *sem){ unsigned long flags; raw_spin_lock_irqsave(&sem->lock, flags); if (likely(sem->count > 0)) sem->count--; else __down(sem); raw_spin_unlock_irqrestore(&sem->lock.原创 2022-03-20 11:34:05 · 774 阅读 · 0 评论