linux内核
liunx内核
前言
Linux内核的重要部分
Linux内核主要由五个子系统组成:进程调度,内存管理,虚拟文件系统,网络接口,进程间通信。
提示:以下是本篇文章正文内容,下面案例可供参考
一. 进程
进程的定义:进程是程序执行时的一个实例。它是充分描述程序已执行到何种出差呢高度的数据结构的汇集。
线程:
协程:
进程的定义:
- 进程描述符
- 进程的状态:可运行状态(TASK_RUNNING)、可中断的等待状态(TASK_INTERRUPTIBLE)、不可中断的等待状态(TASK_UNINTERRUPTIBLE)、暂停状态(TASK_STOPPED)、跟踪状态(TASK_TRACED)、僵死状态(EXIT_ZOMBIE)、僵死撤销(EXIT_DEAD)。
创建进程:clone()、fork()、vfork()。
进程的切换:1、切换页全局目录以安装一个新的地址空间;2、切换内核态堆栈和硬件上下文,硬件上下文包含内核执行新进程所需要的所有信息,包括CPU寄存器。
内存寻址:
逻辑地址 --> 线性地址 --> 物理地址
(段) (页)
二. 中断和异常
异常:同步中断是当指令执行时由CPU控制单元产生的;
中断:异步中断是由其他硬件设备依照CPU时钟信息随机产生的。
中断可以抢断异常,而异常不可以抢断中断。
硬中断和软中断的区别:
- 软中断是执行中断指令产生的,而硬中断是由外设引发的。
- 硬中断的中断号是由中断控制器提供的,软中断的中断号由指令直接指出,无需使用中断控制器。
- 硬中断是可屏蔽的,软中断不可屏蔽。
- 硬中断处理程序要确保它能快速地完成任务,这样程序执行时才不会等待较长时间,称为上半部。
- 软中断处理硬中断未完成的工作,是一种推后执行的机制,属于下半部。
软中断实现的关键函数:可延迟函数和通过工作队列来执行的函数。
三. 内核同步
内核抢占:如果进程正执行内核函数,即使它在内核态,允许发生内核切换,这个内核就是抢占的。
针对内核的抢占或者多CPU对共享数据的竞争,需要使用同步技术。
同步技术:
技术 | 说明 | 使用范围 |
---|---|---|
每CPU变量 | 在CPU之间复制数据结构 | 所有CPU |
原子操作 | 对一个计数器原子地“读-修改-写” 的指令 | 所有CPU |
内存屏障 | 避免指令重新排序 | 本地CPU或所有CPU |
自旋锁 | 加锁时忙等待 | 所有CPU |
信行量 | 加锁时阻塞等待(睡眠) | 所有CPU |
顺序锁 | 基于访问计数器的锁 | 所有CPU |
本地中断的禁止 | 禁止单个CPU上的中断处理 | 本地CPU |
本地软中断的禁止 | 禁止单个CPU上的可延迟函数处理 | 本地CPU |
读-拷贝-更新(RCU) | 通过指针而不是锁来访问共享数据结构 | 所有CPU |
自旋锁:只要内核控制路径获得自旋锁(读/写锁、顺序锁、RCU读锁),就禁用本地中断或本地软中断,自动禁用内核抢占。自旋锁的原语仅仅是禁止或者启用内核强占。
设计思想:最好的同步技术是把设计不需要同步的内核放在首位。
四. 定时测量
定时测量是由基于固定频率振荡器和计数器的几个硬件电路完成。
多处理器系统可以依赖两种不同的时钟中断源:可编程间隔定时器或高精度事件定时器产生的中断,以及CPU本地定时器产生的中断。
五. 进程调度
调度策略定义:决定什么时候以怎样的方式选择一个新进程运行的规则。
调度中要解决的问题:
- 进程响应时间尽可能短
- 后台作业的吞吐量尽可能高
- 尽可能避免进程的饥饿现象
- 低优先级和高优先级进程的需要尽可能调和。
进程的分类:
- 交互式进程
- 批处理进程
- 实时进程
时间片的设置:时间片太短,由进程切换引起的系统额外开销会非常高;时间片太长,进程看起来就不是并发执行的。因此,Linux才去单凭经验的方法,选择尽可能长、同时能保持良好响应时间的时间片。
总结
提示:这里对文章进行总结: