- 1、本文档共8页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
浅析Linux中进程和中断
一 进程和进程调度
1.进程
1.1 什么是进程
正在执行的程序代码的实时结果,即处于执行期的程序及相关资源。
系统进行资源分配和调度的基本单元
Linux系统中的进程:
交互式进程 shell命令进程、文本编辑器
批处理进程 编译
实时进程 视频应用程序
1.2 Linux下的进程结构
内核将所有进程存放在进程链表,链表的每一项的类型为task_struct
这个类型就称为进程描述符,一个进程描述符包含了具体进程的所有信息,包括进程的状态、进程标识值、进程间的关系、打开的文件信息等
进程标识
内核通过唯一的进程标识值PID来标识每一个来标志每一个进程
PID存放在进程描述符中
getpid() 获得当前进程的进程号
getppid() 获得当前进程的父进程号
进程的状态
TASK_RUNNING 运行状态(运行就绪、正在运行)
TASK_INTERRUPTIBLE 可中断的阻塞状态
TASK_UNINTERRUPTIBLE 不可中断的阻塞状态
TASK_TRACED 跟踪状态
TASK_STOPPED 暂停状态
设置当前进程的状态:
set_current_state(current,state);
进程家族树:
Linux系统的进程之间存在继承关系,所有的进程都是PID为1的init进程的后代,内核在系统启动的最后阶段启动init进程。
Linux 下进程的创建和终止
创建
fork() 拷贝当前进程创建一个子进程
exec() 读取可执行文件并将其载入地址空间开始运行
其中,fork()使用写时复制技术,避免拷贝大量用不到的数据,使系统具有快速执行能力
终止
do_exit() 释放与进程相关的资源,进程僵死不可运行,处于退出状态
但仍保留了进程描述符,此时进程的存在只为父进程能获得它的信息
wait() 终止进程,占用的所有资源被释放
Linux下的进程调度
进程的优先级
Linux采用两种不同的优先级范围
nice值 -20~+19 默认值为0 值越大优先级越低
实时优先级 可配置 0~99 值越大优先级越高
内核将进程分为两个级别: 普通进程和实时进程,任何实时进程的优先级都高于普通进程,实时优先级和nice?优先级处于互不相交的两个范畴
时间片
进程被抢占前持续运行的时间
时间片过长 系统对交互响应表现欠佳
时间片过短 明显增大进程切换带来的处理器耗时
Linux的CFS调度器并没有直接分配时间片到进程,而是划分了处理器的使用比,它还会受到nice值得影响
Linux下的进程调度
Linux的调度器类主要实现两类进程调度算法:实时调度算法和完全公平调度算法(CFS)
对实时进程的调度
按优先级执行,一般不会被抢占。直到实时进程执行完,才会执行普通进程。
如果有多个可执行状态的同优先级的实时进程,有两种调度策略:
a)SCHED_FIFO 先进先出
b)SHED_RR 轮转调度 内核为实时进程分配时间片
完全公平调度算法 Completely ?Fair?Scheduler
CFS 完全公平调度 针对普通进程的调度类
CFS基于一个简单的理念:所有任务都应该公平的分配处理器。理想情况下,n个进程的调度系统中,每个进程获得1/n处理器时间
CFS使用 vruntime变量记录一个进程运行多长时间以及还应该再运行多久,它是一个通过优先级和系统负载等加权过的时间,nice值在CFS中被作为进程获得的处理器运行比的权重,越低的nice值(越高的优先级)进程获得更多的处理器使用权重
CFS在所有可运行进程总数基础上计算出一个进程应该运行多久
可运行进程数量趋于无限时,处理器使用比趋于0,为此CFS引入了每个进程时间片底线,称为最小粒度,默认为1ms
CFS就是通过追踪这个vruntime来进行任务调度,CFS选择具有最小vruntime值的进程作为下一个可执行进程,用红黑树来组织调度实体,而键值就是vruntime。在每个tick中断的时候,会更新进程的信息,并检查这个红黑树,判断某些进程是不是要被替换掉。那么CFS只要选择最左叶子节点作为下一个可执行进程即可。实际上CFS缓存了最左叶子,可以直接选取left_most叶子 _pick_next_entity()
。
二:中断和中断处理
2.1什么是中断
硬件在需要的时候向内核发出信号
由于处理器的速度远大于外围硬件设备的速度,内核可以线处理其它事物,等到硬件真正完成请求再对该请求进行处理
2.2 中断处理的上半部和下半部
为了让中断处理既运行的快,又完成多工作量,中断处理程序从概念上分为上半部分(top
文档评论(0)