![](https://img-blog.csdnimg.cn/20190222100512977.gif?x-oss-process=image/resize,m_fixed,h_224,w_224)
进程管理
介绍Linux进程管理相关内容。
程序猿Ricky的日常干货
擅长扫地、打杂、开车。。
展开
-
Linux idle进程创建过程(kernel 4.14)
idle进程是内核创建的第一个进程,也常常被叫做swapper 进程:asmlinkage __visible void __init start_kernel(void){ char *command_line; char *after_dashes; set_task_stack_end_magic(&init_task);idle进程也是唯一一个...原创 2018-11-13 15:08:33 · 1568 阅读 · 0 评论 -
Linux Workqueue:work的处理
workqueue常用的queue操作接口如下所示: /** * schedule_work_on - put work task on a specific cpu * @cpu: cpu to put the work task on * @work: job to be done * * This puts a job on a specific cpu */ s...原创 2019-09-12 15:05:03 · 1573 阅读 · 0 评论 -
Linux Workqueue到CMWQ的技术演进
基础workqueue实现Linux kernel 2.6.36版本之前,内核已经实现了workqueue的功能。工作线程创建支持single-thread和Per-CPU thread两种形式的workqueue,对于singlethread workqueue,内核会创建单个kthread用于执行work任务,并且该kthread不会绑定到某个CPU上;对于Per-CPU threa...原创 2019-09-10 20:15:39 · 1605 阅读 · 0 评论 -
进程冻结和解冻的本质
在我前面的文章中已经介绍了内核中的进程冻结技术,进程冻结存在的意义以及它的实现架构,没有看过的童鞋可以点击如下链接过去浏览:https://blog.csdn.net/rikeyone/article/details/103182748看过此文的人可能又会产生一些新的疑问,一个进程如果被冻结了,那么它到底在做什么呢?处于什么状态呢?这也是我当时产生的疑问,经过RTFSC,就记录了本文,对该问题...原创 2020-04-22 12:06:25 · 3376 阅读 · 1 评论 -
进程冻结(freezing of task)
进程冻结(freezing of tasks)进程冻结是当系统hibernate或者suspend时,对进程进行暂停挂起的一种机制,后面主要以hibernate为例进行介绍。那么为什么要在hibernate或者suspend时需要把进程冻结呢?主要是出于如下的原因:第1点,防止文件系统被修改后无法恢复。假设没有进程冻结操作,那么在hibernate时,进程可能会在hibernation im...原创 2019-11-21 15:00:32 · 5782 阅读 · 1 评论 -
多核编程与CPU亲和力
多核编程多核编程和多线程编程还是有一些差异的,对于多线程编程,我们可以创建多个线程去处理业务,但是不会关心具体哪个进程运行在哪个CPU上,而多核的意思则是可以把特定任务绑定到特定的CPU上运行。这样的好处是什么?能够把重要的任务独立到一个CPU上运行,从而不受其他任务影响,提升该任务的响应速度。通过CPU绑定也能提升cache命中率,从而提高性能。具体到使用上,就是利用如下API绑定CPU:i...原创 2019-05-30 19:10:21 · 1542 阅读 · 0 评论 -
HMP调度器和EAS调度器
HMP调度器为了降低功耗,ARM开发了大小核架构处理器。Linux内核中的负载均衡算法基于SMP模型,并未考虑big.LITTLE模型,因此Linaro开发了一个HMP调度器用于支持这种架构,它也被用于Android 5.x和Android6.x中,但这种调度器并没有被合入内核的基线中。该调度器的进程调度算法基本上和CFS一样,主要区别在于调度域和负载均衡的处理上。HMP调度域的实现比自带的C...原创 2019-03-08 10:27:41 · 12730 阅读 · 2 评论 -
CPU负载均衡
如何实现负载均衡为了系统负载的均衡,主要通过如下三种手段:(1)当一个进程要加入runqueue时,选择负载最轻的cpu上的runqueue(2)当前CPU的runqueue为空时,主动拉取其他runqueue上的进程来运行(3)周期计算各个CPU上的负载情况,在必要的时候迁移进程具体的场景,CFS调度器负载均衡发生在如下的一些路径上:1.当前进程离开runqueue,进入睡眠,而对应...原创 2019-02-28 19:37:36 · 4826 阅读 · 0 评论 -
进程创建过程
进程创建在进程创建时,调用do_fork函数来创建新进程,那么和调度相关的操作主要有两个,一个是sched_fork,这是对一个进程进行调度的初始化,另外一个就是wake_up_new_task,这个是把刚刚创建的子进程唤醒加入到调度器中管理。首先来看sched_fork函数,调用流为do_fork–>copy_process–>sched_fork。 /* * fork()...原创 2019-02-25 16:07:26 · 4916 阅读 · 0 评论 -
scheduler_tick函数详解
scheduler_tick是调度器中的一个核心重要的函数,它叫做周期调度器,驱动调度器运行的机制之一。event_handler()-->tick_handle_periodic()->tik_periodic()->update_process_times()-->scheduler_tick()以上是该函数的调用回溯,由时钟中断驱动着这个函数的运行,每个CPU ...原创 2019-02-24 17:09:01 · 5703 阅读 · 0 评论 -
schedule()函数详解
asmlinkage __visible void __sched schedule(void) { struct task_struct *tsk = current; sched_submit_work(tsk); do { __schedule(); } while (need_resched()); }schedul...原创 2019-02-20 16:58:20 · 20860 阅读 · 0 评论 -
PELT负载计算
PELT负载计算 (Per-Entity Load Tracking)简介什么是负载,负载实际上表示的是进程运行对系统的“压力”情况,它和进程消耗CPU时间是两个概念,比如:10个进程在运行队列runqueue中,和1个进程在runqueue中,虽然在runquque中的进程并没有正在消耗CPU时间,实际上这两种情况下,系统的压力是不同的,此时这些进程并没有在消耗CPU时间,而是在等待,但是...原创 2019-02-21 20:33:59 · 2152 阅读 · 0 评论 -
CFS调度器(二)
组调度前面介绍到的CFS调度器都是以进程为单位进行的调度,实际应用场景中,用户可能会希望系统调度是基于用户组进行的。比如一个服务器上有两个用户同时使用,如果想要两个用户拥有相同的资源分配,那么就可以采用组调度方式。如果依然以进程为单位,那么假如一个用户拥有1个进程,而另一个用户拥有10个进程,这就导致了其中一个用户占用了大部分的CPU资源。调度器都是基于调度实体sched_entity来作为调...原创 2019-02-24 15:08:41 · 346 阅读 · 0 评论 -
CFS调度器(一)
关于调度类和优先级的概念,前面的文章《调度器概述》中已经做了介绍了,本文不在重述。本文主要关注的就是CFS调度器,或者叫做fair_sched_class调度类。这种调度器是被SCHED_NORMAL、SCHED_BATCH这两种调度策略使用的。(本文基于Linux4.0)提到调度器涉及到两个问题:1.怎么根据参量快速选出下一个要调度执行的进程?2.怎么定义和更新不同进程的相关参量?带着...原创 2019-02-22 18:09:09 · 1311 阅读 · 0 评论 -
Linux2.6 O(1)调度器
O(1)调度器存在于2.4-2.6版本的内核中。普通进程和实时进程Linux中把进程分为普通进程和实时进程两种,实时进程对于系统的响应时间要求很高,因此实时进程的优先级都是要高于普通进程的。静态和动态优先级静态和动态优先级的范围都是[100~139],这两个值对于普通进程来说非常重要。静态优先级(值越小)越高,基本时间片越长,静态优先级越低(值越大),基本时间片越短。这是有一个固定公式进...原创 2019-02-15 15:56:12 · 792 阅读 · 0 评论 -
内核调度时机
调度的时机内核中常见的调度场景如下:(1)进程被阻塞时,比如执行sleep()后,需要立刻执行schedule()进行调度(2)当唤醒进程时,比如try_to_wake_up()执行时,会重新计算负载,查找需要执行的进程,并设置TIF_NEED_RESCHED标志延时调度(3)当周期执行的scheduler_tick()发现需要切换进程时,设置TIF_NEED_RESCHED标志延时调度...原创 2019-02-19 10:19:19 · 670 阅读 · 0 评论 -
调度器概述
调度类现代版本的内核中,比如笔者使用的Linux 4.0,已经去除了O(N)和O(1)调度器的实现。默认实现了另外更新的4种调度器:deadline,realtime,idle和CFS。内核使用struct sched_class来描述一个调度类,也就是一个调度器。这几个调度类在内核中的定义如下:rt_sched_class --------- realtime调度器fair_sched_...原创 2019-02-20 11:18:31 · 522 阅读 · 0 评论