这一篇有区别于上一篇的“信号量”机制哈 平台的手机版对排版的支持有限,建议用电脑打开此文章 一,Linux信号的概念: 信号是 Linux 进程间通信的最古老的方式。...二,Linux信号的特点: 1.信号是异步的,进程不需要等待信号的到来,也不需要有获得信号的操作,而是在进程内部设置与信号对应的处理函数,有信号到达的时候,系统异步触发对应的处理函数。...在Linux终端上敲“Ctrl+c”,就产生一个“中断”,相当于产生一个信号,接着就会处理这个“中断任务”(默认的处理方式为结束掉当前进程) 2.信号可以直接进行用户空间进程和内核空间进程的交互,内核进程可以利用它来通知用户空间进程发生了哪些系统事件...b) 硬件异常将产生信号。 除数为 0,无效的内存访问等。这些情况通常由硬件检测到,并通知内核,然后内核产生适当的信号发送给相应的进程。 c) 软件异常将产生信号。...Linux中可能有不同的行为。
Linux多进程访问共享资源时,需要按下列步骤进行操作: (1)检测控制这个资源的信号量的值。 (2)如果信号量是正数,就可以使用这个资源。进程将信号量的值“减 1”,表示当前进程占用了一份资源。...四,信号量的分类: 信号量按照使用场景分为 :二值信号量和计数信号量: 二值信号量:指初始值为 1 的信号量,此类信号量只有 1 和 0 两个值,通常用来代替锁机制实现线程同步, 在一个时刻仅允许有一个资源持有者...功能: sem_post函数的作用是给信号量的值加上一个“1”,它是一个“原子操作”---即同时对同一个信号量做加“1”操作的两个线程是不会冲突的; 信号量的值永远会正确地加一个“2”--因为有两个线程试图改变它...如果对一个值为0的信号量调用sem_wait(), 这个函数就会地等待直到有其它线程增加了这个值使它不再是0为止。...pthread_create(&smk_1, 0, smoker, 1); pthread_create(&smk_2, 0, smoker, 2); while(1); } Linux
进入某段临界代码段就会调用相关信号量的P操作;如果信号量的值大于0,该值会减1,进程继续执行。相反,如果信号量的值等于0,该进程就会等待,直到有其它程序释放该信号量。...事实上,Linux提供了两类信号量: 内核使用的信号量 用户态使用的信号量(遵循System V IPC信号量要求) 在本文中,我们集中研究内核信号量,至于进程间通信使用的信号量以后再分析。...虽然信号量可以支持很大的count,但是在linux内核中,大部分情况下还是使用信号量的一种特殊形式,也就是互斥信号量(MUTEX)。...但是,从Linux内核2.6.37版本之后,上面的函数和宏已经不存在。这是为什么呢?因为大家发现在Linux内核的设计实现中通常使用互斥信号量,而不会使用信号量。...基于这个原因,Linux还提供了其它版本的请求信号量的函数: down_trylock() 可以被中断和延时函数调用。
进程崩溃时,Linux会将崩溃前进程的内存状态保存在core文件里,就像保存了案发现场的照片,可以帮助开发人员找到事故原因,修复程序。本文用简单的例子讲解如何根据core文件,定位进程崩溃的原因。
1.2、键盘产生信号并被读取的过程 在CPU上是有各个针脚的,每个针脚有对应的编号。针脚在主板上是可以和键盘进行连接的。...CPU有寄存器能记录是几号(我觉得可以理解成数组下标)针脚触发了高电平。然后CPU就可以根据寄存器中的数字在中断向量表中找到对应数组下标中的读取键盘数据的方法。操作系统就去读取键盘上输入的数据。...因为发送信号要修改PCB内核数据结构的内容,所以无论产生信号的方式有多少种,最终都是由操作系统将信号写入进程PCB中的。...假设我们要修改空指针里的内容,将保存在eax寄存器中的空指针的地址(虚拟地址)和CR3寄存器中的基地址到MMU中进行映射,发现页表中根本就没有空指针的虚拟地址到物理地址之间的转换关系(或者是其它情况,有转换关系但是页表项的权限为只读权限但你却要做修改...无论产生信号的方式有多少种,最终都是由操作系统将信号写入进程PCB中的。
从实现方式上划分,线程有两种类型:“用户级线程”和“内核级线程”。...用户线程指不需要内核支持而在用户程序中实现的线程,其不依赖于操作系统核心,应用进程利用线程库提供创建、同步、调度和管理线程的函数来控制用户线程。...另外一种则需要内核的参与,由内核完成线程的调度。其依赖于操作系统核心,由内核的内部需求进行创建和撤销,这两种模型各有其好处和缺点。...而内核线程则没有各个限制,有利于发挥多处理器的并发优势,但却占用了更多的系统开支。...Windows NT和OS/2支持内核线程。Linux 支持内核级的多线程。
Java 离内核有多远? 测试环境版本信息: image.png 玩内核的人怎么也懂 Java?...此处就可以进入内核了,但是我们还是先继续看看 JVM。...Linux 实际上并没有从本质上将进程和线程分开,线程又被称为轻量级进程(Low Weight Process, LWP),区别就在于线程与创建它的进程(线程)共享内存、文件等资源。...完整的段落如下(双引号扩起来的几个段落),有兴趣的同学可以详细阅读: “ fork 传递至 _do_fork 的 clone_flags 参数是固定的,所以它只能用来创建进程,内核提供了另一个系统调用...将线程当作轻量级进程,但线程的特性并不是由 Linux 随意决定的,应该尽量与其他操作系统兼容,为此它遵循 POSIX 标准对线程的要求。
那也就是说,读/写信号量同读/写自旋锁一样,对于读操作,多个内核控制路径可以并发请求一个读写信号量;而对于写操作,每个内核控制路径必须独占访问受保护的资源。...因此,对于读/写信号量来说,写操作的时候,既不可以进行读操作,也不可以进行写操作。读/写信号量提高了内核中的并发数量,也同时提高了系统的整体性能。...内核严格按照先进先出(FIFO)的原则处理等待读/写信号量的进程。读进程或者写进程一旦请求信号量失败,就被写到信号量等待队列的队尾。当信号量被释放后,队列中的第一个进程先被执行,因为它先被唤醒。...高16位的计数器以2的补码形式表示非等待写进程和等待内核控制路径的数量,低16位表示非等待读进程和非等待写进程的总数。 wait_list 等待进程的列表。...down_read() 和 down_write()函数分别用来请求读信号量和写信号量。同理,up_read()和 up_write()函数分别用来释放读信号量和写信号量。
它们必须通过系统调用接口来请求内核态的服务。 1.2、内核态 内核态是操作系统的核心部分(即内核)的运行状态。在这种状态下,代码可以访问系统内的所有内存空间,并且可以执行特权指令。...内核态下的代码具有最高级别的权限,可以访问硬件、执行敏感操作,并管理系统资源。 1.3、用户态和内核态的切换时机 当用户态下的进程需要执行特权操作时,它会通过系统调用接口向内核发出请求。...在这三种情况下,操作系统都会保存用户态的上下文,并在内核态下处理这些事件。 二、信号被处理的时机 如下图所示,进程从内核态切换回用户态的时候,信号会被检测并处理。...如果该信号的处理方法为默认处理方法,就不需要从内核态切换回用户态来处理我们写的方法,但如果该信号的处理方法为我们自己的自定义处理方法,就要从内核态切换回用户态来执行,执行完毕程序再进入内核。...三、用户态和内核态切换的内核级理解 在我们的进程地址空间中存在1G的内核空间,这部分会用来映射加载到内存中的操作系统。
ThreadLocal在Java中是一个非常有用的工具,它可以帮助我们解决多线程环境下的数据共享问题。ThreadLocal是Java中的一个类,它提供了线程局...
在外表上看不出区别的ip有什么意义?) 发布会上演示了个AR游戏: 然后,我看到有人表示,『为什么打个类似王者农药的游戏还要绕着桌子走来走去』?...『电脑有什么用?玩空当接龙?』 『为什么要上网买东西,明明走两步就到商城了,还能自己亲自试一试货对不对口。』 在现在这个时代再看看上面这些问题,很可笑吧? 『AR有什么用?』...这个问题在现在,等价于十几年前『电脑有什么用?』 那答案到底是有什么用呢? 回想一下,几十年前的电脑有什么用?拨号上网,贵的要死,用卡车拉存储器。...,就要忍受那时候的人对汽车的嘲笑:『看看这个笨重的铁块,一直打滑,跑的贼慢,还老贵了,傻子才买~』 AR是个平台,苹果很清楚自己的定位,所以口号是『最大的AR平台』,而这个技术能否发光,取决于以后是否有个象征性的产品产生
在收到通知,再到你拿到快递期间,是有一个时间窗口的,在这段时间,你并没有拿到快递,但是你知道有一个快递已经来了。...2.4 硬件异常产生信号 硬件异常被硬件以某种方式被硬件检测到并通知内核,然后内核向当前进程发送适当的信号。...信号产生时,内核在进程控制块中设置该信号的未决标志,直到信号递达才清除该标志。...Linux是这样实现的:常规信号在递达之前产生多次只计一次,而实时信号在递达之前产生多次可以依次放在一个队列里 3.3 sigset_t 从上图来看,每个信号只有一个bit的未决标志,非0即1,不记录该信号产生了多少次...当前正在执行main函数,这时发生中断或异常切换到内核态。在中断处理完毕后要返回用户态的main函数之前检查到有信号SIGQUIT递达。
进程对于信号的处理有三种:1.默认,2.忽略,3.自定义; 但并不是进程一收到信号就马上处理,因为信号是随时产生的(异步),可能当信号来临时进程正在处理着更重要的事情,进程对信号的处理会在合适的时机(内核态返回用户态时...注意,阻塞和忽略是不同的,只要信号被阻塞就不会递达,而忽略是在递达之后可选的一种处理动作 2.在内核中的表示 PCB中有两个位图和一个函数指针数组,而位图的下标就代表对应的信号,其中block位图代表的是该信号是否有被阻塞...当然也不用担心陷入内核以后找不到进程的代码,因为有寄存器保存了当前正在执行进程的PCB和用户级页表地址。...再谈地址空间 在前面的博客中只谈论了0–3G的用户级地址空间,现在就再将3–4G的内核级地址空间也拿出来谈论: 1.为什么用户级页表要各自有一份?...方法中是否有恶意代码); 执行完handler方法以后还需要再回一次内核态,因为进程的上下文数据是由操作系统保存的,无法直接知道之前是从哪一行代码跳转过来的,要想回到之前跳转的代码继续往后面执行,必须要有操作系统的参与
有任何想要讨论和学习的问题可联系我:zhuyc@vip.163.com。 发布文章的风格因专栏而异,均自成体系,不足之处请大家指正。 IP地址有什么用?...每一个路由器相当于一个中转站,就好像一个个的信号基站(这并不是一个十分恰当的比喻),将某个区域的计算机或低一级的路由器统一来进行管理。...当然,我们可以使用路由器给我们分配的IP地址,但有一个问题,由路由器分配的IP地址有可能会发生变化,还有可能我们的电脑并没有连入路由器。...Windows:ipconfig Linux/Mac:ifconfig 3. 路由跃点跟踪 如果我们想知道我们当前的设备到底经过了多少个路由才接入的互联网,可以使用如下命令。...Windows:tracert Linux/Mac:traceroute ?
---- 前言 在 Linux 中,进程具有独立性,进程在运行后可能 “放飞自我”,这是不利于管理的,于是需要一种约定俗成的方式来控制进程的运行,这就是 进程信号,本文将会从什么是进程信号开篇,讲述各种进程信号的产生方式及作用...SIGPROF 该信号类似与 SIGVTALRM,它不仅包括该进程占用 CPU 的时间还包括执行系统调用的时间,该信号的默认处理动作是终止进程 28 SIGWINCH 当窗口大小发生变化时,内核会将该信号发送至前台进程组...这个位图结构中 4.所谓的 “发送” 信号,其实就是写入信号,修改进程中位图结构中对应的比特位,由 0 置为 1,表示该信号产生了 5.signal_struct 属于内核数据结构,只能由 操作系统...核心转储 文件啊 难道是我们的环境有问题吗?...最终会导致整个服务器挂掉的 还有一个重要问题是 core 文件中可能包含用户密码等敏感信息,不安全 关闭核心转储很简单,设置为 0 就好了 ulimit -c 0 6.3、核心转储的作用 如此大的核心转储文件有什么用呢
的相关概念 1.1、概念 信号 传递过程:信号产生 -> 信号未决 -> 信号递达 信号产生(Produce):由四种不同的方式发出信号 信号未决(Pending):信号从 产生 到 执行 的中间状态...(未决信息已记录),当 快递送达后(信号递达),物流记录 不再更新 而 堵车 是一件不可预料的事情,也就是说:在下单后,快递可能一会儿送达(没有阻塞),可能五天送达(阻塞 -> 解除阻塞),有可能永不送达...快递送达后,正常拆快递(默认动作) 快递送达后,啥也不干,就是玩(忽略) 快递送达后,直接把快递退回去(用户自定义) 当然,用户自定义的情况可以有很多种,也有可能是直接把快递扔了 综上,网购的整个过程可以看作...信号传递过程,本文探讨的是 信号保存阶段,即 物流信息 1.3、在内核中的表示 对于传递中的信号来说,需要存在三种状态表达: 信号是否阻塞 信号是否未决 信号递达时的执行动作 在内核中,每个进程都需要维护这三张与信号状态有关的表...---- 总结 以上就是本次关于 Linux进程信号【信号保存】的全部内容了,在本文中,我们首先再一次对信号有了较深的理解,知道了在内核中存在三张表记录信号的处理流程,然后我们学习了信号集的操作函数,
SIGCHLD产生的条件 实际上,在子进程结束的时候,会产生一个SIGCHLD信号,信号描述如下,根据man手册可以知道,子进程结束运行,其父进程会收到SIGCHLD信号,该信号的默认处理动作是忽略。...信号停止时; 子进程处在停止态,接受到SIGCONT后唤醒时; 既然子进程在退出或暂停的时候会发送SIGCHLD信号,那么我们就可以利用该信号,捕捉该信号,并在捕捉函数中完成子进程状态的回收,这样就不用使用...,但子进程没有继承未决信号集spending; 应该在fork之前,阻塞SIGCHLD信号,注册完捕捉函数后解除阻塞。...; 信号的处理方式必须是捕捉 (默认动作、忽略都不可以); 中断后返回-1, 设置errno为EINTR,表示被信号中断; 可以通过修改sa_flags参数来设置被信号中断后系统调用是否重启:SA_INTERRURT...sa_flags还有很多可选参数,适用于不同情况,比如:捕捉到信号后,在执行捕捉函数期间,不希望自动阻塞该信号,可将sa_flags设置为SA_NODEFER,除非sa_mask中包含该信号,等等。
signal 信号是 UNIX 系统最先开始使用的进程间通信机制,因为 Linux 是继承于 UNIX 的,所以 Linux 也支持信号机制,通过向一个或多个进程发送 异步事件信号 来实现,信号可以从键盘或者访问不存在的位置等地方产生...你可以在 Linux 系统上输入 kill -l 来列出系统使用的信号,下面是我提供的一些信号 进程可以选择忽略发送过来的信号,但是有两个是不能忽略的:SIGSTOP 和 SIGKILL 信号。...除此之外,进程可以选择它想要处理的信号,进程也可以选择阻止信号,如果不阻止,可以选择自行处理,也可以选择进行内核处理。如果选择交给内核进行处理,那么就执行默认处理。...下面我们就来看一下这些信号是干什么用的 SIGABRT 和 SIGIOT SIGABRT 和 SIGIOT 信号发送给进程,告诉其进行终止,这个 信号通常在调用 C 标准库的 abort() 函数时由进程本身启动...当用户退出Linux登录时,前台进程组和后台有对终端输出的进程将会收到SIGHUP信号。这个信号的默认操作为终止进程,因此前台进 程组和后台有终端输出的进程就会中止。
- 2、用户态与内核态 对于 用户态、内核态 的理解及引出的 进程地址空间 和 信号处理过程 相关知识是本文的重难点 2.1、概念 先来看看什么是 用户态和内核态 用户态:执行用户所写的代码时,就属于...与真实的地址空间建立映射关系 每个进程都有自己的 进程地址空间,不同 进程地址空间 中地址可能冲突,但实际上地址是独立的 进程地址空间 可以让进程以统一的视角看待自己的代码和数据 关于 进程地址空间 的相关知识详见 《Linux...,还需要坠入 内核态 通过一张图快速记录信号的 处理 过程 图片来源:Linux进程信号 ---- 3、信号的捕捉 接下来谈谈 信号 是如何被 捕捉 的 3.1、内核如何实现信号的捕捉?...截至目前,信号 处理的所有过程已经全部学习完毕了 信号产生阶段:有四种产生方式,包括 键盘键入、系统调用、软件条件、硬件异常 信号保存阶段:内核中存在三张表,blcok 表、pending 表以及 handler...表,信号在产生之后,存储在 pending 表中 信号处理阶段:信号在 内核态 切换回 用户态 时,才会被处理 ---- 总结 以上就是本次关于 Linux进程信号【信号处理】的全部内容了,本文对信号的处理时机做了探讨
文章目录 一、下载 Linux 内核源码 二、使用 VSCode 阅读 Linux 内核源码 一、下载 Linux 内核源码 ---- 参考 【Linux 内核】编译 Linux 内核 ① ( 下载指定版本的...Linux 内核源码 | Linux 内核版本号含义 | 主版本号 | 次版本号 | 小版本号 | 稳定版本 ) 博客 , 下载 Linux 5.6.18 版本的内核源码 ; 5.x 内核源码下载地址...: https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/ Linux 内核 5.6.18 版本 : https://mirrors.edge.kernel.org...参考 【错误记录】解压 Linux 内核报错 ( Can not create symbolic link : 客户端没有所需的特权 | Windows 中配置 7z 命令行执行解压操作 ) 博客 ;...不同版本的 Linux 内核 区别 : 系统调用 : 其系统调用是相同的 , 新的版本可能会增加新的系统调用 ; 设备文件 : 各内核版本的设备文件都是相同的 , 但是 内部接口 可能不同 ; 二、使用
领取专属 10元无门槛券
手把手带您无忧上云