收藏 分销(赏)

浅析Linux中的进程和中断.doc

上传人:xrp****65 文档编号:8752730 上传时间:2025-03-01 格式:DOC 页数:7 大小:422.50KB 下载积分:10 金币
下载 相关 举报
浅析Linux中的进程和中断.doc_第1页
第1页 / 共7页
浅析Linux中的进程和中断.doc_第2页
第2页 / 共7页


点击查看更多>>
资源描述
一 进程和进程调度 1.进程 1.1 什么是进程 正在执行的程序代码的实时结果,即处于执行期的程序及相关资源。 系统进行资源分配和调度的基本单元 Linux系统中的进程: 交互式进程 shell命令进程、文本编辑器 批处理进程 编译 实时进程 视频应用程序 1.2 Linux下的进程结构 内核将所有进程存放在进程链表,链表的每一项的类型为task_struct 这个类型就称为进程描述符,一个进程描述符包含了具体进程的所有信息,包括进程的状态、进程标识值、进程间的关系、打开的文件信息等 1. 进程标识 内核通过唯一的进程标识值PID来标识每一个来标志每一个进程 PID存放在进程描述符中 getpid() 获得当前进程的进程号 getppid() 获得当前进程的父进程号 2. 进程的状态 TASK_RUNNING 运行状态(运行就绪、正在运行) TASK_INTERRUPTIBLE 可中断的阻塞状态 TASK_UNINTERRUPTIBLE 不可中断的阻塞状态 TASK_TRACED 跟踪状态 TASK_STOPPED 暂停状态 设置当前进程的状态: set_current_state(current,state); 进程家族树: Linux系统的进程之间存在继承关系,所有的进程都是PID为1的init进程的后代,内核在系统启动的最后阶段启动init进程。 1.3 Linux 下进程的创建和终止 1. 创建 fork() 拷贝当前进程创建一个子进程 exec() 读取可执行文件并将其载入地址空间开始运行 其中,fork()使用写时复制技术,避免拷贝大量用不到的数据,使系统具有快速执行能力 2. 终止 do_exit() 释放与进程相关的资源,进程僵死不可运行,处于退出状态 但仍保留了进程描述符,此时进程的存在只为父进程能获得它的信息 wait() 终止进程,占用的所有资源被释放 1.4 Linux下的进程调度 1. 进程的优先级 Linux采用两种不同的优先级范围 1) nice值 -20~+19 默认值为0 值越大优先级越低 2) 实时优先级 可配置 0~99 值越大优先级越高 内核将进程分为两个级别: 普通进程和实时进程,任何实时进程的优先级都高于普通进程,实时优先级和nice 优先级处于互不相交的两个范畴 2. 时间片 进程被抢占前持续运行的时间 时间片过长 系统对交互响应表现欠佳 时间片过短 明显增大进程切换带来的处理器耗时 Linux的CFS调度器并没有直接分配时间片到进程,而是划分了处理器的使用比,它还会受到nice值得影响 3. Linux下的进程调度 Linux的调度器类主要实现两类进程调度算法:实时调度算法和完全公平调度算法(CFS) 1) 对实时进程的调度 按优先级执行,一般不会被抢占。直到实时进程执行完,才会执行普通进程。 如果有多个可执行状态的同优先级的实时进程,有两种调度策略: a)SCHED_FIFO 先进先出 b)SHED_RR 轮转调度 内核为实时进程分配时间片 2) 完全公平调度算法 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 half)和下半部分(bottom half),内核把上半部和下半部分开处理。 1. 上半部——登记中断 中断处理程序收到一个中断,它就立即开始执行,但只做有严格时间限制的工作,如对中断的应答和拷贝数据等, 应该尽量减少上半部的工作量,此时完全屏蔽中断,要求快速,否则其它中断得不到处理 2. 下半部——可以推迟处理的部分 执行与中断处理密切相关但上半部分本身不执行的工作,允许被稍后完成 2.3 注册中断处理程序 每一设备都有相关的驱动程序,如果设备使用中断,相应的驱动程序就需要注册一个中断处理程序 驱动程序通过request_irq()函数注册一个中断处理程序,并且激活给定的中断线 int request_irq(unsigned int irq, irq_handler_t handler,unsigned long flags, const char *name,void *dev) irq 要分配的中断号 handler 指针,指向处理这个中断的实际中断处理程序 typedef irqreturn_t (*irq_handler_t) (int,void *) flags 中断处理的标志 RQF_DISABLED 内核在处理中断处理程序期间,禁止所有其它中断 IRQF_SAMPLE_RANDOM 中断对内核熵池有贡献 内核熵池--负责提供从各种随机事件导出的真正随机数 IRQF_TIMER 系统定时器的中断处理 IRQF_SHARED 在多个中断处理程序之间共享中断线 name 与中断相关的设备的ASCII文本表示 dev 对于共享的中断线,提供唯一的标志信息区分共享同一中断处理程序的多个设备, 支持共享. 函数返回0表示成功执行,返回非0表示有错误 2.4中断处理程序 1.编写中断处理程序 return_t intr_handler(int irq, void *dev) 返回类型 irqreturn_t IRQ_NONE 不是指定的设备产生的中断 IRQ_HANDLED 被正确调用 对于共享的中断处理程序: flags 必须设置为IRQF_SHARED 对每个注册的中断处理程序,dev参数唯一(可以使用指向设备结构的指针) 2.释放中断处理程序 void free_irq(unsigned int irq,void *dev) 2.5 /proc/interrupts 该文件存放系统中与中断相关的统计信息 第一列是中断号,第二 三列是接受中断数量的值,第四列是处理这个中断的中断控制器,最后一列是与这个中断相关的设备名字 2.6 中断的控制 2.7 下半部的三种实现机制 在2.6的内核中,有三种下半部的实现机制:软中断 tasklet 和工作队列 其中,tasklet基于软中断实现,工作队列靠内核线程实现
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 教育专区 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服