内核编译,进程调度

news2025/1/21 0:59:22

目录

  • 1 下载源代码
  • 2 编译
    • 2.1 编译错误
  • 3 安装
    • 3.1 模块安装操作:sudo make modules_install
    • 3.2 安装内核 sudo make install
    • 3.3 验证安装
  • 4 进程调度CFS及4个调度类
    • 4.1 调度
    • 4.2 调度类
    • 4.3 调度类可分为5种
    • 4.4 进程优先级
    • 4.5 进程分类
    • 4.6 内核调度策略

1 下载源代码

https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/
下载 eg: linux-5.6.18.tar.gz

2 编译

make之前安装如下:
sudo apt install libelf-dev dwarves
可能需要:sudo apt-get install gcc libncurses5-dev build-essential kernel-package libssl-dev kernel-source-** libc6-dev tk8.* fakeroot bin86

tar zxvf linux-5.6.18.tar.gz
cd linux-5.6.18
make menuconfig 看有没有提示错误,有错误就解决,直到没有错误,
然后退出make menuconfig的系统配置界面,保存,内核配置的开关都保存在 linux-5.6.18/.config文件中。
正式编译:
make -j4

2.1 编译错误

1 make[1]: *** No rule to make target ‘debian/canonical-certs.pem’, needed by ‘certs/x509_certificate_list’. Stop.
注释掉 linux-5.6.18/.config 中的 ONFIG_MODULE_SIG_KEY=“certs/signing_key.pem”
在这里插入图片描述
如果不行, 注释两行如下:

#CONFIG_MODULE_SIG_KEY="certs/signing_key.pem"
CONFIG_SYSTEM_TRUSTED_KEYRING=y
#CONFIG_SYSTEM_TRUSTED_KEYS="certs/rhel.pem"

3 安装

3.1 模块安装操作:sudo make modules_install

在这里插入图片描述

3.2 安装内核 sudo make install

在这里插入图片描述
把grub的等待时间设置为了3秒 sudo vim /etc/default/grub,以方便在开机的时候切换内核,若是vmware,按住shift即可进入grub菜单
在这里插入图片描述
保存退出后,sudo update-grub ,输出信息中也可以看新安装的内核
在这里插入图片描述

3.3 验证安装

在这里插入图片描述
进入后发现新安装的内核
在这里插入图片描述

4 进程调度CFS及4个调度类

4.1 调度

就是按照某种调度的算法调度,从进程的就绪队列当中选取进程分配CPU,主要是协调CPU等等相关的资源使用。进程高度的目的:最大限度CPU时间。如果调度器支持就绪状态切换到执行状态,同时支持执行状态切换到就绪状态,称该调度器为抢占式调度器。

4.2 调度类

kernel\sched\sched.h

// 结构类类型
struct sched_class {
  // 操作系统中有多个调度类,按照调度优先级排成一个链表
  const struct sched_class *next;



#ifdef CONFIG_UCLAMP_TASK

  int uclamp_enabled;

    #endif
// 将进程加入到执行队列当中,即将高度实例(进程)存放到红黑树当中,并对nr_running变量自动加1
    void (*enqueue_task) (struct rq *rq, struct task_struct *p, int flags);
// 从执行队列中删除进程, nr_running -1
    void (*dequeue_task) (struct rq *rq, struct task_struct *p, int flags);
// 放弃cpu执行权限,实际上该函数执先出后入队,在这种情况它直接将调度实体存放在红黑树的最右侧
    void (*yield_task)  (struct rq *rq);
    bool (*yield_to_task)(struct rq *rq, struct task_struct *p, bool preempt);
	// 是否可以被新进程抢占
    void (*check_preempt_curr)(struct rq *rq, struct task_struct *p, int flags);
// 选择下一个要执行的进程
    struct task_struct *(*pick_next_task)(struct rq *rq);
// 将进程施加到运行队列中
    void (*put_prev_task)(struct rq *rq, struct task_struct *p);
    void (*set_next_task)(struct rq *rq, struct task_struct *p, bool first);

#ifdef CONFIG_SMP
	int (*balance)(struct rq *rq, struct task_struct *prev, struct rq_flags *rf);
    // 为进程选择一个合适的cpu
	int  (*select_task_rq)(struct task_struct *p, int task_cpu, int sd_flag, int flags);
    // 迁移任务到另一个cpu
	void (*migrate_task_rq)(struct task_struct *p, int new_cpu);
    // 用于唤醒一个进程
	void (*task_woken)(struct rq *this_rq, struct task_struct *task);
	// 修改CPU亲和力
	void (*set_cpus_allowed)(struct task_struct *p,
				 const struct cpumask *newmask);
	// 启动禁止运行队列
	void (*rq_online)(struct rq *rq);
	void (*rq_offline)(struct rq *rq);
#endif    
    

4.3 调度类可分为5种

extern const struct sched_class stop_sched_class;  // 停机调度类
extern const struct sched_class dl_sched_class;    // 限期调度类
extern const struct sched_class rt_sched_class; 	// 实时调度类
extern const struct sched_class fair_sched_class;	// 公平调度类
extern const struct sched_class idle_sched_class;	// 空闲调度类

这5种调度类的优先级从高到低依次为:

停机调度类(优先级最高)—>限期—>实时 —>公平—>空闲调度类

4.4 进程优先级

Linux优先级的源码

include\linux\sched\prio.h

#define MAX_NICE	19
#define MIN_NICE	-20
#define NICE_WIDTH	(MAX_NICE - MIN_NICE + 1)

/*
 * Priority of a process goes from 0..MAX_PRIO-1, valid RT
 * priority is 0..MAX_RT_PRIO-1, and SCHED_NORMAL/SCHED_BATCH
 * tasks are in the range MAX_RT_PRIO..MAX_PRIO-1. Priority
 * values are inverted: lower p->prio value means higher priority.
 *
 * The MAX_USER_RT_PRIO value allows the actual maximum
 * RT priority to be separate from the value exported to
 * user-space.  This allows kernel threads to set their
 * priority to a value higher than any user task. Note:
 * MAX_RT_PRIO must not be smaller than MAX_USER_RT_PRIO.
 */

#define MAX_USER_RT_PRIO	100
#define MAX_RT_PRIO		MAX_USER_RT_PRIO

#define MAX_PRIO		(MAX_RT_PRIO + NICE_WIDTH)
#define DEFAULT_PRIO		(MAX_RT_PRIO + NICE_WIDTH / 2)

4.5 进程分类

实时进程:优先级高,需要立即被执行的进程

普通进程:优先级低,更长执行时间的进程

进程的优先级是一个0–139的整数直接来表示,数字越小优先级越高,其中优先级0-99是留给实时进程,100-139留给普通进程。

4.6 内核调度策略

Linux内核提供一些调度策略供用户应用程序来选择调度器,Linux内核调度策略源码如下:

include\uapi\linux\sched.h

关联代码 cf_rq

/*
 * Scheduling policies
 */
#define SCHED_NORMAL		0        // 普通进程调度策略
#define SCHED_FIFO		1            // 实时进程调度策略
#define SCHED_RR		2            // 实时进程调度策略
#define SCHED_BATCH		3			// 普通进程调度策略
/* SCHED_ISO: reserved but not implemented yet */
#define SCHED_IDLE		5			// 普通进程调度策略
#define SCHED_DEADLINE		6		// 限期进程调度策略	

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1114032.html

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

相关文章

RESR开发

REST简介 REST(Representation State Transfer),表现形式状态转换 优点 隐藏资源的访问行为,无法通过地址得知对方资源是何种操作书写简化 按照REST风格访问资源时使用行为动作区分对资源进行了何种操作。 根据REST风格对资源进行访问是RESTFUL REST风格 Restfu…

Spring Security静态资源过滤(11)

在一个实际项目中,并非所有的请求都需要经过Spring Security过滤器,有一些特殊的请求,例如静态资源等,一般来说并不需要经过Spring Security过滤器链,用户如果访问这些静态资源,直接返回对应的资源即可。 …

oracle11g安装图解

软件需求 1.安装CentOS6.5的服务器一台 2.Oracle 11g 安装介质: linux.x64_11gR2_database_1of2.zip linux.x64_11gR2_database_2of2.zip 3.命令行客户端工具xshell、crt或者putty 4.图形界面客户端工具Xming 系统配置检查 1.内存检查 grep MemTotal /proc/m…

nginx 内存管理(一)

文章目录 前提知识nginx内存管理的基础内存分配不初始化封装malloc初始化malloc 内存池内存池结构清理函数cleanup大块内存large 创建内存池申请内存void *ngx_palloc(ngx_pool_t *pool, size_t size)void *ngx_pnalloc(ngx_pool_t *pool, size_t size)void *ngx_pcalloc(ngx_p…

【Ant Design Table + React】表格列伸缩实现

需求背景:需要实现Antd Table 组件的列伸缩,宽度可以拖拽 在Antd 3.x 的版本中是保留的列伸缩的Demo例子的: 借助 react-resizable 可以实现伸缩列。 # npm 安装 npm install react-resizable --save# yarn 安装 yarn add react-resizable参…

字符函数和字符串函数(详解大全)

重点 C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在 常量字符串 中或者 字符数组 中。 字符串常量 适用于那些对它不做修改的字符串函数. 1.函数介绍 1.1strlen size_t strlen ( const char * str ); ⭐字符…

Linux——centos7.4磁盘空间调整分配

安装centos7.4操作系统时,采用默认安装方式,导致磁盘分配不太合理,于是重新进行磁盘空间分配。 1、cnetos7.4默认安装完成时磁盘分配情况 可以看到/dev/mapper/centos-home分区占用大部分空间,如今想将根目录空间增大。 注意&…

pandas写入MySQL

安装好pandas、mysql pip install pandas pip install pymysql 导入pandas、mysql import pymysql as mysql import pandas as pd 建立连接 conmysql.connect(host10.10.0.221,userroot,passwordroot,databasepandas,port3306,charsetutf8) 创建游标 curcon.cursor() 读…

R语言处理数量很大(千万级及以上)的数据时的拆分策略-案例一

主要是用R中的groupb_by和 summarise分组查询和统计数据量

碰到it运维故障怎么办丫?突发IT事故怎么快速解决?

随着信息技术的快速发展,企业对于IT系统的依赖程度越来越高。但IT系统突发事件的风险也在不断增加,例如突发故障,例如数据泄露、例如数据入侵等等。那碰到这种it运维故障怎么办?突发IT事故怎么快速解决? 碰到it运维故障…

广度优先搜索(Breadth First Search, BFS)算法

广度优先搜索(Breadth First Search, BFS) 广度优先搜索是一种盲目搜索算法,它认为所有状态(或者说结点)都是等价的,不存在优劣之分。 假如我们把所有需要搜索的状态组成一棵树来看,广搜就是一层搜完再搜下一层,直到找出目标结点…

旅游业媒体套餐7个诀窍助你轻松实现销售目标-华媒舍

旅游业是一个竞争激烈的行业,成功营销对于吸引客户和实现销售目标至关重要。借助媒体资源是一种有效的方式。本文将介绍7个诀窍,借助旅游业媒体套餐轻松实现销售目标。 1. 策划细致的新闻稿 新闻稿是介绍旅游产品和服务的重要工具。确保新闻稿中包含吸引…

【精选】2023网络安全学习路线 非常详细 推荐学习

关键词:网络安全入门、渗透测试学习、零基础学安全、网络安全学习路线 分享2套零基础、进阶学习网络安全/渗透测试教程 第一套是Web安全学习笔记 该笔记详细介绍了计算机网络协议、信息收集、常见漏洞、内网渗透、御用技术等等,全文全面成体系&#x…

京东店铺所有商品数据接口及店铺商品数据分析

获取京东店铺所有商品数据的接口是京东开放平台提供的接口,通过该接口可以获取店铺所有商品数据。 通过京东开放平台接口获取店铺所有商品数据的方法如下: 在开放平台注册成为开发者并创建一个应用,获取到所需的 App Key 和 App Secret 等信…

PHP 基础/练习

练习 成绩定级 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>成绩定级脚本</title> </…

Windows 事件日志监控

Windows 事件日志是记录 Microsoft 系统上发生的所有活动的文件&#xff0c;在 Windows 环境中&#xff0c;将记录系统上托管的系统、安全性和应用程序的事件&#xff0c;事件日志提供包含有关事件的详细信息&#xff0c;包括日期、时间、事件 ID、源、事件类型和发起它的用户。…

spring cloud Eureka集群模式搭建(IDEA中运行)

spring cloud Eureka集群模式搭建&#xff08;IDEA中运行&#xff09; 新建springboot 工程工程整体目录配置文件IDEA中部署以jar包形式启动总结 新建springboot 工程 新建一个springboot 工程&#xff0c;命名为&#xff1a;eureka_server。 其中pom.xml文件为&#xff1a; …

el-input无法输入的问题和表单验证失败问题(亲测有效)-开发bug总结4

大部分无法输入的问题&#xff1a;基本都是没有进行v-model双向数据绑定&#xff0c;这个很好解决。 本人项目中遇到的bug问题如下&#xff1a; 点击添加&#xff0c;表单内可输入用户名 和 用户姓名&#xff0c;但有时会偶发出现无法这两个input框里面无法输入内容。 原因&a…

使用 Rust 开发:以太坊与 Layer2 生态建设新趋势

Rust 是一种系统编程语言&#xff0c;以其出色的性能、内存安全和并发性而闻名&#xff0c;在区块链和 Web3 中广泛应用&#xff0c;大多数编程语言和开发框架都以 Rust 为核心&#xff0c;如 Polkadot、Solana、NEAR、Elrond&#xff08;现名 MultiversX&#xff09;、Hyperle…

探索房产小程序源码中的十大必备功能

作为房地产行业的专家&#xff0c;我们深知房产小程序在实现高效交易和提升用户体验方面的重要性。选择适合的房产小程序源码&#xff0c;关乎着您的平台能否脱颖而出。在本文中&#xff0c;我将为您揭示房产小程序中不可或缺的十大必备功能&#xff0c;助您确保您的小程序具备…