宋宝华Linux培训笔记-Linux进程管理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jj12345jj198999/article/details/82079284

1、cpu进程状态

linux中进程状态如下图:

浅度睡眠为进程等待资源或中断响应,即使资源没有拿到也可以被唤醒;深度睡眠为进程等待资源,拿到资源后进入就绪状态。

僵死状态为进程死亡,但还没有被父进程执行wait操作,此时进程中只剩下task_struct,其他资源已经被释放,当父进程执行完wait操作后,子进程的僵死状态被清除。如果一个父进程死了,那该父进程下面的子进程将被托孤给离该父进程最近的收割进程,该进程内含有wait操作,监控子进程。

暂停状态是进程暂时被挂起,ctrl+Z可以暂停进程,按fg继续执行进程。可用于作业控制。

 

2、进程描述符

Linux进程描述符采用task_struct结构体描述,该结构体内含有五个部分:

Linux中针对task_struct进行调度。多线程应用中同一个进程创建的多个线程它们pid和进程的pid一样,但是每个线程拥有不同的tid。

Linux对于进程描述符有三种表现形式,task_struct双向链表,进程树,哈希表。可以通过这三种数据格式描述同一个进程。

 

3、linux进程创建

创建进程有三种方式

Fork 创建子进程,将父进程的资源复制一份给子进程,task_struct内五项内容不共享,fork的返回值为0,必须要有mmu进行页表管理

Vfork 创建子进程,父进程和子进程共享mm,其他四项内容不共享,没有mmu的方式下使用

Clone(pthread_create) 创建子线程,资源共享,task_struct内五项内容共享。

三个函数最终都是调用do_fork。

在fork时,父进程和子进程最终会有不一样的物理地址,必须要有mmu才行。

 

4、进程生命周期

系统上电以后最早的进程为进程0,当进程0创建完进程1(init)后变化为idle进程,该进程在linux中优先级最低,当执行到该进程时,表明系统很闲,进入省电状态WFI

 

5、linux进程调度

进程类型分为I/O消耗性,CPU消耗性。

I/O消耗性是能够及时响应I/O中断消息,用户体验好,类似于手机。

CPU消耗性是运算好,用户体验差。

一个进程是I/O消耗性或是CPU消耗性只有进程运行过程中才能知道,不是由用户创建时选定的。

 

6、linux进程调度

linux进程分为两个类别

0-99采用SCHED_FIFO或SCHED_RR模式,直接抢占,数字越小优先级越高(linux内部用99-数字),现在也可以设定rt_period_us或rt_runtime_us,指定抢占式进程最多不超过一个固定值,比如1ms中最多执行0.95ms

100-139采用SCHED_OTHER模式,非抢占,每个进程都有时间来执行,通过nice来判断进程优先级。

Nice -20 对应 100,优先级高,每次被分到更多的时间片执行

Nice 19 对应 139,优先级低,分到的时间片较少

可以通过renice –n -5 –g pidof设定某个pidof的nice值。

切换FIFO RR或者OTHER命令为

Chrt –a –f –p 50 pid 修改为FIFO

Chrt –a –r –p [1..99] pid 修改为RR

Chrt –a –o –p -0 1024 修改为OTHER

 

后续linux采用CFS红黑树方式进行OTHER内存调度,每次选取VT值最小的进程进行调度

进程的virtual time=physical time/权重

权重和nice相关,nice值越小权重越大,得到的vt越小,但是如果pt执行的次数越多,pt越大,vt也会变大。

 

新内核中加入组的概念,不同组直接采用CFS调度,组内采用CFS调度。加入组的概念后可以进行CPU流量控制,每个组设置不同,获得的CPU资源不同。

创建组:/sys/fs/cgroup/cpu内创建mkdir A,mkdir B

将进程加入该组:sh –c ‘echo pod > cgroup.procs’

修改组内的配置 sh –c ‘echo 100 > cpu.shares’ shares越大,该组cpu拿到的时间片越多

Sh –c ‘echo 1000> cpu_cfs_quota_us’ 值越大,该组cpu每一个时间片内拿到的时间越多

 

7、smp负载均衡

负载均衡为硬件自动实现,RR和FIFO自动均分到每个核上执行,每个核进行推拉操作获取进程,每个核的调度算法都一样。可以通过命令指定将任务放到哪个核上。

Pthread_attr_setaffinity_np()内含有设置CPU掩码,指定在哪个CPU上面跑。0X1为CPU1,0x2为CPU2。

 

猜你喜欢

转载自blog.csdn.net/jj12345jj198999/article/details/82079284