首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux内核编程--进程通信信号

这一篇有区别于上一篇的“信号量”机制哈 平台的手机版对排版的支持有限,建议用电脑打开此文章 一,Linux信号的概念: 信号Linux 进程间通信的最古老的方式。...在Linux终端上敲“Ctrl+c”,就产生一个“中断”,相当于产生一个信号,接着就会处理这个“中断任务”(默认的处理方式为结束掉当前进程) 2.信号可以直接进行用户空间进程和内核空间进程的交互,内核进程可以利用它来通知用户空间进程发生了哪些系统事件...b) 硬件异常将产生信号。 除数为 0,无效的内存访问等。这些情况通常由硬件检测到,并通知内核,然后内核产生适当的信号发送给相应的进程。 c) 软件异常将产生信号。...给本进程或者线程发送指定信号(自己给自己发),等价于 kill(getpid(), sig)1.在单线程程序中等价于 kill(getpid(), sig) 2.在多线程程序中等价于 pthread_kill...Linux中可能有不同的行为。

2.8K20

Linux内核编程--信号量机制

若sem<=0,则从阻塞队列中唤醒一个阻塞在该信号量上的线程,然后再返回原线程(调用ν操作的线程)继续执行。...Linux多进程访问共享资源时,需要按下列步骤进行操作: (1)检测控制这个资源的信号量的值。 (2)如果信号量是正数,就可以使用这个资源。进程将信号量的值“减 1”,表示当前进程占用了一份资源。...; 计数信号量:指初始值大于 1 的信号量,当进程中存在多个线程,但某公共资源允许同时访问的线程数量是有限的,它允许在一个时刻至多有count个资源持有者,这时就可以用计数信号量来限制同时访问资源的线程数量...功能: sem_post函数的作用是给信号量的值加上一个“1”,它是一个“原子操作”---即同时对同一个信号量做加“1”操作的两个线程是不会冲突的; 信号量的值永远会正确地加一个“2”--因为有两个线程试图改变它...如果有两个线程都在sem_wait()中等待同一个信号量变成非零值, 那么当它被第三个线程增加 一个“1”时,等待线程中只有一个能够对信号量做减法并继续执行,另一个还将处于等待状态。

2.6K30
您找到你想要的搜索结果了吗?
是的
没有找到

Linux内核33-信号

事实上,Linux提供了两类信号量: 内核使用的信号量 用户态使用的信号量(遵循System V IPC信号量要求) 在本文中,我们集中研究内核信号量,至于进程间通信使用的信号量以后再分析。...虽然信号量可以支持很大的count,但是在linux内核中,大部分情况下还是使用信号量的一种特殊形式,也就是互斥信号量(MUTEX)。...但是,从Linux内核2.6.37版本之后,上面的函数和宏已经不存在。这是为什么呢?因为大家发现在Linux内核的设计实现中通常使用互斥信号量,而不会使用信号量。...为了更好的理解信号量,也为了尝试理解内核在设计上的一些思想和机制。我们还是先了解一下早期版本内核获取和释放信号量的过程。 因为信号量的释放过程比获取更为简单,所以我们先以释放信号量的过程为例进行分析。...基于这个原因,Linux还提供了其它版本的请求信号量的函数: down_trylock() 可以被中断和延时函数调用。

1.4K20

深入理解Linux内核内核线程(下)

虽然讲解完了内核线程的创建过程,但是似乎又少点什么,那么下面我们来看两个细节:内核线程执行处理函数和内核线程上下文切换细节: 7.内核线程执行处理函数细节 内核线程执行到处理函数要从fork说起: 7.1...内核中创建内核线程用例 下面我们来看下,内核中创建内核线程为系统服务的用例,我们只提及不讲解具体的服务逻辑。...用例1:linux系统中,当内存不足时,会唤醒kswapd内核线程来进行异步内存回收,下面我们来看他的创建过程: mm/vmscan.c kswapd_init ->for_each_node_state...(kswapd, pgdat, "kswapd%d", nid) //使用kthread_run结构创建并唤醒创建的内核线程 执行kswapd函数 用例2:Linux软中断是下半部的一种机制,一般对效率要求较高的场景会使用到...内核模块代码:kthread_demo.c #include #include #include #include

2K30

Linux内核线程

线程通常被定义为一个进程中代码的不同执行路线。从实现方式上划分,线程有两种类型:“用户级线程”和“内核线程”。...用户线程指不需要内核支持而在用户程序中实现的线程,其不依赖于操作系统核心,应用进程利用线程库提供创建、同步、调度和管理线程的函数来控制用户线程。...这种线程甚至在象 DOS 这样的操作系统中也可实现,但线程的调度需要用户程序完成,这有些类似 Windows 3.x 的协作式多任务。另外一种则需要内核的参与,由内核完成线程的调度。...而内核线程则没有各个限制,有利于发挥多处理器的并发优势,但却占用了更多的系统开支。...Windows NT和OS/2支持内核线程Linux 支持内核级的多线程

4K00

深入理解Linux内核内核线程(上)

1.开场白 环境: 处理器架构:arm64 内核源码:linux-5.11 ubuntu版本:20.04.1 代码阅读工具:vim+ctags+cscope 在linux系统中, 我们接触最多的莫过于用户空间的任务...,像用户线程或用户进程,因为他们太活跃了,也太耀眼了以至于我们感受不到内核线程的存在,但是内核线程却在背后默默地付出着,如内存回收,脏页回写,处理大量的软中断等,如果没有内核线程那么linux世界是那么的可怕...本文力求与完整介绍完内核线程的整个生命周期,如内核线程的创建、调度等等,当然本文还是主要从内存管理和进程调度两个维度来解析,且不会涉及到具体的内核线程如kswapd的实现,最后我们会以一个简单的内核模块来说明如何在驱动代码中来创建使用内核线程...6.除了初始化阶段0号内核线程和kthreadd本身,其他所有的内核线程都是被kthreadd内核线程来间接创建。...2.kthreadd的诞生 盘古开天辟地,我们知道linux所有任务的祖先是0号进程,然后0号进程创建了天字第一号的1号init进程,init进程是所有用户任务的祖先,而内核线程同样也有自己的祖先那就是

2K20

Linux 内核】进程管理 ( 内核线程概念 | 内核线程、普通进程、用户线程 | 内核线程与普通进程区别 | 内核线程主要用途 | 内核线程创建函数 kernel_thread 源码 )

文章目录 一、内核线程概念 二、内核线程、普通进程、用户线程 三、内核线程、普通进程区别 四、内核线程主要用途 五、内核线程创建函数 kernel_thread 源码 一、内核线程概念 ---- 直接...由 Linux 内核 启动的线程 , 被称为 " 内核线程 " ; " 内核线程 " 是一种 特殊进程 , 独立运行在 " 内核空间 " , 其将 " 内核函数 " 委托给 独立进程 , 该 " 独立进程..." 与 其它进程 ( 包括 普通进程 , 内核自身 , 用户级线程 ) 并行执行 ; " 内核线程 " 也称为 " 守护进程 " ; 二、内核线程、普通进程、用户线程 ---- 在 【Linux 内核...】进程管理 ( 进程特殊形式 | 内核线程 | 用户线程 | C 标准库与 Linux 内核中进程相关概念 | Linux 查看进程命令及输出字段解析 ) 一、进程特殊形式 ( 内核线程 | 用户线程...-5.6.18\include\linux\sched.h 四、内核线程主要用途 ---- 内核线程主要用途 : 内存同步 : 周期性执行如下同步操作 , 同步 " 修改的内存页 " 与 " 页来源块设备

3.7K20

Linux线程编程之信号

hello pthread jjjkj the input words is 5 jjkl;j the input words is 6 end over 注意: 这里在Linux...不过在这之前还是要稍微介绍一下什么是线程信号量,其实这个跟进程通信有点类似——Linux进程编程----syslog的使用和进程间通信的介绍(六): a、那么什么是信号量呢?...信号量用在多线程多任务同步的时候,一个线程完成了某一个动作就通过信号量告诉别的线程,别的线程再进行某些动作(可以理解日常打电话给女朋友,而你朋友却经常给你信号,不要烦她。...当信号量被释放一个,值被加一后,系统自动从等待队列中唤醒一个等待中的线程,让其获得信号量,同时信号量再减一。...因此,为了访问共享资源,线程必须从信号量得到通行证, 如果该信号量的计数大于0,则此线程获得一个通行证,这将导致信号量的计数递减,否则,此线程将阻塞直到获得一个通行证为止。

1.5K20

Linux内核34-读写信号

那也就是说,读/写信号量同读/写自旋锁一样,对于读操作,多个内核控制路径可以并发请求一个读写信号量;而对于写操作,每个内核控制路径必须独占访问受保护的资源。...因此,对于读/写信号量来说,写操作的时候,既不可以进行读操作,也不可以进行写操作。读/写信号量提高了内核中的并发数量,也同时提高了系统的整体性能。...内核严格按照先进先出(FIFO)的原则处理等待读/写信号量的进程。读进程或者写进程一旦请求信号量失败,就被写到信号量等待队列的队尾。当信号量被释放后,队列中的第一个进程先被执行,因为它先被唤醒。...高16位的计数器以2的补码形式表示非等待写进程和等待内核控制路径的数量,低16位表示非等待读进程和非等待写进程的总数。 wait_list 等待进程的列表。...down_read() 和 down_write()函数分别用来请求读信号量和写信号量。同理,up_read()和 up_write()函数分别用来释放读信号量和写信号量。

1.3K10

Java线程Linux内核线程的映射关系

Java线程Linux内核线程的映射关系Linux内核2.6开始使用NPTL (Native POSIX Thread Library)支持,但这时线程本质上还轻量级进程。...Java里的线程是由JVM来管理的,它如何对应到操作系统的线程是由JVM的实现来确定的。Linux 2.6上的HotSpot使用了NPTL机制,JVM线程内核轻量级进程有一一对应的关系。...线程的调度完全交给了操作系统内核,当然jvm还保留一些策略足以影响到其内部的线程调度,举个例子,在linux下,只要一个Thread.run就会调用一个fork产生一个线程。...Java线程在Windows及Linux平台上的实现方式,现在看来,是内核线程的实现方式。...看图: Java线程Linux内核线程的映射关系 (说明:KLT即内核线程Kernel Thread,是“内核分身”。

2.1K40

Linux线程信号量控制手段!

Linux线程DEMO介绍: 本次的DEMO是对多线程知识点的回顾,因为多线程技术在我们平常开发中经常用到。这次的DEMO是通过发送信号量去控制线程的运行和停止。...相当于这两个线程默认是挂起阻塞起来,然后等着input_monitor线程发送指令。...3.2. input_monitor线程的讲解: input_monitor线程的主要用途是,发送指令去操控process1_thread线程和process2_thread线程的运行。...blocking_thread_start主要功能是:开启对应的线程,把线程的count设置成1,并且使用pthread_cond_broadcast去通知对应的线程,要开始线程的打印。...blocking_thread_stop主要功能是:停止对应的线程,把线程的count设置成0,并且使用pthread_cond_broadcast去通知对应的线程,要停止线程的打印。

1.7K30

Linux】多线程 之 POSIX信号

,等待释放临界资源时 sem由0变为1 ,才可以再申请临界资源 这种信号量称为 二元信号量 ,等同于互斥锁 每一个线程,在访问对应的资源时,先申请信号量, 申请成功,表示该线程允许使用该资源 申请不成功...认识接口 POSIX信号量 和system V 信号量 作用相同,都是用于同步操作,达到无冲突的访问共享资源目的,但POSIX可以用于线程间同步 ---- sem_init ——初始化信号量 输入 man...sem_init sem :表示信号量 pshared : 0表示线程间共享 非零表示进程间共享 value : 信号量初始值 (计数器值初始化为多少) sem_destroy——销毁信号量...,空间信号量只有生产者关心 构造 将环形队列ring大小和_cap(容量)初始化为N 0表示线程间共享,将数据信号量 初始化为0,将空间信号量初始化为整个环形队列的容量 (对于两者的初始化值大小,在原理处都有详细解释...main() { ringqueue*rq=new ringqueue(); pthread_t c;//消费者 pthread_t p;//生产者 //创建线程

26350

Java线程内核线程

本篇文章探究下Java线程内核线程的关系. 在Java中,一个Java的线程对应一个内核线程,实际的业务代码是由内核线程来执行的,而Java线程只是一个傀儡....在Thread-A线程结束之后,对应的有个内核线程707也消失了,那么这个内核线程707是不是就是对应Java的Thread-A线程呢?...我们是使用strace -ff -o out java Example命令运行的程序,因此它会打印系统调用相关的信息. 707内核线程打印了Thread-A, 也就是说,内核线程707对应Java的...同时当Java线程的run方法执行完成之后, 线程就调用exit退出了. 这里也就解释了Java线程退出之后,内核线程也会退出的原因了....中的线程状态,以及内核线程状态,都是不完全一样的.

1.1K40

Linux系统编程-(pthread)线程通信(信号量)

总结 信号量也主要是用来保护共享资源(信号量也属于临界资源),使得资源在一个时刻只有一个线程或者多个线程独享。...**信号量和互斥锁(mutex)的区别:**互斥锁只允许一个线程进入临界区,而信号量允许多个线程同时进入临界区,要使用信号量同步,需要包含头文件semaphore.h。 2....如果pshared的值为0,那么信号量在进程的线程之间共享,并且应位于所有线程可见的某个地址(例如,全局变量)能够,或在堆上动态分配的变量),如果pshared不为零,那么信号量在进程之间共享,信号量的值就位于共享内存区域...主要用来增加信号量的值。当有线程阻塞在这个信号量上时,调用这个函数会使其中的一个线程不在阻塞。...(获取信号量),主要被用来阻塞当前线程直到信号量 sem 的值大于 0,得到信号量之后,信号量的值会减一。

2.1K10

Linux信号

进程对于信号的处理有三种:1.默认,2.忽略,3.自定义; 但并不是进程一收到信号就马上处理,因为信号是随时产生的(异步),可能当信号来临时进程正在处理着更重要的事情,进程对信号的处理会在合适的时机(内核态返回用户态时...) lgn代表内核级忽略 可以看到大部分信号的最终处理都是一样的(退出当前进程),系统设置这些信号主要是为了知道导致进程退出的原因是什么。...其实调用系统调用之所以能让我们要求操作系统帮我们获得某些数据或者访问硬件,是因为在执行系统调用的时候,首先会执行Int 80这样的汇编代码,陷入内核,让我们从用户态切换到内核态。...在寄存器中有一个CR3寄存器,该寄存器中存放的数据代表的是当前代码的执行权限(0代表内核态,3代表用户态),陷入内核以后操作系统首先会修改CR3的数据。...因为操作系统只有一封,被加载到内存中也是独一份,因此没有必须要让每个进程都独立维护一个内核级页表 信号处理全过程 首先因为信号导致的系统调用陷入内核,从用户态切换到内核态,通过寄存器中保存的PCB

18030

Linux进程信号信号保存】

---- 前言 信号从产生到执行,并不会被立即处理,这就意味着需要一种 “方式” 记录信号是否产生,对于 31 个普通信号来说,一个 int 整型就足以表示所有普通信号的产生信息了;信号还有可能被 “阻塞...的相关概念 1.1、概念 信号 传递过程:信号产生 -> 信号未决 -> 信号递达 信号产生(Produce):由四种不同的方式发出信号 信号未决(Pending):信号从 产生 到 执行 的中间状态...信号递达(Delivery):进程收到信号后,对信号的处理动作 在这三种过程之前,均有可能出现 信号阻塞 的情况 信号阻塞(Block):使信号传递 “停滞”,无论是否产生,都无法进行处理 信号递达后的三种处理方式...,本文探讨的是 信号保存阶段,即 物流信息 1.3、在内核中的表示 对于传递中的信号来说,需要存在三种状态表达: 信号是否阻塞 信号是否未决 信号递达时的执行动作 在内核中,每个进程都需要维护这三张与信号状态有关的表...---- 总结 以上就是本次关于 Linux进程信号信号保存】的全部内容了,在本文中,我们首先再一次对信号有了较深的理解,知道了在内核中存在三张表记录信号的处理流程,然后我们学习了信号集的操作函数,

16420

线程同步(四)—— 信号

这篇是进程线程的博文的最后一篇了,至此进程线程的所有同步内容已经全部回顾完了。 其中信号信号量看起来名字很像,实际上却是完全不一样的两个东西,信号信号量在进程线程中都可以使用。...进程中的共享内存,线程中的互斥锁,条件变量。这些是独有的,但实际也能互相使用,《Unix网络编程》中对这些的总结是按需所用。...前面提到过线程回收,类似进程回收,线程回收的pthread_join也是接收子线程的销毁消息。 使用kill -l查看linux中的信号。...这次还是使用USR1信号作为用户的定义信号,进行线程的通信。 这块代码由于需要给指定的函数传入函数指针,为了消除this指针使用了几个static静态函数和静态成员。...在主线程收到其他线程发出的信号

54050
领券