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)。

VWO
VWO

一个A/B测试工具

下载

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

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 下享受进程调度的优势和便利。

相关专题

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

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

78

2025.09.18

python 全局变量
python 全局变量

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

96

2025.09.18

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

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

175

2023.11.23

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

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

97

2025.11.27

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

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

482

2023.08.10

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

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

1351

2023.06.21

如何安装LINUX
如何安装LINUX

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

704

2023.06.29

linux find
linux find

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

294

2023.06.30

AO3中文版入口地址大全
AO3中文版入口地址大全

本专题整合了AO3中文版入口地址大全,阅读专题下面的的文章了解更多详细内容。

1

2026.01.21

热门下载

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

精品课程

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

共48课时 | 7.5万人学习

Git 教程
Git 教程

共21课时 | 2.8万人学习

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

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