如果说操作系统是一辆车,那么操作系统内核就是发动机。操作系统内核是操作系统最核心的部分,负责调度cpu资源,管理进程和内存等。用户应用程序不能直接操作硬件,而是需要通过内核这个中间层,由内核真正的操纵硬件资源(硬件驱动程序也属于内核当中)。
操作系统内核的体系结构:
Linux中每一个进程都依赖一个父进程,内核启动程序init程序作为第一个进程,该进程在系统初始化的时候再进一步创建其他进程(fork, 创建当前进程的副本,只有pid不同,内存也将被复制;exec,将一个新程序加入到当前进程的内存并执行)
pstree可以看到进程的层次结构:
在Linux中使用clone方法创建线程,工作方式类似于fork,但是启用了精确的检查,以确认哪些资源和父进程共享,哪些资源为线程自己创建。
Linux提供了命名空间(namespace)技术,可以将不同进程进行分组,不同的组可以互相隔离(环境隔离),每个组中都有一个唯一的init进程(父进程),该技术让虚拟化技术得以发展。但是仅仅环境隔离还不够,因为进程使用CPU、内存、磁盘等资源还是可以随心所欲的,所以Linux内核又提供了CGroup技术,使得计算资源得以隔离,即A组中的进程只能使用分配给A的cpu、内存、磁盘等,而不能去干涉B组中的资源。虚拟机由此诞生。
进程间的相互通信是通过信号(Signal)来实现的,信号用于将系统事件报告给进程。例如当用户按下Ctrl+C时,实际上是发送了一个SIGINT中断信号,用来终止当前执行的进程。Linux中大约有20多种不同的信号。
当用户在键盘上敲入一个字符或者点击鼠标的时候,会产生中断(不同事件会有不同的标识,并由中断向量表来选择由哪个中断处理程序处理),当一个中断信号到达时,CPU必须停止它当前正在做的事情,保留上下文,并调用中断处理程序(内核控制路径,并不是进程)将中断尽可能快的处理完(关键而紧急的部分立即执行,其他的部分内核随后会执行,例如I/O设备(比如网卡)发出的所有中断请求都是可屏蔽中断,cpu在稍后会一起执行)。同步中断(又叫异常,只有在CPU执行完当前指令后才会发出中断,又分为故障(缺页异常),陷阱,异常终止,编程异常)和异步中断(中断,由其他硬件设备根据CPU时钟信号随机产生)统称为中断信号。
内核线程(又叫守护进程)是直接由内核本身启动的进程,只运行在内核态,只能使用3~4G的虚拟地址空间。内核线程与用户进程并行地执行,实现内存页置换,监控资源等操作。
读写自旋锁:rwlock_t结构,允许多个内核控制路径并发的读,但是如果有一个内核控制路径想修改结构,则需要先获取读写自旋锁的写锁。