Linux 信号

信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。通俗来讲,信号就是进程间的一种异步通信机制。

对于内核来说,信号的意义在于通知进程让进程知道已经发生了某个特定事件,或/和强迫进程执行它的信号处理程序,比如本文[……]

阅读全文

从OS / VM角度谈一谈栈的应用

系统中一个栈代表一个执行流,那么到底有多少种栈

首先用户空间,也就是进程至少有一个用户栈(每个线程有一个独立的用户栈)

中断、异常处理程序有独立的调用栈

系统调用有独立的调用栈 – 进程(线程)的内核栈

信号处理程序的执行肯定是在用户[……]

阅读全文

Linux 内核同步原语

每 CPU 变量

每 CPU 变量是一种内核用来避免竞争(而不是解决竞争)的手段,意思就是每个 CPU 访问各自的每 CPU变量而不要越界,这样就直接不需要同步了

原子操作

原子操作需要硬件支持,这类芯片级的原子操作对操作系统来说是不可或缺的,他们不[……]

阅读全文

本文涉及到中断/异常、系统调用、信号、进程切换,因为有这之间涉及到很多依赖,而很多概念容易混淆,所以专门梳理一下概念

中断/异常:

中断是由间隔定时器和I/O设备产生的,即CPU的外围设备产生,以通知CPU一个事件的发生,硬件上存在可编程中断控制器(PIC, APIC),负责向 CPU[……]

阅读全文

虚拟内存与进程地址空间

为了方便描述模型,以32位Linux 为例,每个进程有3G的独立的地址空间,高位1G 的地址空间 – 内核空间是所有进程共享的,每个进程本身的描述符就是放在内核空间中,并且内核空间又为每个进程都分配了一个独立的内核栈,当然每个进程在自己独立的用户空间中还有另一个栈 -[……]

阅读全文

一. 轮询

试想这样一种情形,  一个主线程中创建两个(多个)工作线程, 主线程需要等待一个或者多个工作线程执行结束.

比较直接的做法就是主线程中用一个循环, 每次都锁住和工作线程相同的一个互斥锁并检查是否有工作线程已经结束.

#include <stdio.h>
#inc[......]

阅读全文

背景: sleep函数会将进程投入睡眠, 直到被时钟中断唤醒. 而”睡眠”这个状态含义是进程不在CPU上运行, 并不是 CPU 投入”睡眠”, 当时钟中断到来时经过进程调度重新将 CPU 让给之前睡眠的进程

那么问题就来了, 如果一个系统中每个进程都主动或者被动进入睡眠状态, 比如10个进程都[……]

阅读全文