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

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

进程调度

        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.mzph.cn/news/121092.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nginx配置反向代理和动静分离应用

一. Nginx配置反向代理和实现动静分离与虚拟主机流程图&#xff1a; 二 .Nginx配置反向代理和实现动静分离与虚拟主机实现详细配置和效果图 2.1 nginx 配置反向代理 #在nginx.conf配置server同级下配置 include tomcat.conf# vim tomcat.conf upstream api.z.mukewang.com{…

mac 查看GPU使用

首先搜索活动监视器 然后 点击窗口->gpu历史记录 记住不是立马出结果&#xff0c;而是 需要等半分钟左右的

PS笔记2_钢笔工具的形状和路径

本文目录 前言Step 1 形状的用法&#xff1a;画图Step 2 路径的用法&#xff1a;抠图 前言 当我们在PS中选择钢笔工具时&#xff0c;上方功能栏中可以选择钢笔的功能项&#xff0c;有三种选项&#xff1a;形状&#xff0c;路径和像素。最常用的就是“形状”和“路径”。本博文…

Hadoop3.0大数据处理学习4(案例:数据清洗、数据指标统计、任务脚本封装、Sqoop导出Mysql)

案例需求分析 直播公司每日都会产生海量的直播数据&#xff0c;为了更好地服务主播与用户&#xff0c;提高直播质量与用户粘性&#xff0c;往往会对大量的数据进行分析与统计&#xff0c;从中挖掘商业价值&#xff0c;我们将通过一个实战案例&#xff0c;来使用Hadoop技术来实…

安全狗安装

安装waf 关闭apache程序及httpd.exe进程; 运行cmd&#xff0c;cd进入apache/bin文件夹目录&#xff0c; 执行httpd.exe -k install -n apache2.4.39; 启动apache,启动phpstudy 安全狗安装服务名称填写apache2.4.39; 安装安全狗之后就会提示报错 网站防护 可以设备黑白名单 漏…

ubuntu 22.04安装百度网盘

百度网盘 客户端下载 (baidu.com) 下载地址 sudo dpkg -i baidunetdisk_4.17.7_amd64.deb

【Vue3-Flask-BS架构Web应用】实践笔记1-使用一个bat脚本自动化完整部署环境

前言 近年来&#xff0c;Web开发已经成为计算机科学领域中最热门和多产的领域之一。Python和Vue.js是两个备受欢迎的工具&#xff0c;用于构建现代Web应用程序。在本教程中&#xff0c;我们将探索如何使用这两个工具来创建一个完整的Web项目。我们将完成从安装Python和Vue.js到…

ETCD备份与恢复

文章目录 主要内容一.备份1.先安装etcd客户端代码如下&#xff08;示例&#xff09;: 2.备份成文件并查看代码如下&#xff08;示例&#xff09;: 3.解释 二.恢复1.先停止服务代码如下&#xff08;示例&#xff09;: 2.删除现有ETCD&#xff0c;并恢复数据代码如下&#xff08;…

RocksDB基本架构与原理详解

Rocksdb Flink提供基于流的有状态计算&#xff0c;除了提供实时数据流的处理能力&#xff0c;还需要将计算产生的状态存储起来。 为了满足状态存取需求&#xff0c;提供了memory、flie system、rocksdb三种类型的状态存储机制。 memory存取高效单空间有限&#xff0c;且可用…

面试题:为什么HashMap 使用的时候指定容量?

文章目录 前言正文为什么要指定容量&#xff1f; 前言 其实可以看到我写了这么久的博客&#xff0c;很少去写hashMap的东西。 为什么&#xff1f;因为这个东西感觉是java面试必备的&#xff0c;我感觉大家都看到腻了&#xff0c;所以一直没怎么去写hashMap相关的。 本篇内容&…

如何使用navicat图形化工具远程连接MariaDB数据库【cpolar内网穿透】

公网远程连接MariaDB数据库【cpolar内网穿透】 文章目录 公网远程连接MariaDB数据库【cpolar内网穿透】1. 配置MariaDB数据库1.1 安装MariaDB数据库1.2 测试局域网内远程连接 2. 内网穿透2.1 创建隧道映射2.2 测试随机地址公网远程访问3. 配置固定TCP端口地址3.1 保留一个固定的…

Kafka笔记

一、Kafka 概述 1.1.定义 传统定义&#xff1a;Kafka 是一个分布式的基于发布/订阅模式的消息队列&#xff0c;主要用于大数据实时处理领域。最新定义&#xff1a;Kafka 是一个开源的分布式事件流平台&#xff0c;被数千家公司用于高性能数据管道、流分析、数据集成和关键任务…

修改 jquery dialog title

官网&#xff1a; $("#xxx").dialog("option", "title", "xxx").dialog(open);

行政快递管理高效化教程

能不能做好因公寄件管理&#xff0c;影响着企业内部运转的效率。我们知道&#xff0c;基本上每家企业的因公寄件&#xff0c;是由行政部门来统筹管理的...... 企业员工只知道&#xff0c;在公司寄快递&#xff0c;找行政。殊不知行政快递管理&#xff0c;不仅仅是“寄件”这么…

Docker添加软链接,解决c盘占用问题

Docker的文件&#xff0c;默认放在 c 盘&#xff0c;用多了很影响系统的速度。 解决方法&#xff1a; 为 Docker 路径添加软链接。 在 windows 搜索框&#xff0c;输入cmd &#xff0c;以管理员身份运行 cmd * 执行命令&#xff1a; “C:\Program Files\Docker” 这个地址是…

如何使用Abaqus进行摩擦生热仿真

Abaqus除了可以对结构进行强度分析&#xff0c;同样也有强大的固体传热分析功能&#xff0c;下面通过一个简单的实例演示Abaqus的双向热固耦合分析。 因为本案例涉及物体表面辐射&#xff0c;因此需要定义绝对零度和输入史蒂夫-波兹曼常数&#xff0c;如下&#xff1a; 本次分…

Python手搓C4.5决策树+Azure Adult数据集分析

前言 课上的实验 由于不想被抄袭&#xff0c;所以暂时不放完整代码 Adult数据集可以在Azure官网上找到 Azure 开放数据集中的数据集 - Azure Open Datasets | Microsoft Learn 数据集预处理 删除难以处理的权重属性fnlwgt与意义重复属性educationNum去除重复行与空行删除…

控制输入流,从控制台打印到文件中,更改输出的位置

public static void main(String[] args) throws IOException {PrintStream printStream System.out;//在默认情况下&#xff0c;PrintStream 输出数据的位置 标准输出&#xff0c;即显示器printStream.print("Tom,hello");/*public void print(String s) {if (s n…

R语言代码示例

以下是一个使用R语言和httrOAuth库的下载器程序&#xff0c;用于下载的内容。程序使用以下代码。 # 安装和加载必要的库 install.packages("httr") install.packages("httrOAuth") library(httr) library(httrOAuth) ​ # 设置 http_proxy <- "du…

卷积神经网络的感受野

经典目标检测和最新目标跟踪都用到了RPN(region proposal network)&#xff0c;锚框(anchor)是RPN的基础&#xff0c;感受野(receptive field, RF)是anchor的基础。本文介绍感受野及其计算方法&#xff0c;和有效感受野概念。 1.感受野概念 在典型CNN结构中&#xff0c;FC层(…