
Linux内核
文章平均质量分 68
差不太多先生
这个作者很懒,什么都没留下…
展开
-
进程管理--CFS调度器(2)
主要以CFS调度器为例,介绍一下进程调度的一般流程。首先是调度的时机,基本调度器会根据TIF_NEED_RESHED标记判断是否需要进行调度,所以这个标记的设置就是调度的开始。满足抢占的条件就是,唤醒的进程的虚拟时间首先要比正在运行进程的虚拟时间小,并且差值还要大于一定的值才行(这个值是sysctl_sched_wakeup_granularity,称作唤醒抢占粒度)。原创 2023-09-26 11:45:05 · 221 阅读 · 0 评论 -
进程管理--CFS调度器(1)
CFS(Completely Fair Scheduler,完全公平调度器)用于Linux系统中普通进程的调度。它给cfs_rq(cfs的run queue)中的每一个进程设置一个虚拟时钟,vruntime。如果一个进程得以执行,随着时间的增长(一个个tick的到来),其vruntime将不断增大。没有得到执行的进程vruntime不变。调度器总是选择vruntime跑得最慢的那个进程来执行。这就是所谓的“完全公平”。原创 2023-09-26 11:39:51 · 244 阅读 · 0 评论 -
进程管理--进程调度基本概念
所有的就绪进程都会被放入某个CPU的rq上去,具体放到哪个rq上,这个在调度均衡里面讲。内核一共定义了五个调度类,属于不同调度类的进程会被放入不同的子队列,所以rq中包含三个子运行队列cfs_rq、rt_rq、dl_rq。因为有两个调度类idle、stop,每个CPU只能有一个进程,所以没必要弄个队列,直接关联它们的进程就可以了。内核中处理优先级如上所示,范围是0-139,数值越低,优先级越高,其中nice映射到100-139,RT优先级逆向映射到0-99。内核中定义了上面这几个宏,代表不同的调度策略。原创 2023-09-26 11:36:40 · 174 阅读 · 0 评论 -
进程管理--上下文切换
上下文切换:当一个任务切换到另一个任务时,它需要保存当前任务的所有状态,即保存当前任务的上下文,以便在再次执行该任务时,能恢复之前的状态,继续执行。上下文:描述了任务的执行状态。包括任务执行过程中堆栈中的内容和寄存器值,获取的资源信息,自身状态等。原创 2023-09-26 11:31:04 · 238 阅读 · 0 评论 -
进程管理--进程创建
进程拷贝或创建的一个整体调用流程:首先通过系统调用陷入内核,然后kernel_clone完成创建。其中描述符和资源的拷贝,pid的分配等都在copy_process中完成,完成创建后需要通过wake_up_new_task加入调度。可以使用fork或vfork创建进程,使用clone系统调用创建线程。在内部都是用kernel_clone实现。区别只是传入的args不同(用来控制新进程或线程与父进程或线程共享什么资源)。进程在某一时刻只可能有一种状态。原创 2023-09-26 11:22:58 · 142 阅读 · 0 评论 -
同步 -- 互斥锁
等待队列的第一个对象出列,表示下一个将要获得锁的任务。把下一个任务的task_struct地址写入到mutex lock的owner变量中(相当于下一个任务获得了互斥锁),唤醒下一个任务继续执行。__mutex_unlock_fast(快解锁):比较lock->owner和curr是否一致,一致则直接把0写到lock->owner中,表示解锁。互斥锁初始化比较简单,就是把owner,wait_lock,wait_list这几个成员初始化一下。解锁:mutex_unlock。加锁:mutex_lock。原创 2023-09-19 09:53:46 · 129 阅读 · 0 评论 -
电源管理--Runtime
单独关闭某一设备。原创 2023-03-29 15:39:15 · 478 阅读 · 0 评论 -
ARM体系之异常中断
在ARM体系结构中,同步异常是指在指令执行期间产生的异常,通常是由于执行的指令出现了一些错误或者条件不满足而导致的。同步异常可以被捕获并且在指令执行结束之前进行处理,处理完成后再恢复指令执行。原创 2023-03-26 16:10:32 · 485 阅读 · 0 评论 -
Linux内核--内核同步下(并发控制)
Linux中的信号量是一种睡眠锁。如果有一个任务试图获得一个不可用(已经被占用)的信号量时,信号量会将其推进一个等待队列,然后让其睡眠。这时处理器能重获自由,从而去执行其他代码。当持有的信号量可用(被释放)后,处于等待队列中的那个任务将被唤醒,并获得该信号量。原创 2023-02-04 17:19:15 · 80 阅读 · 0 评论 -
Linux内核--内核同步上(并发控制)
内核中有类似可能造成并发执行的原因。它们是:• ·中断一中断几乎可以在任何时刻异步发生,也就可能随时打断当前正在执行的代码。• ·软中断和tasklet-一内核能在任何时刻唤醒或调度软中断和tasklet,打断当前正在执行的代码。• ·内核抢占一因为内核具有抢占性,所以内核中的任务可能会被另一任务抢占。• ·睡眠及与用户空间的同步一在内核执行的进程可能会睡眠,这就会唤醒调度程序,从而导致调度一个新的用户进程执行。• ·对称多处理一两个或多个处理器可以同时执行代码。原创 2023-01-13 08:00:00 · 154 阅读 · 0 评论 -
Linux内核-进程管理
设置新进程的tss(进程的状态描述符, 进程运行过程中CPU需要知道的进程状态标志(段属性、位属性等))和ldt(局部描述符,包括两个东西,一个是数据段(全局变量静态变量等),另一个是代码段,不过这里面存的都是指针)循环task列表 找出最大的counter时间片,如果找到不为0,说明当前进程链表中,还有一些进程的时间片没用完。将TSS寄存器中的地址换为新进程的TSS描述符,将CPU中保存的TSS段存到原TSS中,将新TSS存到CPU中。新进程设为运行状态,返回新进程的PID。原创 2023-01-11 07:30:00 · 83 阅读 · 0 评论 -
Linux内核-中断
• 中断的处理可以分为上半部,下半部• 中断上半部,用来处理紧急的事,它是在关中断的状态下执行的• 中断下半部,用来处理耗时的、不那么紧急的事,它是在开中断的状态下执行的• 中断下半部执行时,有可能会被多次打断,有可能会再次发生同一个中断• 中断上半部执行完后,触发中断下半部的处理• 多个中断的下半部,是汇集在一起处理的原创 2023-01-08 19:11:36 · 121 阅读 · 0 评论