当前位置: 首页 > news >正文

内核进程的调度与进程切换

进程被创建到了链表中,如何再进行进一步的调用和调用?

进程调度

        void schedule(void);        进程调度

        switch_to(next);        进程切换函数

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) {if ((*p)->alarm && (*p)->alarm < jiffies) {(*p)->signal |= (1<<(SIGALRM-1));(*p)->alarm = 0;}//信号不为空,并且去除不能引发进程就绪状态的阻塞信号,且现在进程为可中断状态if ((*p)->signal && (*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;
//找到当前counter最大值if ((*p)->state == TASK_RUNNING && (*p)->counter > c)c = (*p)->counter, next = i;}if (c) break;
//如果task链表中所有进程的时间片为0,则进行时间片重分配for(p = &LAST_TASK ; p > &FIRST_TASK ; --p)if (*p)(*p)->counter = ((*p)->counter >> 1) +(*p)->priority;  //counter = counter/2+pri}switch_to(next);
}

进程状态:

运行状态                           #define TASK_RUNNING        0  可以被运行,就绪状态,只有这种状态才能被运行

可中断睡眠状态                 #define TASK_INTERRUPTIBLE  1  可以被信号中断,使其变成RUNING

不可中断睡眠状态             #define TASK_UNINTERRUPTIBLE    2  只能被wakeup唤醒变成RUNNING

暂停状态                           #define TASK_STOPPED        4   被相关STOP信号暂停

僵死状态                          #define TASK_ZOMBIE     3   进程停止运行,但是没有被父进程进行回收

进程切换:

将进程切换为当前执行进程

1.将需要切换的进程赋值给当前执行进程

2.切换进程上下文(TSS等信息),堆栈信息

#define switch_to(n) {\
struct {long a,b;} __tmp; \
__asm__("cmpl %%ecx,_current\n\t" \  //比较一下是否为当前进程"je 1f\n\t" \"xchgl %%ecx,_current\n\t" \"movw %%dx,%1\n\t" \"ljmp %0\n\t" \"cmpl %%ecx,%2\n\t" \"jne 1f\n\t" \"clts\n" \"1:" \::"m" (*&__tmp.a),"m" (*&__tmp.b), \"m" (last_task_used_math),"d" _TSS(n),"c" ((long) task[n])); \
}

进程睡眠函数:

void sleep_on(struct task_struct **p)
{struct task_struct *tmp;if (!p)return;if (current == &(init_task.task))panic("task[0] trying to sleep");tmp = *p;*p = current;current->state = TASK_UNINTERRUPTIBLE;schedule();if (tmp)tmp->state=0;
}

http://www.lryc.cn/news/207838.html

相关文章:

  • docker-rabbitmq 安装依赖
  • (1)(1.9) HC-SR04声纳
  • 06 MIT线性代数-列空间和零空间 Column space Nullspace
  • 【每日一题Day360】LC1465切割后面积最大的蛋糕 | 贪心
  • 中国地名信息库
  • 网络时代下的声音之路:如何在中央新闻媒体发布网评稿
  • Selenium中WebDriver最新Chrome驱动安装教程
  • 云原生Docker数据管理
  • endnote设置
  • 计算机网络整理-简称缩写【期末复习|考研复习】
  • Flink Hive Catalog操作案例
  • NSSCTF做题第9页(3)
  • 从瀑布模式到水母模式:ChatGPT如何赋能软件研发全流程【文末送书五本】
  • 设置使用LibreOffice作为默认程序打开word、excel等文档
  • 创新领航 | 竹云参编《基于区块链的数据资产评估实施指南》正式发布!
  • 【Docker】Linux网桥连接多个命名空间
  • ES6新特性:let关键字详解
  • 鸿运主动安全监控云平台任意文件下载漏洞复现 [附POC]
  • 使用pycharm远程连接到Linux服务器进行开发
  • JavaScript 中 BOM 基础知识有哪些?
  • 【PointNet—论文笔记分享】
  • Mysql8.1.0 windows 绿色版安装
  • 何为自制力?如何提高自制力?
  • 第1篇 目标检测概述 —(3)目标检测评价指标
  • 剑指JUC原理-3.线程常用方法及状态
  • MYSQL8-sql语句使用集合。MYCAT-sql语法使用集合
  • UNIX 域协议(本地通信协议)
  • 分类预测 | MATLAB实现SSA-CNN-BiGRU-Attention数据分类预测(SE注意力机制)
  • 基于FPGA的图像PSNR质量评估计算实现,包含testbench和MATLAB辅助验证程序
  • 算法进修Day-38