linux内核进程调度以及定时器实现机制,Linux内核进程调度以及定时器实现机制(转)...

Linux内核进程调度以及定时器实现机制(转)

摘要】本文简单介绍了任务的各种状态和PCB的结构,分析了几种任务调度策略,详解了schedule,并分析了如何进行进程上下文切换;随后分析了2.6内核如何优化了任务调度算法;最后介绍了内核定时器的实现机制和系统调用的实现过程。

【关键词】进程控制块PCB,RR,FIFO,内核调度算法,任务切换,内核定时,timer,软中断softirq,系统调用

一、2.6版以前内核进程调度机制简介... 1

1、进程控制块数据结构... 1

2、进程调度... 2

3、进程上下文切换... 5

二、2.6版内核对进程调度的优化... 7

1、新调度算法简介... 7

2、2.6版新调度算法分析... 8

3、2.6版新调度算法流程图... 11

三、内核中断及定时器实现分析... 11

四、系统调用的实现过程... 14

参考资料:... 14

一、2.6版以前内核进程调度机制简介

Linux的进程管理由进程控制块、进程调度、中断处理、任务队列、定时器、bottom half队列、系统调用、进程通信等等部分组成。

进程调用分为实时进程调度和非实时进程调度两种。前者调度时,可以采用基于动态优先级的轮转法(RR),也可以采用先进先出算法(FIFO)。后者调度时,一律采用基于动态优先级的轮转法。某个进程采用何种调度算法由该进程的进程控制块中的某些属性决定,没有专门的系统用来处理关于进程调度的相关事宜。Linux的进程调度由schedule( )函数负责,任何进程,当它从系统调用返回时,都会转入schedule( ),而中断处理函数完成它们的响应任务以后,也会进入schedule( )。

1、进程控制块数据结构

Linux系统的进程控制块用数据结构task_struct表示,这个数据结构占用1680个字节,具体的内容不在这里介绍,详细内容见《Linux内核2.4版源代码分析大全》第二页。

进程的状态主要包括如下几个:

TASK_RUNNING  正在运行或在就绪队列run-queue中准备运行的进程,实际参与进程调度。

TASK_INTERRUPTIBLE      处于等待队列中的进程,待资源有效时唤醒,也可由其它进程通过信号或定时中断唤醒后进入就绪队列run-queue。

TASK_UNINTERRUPTIBLE 处于等待队列的进程,待资源有效时唤醒,不可由其它进程通过信号或者定时中断唤醒。

TASK_ZOMBIE     表示进程结束但尚未消亡的一种状态(僵死),此时,进程已经结束运行并且已经释放了大部分资源,但是尚未释放进程控制块。

TASK_STOPPED   进程暂停,通过其它进程的信号才能唤醒。

所有进程(以PCB形式)组�

相关文档:

嵌入式Linux开发需要的参考资料

作者:  来源于:  发布时间:2008-10-6 20:45:00

引导:

如需获得对

vmlinux

zimage

之间区别的极好解释,请在

Alessandro Rubini

编写的

Kernel Configuration: dealing with the unexpected

(

Linux Magazine

)的一文中找到

&ld ......

在平常的作业中,有时候老师让自己实现诸如cat等类的程序,有时候叫用shell实现,有时候用c实现,但是我经常一点头绪都没有,不过我想到linux开源的,命令代码可以拿来参考下阿,所以我就想看看linux命令的源代码,于是就开始了摆渡狗狗的搜索过程。从结果来看,有两种情况,一种是给予rpm的包的形式;另一种是基于deb包的� ......

链接文件有点类似于Windows 的所谓快捷方式,但并不完全一样。链接有两种方式,软链接和硬链接。

软链接文件

软链接又叫符号链接,这个文件包含了另一个文件的路径名。可以是任意文件或目录,可以链接不同文件系统的文件。链接文件甚至可以链接不存在的文件,这就产生一般称之为"断链"的问题(或曰“现 ......

软实时和硬实时,软实时是说违反了程序执行的deadline也不会有致命的错误,而硬实时的deadline是写死的。

很多linux有硬实时的补丁,如MontaVista。

有源晶振和无源晶振,有源的叫osllicator,无源的叫crystal。

uclinux是静态编译的,没有mmu机制。

x86的要选xterm...

serveu假设服务器 + linux用sftp(通过ssh ......

本文将描述线程的一个比较重要的一方面:线程私有数据,如下代码:

#include

#include

#include

pthread_key_t kKey = 0;

void * ThreadProc(void* arg)

{

char* a = (char*)(arg);

sleep(2);

pthread_setspecific(kKey, a);

......

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值