
前两天做 *** 作系统作业的时候学习了一下几种进程调度算法,在思考和讨论后,有了一些自己的想法,现在就写出来,跟大家讨论下。,或者说只有有限的CPU资源,当系统中有多个进程处于就绪状态,要竞争CPU资源时, *** 作系统就要负责完成如何分配资源的任务。在 *** 作系统中,由调度程序来完成这一选择分配的工作,调度程序所使用的算法即是调度算法。调度算法需要考虑的指标主要有尽量保证CPU资源分配的公平性;按照一定策略强制执行算法调度;平衡整个计算机系统,尽量保持各个部分都处于忙碌状态。而根据系统各自不同的特点和要求,调度算法又有一些侧重点和目标不同,因此,算法按照系统差异主要分为三大类:批处理系统中的调度算法,代表调度算法有:先来先服务、最短作业优先、最短剩余时间优先。交互式系统中的调度算法,代表调度算法有:轮转调度、优先级调度、多级队列、最短进程优先、保证调度、**调度、公平分享调度。实时系统中的调度算法,代表调度算法有:速率单调调度、最早最终时限优先调度。下面就上述提到的调度算法中挑出几个进行重点分析:保证调度保证调度是指利用算法向用户做出明确的性能保证,然后尽力按照此保证实现CPU的资源分配。利用这种算法,就是定一个进程占用CPU的时间的标准,然后按照这个标准去比较实际占用CPU的时间,调度进程每次使离此标准最远的进程得到资源,不断满足离所保证的标准最远的进程,从而平衡资源分配满足这个标准的要求。保证调度算法的优点是:能很好的保证进程公平的CPU份额,当系统的特点是:进程的优先级没有太大悬殊,所制定的保证标准差异不大,各个进程对CPU的要求较为接近时,比如说系统要求n个进程中的每个进程都只占用1/n的CPU资源,利用保证调度可以很容易的实现稳定的CPU分配要求。但缺点是,这种情况太过理想,当系统的各个进程对CPU要求的紧急程度不同,所制定的保证较为复杂的时候,这个算法实现起来比较困难。**调度**调度这种算法的大意是指向进程提供各种系统资源如CPU资源的**,当系统需要做出调度决策时,随机抽出一张**,由此**的拥有者获得资源。在**调度系统中,如果有一个新的进程出现并得到一些**,那么在下一次的抽奖中,该进程会有同它持有**数量成正比例的机会赢得奖励。进程持有的**数量越多,则被抽中的可能性就越大。调度程序可以通过控制进程的**持有数量来进行调度。**调度有很多优点:首先,它很灵活,系统增加分给某个进程的**数量,就会大大增加它占用资源的可能性,可以说,**调度的反应是迅速的,而快速响应需求正是交互式系统的一个重要要求。其次,**调度算法中,进程可以交换**,这个特点可以更好的保证系统的平衡性,使其各个部分都尽可能的处于忙碌状态。而且利用**调度还可以解决许多别的算法很难解决的问题,例如可以根据特定的需要大致成比例的划分CPU的使用。速率单调调度速率单调调度算法是一种可适用于可抢占的周期性进程的经典静态实时调度算法。当实时系统中的进程满足:每个周期性进程必须在其周期内完成,且进程之间没有相互依赖的关系,每个进程在一次突发中需要相同的CPU时间量,非周期的进程都没有最终时限四个条件时,并且为了建模方便,我们假设进程抢占即刻发生没有系统开销,可以考虑利用速率单调算法。速率单调调度算法是将进程的速率(按照进程周期所算出的每秒响应的次数)赋为优先级,则保证了优先级与进程速率成线性关系,这即是我们所说的速率单调。调度程序每次运行优先级最高的,只要优先级较高的程序需要运行,则立即抢占优先级低的进程,而优先级较低的进程必须等所有优先级高于它的进程结束后才能运行。速率单调调度算法可以保证系统中最关键的任务总是得到调度,但是缺点是其作为一种静态算法,灵活性不够好,当进程数变多,系统调度变得复杂时,可能不能较好的保证进程在周期内运行。最早最终时限优先调度最早最终时限优先调度算法是一个动态算法,不要求进程是周期性的,只要一个进程需要CPU时间,它就宣布它的到来时间和最终时限。调度程序维持一个可运行的进程列表,按最终时限排序,每次调度一个最终时限最早的进程得到CPU 。当新进程就绪时,系统检查其最终时限是否在当前运行的进程结束之前,如果是,则抢占当前进程。由于是动态算法,最早最终优先调度的优点就是灵活,当进程数不超过负载时,资源分配更优,但也同样由于它的动态属性,进程的优先级都是在不断变化中的,所以也没有哪个进程是一定可以保证满足调度的,当进程数超过负载时,资源分配合理度会急速下降,所以不太稳定。
有几种方法可供参考:
方法1: 提高进程优先级 startForeground(1, new Notification()); 降低进程优先级 stopForeground(true);
onStart() 方法中进行提高优先级 *** 作,然后在onStop()方法中进行降低优先级 *** 作
这个方法可以将对应AP的ADJ临时提高到2。
方法2:
找到这个进程对应的AndroidMannifestxml文件,在其中添加属性『android:persistent="true"』, 这样可以将该进程设置为常驻内存进程,就可以降低被Kill的概率。以Acore进程为例, 在 /package/providers/ContactsProvider/AndroidMannifestxml 文件中增加一行『android:persistent="true"』
具体修改示例如下:
<application android:process="androidprocessacore" android:label="@string/app_label"
android:icon="@drawable/app_icon"
android:allowBackup="false"
android:persistent="true"
> 方法3:
在需要提高优先级的地方调用:
final Intent it = new Intent();
itsetAction("androidintentactionBOOST_DOWNLOADING");
itputExtra("package_name", "comandroidcontacts");
itputExtra("enabled", true);
contextsendBroadcast(it);
在需要恢复到正常优先级时调用:
final Intent it = new Intent();
itsetAction("androidintentactionBOOST_DOWNLOADING");
itputExtra("package_name", "comandroidcontacts");
itputExtra("enabled", false);
contextsendBroadcast(it);
onStart() 方法中进行提高优先级 *** 作,然后在onStop()方法中进行降低优先级 *** 作
这个方法可以将对应AP的ADJ临时提高到7。
接上篇cpuset,这篇来看看进程优先级与调度策略管理。
Linux中,优先级号一共有0-139,其中0-99的是RT(实时)进程,100-139的是非实时进程。
数字越低优先级越高。
SCHED_IDLE idle状态低优先级进程调度
先看Process中调度策略的划分,与上面介绍的一样。
首先在AMS中封装了FIFO和NORMAL的两个策略,NORMAL好说,看看FIFO在哪用到
这里ProcesssetThreadScheduler并没有太多的应用,我们直接来看优先级设置吧。else中将top app的UI线程与render线程都设置为TOP_APP_PRIORITY_BOOST优先级,nice值为-10,非常高。
这里主要调用androidSetThreadPriority方法
这里通过set_sched_policy来调整调度策略,并通过setpriority设置进程优先级。这里不特意区分进程与线程了,反正在linux中都是进程。
这里与前面的cpuset非常相似,依然是写节点,节点前面也提了就是:
那么这里又引入了一个schedtune子系统,简单介绍下:
schedtune是ARM/Linaro为了EAS新增的一个子系统,主要用来控制进程调度选择CPU以及boost触发。通过权重来分配CPU负载能力来实现快速运行。高权重意味着会享受到更好的cpu负载来处理对应的任务,换句话说你能享受相对更好的cpu运行性能。
简单梳理下schedtune和不同类型SchedPolicy之间的对应关系:
看下具体文件夹内容:
系统配置:
这里/dev/stune相关配置只做了这么一个
Windows是当今流行的多任务 *** 作系统,其多任务处理可分为两类:协同式多任务和抢先式多任务处理模式。
使用协同式多任务处理模式,CPU的分配直接由应用程序决定,所以系统性能好坏取决于应用程序设计好坏。
而运行抢先式多任务处理模式,各进程占用CPU的时间由系统调度程序决定,当调度程序检测出有比当前任务优先级更高的程序事件后,暂停当前任务并将CPU时间分配给优先级更高的进程。
所有的Win16应用程序都在同一台虚拟机上运行,各程序之间采用的是协同式多任务处理。
每个Win32应用程序和MS-DOS应用程序都具有自己专用的虚拟机,其进程按抢先式多任务处理方式运行。
以上就是关于进程调度方案设计 实现一个基本动态优先级的调度算法全部的内容,包括:进程调度方案设计 实现一个基本动态优先级的调度算法、android开发如何将进程放到优先级最高、Android 进程管理篇(五)-调度策略与优先级等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)