0

0

Linux 系统中的进程调度:概念、原理和方法

WBOY

WBOY

发布时间:2024-02-09 16:33:23

|

1162人浏览过

|

来源于良许Linux教程网

转载

进程调度是 linux 系统中一种重要的内核功能,它可以在多个进程之间分配 cpu 的使用权,使得每个进程都能得到合理的运行时间,从而提高系统的并发性和响应性。进程调度的效果直接影响到系统的性能和用户体验,因此,了解 linux 系统中的进程调度是非常有必要的。但是,你真的了解 linux 系统中的进程调度吗?你知道它的概念、原理和方法吗?你知道如何在 linux 下使用和配置进程调度吗?本文将为你详细介绍 linux 系统中的进程调度的相关知识,让你在 linux 下更好地使用和理解这个强大的内核功能。

Linux 系统中的进程调度:概念、原理和方法

在Linux内核中,completion是一种简单的同步机制,标志”things may proceed”。

要使用completion,必须在文件中包含,同时创建一个类型为struct completion的变量。

  1. 这个变量可以静态地声明和初始化:

  2. DECLARE_COMPLETION(my_comp);

  3. 或者动态初始化:

    1. **struct** completion my_comp; 
    2. init_completion(&my_comp); 
    

如果驱动程序要在执行后面操作之前等待某个过程的完成,它可以调用wait_for_completion ,以要完成的事件为参数:

  1. void wait_for_completion(struct completion *comp);

wait_for_completion等待在completion上。如果加了interruptible,就表示线程等待可被外部发来的信号打断;如果加了killable,就表示线程只可被kill信号打断;如果加了timeout,表示等待超出一定时间会自动结束等待,timeout的单位是系统所用的时间片jiffies(多为1ms)。

PathFinder
PathFinder

AI驱动的销售漏斗分析工具

下载

如果其它部分代码可以确定事件已经完成,可以调用下面两个函数之一来唤醒等待该事件的进程:

1. **void** complete(**struct** completion *comp); 
2. **void** complete_all(**struct** completion *comp); /* Linux 2.5.x以上版本 */ 

前一个函数将只唤醒一个等待进程,而后一个函数唤醒等待该事件的所以进程。由于completion的实现方式,即使complete在wait_for_competion之前调用,也可以正常工作。
例如,在MD设备驱动程序实现中,有一个恢复线程md_recovery_thread。驱动程序通过md_register_thread和md_unregister_thread来注册和注销恢复线程。恢复线程的执行逻辑在md_thread函数中,大致如下:

1. **int** md_thread(**void** * arg) 
2. { 
3.   线程初始化; 
4.   **while** (运行) { 
5. ​    处理逻辑; 
6. ​    接收信号; 
7.   } 
8.   **return** 0; 
9. } 

md_register_thread将创建一个恢复线程,它必须在线程真正初始化结束之后才能返回该线程的指针。因此,其逻辑是:

1. mdk_thread_t *md_register_thread(**void** (*run) (**void** *), **void** *data, **const** **char** *name) 
2. { 
3.   mdk_thread_t ***thread**; 
4.   …… 
5.   **struct** completion event; 
6.   /* 为线程分配空间 */ 
7.   **thread** = (mdk_thread_t *) kmalloc (**sizeof**(mdk_thread_t), GFP_KERNEL); 
8.   …… 
9.   init_completion(&event); 
10.   …… 
11.   **thread**->event = &event; 
12.   /* 创建内核线程 */ 
13.   ret = kernel_thread(md_thread, **thread**, 0); 
14.   /* 等待线程初始化结束 */ 
15.   …… 
16.   wait_for_completion(&event); 
17.   /* 返回线程指针 */ 
18.   **return** **thread**; 
19. } 

而md_unregister_thread通过向线程发送SIGKILL信号注销恢复线程,它也需要在线程真正退出后才能释放线程所占用的内存。因此,其逻辑是:

1. **void** md_unregister_thread(mdk_thread_t ***thread**) 
2. { 
3.   **struct** completion event; 
4.   init_completion(&event); 
5.   **thread**->event = &event; 
6.   …… 
7.   /* 向线程发送SIGKILL信号终止其运行 */ 
8.   md_interrupt_thread(**thread**); 
9.   /* 等待线程退出 */ 
10.   wait_for_completion(&event); 
11.   /* 释放线程所占用的内存 */ 
12.   kfree(**thread**); 
13. } 

如果考虑completion,md_thread的逻辑是:


1. **int** md_thread(**void** * arg) 
2. { 
3.   线程初始化; 
4.   complete(**thread**->event);  
5.   **while** (运行) { 
6. ​    处理逻辑; 
7. ​    接收信号; 
8.   } 
9.   complete(**thread**->event);  
10.   **return** 0; 
11. } 

需要说明的是,由于等待事件是在驱动程序和恢复线程中的一个共享资源,它必须是一个全局变量,或者如实现代码中,定义为一个局部变量,而将其指针放在恢复线程结构中。

typedef struct mdk_thread_s {
  ……
  struct completion *event;
  ……
} mdk_thread_t;

通过本文,你应该对 Linux 系统中的进程调度有了一个深入的了解,知道了它的概念、原理和方法。你也应该明白了进程调度的作用和影响,以及如何在 Linux 下正确地使用和配置进程调度。我们建议你在使用 Linux 系统时,使用进程调度来提高系统的并发性和响应性。同时,我们也提醒你在使用进程调度时要注意一些潜在的问题和挑战,如进程优先级、负载均衡、实时性等。希望本文能够帮助你更好地使用 Linux 系统,让你在 Linux 下享受进程调度的优势和便利。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
全局变量怎么定义
全局变量怎么定义

本专题整合了全局变量相关内容,阅读专题下面的文章了解更多详细内容。

95

2025.09.18

python 全局变量
python 全局变量

本专题整合了python中全局变量定义相关教程,阅读专题下面的文章了解更多详细内容。

106

2025.09.18

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

186

2023.11.23

java中void的含义
java中void的含义

本专题整合了Java中void的相关内容,阅读专题下面的文章了解更多详细内容。

134

2025.11.27

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

765

2023.08.10

磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

1564

2023.06.21

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

716

2023.06.29

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

300

2023.06.30

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

26

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 10.6万人学习

Git 教程
Git 教程

共21课时 | 4.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号