作用:从准备执行的进程中选择进程分配到CPU
因为短期调度程序经常要为CPU选择进程,所以它的执行频率很快
长期调度程序:
作用: 将进程从大容量存储设备的缓冲池中选择进程,加载到内存
长期调度控制内存中进程数量
只有在进程离开系统时,才需要长期调度程序的调度
在新进程创建之间,可能间隔几分钟,所以长期调度程序执行并不频繁。
长期调度程序是认真选择的,他将I/O密集型进程和CPU密集型进程合理组合。
解释如下:
大多数进程可分分为I/O密集型或CPU密集。前者执行I/O比执行计算话费时间多,后者执行计算比I/O时间多。
如果调度的进程大都是I/O密集型的,那么就绪队列总是空的,短期调度程序没事可做
如果大多数调度进程是CPU密集型的,那么I/O等待队列总是为空,从而设备没有得到利用,系统会不平衡。
长期调度将这两用类型进程组合,使性能更佳
中期调度程序:
分时 *** 作系统,可能会引入额外的中期调度程序
中期调度程序的核心思想是将进程从内存(或CPU竞争)中取出,从而降低内存中进程数据(多道程序程度)。之后进程重新调入内存,并从中断处继续执行。通过中期调度程序,进程可以 换出 ,并在后来 换入 。
FCFS调度算法属于不可剥夺算法。从表面上看,它对所有作业都是公平的,但若一个长作业先到达系统,就会使后面许多短作业等待很长时间,因此它不能作为分时系统和实时系统的主要调度策略。但它常被结合在其他调度策略中使用。例如,在使用优先级作为调度策略的系统中,往往对多个具有相同优先级的进程按FCFS原则处理。
FCFS调度算法的特点是算法简单,但效率低; 对长作业比较有利,但对短作业不利(相对SJF和高响应比);
FCFS调度算法有利于CPU繁忙型作业,而不利于I/O繁忙型作业。
短作业优先调度算法是一个非抢占策略,他的原则是下一次选择预计处理时间最短的进程,因此短进程将会越过长作业,跳至队列头。该算法即可用于作业调度,也可用于进程调度。 但是他对长作业不利,不能保证紧迫性作业(进程)被及时处理,作业的长短只是被估算出来的。
缺点:
该算法对长作业不利,SJF调度算法中长作业的周转时间会增加。更严重的是,如果有一长作业进入系统的后备队列,由于调度程序总是优先调度那些 (即使是后进来的)短作业,将导致长作业长期不被调度(“饥饿”现象,注意区分“死锁”。后者是系统环形等待,前者是调度策略问题)。
该算法完全未考虑作业的紧迫程度,因而不能保证紧迫性作业会被及时处理。
由于作业的长短只是根据用户所提供的估计执行时间而定的,而用户又可能会有意或无意地缩短其作业的估计运行时间,致使该算法不一定能真正做到短作业优先调度。
SJF调度算法的平均等待时间、平均周转时间最少。
高响应比优先调度算法既考虑作业的执行时间也考虑作业的等待时间,综合了先来先服务和最短作业优先两种算法的特点。
该算法中的响应比是指作业等待时间与运行比值,响应比公式定义如下:
响应比 =(等待时间+要求服务时间)/ 要求服务时间,即RR=(w+s)/s=1+w/s,因此 响应比一定是大于等于1的。
短作业与先后次序的兼顾,且不会使长作业长期得不到服务。
响应比计算系统开销,增加系统开销。
高响应比优先调度算法适合批处理系统,主要用于作业调度。
为了实现 RR 调度,我们将就绪队列视为进程的 FIFO 队列。新进程添加到就绪队列的尾部。CPU 调度程序从就绪队列中选择第一个进程,将定时器设置在一个时间片后中断,最后分派这个进程。
接下来,有两种情况可能发生。进程可能只需少于时间片的 CPU 执行。对于这种情况,进程本身会自动释放 CPU。调度程序接着处理就绪队列的下一个进程。否则,如果当前运行进程的 CPU 执行大于一个时间片,那么定时器会中断,进而中断 *** 作系统。然后,进行上下文切换,再将进程加到就绪队列的尾部,接着 CPU 调度程序会选择就绪队列内的下一个进程。
采用 RR 策略的平均等待时间通常较长。
在 RR 调度算法中,没有进程被连续分配超过一个时间片的 CPU(除非它是唯一可运行的进程)。如果进程的 CPU 执行超过一个时间片,那么该进程会被抢占,并被放回到就绪队列。因此, RR调度算法是抢占的。
算法描述
1、进程在进入待调度的队列等待时,首先进入优先级最高的Q1等待。
2、首先调度优先级高的队列中的进程。若高优先级中队列中已没有调度的进程,则调度次优先级队列中的进程。例如:Q1,Q2,Q3三个队列,当且仅当在Q1中没有进程等待时才去调度Q2,同理,只有Q1,Q2都为空时才会去调度Q3。
3、对于同一个队列中的各个进程,按照FCFS分配时间片调度。比如Q1队列的时间片为N,那么Q1中的作业在经历了N个时间片后若还没有完成,则进入Q2队列等待,若Q2的时间片用完后作业还不能完成,一直进入下一级队列,直至完成。
4、在最后一个队列QN中的各个进程,按照时间片轮转分配时间片调度。
5、在低优先级的队列中的进程在运行时,又有新到达的作业,此时须立即把正在运行的进程放回当前队列的队尾,然后把处理机分给高优先级进程。换而言之,任何时刻,只有当第1~i-1队列全部为空时,才会去执行第i队列的进程(抢占式)。特别说明,当再度运行到当前队列的该进程时,仅分配上次还未完成的时间片,不再分配该队列对应的完整时间片。
一,使用taskset充分利用多核cpu,让cpu的使用率均衡到每个cpu上#taskset
-p,设定一个已存在的pid,而不是重新开启一个新任务
-c,指定一个处理,可以指定多个,以逗号分隔,也可指定范围,如:2,4,5,6-8。
1,切换某个进程到指定的cpu上
taskset -cp 3 13290
2,让某程序运行在指定的cpu上
taskset -c 1,2,4-7 tar jcf test.tar.gz test
需要注意的是,taskset -cp 3 13290在设定一个已经存在的pid时,子进程并不会继承父进程的,
因此像tar zcf xxx.tar.gz xxx这样的命令,最好在启动时指定cpu,如果在已经启动的情况下,则需要指定tar调用的gzip进程。
二,使用nice和renice设置程序执行的优先级
格式:nice [-n 数值] 命令
nice 指令可以改变程序执行的优先权等级。指令让使用者在执行程序时,指定一个优先等级,称之为 nice 值。
这个数值从最高优先级的-20到最低优先级的19。负数值只有 root 才有权力使。
一般使用者,也可使用 nice 指令来做执行程序的优先级管理,但只能将nice值越调越高。
可以通过二种方式来给某个程序设定nice值:
1,开始执行程序时给定一个nice值,用nice命令
2,调整某个运行中程序的PID的nice值,用renice命令
通常通过调高nice值来备份,为的是不占用非常多的系统资源。
例:
nice -n 10 tar zcf test.tar.gz test
由nice启动的程序,其子进程会继承父进程的nice值。
查看nice值
# nice -n -6 vim test.txt &
# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 19427 2637 0 75 0 – 16551 wait pts/600:00:00 bash
4 T 0 21654 19427 0 71 -6 – 23464 finish pts/600:00:00 vim
renice调整运行中程序的nice值
格式:renice [nice值] PID
三,使用ulimit限制cpu占用时间
注意,ulimit 限制的是当前shell进程以及其派生的子进程。因此可以在脚本中调用ulimit来限制cpu使用时间。
例如,限制tar的cpu占用时间,单位秒。
# cat limit_cpu.sh
ulimit -SHt 100
tar test.tar.gz test
如果tar占用时间超过了100秒,tar将会退出,这可能会导致打包不完全,因此不推荐使用ulimit对cpu占用时间进行限制。
另外,通过修改系统的/etc/security/limits配置文件,可以针对用户进行限制。
四,使用程序自带的对cpu使用调整的功能
某些程序自带了对cpu使用调整的功能,比如nginx服务器,通过其配置文件,可以为工作进程指定cpu,如下:
worker_processes 3
worker_cpu_affinity 0001 0010 0100 1000
这里0001 0010 0100 1000是掩码,分别代表第1、2、3、4颗cpu核心,这就使得cpu的使用比较平均到每个核心上。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)