OS课程与Linux内核相结合之同步实例(二)

简介: 陈继峰同学在学习完成量时写了一个简单的模块,用于理解完成量的在同步机制中的用法,关于完成量的详细知识,参看 http://blog.chinaunix.net/u2/73528/showart_1101096.html这个简单的例子,模拟了公交车的司机与售票员的同步。

陈继峰同学在学习完成量时写了一个简单的模块,用于理解完成量的在同步机制中的用法,关于完成量的详细知识,参看 http://blog.chinaunix.net/u2/73528/showart_1101096.html
这个简单的例子,模拟了公交车的司机与售票员的同步。

 #include
#include
#include
#include
MODULE_LICENSE("Dual BSD/GPL");

struct completion my_completion1;
struct completion my_completion2;//定义了两个完成量


int thread_dirver(void *);
int thread_saleman(void *);

int thread_driver(void *p)//司机线程

{
    printk(KERN_ALERT"DRIVER:I AM WAITING FOR SALEMAN CLOSED THE DOOR\n");
    wait_for_completion(&my_completion1);//等待完成量completion1

    printk(KERN_ALERT"DRIVER:OK , LET'S GO!NOW~\n");
    printk(KERN_ALERT"DRIVER:ARRIVE THE STATION.STOPED CAR!\n");
    complete(&my_completion2);//唤醒完成量completion2

    return 0;
}
int thread_saleman(void *p)//售票员线程

{
    printk(KERN_ALERT"SALEMAN:THE DOOR IS CLOSED!\n");
    complete(&my_completion1);//唤醒完成量completion1

    printk(KERN_ALERT"SALEMAN:YOU CAN GO NOW!\n");
    wait_for_completion(&my_completion2);//等待完成量completion2

    printk(KERN_ALERT"SALEMAN:OK,THE DOOR BE OPENED!\n");
    return 0;
}
static int hello_init(void)
{
    printk(KERN_ALERT"\nHello everybody~\n");
    init_completion(&my_completion1);
    init_completion(&my_completion2);//初始化完成量

    kernel_thread(thread_driver,NULL,CLONE_KERNEL);
    kernel_thread(thread_saleman,NULL,CLONE_KERNEL);//创建了两个内核线程,

    return 0;
}
static void hello_exit(void)
{
    printk(KERN_ALERT"Goodbye everybody~\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_AUTHOR("CHEN");
MODULE_DESCRIPTION("A simple completion Module");

这个例子实现了两个线程间的同步,只有当售票员把门关了后,司机才能开动车,只有当司机停车后,售票员才能开门。所以例子中用了两个完成量来实现这个要求。
运行结果:
Hello  everybody~
DRIVER:I AM WAITING FOR SALEMAN CLOSED THE DOOR
SALEMAN:THE DOOR IS CLOSED!
SALEMAN:YOU CAN GO NOW

DRIVER:OK , LET'S GO!NOW~
DRIVER:ARRIVE THE STATION.STOPED CAR!
SALEMAN:OK,THE DOOR  BE OPENED!
Goodbye everybody~

点评:完成量是对信号量的一种补充,主要用于多处理器系统上发生的一种微妙竞争。因此,大家可以思考,是否可以用信号量达到司机与售票员的同步?要真正体现完成量的功能,如何设计实例

目录
相关文章
|
13天前
|
Linux C语言
Linux内核队列queue.h
Linux内核队列queue.h
|
14天前
|
监控 Unix Linux
Linux操作系统调优相关工具(四)查看Network运行状态 和系统整体运行状态
Linux操作系统调优相关工具(四)查看Network运行状态 和系统整体运行状态
29 0
|
15天前
|
Linux 编译器 开发者
Linux设备树解析:桥接硬件与操作系统的关键架构
在探索Linux的庞大和复杂世界时🌌,我们经常会遇到许多关键概念和工具🛠️,它们使得Linux成为了一个强大和灵活的操作系统💪。其中,"设备树"(Device Tree)是一个不可或缺的部分🌲,尤其是在嵌入式系统🖥️和多平台硬件支持方面🔌。让我们深入了解Linux设备树是什么,它的起源,以及为什么Linux需要它🌳。
Linux设备树解析:桥接硬件与操作系统的关键架构
|
29天前
|
消息中间件 存储 算法
【软件设计师备考 专题 】操作系统的内核(中断控制)、进程、线程概念
【软件设计师备考 专题 】操作系统的内核(中断控制)、进程、线程概念
75 0
|
1月前
|
Linux 数据安全/隐私保护 虚拟化
Linux技术基础(1)——操作系统的安装
本文是龙蜥操作系统(Anolis OS) 8.4 的安装指南,用户可以从[龙蜥社区下载页面](https://openanolis.cn/download)获取ISO镜像。安装方法包括物理机的光驱和USB闪存方式,以及虚拟机中的VMware Workstation Pro设置。安装过程涉及选择语言、配置安装目标、选择软件集合和内核,设置Root密码及创建新用户。安装完成后,可通过文本模式或图形化界面验证系统版本,如Anolis OS 8.4,标志着安装成功。
|
1月前
|
Shell Linux C语言
【Shell 命令集合 系统设置 】⭐Linux 卸载已加载的内核模块rmmod命令 使用指南
【Shell 命令集合 系统设置 】⭐Linux 卸载已加载的内核模块rmmod命令 使用指南
29 1
|
14天前
|
Linux
Linux操作系统调优相关工具(三)查看IO运行状态相关工具 查看哪个磁盘或分区最繁忙?
Linux操作系统调优相关工具(三)查看IO运行状态相关工具 查看哪个磁盘或分区最繁忙?
21 0
|
1天前
|
Linux 数据安全/隐私保护
Linux常用命令实例带注释
Linux常用命令实例带注释
11 0
|
6天前
|
算法 Linux 调度
深入理解Linux内核的进程调度机制
【4月更文挑战第17天】在多任务操作系统中,进程调度是核心功能之一,它决定了处理机资源的分配。本文旨在剖析Linux操作系统内核的进程调度机制,详细讨论其调度策略、调度算法及实现原理,并探讨了其对系统性能的影响。通过分析CFS(完全公平调度器)和实时调度策略,揭示了Linux如何在保证响应速度与公平性之间取得平衡。文章还将评估最新的调度技术趋势,如容器化和云计算环境下的调度优化。
|
11天前
|
算法 Linux 调度
深度解析:Linux内核的进程调度机制
【4月更文挑战第12天】 在多任务操作系统如Linux中,进程调度机制是系统的核心组成部分之一,它决定了处理器资源如何分配给多个竞争的进程。本文深入探讨了Linux内核中的进程调度策略和相关算法,包括其设计哲学、实现原理及对系统性能的影响。通过分析进程调度器的工作原理,我们能够理解操作系统如何平衡效率、公平性和响应性,进而优化系统表现和用户体验。
20 3