进程调度

1、策略

  策略决定调度程序在何时让什么进程运行。调度器的策略往往决定系统的整体印象,并且,还要负责优化使用处理器时间。

1.1 I/o消耗型和处理器消耗型。 

  进程可以被分为I/O消耗型和处理器消耗型。前者指进程的大部分时间用来提交I/O请求或者等待I/O请求。因此,这样的进程经常处于可运行状态,但通常都是运行短短的一会儿,I/O请求时最后总会阻塞。

1.2 进程优先级

  调度算法中最基本的一类就是基于优先级的调度。Linux内核提供了两组独立的优先级范围。第一种是nice值,范围从-20到+19,默认值是0,。nice的值越大优先级越低,nice值小的进程在nice直达的进城之前执行。第二个是实时优先级,其值是可配置的,默认情况下他的变化范围是从0到99.任何实施进程的优先级度高于普通的进程。

1.3 时间片

1.4 进程抢占

 

1.5 调度策略的活动

2 Linux调度算法

设计新的调度算法是为了实现下列目标:

  • 充分实现O(1)调度,不管有多少进程,新的调度采用的每个算法都能在恒定时间内完成。
  • 全面实现SMP的可扩展性。每个村里起拥有自己的锁和自己的可执行队列。
  • 强化SMP的亲和力,尽量将相关一组任务分配给一个CPU进行连续的执行。只有在需要平衡任务队列的大小时才在CPU之间移动进程。
  • 加强交互性能。即使在系统处于相当负载的情况下,也能保证系统的相应,冰粒机调度交互式进程。
  • 保证公平,在合理设定的时间范围内,没有进程会处于饥饿状态。同样的,也没有进程能够显示公平地得到大量的时间片。
  • 虽然最常见的优化情况是系统中只有1~2个可运行进程,但是优化也完全有能力扩展到具有多处理器且每个处理器上运行多个进程的系统中。

2.1 可执行队列

  调度程序中最基本的数据结构是运行队列。可执行队列定义域kernel/sechd.c中,由runqueue表示。

struct runqueue{spinlock_t            lock;            /* 保护运行队列的自旋锁 */unsigned long         nr_running;       /* 可运行任务数目 */unsigned long         nr_switches;      /* 上下文切换数目 */unsigned long         expired_timestamp;   /* 队列最后被换出时间 */unsigned long         nr_uninterruprible;   /*处于不可中断睡眠状态的任务数目 */unsigned long long    timestamp_last_tick;  /* 最后一个调度程序的节拍 */struct task_struct    *curr;          /* 当前运行任务 */struct task_struct    *idle;           /* 该处理器的空任务 */struct mm_struct      *prev_mm;         /*最后运行任务的mm_struct结构体 */struct prio_array     *active;         /* 活动优先级队列 */struct prio_array     *expired;         /*超时优先级队列 */struct prio_array     array[2];         /*实际优先级数组 */struct task_struct    *migration_thread;    /* 移出线程 */struct list_head      *migration_queue;     /*移出队列 */atomic_t              nr_iowait;        /* 等待I/O操作的任务数量 */
};  

 

  由于可执行队列是调度程序的核心数据结构体,所以有一组宏定义用于获取与给定处理器或进程相关的可执行队列。cpu_rq(processor)宏用于返回给定处理器可执行队列的指针。this_rq()宏用来返回当前处理器的可执行队列。最后,宏task_rq(task)返回给定任务多在的队列指针。

  在对可执行队列晋城操作以前,应该先锁住它。因为每个可执行队列唯一的对应一个处理器,所以很少出现一个处理器需要锁其他处理器的可执行队列的情况。在其拥有者读取或改写队列成员的时候,可执行队列包含的锁用来放置队列被其他代码改动。锁住额运行队列的最常见情况发生在你想锁住的运行队列上恰巧有一个特定的任务在运行,此时需要用到task_rq_lock()和task_rq_unlock()

2.2 优先级数组

  每个运行队列都有两个优先级数组,一个活跃的和一个过期的。

2.3 重新计算时间片

  

 

转载于:https://www.cnblogs.com/pingfandfy/p/5694389.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/457558.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Django,Ajax,Vue实现文章评论功能

Django评论 评论复杂的地方在于需要实现点击提交评论后评论内容需要立刻出现在下面,还要保持页面位置不变,所以提交后不能整体刷新页面,因为刷新以后页面肯定在最上面,而评论一般都在最下面,所以要用到Ajax 整个过程用…

回归分析什么时候取对数_冬蜜什么时候取,冬天取蜂蜜的方法

大家好,我现在分享的是,在冬天是在什么时候取蜜!冬天在我们南方,取蜜时间是十一月到十二月的时候,只要温度达到15度以上,蜂蜜封盖了就可以取蜜了,并且在冬天我们只能取一次,最晚取蜜…

Opencv与dlib联合进行人脸关键点检测与识别

前言 依赖库:opencv 2.4.9 /dlib 19.0/libfacedetection 本篇不记录如何配置,重点在实现上。使用libfacedetection实现人脸区域检测,联合dlib标记人脸特征点,最后使用opencv的FaceRecognizer实现人脸识别。 准备工作 1、配置好Op…

Category 的一些事

来源:伯乐在线 - Tsui YuenHong 链接:http://ios.jobbole.com/90422/ 点击 → 申请加入伯乐在线专栏作者 新增实践部分:偏方 Hook 进某些方法来添加功能 Category – 简介 Category(类别)是 Objective-C 2.0 添加的新特…

python tfidf特征变换_机器学习的“万能模板” - 数据分析

最后是文本变量。很遗憾Titanic数据集中没有合适的文本变量。一般我们处理文本变量的方法是,合并所有的文本形成一个变量,然后调用Count Vectorizer或者TfidfVectorizer算法,将文本数据转换成数字。大部分情况下,TfidfVectorizer比…

python实现哈希表

# python 实现哈希表class HashTable:"""哈希函数的构造解决冲突"""def __init__(self, source):self.source sourceself._index []self._val []self.table []self._mod 13def Output(self):print(self._index)print(self._val)def _create…

商品综合评价排名

店内有很多产品,而且包含但不局限于以下指标:浏览量、访客数、平均停留时长、详情页跳出率、下单转化率、下单支付转化率、支付转化率、下单金额、下单商品件数、下单买家数、支付金额、支付商品件数、加购件数、访客平均价值、收藏人数、客单价、搜索支…

ionic资源网站

http://ionichina.com/topic/570b1f4ecd63e4247a7cfcf3 http://doc.ionicmaterialdesign.com/#intro http://ionicmaterial.com/demo/ 10大materialhttp://www.open-open.com/news/view/192f93e转载于:https://www.cnblogs.com/znsongshu/p/6079357.html

pytorch神经网络因素预测_实战:使用PyTorch构建神经网络进行房价预测

微信公号:ilulaoshi / 个人网站:lulaoshi.info本文将学习一下如何使用PyTorch创建一个前馈神经网络(或者叫做多层感知机,Multiple-Layer Perceptron,MLP),文中会使用PyTorch提供的自动求导功能,训练一个神经…

SQL基本操作

SQL 操作 检索数据 SELECT 检索数据 -- 检索单个列 SELECT 列名 FROM table_name;-- 检索多个列 SELECT 列1, 列2 FROM table_name;-- 检索所有列 SELECT * FROM table_name;-- 检索不同的值 SELECT DISTINCT 列名 FROM table_name;限制检索结果 -- SQL Server / Access SE…

git 忽略 部分文件夹_git提交忽略某些文件或文件夹

记得第一次用 github 提交代码,node_modules 目录死活传不上去,哈哈哈,后来才知道在 .gitignore 文件里设置了忽略 node_modules 目录上传。是的, .gitignore 文件就是设置那些你不想用 git 一起上传的文件和文件夹。比如刚接触到…

Ajax实现原理详解

Ajax:Asynchronous javascript and xml,实现了客户端与服务器进行数据交流过程。使用技术的好处是:不用页面刷新,并且在等待页面传输数据的同时可以进行其他操作。 这就是异步调用的很好体现。首先得了解什么是异步和同步的概念。…

SpringJDBC解析3-回调函数(update为例)

PreparedStatementCallback作为一个接口,其中只有一个函数doInPrepatedStatement,这个函数是用于调用通用方法execute的时候无法处理的一些个性化处理方法,在update中的函数实现: protected int update(final PreparedStatementCr…

python上下文管理器

DAY 23. python上下文管理器 Python 的 with 语句支持通过上下文管理器所定义的运行时上下文这一概念。 此对象的实现使用了一对专门方法,允许用户自定义类来定义运行时上下文,在语句体被执行前进入该上下文,并在语句执行完毕时退出该上下文&…

勾股定理python思路_趣叮咚编程数学揭秘:为什么勾股定理a+b=c?

我们都知道:三角形3个外角之和360度可是谁知道为什么等于360度呢?其实利用编程制作动图演绎了解啦:那勾股定理abc又是为什么呢?还有很多有趣的数学公式都可以演绎:圆的面积公式、圆周长...通过动图演绎原来晦涩难懂的定…

System.InvalidOperationException : 不应有 Response xmlns=''。

xml如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <Response version"2"><datacash_reference>4700203048783633</datacash_reference><information>Failed to identify the card scheme of the supp…

Navicat Premium连接SQL Server

Navicat Premium连接SQL Server 步骤&#xff1a; 激活SQL Server 服务配置SQL Server网络配置连接SQL Server 激活SQLServer服务 直接搜索 计算机管理 点 服务和应用程序&#xff0c; 点 SQL Server配置管理器&#xff0c; 双击第一个SQL Server服务 不出意外的话&#xf…

mysql 单标递归_MySql8 WITH RECURSIVE递归查询父子集的方法

背景开发过程中遇到类似评论的功能是&#xff0c;需要时用查询所有评论的子集。不同数据库中实现方式也不同&#xff0c;本文使用Mysql数据库&#xff0c;版本为8.0Oracle数据库中可使用START [Param] CONNECT BY PRIORMysql 中需要使用 WITH RECURSIVE需求找到name为张三的孩子…

processon完全装逼指南

一、引言 作为一名IT从业者&#xff0c;不仅要有扎实的知识储备&#xff0c;出色的业务能力&#xff0c;还需要具备一定的软实力。软实力体现在具体事务的处理能力&#xff0c;包括沟通&#xff0c;协作&#xff0c;团队领导&#xff0c;问题的解决方案等&#xff0c;这些能力在…

mysql在空闲8小时之后会断开连接(默认情况)

调试程序的过程发现&#xff0c;在mysql连接空闲一定时间&#xff08;默认8小时&#xff09;之后会断开连接&#xff0c;需要重新连接&#xff0c;也引发我对重连机制的思考。转载于:https://www.cnblogs.com/ppzbty/p/5707576.html