分清概念十分重要之--Linux中的各种队列

本文介绍了Linux内核中的关键数据结构——运行队列、等待队列和工作队列。运行队列用于任务调度,等待队列则涉及内核的睡眠机制,而工作队列则允许在内核线程上下文中执行回调函数。通过理解这些队列的工作原理,可以深入掌握Linux内核的调度和同步机制。
摘要由CSDN通过智能技术生成

先列个框架,后续丰富完善。

提这个问题,是因为在Linux内核学习中,遇到过一个让人啼笑皆非的问题。这个问题是啥呢?提个引子,在实际生活中,可能每个人都有过这样的经历,就是总是将某两个明明完全不同的概念搞混。原因有可能是两个概念发音比较接近,或者字形相似,亦或者没有什么相似点,而只是在大脑中奇怪的产生了关联而已,就像量子作用。

回到开头,说说我的这个问题。有一段时间,对于Linux中将wait_queue加入等待队列头,然后再等待被唤醒的逻辑总是想不清楚,直到后来有一天突然搞明白,我是将等待队列和工作队列搞混了。

下面,我们简单总结下Linux中的三个重要队列。

第一个是运行队列。run_queue是内核中极其重要的一个队列。任务调度就是基于这个队列实现的。每当一个进程可以运行的时候(无论是资源满足还是新创建),内核调度器schedule就将其放入运行队列中,当其被选中的时候,通过swich_to调用,完成进程切换,然后执行。

所谓切换,就是将当前进程的上下文保存起来,然后选一个新的进程,加载其上下文。当CPU的PC寄存器切换为被调度进程上次调出时保存的下一条指令后,被调度进程就获得了CPU的使用权,开始执行。

第二个就是等待队列。wait_queue也是内核中非常重要的一个队列。内核的睡眠机制就是基于等待队列实现的。首先需要了解,睡眠只存在于非原子上下文,基本就是内核线程或者进程上下文。一般的工作流程是这样的,进程会将自己加入一个等待队列,然后调用schedule进行调度。调度接口中,会将当前进程从运行队列移除。当进程运行的条件重新满足后,一般是资源满足的地方(还有一种是信号),会唤醒等待队列上的进程。主要的操作就是将进程从等待队列移除,然后重新加入运行队列。这样当调度再次发生后,进程就又有机会重新被调度到并执行了。

第三个是工作队列。work_queue在内核中有多个变种,但基本逻辑都差不多。内核工作线程检查工作队列,执行队列上注册的回调函数。工作队列运行在线程上下文,这在内核的有些地方可能是非常重要和有用的,比如DMA的一些内存释放是需要在线程上下文执行的,这样在中断中释放时,就需要将释放工作添加到工作队列上,让其切入线程上下文执行。

### 回答1: 在编程,函数是一个非常重要概念。函数可以将一段代码封装起来,使得代码更加模块化和易于维护。同时,函数也可以被多次调用,从而提高代码的复用性。 在使用函数时,我们需要分清主次。首先,我们需要确定函数的主要功能,也就是函数的核心逻辑。其次,我们需要考虑函数的调用方式,包括传入参数和返回值。最后,我们需要注意函数的命名规范和注释,以便其他人能够理解和使用我们的代码。 总之,函数是编程非常重要的一部分,我们需要认真对待函数的设计和使用,以提高代码的质量和可维护性。 ### 回答2: 第四关篇章的主题是“函数与函数调用——分清主次”,在突破第四关的过程,需要学会如何理解函数的含义,以及函数调用的原理。同时,需要学会如何正确地设计函数的输入、输出参数,以及如何进行函数调用操作。 本关主要内容有: 1.什么是函数 函数是一段完成特定任务的代码,它可以实现代码重复使用,使得代码更加简洁高效。函数可以进行输入参数的定义和输出参数的返回,从而帮助实现更为灵活和高效的编程操作。 2.如何定义函数 函数的定义包括函数的名称、函数的输入参数、函数的输出参数以及函数的具体实现代码。在定义函数时,需要注意函数名称的唯一性和描述性,输入、输出参数的类型和名称应该明确清晰,函数代码的实现应该遵循“输入即输出”、“分步处理”的原则。 3.如何调用函数 调用函数时需要注意当前程序所在位置和函数的实际调用方式,需要明确调用的函数类型和参数类型并进行正确的传递,同时,还需要注意函数调用的结果返回和后续操作设计等问题。 4.常见的函数调用错误 常见的函数调用错误包括参数类型不匹配、参数数量不匹配、函数名称输入错误等。只有明确理解合理设计函数和正确进行调用,才能避免这些常见错误的发生。 总的来说,第四关的重点是帮助大家理解函数的实现原理和函数调用的过程,以及函数的输入输出参数的设计。同时,还需要注意常见的函数调用错误,并根据实际情况进行合理的调整和修改操作,以实现更为高效灵活的编程操作。 ### 回答3: 函数与函数调用是程序设计非常重要概念,也是初学者必须掌握的内容。在理解函数及其调用之前,我们首先需要了解什么是函数。 函数是一组完成特定任务的代码块,这个代码块可以接受输入,处理输入并输出结果。函数可以模块化代码、提高代码重用率、简化代码结构等,因此在程序设计使用函数非常普遍。函数包括函数名称、参数列表、返回值和函数体等四个部分。 函数调用是指在程序调用函数的过程。调用函数时,需要提供函数名称和参数列表以及指定函数返回值的类型。程序在执行调用语句的时候,就会进入到函数体执行所需的代码,并返回执行结果给调用者。 在使用函数和函数调用时,我们需要分清主次。主要体现在以下几个方面: 1. 确定函数的功能。在编写函数时,需要精确定义该函数的功能以及所需的参数和返回值类型。一定要避免一个函数承担不同功能,或者一个函数只是一个语句块的容器。 2. 确定函数调用的位置。在确定函数调用位置时,需要明确其所在的上下文环境,以确保参数的传递和返回值的使用正确无误,避免出现混乱的逻辑错误。 3. 确定函数调用的数量。在程序设计,正确使用函数可大幅减少代码的重复性,提高代码复用率,但过多的函数调用也会产生额外的开销,降低程序的效率。 4. 确定函数调用的方式。在函数调用时,有时需要使用传值调用,有时需要使用指针调用等不同的方式来传递参数和调用函数。 综上所述,函数与函数调用是程序设计非常重要概念,我们需要在理解其基础概念的基础上,分清主次,正确地应用到程序设计。只有正确地使用函数和函数调用,才能为编写高效、优雅和易维护的程序打下坚实的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙赤子

你的小小鼓励助我翻山越岭

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值