linux进程调度源码是什么
发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,这篇文章主要讲解了"linux进程调度源码是什么",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"linux进程调度源码是什么"吧!下面是进程调度函数及其
千家信息网最后更新 2025年12月02日linux进程调度源码是什么
这篇文章主要讲解了"linux进程调度源码是什么",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"linux进程调度源码是什么"吧!
下面是进程调度函数及其相关函数的代码。
void schedule(void)
{
int i,next,c;
struct task_struct ** p;
/* check alarm, wake up any interruptible tasks that have got a signal */
// 处理进程的信号和状态
for(p = &LAST_TASK ; p > &FIRST_TASK ; --p)
if (*p) {
/*
alarm的值是调用alarm函数设置的,见alarm函数,进程可以调用alarm函数,设置一个时间,
然后到期后会触发alram信号,alarm < jiffies说明过期了。设置alarm信号
*/
if ((*p)->alarm && (*p)->alarm < jiffies) {
(*p)->signal |= (1<<(SIGALRM-1));
(*p)->alarm = 0;
}
/*
_BLOCKABLE为可以阻塞的信号集合,blocked为当前进程设置的阻塞集合,相与
得到进程当前阻塞的集合,即排除进程阻塞了不能阻塞的信号,然后取反得到可以接收的
信号集合,再和signal相与,得到当前进程当前收到的信号。如果进程处于挂起状态,则改成可执行
*/
if (((*p)->signal & ~(_BLOCKABLE & (*p)->blocked)) &&
(*p)->state==TASK_INTERRUPTIBLE)
(*p)->state=TASK_RUNNING;
}
/* this is the scheduler proper: */
// 开始调度,选择合适的进程执行
while (1) {
c = -1;
next = 0;
i = NR_TASKS;
p = &task[NR_TASKS];
while (--i) {
if (!*--p)
continue;
// 找出时间片最大的进程,说明他执行的时间最短
if ((*p)->state == TASK_RUNNING && (*p)->counter > c)
c = (*p)->counter, next = i;
}
// 还有进程需要执行,c大于等于0
if (c) break;
// 没有break说明c等于0,即所有的进程时间片已经执行完,需要重新设置
for(p = &LAST_TASK ; p > &FIRST_TASK ; --p)
if (*p)
// 优先级越高,执行的时间越长,被选中执行的机会越大
(*p)->counter = ((*p)->counter >> 1) +
(*p)->priority;
}
// 切换进程
switch_to(next);
}
#define switch_to(n) {\
struct {long a,b;} __tmp; \
// ecx是第n个进程对应的pcb首地址,判断切换的下一个进程是不是就是当前执行的进程,是就不需要切换了
__asm__("cmpl %%ecx,_current\n\t" \
"je 1f\n\t" \
// 把第n个进程的tss选择子复制到__tmp.b
"movw %%dx,%1\n\t" \
// 更新current变量,使current变量执行ecx,ecx指向task[n]
"xchgl %%ecx,_current\n\t" \
// ljmp 跟一个tss选择子实现进程切换
"ljmp %0\n\t" \
// 忽略
"cmpl %%ecx,_last_task_used_math\n\t" \
"jne 1f\n\t" \
"clts\n" \
"1:" \
::"m" (*&__tmp.a),"m" (*&__tmp.b), \
"d" (_TSS(n)),"c" ((long) task[n])); \
}
int sys_alarm(long seconds)
{
int old = current->alarm;
if (old)
old = (old - jiffies) / HZ;
// 1秒等于100个jiffies
current->alarm = (seconds>0)?(jiffies+HZ*seconds):0;
return (old);
}
// 修改进程执行的优先级,满足条件的情况下increment越大优先权越低
int sys_nice(long increment)
{
if (current->priority-increment>0)
current->priority -= increment;
return 0;
}
每个进程有一个执行的时间,每次时钟中断会减少一个单位的时间。如果时间用完则直接重新调度,否则进程可以继续执行。进程调度的时候,系统会选择时间最长的进程,防止有的进程得不到执行,当所有进程的时间片都消耗完毕,则重新计算时间。
do_timer函数
if ((--current->counter)>0) return;
current->counter=0;
感谢各位的阅读,以上就是"linux进程调度源码是什么"的内容了,经过本文的学习后,相信大家对linux进程调度源码是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!
进程
时间
调度
信号
函数
阻塞
源码
切换
选择
学习
优先级
内容
变量
就是
情况
状态
合适
最大
最长
代码
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
苹果7登录id连接服务器错误
互联网科技帝国
做软件开发的简称什么意思
数据库教程2010版课后习题
创造与魔法服务器搜索
汽车站数据库表格
京东方软件开发oic
不同网段访问mysql服务器
兰州软件开发待遇怎么样
无极数据库是什么
汕尾专业软件开发供应商
bcm5354打印服务器
奉贤区网络技术服务市场价格
服务器远程连接端口怎么开启
一般服务器电源模块配置
电脑如何更改数据库
凉州区网络安全管理
网络安全陷阱视频大全
idea 破解服务器
查询分数高于平均成绩数据库
国家网络安全周口号2018
江苏数据软件开发设施参考价格
服务器提示码是干嘛的
软件开发项目进展中都有哪些过程
网络安全龙头企业飞利信
phpcms还原数据库
网络安全自查自纠照片
一般服务器电源模块配置
裸机云与物理服务器
新华书店有网络安全方面的书吗