进程调度和切换

进程优先级

初认识

什么叫进程优先级?

进程的先后顺序

 

为什么会出现进程优先级?
本质上是目标资源稀缺,导致要通过优先级确认谁先谁后的问题。

优先级VS权限。怎么办?

优先级是一个数字,是task_struct里面的一个变量,值越低,优先级越高。

使用ps -l可以观察到

UID:代表执⾏者的⾝份

PID:代表这个进程的代号

PPID:代表这个进程是由哪个进程发展衍⽣⽽来的,亦即⽗进程的代号

PRI:代表这个进程可被执⾏的优先级,其值越⼩越早被执⾏

NI:代表这个进程的nice值

 

其中PRI和NI是本节的重点

最终优先级函数PRI = PRI(默认为80)+ NI()

可以通过修改nice值,才可以修改优先级.

nice的最小值:-20
最大值:19
Linux进程的优先范围:60~99

修改手法

1.top方法

1.输入top

2.输入r

3.输入要修改进程的pid

4.输入修改的nice值

2.其他调整手法nice,renice 

一、使用nice命令修改NI值

nice命令用于在启动新进程时设置其优先级。基本语法如下:

nice [-n] [nice值] command

其中,-n选项后面跟的是要设置的nice值,command是要启动的命令。如果不使用-n选项,则默认将nice值设置为10(即降低进程的优先级)。

步骤

  1. 确定要启动的命令和期望的nice值。
  2. 使用nice命令启动进程,并指定nice值。例如,要以nice值为5启动ls命令,可以使用以下命令:
nice -n 5 ls
  1. 验证进程的nice值。可以使用ps -ltop命令查看进程的详细信息,其中NI列显示了进程的nice值。
二、使用renice命令修改NI值

与nice命令不同,renice命令允许在进程已经运行后调整其优先级。基本语法如下:

renice [nice值] -p PID...

或者

renice [nice值] -g PGRP...

或者

renice [nice值] -u USER...

其中,-p选项后面跟的是要修改nice值的进程ID(PID),-g选项后面跟的是进程组ID(PGRP),-u选项后面跟的是用户名。nice值是要设置的新nice值。

步骤

  1. 确定要修改的进程的PID、进程组ID或用户名。
  2. 使用ps命令查找进程的PID,例如:
ps aux | grep process_name

其中process_name是要查找的进程名。

  1. 使用renice命令修改进程的nice值。例如,要将PID为1234的进程的nice值设置为10,可以使用以下命令:
renice 10 -p 1234
  1. 验证进程的nice值是否已修改。同样可以使用ps -ltop命令查看。

进程间存在的属性:

竞争性:

系统进程数⽬众多,⽽CPU资源只有少量,甚⾄1个,所以进程之间是具有竞争属性的。为 了⾼效完成任务,更合理竞争相关资源,便具有了优先级

独⽴性:

多进程运⾏,需要独享各种资源,多进程运⾏期间互不⼲扰

并⾏:

多个进程在多个CPU下分别,同时进⾏运⾏,这称之为并⾏

并发:

多个进程在⼀个CPU下采⽤进程切换的⽅式,在⼀段时间之内,让多个进程都得以推进,称 之为并发

进程切换 

初认识的几个问题

1.死循环是如何运行的?

一旦一个进程进入死循环,那么它会一直占用CPU吗?

不会,说明死循环进入进程不会卡死系统,不会一直占用CPU.原因是基于时间片的缘故。

2.聊聊CPU和寄存器

CPU直接访问代码和数据,与PCB就没有多大的关系了。所以CPU就需要很多的寄存器.
pc指针,目前命令吓一跳命令的地址。

1.寄存器就是CPU内部的临时空间。
2.寄存器!=寄存器里面的数据
    空间            内容
空间只有1份,但是内容可以是变化的,多分的。

如何切换 

1.一个好理解的例子

2.具体操作 

具体的操作就是,当是一个全新的进程的时候,CPU会把进程A的临时数据保存起来,保存的task_struct里面的TSS任务状态栏里面。当下次再来的时候方便恢复进程A的数据。

可以通过添加一个isrunning来判断一个是全新队列还是已经调度过的队列。

如下: 

3. Linux实际操作算法:O(1)算法

1.一个CPU一对应一个运行队列runqueue.

2.queue[140] struct task_struct* queue[140],结构体指针数组

Linux的优先级:140个,
其中0~99,100个,实时优先级
剩下40个:分时优先级

3.分时操作系统:按时间片单位调度。
实时操作系:不用考虑,把当前处理完才进行下一个。

4.宏观上按照指针队列从前往后遍历,找下一个要调度的进程,局部上尊崇先进先出。

5.调度器如何快速挑选一个进程?

bitmap:位图。
bitmap[5]:unsigned int,无符号整数,32*5 = 160位。

比特位的位置:queue[140]
0000 0000.
比特位的内容:1/0 ,是否存在进程。

过程:挑队列,挑进程。


6.O(1)调度算法。

nr_active:整个队列中一共有多少进程。

优先级高的进入死循环,优先级低的运行不了,进入死循环。

解决方法:
active调度完,放入过期expired队列里。
active queue进程会越来越少。
expired queue进程会越来越多。
activr调度完了调度完了,进行指针内容交换。
swap(&active,&expired);这样的话,又可以按照最开始的顺序依次执行进程。

全新的进程就放入过列。

总的来说,可以把O(1)调度算法看两个队列,进程看做是队列里面的数据,当前进程如果没有在队列1运行完的话,就把它从队1头提出来,插入另一个队2列的队尾。

当队1到没有数据的时候,执行swap(&active,&expired);

把队2优先执行,当队2没有进程的时候,一个循环就完成了,后面以此类推

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值