Linux线性进程含义,Linux内核中几个比较有意思的解释(进程调度算法,页面调度算法,非线性工做集)...

1.O(1)调度器的时间计算公式与CFS调度器

Linux 2.6.23以前广泛采用了O(1)调度器,它是一种基于优先级的时间片调度算法,所谓的O(1)只是它的一些精巧的数据结构使然,在不考虑动态补偿/惩 罚的状况下,只要优先级肯定,那么时间片就是固定的。2.6.23之后的CFS呢,它是一种基于权重的非时间片调度算法,进程每次执行的时间并非固定 的,而是根据进程数在一个准固定周期内按照其权重比例的时间,依然以时间片为术语,CFS下,进程每次运行的时间与进程的总量有关。

即使在不考虑动态补偿/惩罚的前提下,O(1)依然面临双斜率问题,为了解释这个问题,我先给出进程优先级公式:

prio=MAX_RT_PRIO+nice+20

其中,MAX_RT_PRIO为100,nice为-20到19闭区间内的任意整数。接下来时间片的计算体现了双斜率:

若是prio小于120:time_slice=20*(140-prio)

若是prio大于等于120:time_slice=5*(140-prio)可 见,只要prio肯定了,每一个进程的时间片也就肯定了,以120为分界,高优先级与低优先级的时间片计算是不一样的,之因此这样是为了:既要体现高优先级的 优点,又不过于削弱低优先级。经过O(1)的逻辑,咱们能够算出,全部进程必须完成一轮的调度,即每个进程必须有机会运行一次,所以“一轮调度”的时间 随着进程数量的增长是增长了的。

咱们如今看看CFS是怎么逆转这个结局的。CFS调度很是简单,没有太多的计算公式。依然不考虑动态补偿/惩罚,CFS彻底按照权重,Linux内核将 40个优先级映射了40个权重,为了简化讨论,我假设权重分别为1,1*1.2,1*1.2*1.2,1*1.2*1.2*1.2,....以1.2倍等 比例增长,而后定义一个固定的调度周期或以任意一段时间slice内,一个进程运行的时间就是slice*(进程权重/权重和),可见,若是进程数量增 加,全部的进程集体平滑变慢,意思是每次运行的时间减小(时间片再也不固定),所谓的“彻底公平”意味着权值大的进程其虚拟时钟步进比较慢,权值小的进程其 虚拟时钟步进比较快,CFS在每个调度点(好比时钟tick,wake up,fork等)选择虚拟时钟最小的进程运行,这是相对于O(1)来说更加平滑的一种方式,所以体现了一种延迟公平,至于吞吐,仍是按照权重来的,而权 重映射到了优先级。而O(1)更多的是吞吐公平。

总结来说,就是O(1)为每一个进程计算固定的时间片,而CFS则是在相同的时间段内计算每一个进程运行的时间比例,可见两者基点不一样,甚至是彻底相反的。

如今,咱们给出评价。CFS更加平滑,很是适合交互式进程,由于交互进程是饥饿敏感的,可是它们不常常占有CPU,然而一旦须要CPU,必须立刻让其予取 予求。对于有高吞吐需求的服务进程,CFS并不适合,这种进程的需求是一旦占据CPU,则尽量让其运行久一些,固定时间片的O(1)更加适合。按照惯常 的分类法,I/O密集型的进程多属于交互(可能还有存储类)的,这种进程由I/O驱动,应该知足其任什么时候刻的CPU需求,由于它们不会占据过久,然而对于 CPU密集型进程,获得CPU的机会应该比I/O密集应用少,由于它们一旦得到CPU,就要长期占据。总的来说,对于桌面客户端,CFS更适合,对于服务 器,O(1)更加适合。

本文没有谈及另外两种调度器,也就是Windows调度器以及Linux BFS调度器,前者基于动态优先级提高/恢复,适合桌面应用,后者基于优先级分类O(n)算法,不考虑众核和NUMA扩展,更适合移动终端。

算法

2.缺页中断的Major和Other

所 有进程的虚拟地址空间共享一个限量的物理内存,势必须要按需调页,这种作法之因此可行是由于每个时间点,CPU们只须要少许的物理页面得到映射。如今的 问题是,考虑若是出现缺页-页表项中的“存在位”为0,从哪里得到新的page。答案很简单,固然是从代价最小的地方获取page。

咱们此时必须考虑缺页时所需page的类型,大体能够分为3类:

1).彻底的地址缺页,即该地址曾经没有映射过物理页面。

2).该地址曾经映射过页面,可是被换出到交换空间了。

3).该地址曾经映射的page属于一个文件系统的文件,可是已经解除了映射。针对以上3种状况,所谓的“代价最小”拥有不一样的策略。

首先看1),这个很简单,直接从伙伴系统分配page便可,固然分配单独一个page所付出的代价至关小,由于伙伴系统之上有一个per cpu的page pool,这个pool的分配不须要任何lock。如今咱们看看这个代价小是否足够小,看来是的,可是并不绝对。对于读操做来说,假设以前有一个page 映射于该缺页虚拟地址,后来解除了映射,咱们知道此时该page的部分数据已经cache到了CPU cache line中,当再次须要读该page可是缺页时,咱们但愿得到原先的那个page,愿景是好的,但是咱们怎么追踪这个page呢?追踪这个page和缺页 进程的关系的代价是否抵消保持cache热度的收益呢?事实上,这很难,由于你要考虑到共享内存的状况,这是一个多对一的双向关系,也就是一个多对多的关 系。然而Linux的内存子系统并无什么都不作,而是它基于一种几率行为将释放到per cpu的page pool的行为分为了cold release和hot release,hot release将page添加到pool的队头,反之到队尾,而per cpu page pool的分配行为是队头分配,若是足够幸运,也许进程能够得到刚刚被解除映射的那个作过读操做的page。内核是怎么保证一个进程是足够幸运的呢?这个 很形而上但却也实用,内核采用了一个准LRU算法防止了page在进程之间颠簸,局部性保证了在进程内部一个page被访问后的一段时间内再被访问的概率 很大。

再看2),内核里面运行着一个page回收交换的守护内核线程,发现一个不常被访问要被回收的page是脏page时,内核线程并非直接启动IO将其写 入交换空间,而是暂时先将其排入一个swap cache,也就是给了一个page一次不须要IO而被再次使用的机会,作这样的策略其背后仍是局部性原理。当缺页发生时,首先会在swap cache里面寻找,若是找到就不须要进行IO了。作这个策略的现实意义是巨大的,在分级存储原理咱们能够知道,内存访问和磁盘IO的时间差了几个数量 级,因此不到必需要作,是不会刷swap cache到swap分区的。

最后咱们看3),和2)相似,可是这个涉及到了filesystem的文件page cache,由radix树组织,这个树和page回收是无关的,所谓刷掉一个属于文件的page指的是仅仅将该page解除页表项映射,实际上它彻底可 能还在文件的radix树中,在发生缺页的时候,若是在radix树中找到了该page,那么只需创建一个映射便可,无需再进行磁盘IO。

综上,咱们能够知道,只要不进行磁盘IO就尽可能不要,只要不进行磁盘IO的缺页处理就是Minor,进行了IO的则是Major,一个名称而已。现在的内核将Minor进行了细分,可是这并非重点,所以统一称为Other。

在此不得不提的是LRU算法,通常而言,几乎全部的操做系统都采用了准LRU而不是标准的LRU,这是由于标准LRU只是理论上的,实际实现起来不现实, 并非说硬件消耗巨大,更可能是由于“它的效果并不比准LRU好甚至更糟糕”,标准的LRU是一个栈式管理系统,空间局部性诚然重要,然而考虑到循环的话, 在循环边界将会面对空间局部性的对立极端,这就是列维长跳!!列维短跳是符合空间局部性的,可是列维长跳是空间局部性的对立。顺便说一句,整我的类社会的 任何行为都符合列维长跳原则,若是把量变看作列维短跳,那么质变就是列维长跳,这是根本原则,马克思说过的。

Linux内核采用双时钟二次机会算法模拟了LRU算法,效果很是好。

数据结构

3.进程地址空间的非线性映射与工做集

Linux内核采用vma来表示进程地址空间中的一段,至于这一段映射了什么vma本身管理,对上层只是提供地址空间的一段连续的虚拟内存。

通常而言,一个文件的一部分对应一个vma,若是须要映射一个文件的不一样部分,就须要不一样的vma,若是足够幸运,这几个vma能够牢牢挨在一块儿,可是在 两次映射之间,一些别的映射占据了hole,那么就很差玩了,所以须要一种针对文件“从新布局”的方式,下面的图示展现了这个想法:

ide

67f42c649af4dc37d9a3eb25ee9371b3.png

但 是仅仅针对文件作这个解释不免有点不尽兴。操做系统中有一个工做集的概念,这个概念也是依托局部性原理。工做集就是将不一样的内容映射到一个固定的虚拟地址 空间窗口,若是CPU的cache line是依据虚拟地址寻址的,那么时间空间局部性将会发挥很大的做用,在这个过程当中,TLB也会发挥做用。基于虚拟地址的工做集是虚拟地址空间和物理内 存之间的真正隔离。

本质上来说,非线性映射并不必定要针对文件,它要作的就是“将不一样的内容映射到相同的虚拟地址区段”。

布局

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于微信小程序的家政服务预约系统采用PHP语言和微信小程序技术,数据库采用Mysql,运行软件为微信开发者工具。本系统实现了管理员和客户、员工三个角色的功能。管理员的功能为客户管理、员工管理、家政服务管理、服务预约管理、员工风采管理、客户需求管理、接单管理等。客户的功能为查看家政服务进行预约和发布自己的需求以及管理预约信息和接单信息等。员工可以查看预约信息和进行接单。本系统实现了网上预约家政服务的流程化管理,可以帮助工作人员的管理工作和帮助客户查询家政服务的相关信息,改变了客户找家政服务的方式,提高了预约家政服务的效率。 本系统是针对网上预约家政服务开发的工作管理系统,包括到所有的工作内容。可以使网上预约家政服务的工作合理化和流程化。本系统包括手机端设计和电脑端设计,有界面和数据库。本系统的使用角色分为管理员和客户、员工三个身份。管理员可以管理系统里的所有信息。员工可以发布服务信息和查询客户的需求进行接单。客户可以发布需求和预约家政服务以及管理预约信息、接单信息。 本功能可以实现家政服务信息的查询和删除,管理员添加家政服务信息功能填写正确的信息就可以实现家政服务信息的添加,点击家政服务信息管理功能可以看到基于微信小程序的家政服务预约系统里所有家政服务的信息,在添加家政服务信息的界面里需要填写标题信息,当信息填写不正确就会造成家政服务信息添加失败。员工风采信息可以使客户更好的了解员工。员工风采信息管理的流程为,管理员点击员工风采信息管理功能,查看员工风采信息,点击员工风采信息添加功能,输入员工风采信息然后点击提交按钮就可以完成员工风采信息的添加。客户需求信息关系着客户的家政服务预约,管理员可以查询和修改客户需求信息,还可以查看客户需求的添加时间。接单信息属于本系统里的核心数据,管理员可以对接单的信息进行查询。本功能设计的目的可以使家政服务进行及时的安排。管理员可以查询员工信息,可以进行修改删除。 客户可以查看自己的预约和修改自己的资料并发布需求以及管理接单信息等。 在首页里可以看到管理员添加和管理的信息,客户可以在首页里进行家政服务的预约和公司介绍信息的了解。 员工可以查询客户需求进行接单以及管理家政服务信息和留言信息、收藏信息等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值