十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
你所说的linux系统的优先级数确实是这样的。需要注意的是普通用户只能在0~19之间调整应用程序的优先权值,只有超级用户有权调整更高的优先权值(从-20~19)。linux系统属于这种数值越小优先级越高,数值越大优先级越低的系统。windows属于那种优先数值大的优先级高的系统。其他的就不大清楚
创新互联从2013年开始,先为乡宁等服务建站,乡宁等地企业,进行企业商务咨询服务。为乡宁企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。
Linux内核的三种调度策略:
1,SCHED_OTHER
分时调度策略,
2,SCHED_FIFO实时调度策略,先到先服务。一旦占用cpu则一直运行。一直运行直到有更高优先级任务到达或自己放弃
3,SCHED_RR实时调度策略,时间片轮转。当进程的时间片用完,系统将重新分配时间片,并置于就绪队列尾。放在队列尾保证了所有具有相同优先级的RR任务的调度公平
Linux线程优先级设置
首先,可以通过以下两个函数来获得线程可以设置的最高和最低优先级,函数中的策略即上述三种策略的宏定义:
int
sched_get_priority_max(int
policy);
int
sched_get_priority_min(int
policy);
SCHED_OTHER是不支持优先级使用的,而SCHED_FIFO和SCHED_RR支持优先级的使用,他们分别为1和99,数值越大优先级越高。
设置和获取优先级通过以下两个函数:
int
pthread_attr_setschedparam(pthread_attr_t
*attr,
const
struct
sched_param
*param);
int
pthread_attr_getschedparam(const
pthread_attr_t
*attr,
struct
sched_param
*param);
例如以下代码创建了一个优先级为10的线程:
struct
sched_param
{
int
__sched_priority;
//所要设定的线程优先级
};
例:创建优先级为10的线程
pthread_attr_t
attr;
struct
sched_param
param;
pthread_attr_init(attr);
pthread_attr_setschedpolicy(attr,
SCHED_RR);
param.sched_priority
=
10;
pthread_attr_setschedparam(attr,
¶m);
pthread_create(xxx
,
attr
,
xxx
,
xxx);
pthread_attr_destroy(attr);
linux系统中,程序有若干个优先级,最低的优先级是19。
Linux为一套免费使用和自由传播的类UNIX操作系统,其内核由林纳斯·本纳第克特·托瓦兹于1991年第一次释出,它主要受到Minix和Unix思想的启发,是一个基于POSIX和Unix的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的Unix工具软件、应用程序和网络协议。它支持32位和64位硬件
扩展资料:
普通用户只能在0~19之间调整应用程序的优先权值,只有超级用户有权调整更高的优先权值(从-20~19)。linux系统属于这种数值越小优先级越高,数值越大优先级越低的系统。windows属于那种优先数值大的优先级高的系统。
在linux系统中,使用ifconfig命令给网口配置baiip,系统会自动生成这个网卡的相关路由信息,可以使用命令route –n查看系统所有的路由信息,参数-n是不进行地址解析,如果不添加-n选项,route命令会根据/etc/resolv文件中配置的DNS服务器进行地址解析。
在linux系统中,使用ifconfig命令给网口配置ip,系统会自动生成这个网卡的相关路由信息,可以使用命令route –n查看系统所有的路由信息,参数-n是不进行地址解析,如果不添加-n选项,route命令会根据/etc/resolv文件中配置的DNS服务器进行地址解析,所以返回时间跟DNS服务器的响应时间有关系:
系统自动生成eth0的路由信息
可以看到系统自动生成了201网段的路由信息,凡是201这个网段的数据包都会通过eth0这个网口。但是目前还没有网关的信息,如果要通过eth0访问外网,还需要添加默认网关,linux系统中可以通过命令ip route命令添加默认网关,命令格式为ip route add default via gateway dev interface:
eth0的路由信息
添加默认网关后的路由信息如上图,其中Destination和Genmask为0.0.0.0的记录表明这是系统默认网关,默认网关的意思是当要发送数据包的目标网络地址不在系统的路由记录中时,系统会将该数据包通过默认网关对应的接口(网卡)发送出去,如果允许使用dhcp的话,还可以直接使用udhcpc命令,该命令会自动获取ip并设置默认网关:
使用udhcpc获取ip和设置默认网关
在多网络的情况下,比如以太网和wi-fi以及3G网络同时存在的时候,就会有多个路由信息多个默认网关。下图是核心板的以太网和wi-fi同时存在时的路由信息:
多网络路由信息
可以看到以太网eth0和wi-fi网络wlan0的路由信息都自动生成了,而且存在两个默认网关。如果访问外网,系统会根据路由缓存信息和速度最优的原则,通过速度更快的网关进行访问。Linux系统支持对默认网关的优先级进行设置,这时需要用到mteric这个参数,metric为跃点数,当系统中有多个默认网关时,数据包会通过metric更低的接口传输,通常情况下,默认的metric都为0,所以优先级是相同的。还是可以通过linux的命令ip route命令设置metric,命令格式为ip route add default via gateway dev interface metric val,下面我们就为eth0和wlan0设置优先级:
路由信息的优先级
如图所示我们为eth0设置的metric为100,wlan0的metric为101,这样以太网eth0的优先级就高于wlan0,数据包就会有先通过eth0通讯,如果以太网eth0关闭,则相关路由信息也会被清除掉,这时metric为101的默认网关优先级变为最高,数据包会自动改为通过wlan0通讯。通过traceroute命令可以验证这一点:
数据包通讯信息
可以看到数据包默认是通过优先级更高的网关通讯,当eth0关闭之后,数据就改为通过wi-fi网络的网关了。同时为了方便客户使用和参考,我们提供了一个管理路由信息的例程,让程序在后台运行,会检查有没有新的默认网关,如果有新的默认网关,则按照以太网wi-fi3G/4G网络的优先级顺序自动设置metic的值,如果需要更改则可以通过参数来设置三种网络的metric值:route_manager [metric for eth] [metric for wlan] [metric for ppp]
测试效果
路由信息在板卡重启之后会消失,板卡上自带以太网可以通过英创公司提供的userinfo.txt配置文件来设置以太网的ip和默认网关,或者设置为dhcp的方式。如果有扩展的wi-fi模块则可以通过脚本或自己保存一个配置文件来实现加载网口后自动进行设置ip和网关。3G/4G网络是使用的ppp拨号,ppp会自动生成默认网关。
用top或者ps -l查看进程会发现有PR(PRI) NI两个字段:
NI 是优先值,是用户层面的概念, PR是进程的实际优先级, 是给内核(kernel)看(用)的。
一般情况下,PR=NI+20, 如果一个进程的优先级PR是20, 那么它的NI(nice)值就是20-20=0。
进程调度优先级是从-20到19,一共40个级别,数字越大,表示进程的优先级越低。默认时候,进程的优先级是0。查看进程优先级有两个办法:ps和top。top命令显示的NI列的值。或者可以使用ps -efl来查看,也是在ni列表示了进程的优先级。《Linux就该这么学》 一起学习,进程的优先级可以在程序运行的时候设置,也可以在程序运行过程中动态的修改。
在 Linux 中,线程是由进程来实现的,可以认为线程就是一个轻量级的进程,因此,线程调度是按照进程调度的方式来进行的。这样设计,线程调度流程可以直接复用进程调度流程,没必要再设计一个进程内的线程调度器了。
在 Linux 中,进程调度器是基于进程的调度策略与调度优先级来决定调度哪个进程运行。
调度策略主要包括:
调度优先级的范围是 0~99,数值越大,表示优先级越高。
其中,SCHED_OTHER、SCHED_IDLE、SCHED_BACH 为非实时调度策略,其调度优先级为 0。而 SCHED_FIFO、SCHED_RR 是实时调度策略,其调度优先级范围为 1~99。
实时调度策略的进程总是比非实时调度策略的进程优先级高。
在 Linux 内部实现中,调度器会为每个可能的调度优先级维护一个可运行的进程列表,以最高优先级列表头部的进程作为下一次调度的进程,所有的调度都是抢占式的,如果一个具有更高调度优先级的进程转换为可运行状态,那么当前运行的进程将被强制进入其等待的队列中。
SCHED_OTHER
该调度策略是默认的 Linux 分时调度策略,该调度策略为非实时的,其调度优先级总是为 0。
对于该调度策略类型的进程,调度器是基于动态优先级来调度的。动态优先级跟属性 nice 有关,nice 的值会随着进程的运行时间而动态改变,以确保所有具有 SCHED_OTHER 策略的进程公平地得到调度。
在 Linux 中,nice 的值范围为-20 ~ +19,默认值为 0。nice 值越大,则优先级越低,因此相对较低 nice 值的进程可以获得更多的处理器时间。
通过命令 ps -el 查看系统中的进程列表,其中 NI 列就是进程对应的 nice 值。
使用 top 命令,看到的 NI 列也是进程的 nice 值。
调整 nice 值,可以通过 shell 命令 nice ,该命令可以按照指定的 nice 值运行 cmd ,命令的帮助信息为:
重新调整已运行进程的 nice 值,可通过 renice 命令实现,命令的帮助信息为:
另外,可以执行 top 命令,输入 r ,根据提示输入进程的 pid ,再输入 nice 数值,也可以调整进程的 nice 值。
SCHED_FIFO
该调度策略为先入先出调度策略,简单概括,就是一旦进程占用了 CPU,则一直运行,直到有更高优先级的任务抢占,或者进程自己放弃占用 CPU。
SCHED_RR
该调度策略为时间片轮转调度策略,该调度策略是基于 SCHED_FIFO 策略的演进,其在每个进程上增加一个时间片限制,当时间片使用完成后,调度器将该进程置于队列的尾端,放在尾端保证了所有具有相同调度优先级的进程的调度公平。
使用 top 命令,如果 PR 列的值为 RT ,则说明该进程采用的是实时调度策略,其调度策略为 SCHED_FIFO 或者 SCHED_RR,而对于非实时调度策略的进程,该列的值为 NI + 20 。
可以通过命令 ps -eo state,uid,pid,ppid,rtprio,time,comm 来查看进程对应的实时优先级,实时优先级位于 RTPRIO 列下,如果进程对应的列显示为 - ,说明该进程不是实时进程。
chrt 命令可以用来很简单地更改进程的调度策略与调度优先级。在 Linux 下查看 chrt 命令的帮助信息:
比如,获取某个进程的调度策略,使用如下命令:
在比如,设置某个进程的调度策略为 SCHED_FIFO,调度优先级为 70,使用如下命令: