欢迎各位兄弟 发布技术文章
这里的技术是共享的
OS:操作系统本身就是一个虚拟机
cpu:三大核心部件:运算器,控制器,寄存器
运算器: 算术运算,逻辑运算,等
控制器: 控制指令数据的存取过程
寄存器 registers:数据只能在本地运算,要给数据一个暂存位置,中间数据也得暂存一下,,,暂存很短时间,这个空间被不断的刷新,,,并非核心存储部件,,,要具备锁存??????数据的能力,它的构造结构要比外部的RAM(内存)要复杂得多,RAM没有锁存的能力
内存RAM:通常8位(一个字节)一个单元,叫做cell
如下图,
cpu要有对内存寻址的能力(按地址存取的能力),ram中的每一个cell都有自己的存储地址,每一个cell都有唯一的地址来标识,cpu与内存交互要通过North Bridge,这是早期的经典方式,,,,,,32位,就好像cpu上出来32根线,2^32次方,4GB,最多4G个存储单元,,,,64位, 4G*4GB,但是红帽上通常cpu64位支持1T(还是2T)的内存,,,三种电路:寻址电路,数据电路,指令电路,,,cpu的线路是可以复用的,32个线路,用标识来说明当前这32个电路如何使用的,比如00表示寻址,01表示数据,10表示指令,
PAE:( Physical Address Extension ) 物理地址扩展,,,32bit寻址总线上加上4bit,,,32G*2^4=64G,要求操作系统内核得能额外的4bit的寻址能力,比如红帽5没有额外的4bit的寻址能力,不支持64G的内存,,,,内存多于4G时,直接上64位系统吧,,,除非cpu只有32位的体系结构,,,,,,,只要操作系统是32位的,无论内存多大,单个进程不会超过3G,,(剩下的1G给内核),,只是多个进程能使用更大的空间了,,,,,单进程(多线程)的mysql服务,再大的内存也没有意义,,mysql在32位平台上最多使用2.7G内存
cpu寄存器与cpu时钟频率几乎同步, 可以跟cpu一样的速度完成数据的存取,,,内存(比如1333,1666之类)比cpu的时钟频率慢得多,更何况cpu本身是多核的,所以它的存取频率比RAM快得多,
程序具有局部性?????是缓存机制有意义的前提,,,,缓存比原始存储要小得多,速度比原始存储(主存,内存)要快,造价要高
如下图,
cpu,先从缓存中读,若缓存中没有,就从内存中读进缓存,内存中数据有热区,二八法则,热区数据保存到缓存中来,若缓存中数据已满,则可以使用某种置换策略(比如LRU,最近最少使用 ,,,MRU,最近最常使用算法,算法更好,但需要依赖额外的标记位,才能完成缓存置换的),,,(LRU与MRU两种算法刚好相反)
空间局部性:把内存中的周边数据也加载进来,,(如果周边数据命中率达到40%,都是可取的)
时间局部性:一段数据已被访问一次,很可能再被访问一次,
依照这两个缓存原理(空间局部性,时间局部性),开发的程序,性能会好很多,
如下图
有一级缓存,二级缓存,三级缓存,
寄存器比一级缓存快
一级缓存,分为指令缓存,数据缓存,离cpu最近,速度最快,,,空间小,只有多少多少K, 通常64K,32K
二级缓存,不区分为指令缓存,数据缓存, 造价比一级缓存便宜,所以可以大些
三级缓存,不区分为指令缓存,数据缓存,离cpu最远,速度最慢,造价比二级缓存便宜,所以可以更大些
三级缓存比RAM快
每颗cpu都有自己独有的一级缓存,二级缓存
三级缓存通常是cpu共享的
ram是要不停的充电的,是需要按某种频率不停的刷新的
cpu缓存造价高,离cpu越近,造价越高,cpu缓存使用sram(静态ram的技术,不需要不停的刷写,电路原器件比ram复杂得多,代价高,性能快)
cpu价格不光在主频上,还在缓存空间上,比如二级缓存2M的cpu比1M的价格翻一位,,,
cpu直接操作的数据一定是源于一级缓存,一级缓存中没有,就到二级缓存中找,替换一级缓存中的内容,,,同理二级缓存中没有,就到三级缓存,三级缓存没有,就到ram,
如下图
一级缓存(几十K)比内存(比如8G内存即使热区20%是1.6G),也小太多,缓存命中率极低,
直接映射:RAM中任一个存储单元,都可以存在(一级)缓存中的任一个位置,缓存命中率极低,
如下图,
N路关联:
内存分4区域,一级缓存分4区域,分别对应缓存?????事实上不是一一对应的,缓存有一个个的存储槽,不是8位一个单元,很可能多少K(或者512字节,或64个字节)一个单元(因为缓存涉到的键,值,hash什么的)
如下图
N路:常见,一路,二路,四路,八路
一路关联:就是内存中的4个蓝色只能缓存在缓存的第一路蓝色中,
二路关联:就是内存中的4个蓝色只能缓存在缓存的第一路和第二路蓝色中,
八路关联,也称为完全关联,,,整个缓存一共只有8路????? 也有16路的,但通常最大是8路
事实上,图中的内存中的蓝色不一定是一个单独的存储单元 (也就是 不一定是8位的一个字节)
内存的组织结构与缓存略有不同,
几路关联,路越小,越有可能被清除出去,命中率低
路越多,则需要的缓存空间越大,
如下图
基于N路关联技术,大大提高了缓存的命中率,同时保证了缓存不会被置换得过于频繁
寄存器是用来暂存数据的
有了缓存后,cpu不会到内存中找,而是直接到一级缓存中找,,一级没有,从二级置换到一级缓存中来,如果二级再没有逐级置换
从内存,到三级,再到二级,再到一级,,,cpu通常只跟一级缓存打交道
cpu更新了一级缓存,二级,三级,内存(主存),硬盘要同时更新吗?如果更新,则内存比cpu慢很多,,,如果不更新,万一停电,数据丢失
通写策略:更新了一级缓存,二级,三级,内存(主存)同时更新,,,write through
回写策略:更新了一级缓存,不立即更新其它缓存及内存(主存)当一级缓存中数据需要被丢弃时,才同步更新到其它缓存及主存,,,,write back
回写性能更高,现在几乎都是回写
如下图
如下图
cpu与内存交换数据,要通过北桥芯片,北桥芯片性能要很好,
cpu不通过北桥,直接与内存交互,性能会更好,管理机制更麻烦
马哥讲解是通过北桥芯片的例子来讲原理
显卡,需要cpu大量交互数据,既要在硬件上加速,还需要cpu渲染,显存带宽(与北桥芯片,cpu交互的通路),,,,,,交互的数据需要一帧一帧的显示出来,用显存来缓存显示的数据,若没有显存,需要用到内存来缓存,
显卡直接接到北桥,因为它也是高速总线,数据交互量大,
现在cpu核心中内置显示芯片(图形处理芯片),被称为GPU,,,, 独立显卡性能肯定会好点的,分担了cpu的工作
显卡是外部设备,显卡总线是一种IO,,,,,
如下图
IO分为高速IO和低速IO
高速IO: PCI阶槽的IO,,,,,,现在又有PCI-E,,,,PCI通常接到南桥?????,PCI-E接到北桥,,,,PCI-E比PCI速度快许多
低速IO:
南桥:是把慢速总线的IO汇总起来一并接入北桥,
南桥:桥接芯片就是汇总外部的IO设备的总线数据最终完成跟我们的CPU进行交互,
South Bridge,通常接的是ISA总线,通常8位,16位,E-ISA,32位总线,,,,,,,,,,,,,
早期的PCI是接到南桥上的,现在PCI有些接到北桥上了,,,,但是接的方式不一样,所以性能仍然不一样的????,
PCI: 是Peripheral Component Interconnect(外设部件互连标准)的缩写
scsi,ide,sata,usb的总线都是PCI格式的,速度有限
键盘鼠标都是串形线路,一个字符,一个字符的输入的,速度更慢,
如下图,
u盘插入usb总线上,要跟cpu交互,得经过这些南桥,北桥芯片,,,,,如果u盘做成pci-e接口,n个并行的u盘当作一个u盘,由北桥接入cpu,速度会快很多,,,支持内部并行读写的u盘叫固态硬盘,,,,,,
但是固态硬盘接到sata口,性能仍然很差,,,,很多固态硬盘,仍然是sata口,马哥建议买pci-e口,
TCP协议靠套接字来区分不同的进程
这么多设备通过同样的总线过来,cpu怎么知道是哪个设备,,,cpu发信号怎么知道发的信号是到哪个设备上 (靠IO Port来区分,端口也是65535个,),任意一个外部设备在开机的时候都要申请一批连续的IO Port(总线比较宽,比如硬盘有10位总线,就要得10个IO Port),,,任意一个外部设备,开机加电,BIOS芯片的完成自检的时候,每一个硬件都要向cpu注册申请使用整个IO端口上的一批连续的端口,,,每一次开机时,同一个设备可能IO Port不一样,是由各个设备先后注册的顺序决定的,,,,,,,硬件设备是通过连续的IO Port 与 cpu交互的,,,,,,,,不同的设备仍然是用同一个总线(应该是南桥总线吧?????还是北桥总线和南桥总线??????)与cpu交互,,,,到cpu的总线是复用的,只不过到某些设备的芯片上总线就隔开了,,,每一个设备的电路与cpu电路不一致,所以各个设备都有控制器或适配器(比如sata口就是一个stat控制器), 能够把这个设备所能够理解的信号转换为可以在计算机的总线上通信的信号,(是个翻译官,也是个控制器,),能够控制信号的速率,检验等额外的功能,,,驱动就是驱动控制器或适配器的芯片,指挥着硬件设备工作的
有些设备没有控制器或适配器,比如视频采集卡,一般的pc没有标配,可以通过PCI的空闲槽,可以接在这儿,阶适配器????这是PCI槽的意义,PCI槽本身不是适配器,只是给控制器或适配器连接我们的总线提供了预留的空间,,这些预留空间也占用IO端口(IO Port),,只不过没有装额外设备,可能不会注册使用,
如下图,
外部IO设备有好多个,比如网卡上来了个ping信号,cpu得响应,(不响应,信号就没了),cpu得把信号数据,通过总线读进内存,
(数据先由外设到内存,再到cpu缓存,被cpu处理控制的),,cpu怎么知道来了信号,(去饭店吃饭,出去一会,怎么知道饭做好?轮询,叫拉取吧,pull机制,那么多外设,轮询的话,就太消耗cpu,,,,通知,类似于事件,但与事件驱动是两码事,此时cpu不需要关心外设,外设来了信号后,负责通知给cpu)(IO port是为了实现cpu与外设数据交互的,而不是通知信号交互的),,,,每一个外设芯片还要向cpu注册一个通知信号线路,这个功能不需要cpu来完成,cpu有个外置芯片,叫中断控制器(中断控制信号,cpu接受到ping信号后,中断当前做的事情,把ping信号接受进来放到ram当中去,,,,,这个过程就叫做中断的过程),,每一个硬件设置还要向中断控制器提供是哪一个硬件设置提供中断信号的,,,中断控制器上有中断线(中断通路,中断的连接),,假如每一个通路可以连接一个硬件设备(事实上是复用的),,,每一个中断线上可以接n个设备,这些设备之间可以通过一个中断线来区别的???????硬件所发送的中断信号,通常称为中断向量,,,,,,,,每一个硬件设备在启动的时候,必须要向中断控制器(可编程中断控制器来申请注册使用一个中断向量,即有地址的通知机制),,一旦注册使用以后,中断控制器接受到一个中断信号以后,它能够自己告诉cpu,现在是哪一个设备发起了中断请求,于是cpu就通过那个设备对应的IO Port,跟那个设备进行了交互
这些中断控制器都是可编程的,称为可编程中断控制器,
如下图,
cpu受到中断信号后,把数据接进来,这是紧急的,但是处理这个数据的需求并不紧急,只要把数据加载进内存,就行了,cpu还做刚才做的事情,这个类似于上下文切换,进程切换(但是这是硬件切换),,,,操作系统内部,把中断的处理过程分为中断的上半部和中断的下半部,中断的处理上半部,就是把中断信号接受到后的相关数据读进内存,,,,,中断的处理下半部,就是处理这些与中断处理相关的在内存中的数据...
如下图
ram慢,硬盘慢,cpu接进来一个数据等半天,再等半天接一个数据,,,cpu可以让其它人把数据接进来,但是把数据接进来的话,是会占据总线的,cpu有可能会被架空,,,,所以cpu需要授权给其它人,其它人才能占据总线资源,,,万一cpu和其它人争用总线资源了,,,,,资源竞争,只要有竞争,就要用锁机制,,,,,,,,,一个机算机,如果多cpu,指挥做相反的事情,怎么办??? 任何有可能发生资源竞争的地方,称为临界区(关键性区域)
如下图
假如要加载一片硬盘数据到内存,假如这个文件是15M,内存要15M空间存数据,cpu就是把这15M数据经由总线弄到内存,,,cpu做这个,很烦琐,cpu还有其它事要做,,,cpu在内存在划分15M的空间,将南桥总线,北桥总线的权限授权给DMA, 由DMA加载15M到内存,DMA(DMA: 直接内存访问 DMA全称为Direct Memory Access),,,cpu要想访问每个内存的空间,要有整个内存的寻址能力,要有32位总线(假设32位的cpu),,,DMA的总线非常窄的,,,,DMA很可能只能寻址一小片非常小的连续的内存空间.....物理内存中,通常最底层那段dd值????的空间,最容易寻址的空间,起始地址部分是预留出来给DMA使用的,一般是16M,在16M下面还有1M左右也是预留的,是给BIOS使用的,,,,,,我们指的cpu的寻址空间是线性地址空间,不是物理空间,马哥没加区别的讲解,,,,,计算机开机以后,加上电之后不会做任何事,只有在程序的指挥下才能做事,cpu只有运行指令后,才能有智能,指令在硬盘上,cpu不知道硬盘在哪里,所以不能加载硬盘的指令到内存,也不能运行内存中的指令,,,,所以计算机有自举的过程,一开机以后,直接把硬盘上的cmos的rom芯片(里面有bois的程序设定,)把bois的程序映射到内存的最底层处(事实上是线性地址空间的最起始处的那1M),,,系统一开机,cpu(生产厂商都已经制造好了的)一开机后,啥也不干,直接加载这1M空间里面的指令,所以说程序有个自举的过程,能够完成让cpu去加载某个地址空间中的最开始处的某个指令空间,,,,把这个指令一加载,cpu接下来可以执行某些操作了,(bios中是无法完成硬件的健康状况检查,接下来就是以前讲的启动过程),,,,接下来的16M预留下给DMA使用,DMA负责帮忙加载到这个空间里面,cpu要用的话,从这个16M加载,或者指挥着把这16M的数据移到内存的其它地方,为后来的DMA预留出来可用空间,,,,所以这叫直接内存访问,,,,,DMA的工作就是指挥把数据从硬盘到内存的那16M的空间,加载完后,DMA要向cpu发起中断,告知cpu,事情做好了,,,然后cpu收回相应的总线的使用和控制权
如下图
一个cpu某一时间只能运行一个程序,假如多个cpu要同时运行多个程序,,,cpu处理速度比IO要快得多,加载很耗时,cpu不用等待,加载这个,同时运行那个,,,,cpu及各种内存,缓存,外设,速度不一样,如何同步工作,,,,cpu走一圈,内存才走1%,内存转了一圈,cpu转100圈,浪费了99圈,(频率,单位时间周期内转的圈数),,,cpu要有某种机制,让外设,内存,cpu等步调一致,,,,,,
cpu内部有时间产生器(晶体震荡器),产生时钟脉冲,一高一低的脉冲,,,cpu的时钟脉冲为基准脉冲,内存走得慢,所以cpu白转多少圈,读一次内存,(电平信号产生时钟周期,晶体震荡器震荡出来产生高低不同的电信号,高电平,低电平的信号)(从高电平到低电平,或从低到高,是有时间的,所以是斜的)(cpu和内存切换交互时,是在时钟周期的上升沿进行的)(我们很多指令或动作的采取都是在上升沿或下降沿完成的??????????)
如下图
假如只有一颗cpu,不可能并行运行程序,某个时间点,只能运行一个程序,,,,有个monitor监控程序负责从外设加载进内存,然后从内存交给cpu运行,,cpu运行返回后交给内存,,,再加载外设另外一个程序到内存,,再然后从内存交给cpu运行,,再cpu运行返回后交给内存,,,
Monitor
发展到最后就是OS(操作系统)了,再后来OS把整个机器抽象出来,做成 VM(虚拟机)了,,
所有的进程运行都向OS申请资源,所有的进程不能直接跟硬件打交道了(为了避免任何一个进程独占某资源)
程序的局部性,一个程序可能只有一部分运行????????这个运行(执行)起来的实体叫进程(Process)
Process是一个独立的运行单位,这个运行单位本身没法直接到硬件上去运行,由Monitor来决定调度运行,Process的运行需要系统资源(CPU时间,存储空间(内存,主存)),,,,,,多个进程怎么分配运行?
OS:VM ,OS其实也叫VM,,,,,,CPU虚拟成多个,拆分cpu的运算能力,把时间切片,,,
如下图,10G的时间频率,虚拟成10个1G的( 事实上一般不是平均分配的),让一个进程使用一个虚拟cpu,
cpu有几级缓存,,缓存当前程序中的数据,可能另一个虚拟的cpu运行另一个进程,把缓存中的数据清掉,(如果是回写机制,在清出去之前,是往主存中同步的)
一个进程由一批指令组成,,进程未运行完,但是时间走完了,共100条指令,已运行完73条,下次就从74条开始了,74(下一条指令的位置)保存在寄存器中????(指令计数器) ,,,,,马哥又说保存在内存中?????
进程切换:保存现场,,恢复现场,,,,所以进程切换有开销
缓存无所谓,丢失了,可以重新加载,,,但是寄存器中的状态数据一定是要恢复的
内存,,对于某一进程未使用的就是总内存减去已使用的,,,,但其它进程呢???我们不能让进程直接使用内存,,,内存如何虚拟,让多个进程同时使用,大家还不相互影响,占用,我们可以内存切片
如下图
内存切片,按空间切片,先留一部分给内核,然后分别给进程1,进程2,进程3,..............进程随时启动,随时终止,所以内存中到处是漏洞,,,更何况,某进程的空间不够用了?怎么办,后后扩?会覆盖其它进程的空间,,,,,,所以要引入内存保护,意味着,分给多少空间,只能使用多少空间,,,,,不够用了,咋办?(32位系统,cpu认为自己有4G,程序员不知道有多少空间可用,,),,,,,,,这种直接切割内存空间不合适,跟cpu的寻址空间能力所表现出来的这种地址使用能力不相符合,,,,,,,,,,
如下图
将内存按固定大小的单元划好,(马哥只是让我们理解,并不是所有的内存都这样划的),,不以字节为单位,以4K为一个单元,叫存储槽,叫页框,每个槽,能够存储的数据叫页面(page),每个页面存储的空间叫页框(page frame),,,我们加个映射的机制,每个进程认为自己有4G的空间,,,,比ls命令,可能只用了几k,但是它可以有4G可用,,,,进程空间分为指令区(代码区),数据区,bss段????,堆区和栈,,中间的这一段是空闲的,假设某一进程指令区1page,数据区1page,堆区2page,栈区1page,共5个page,,,与真正的内存建立映射关系,,,,另一进程同理,,,,
进程内存空间描述结构,虚拟的,这个是内核中的,由内核在内存中负责维护的,,,,事实上进程的数据是在物理内存当中,进程的数据在物理内存中是不规整的,不连续的,,,,,虚拟地址,也叫线性地址,,,,,并不是完全一一对应的,cpu从线性地址中找数据,线性地址要被翻译成物理地址,才能真正找到数据
如下图
,,,,中间的这个芯片找线性地址与物理地址的映射关系,如何快速找?索引,没有hash,也很慢,用索引不理想,,,,,,所以可以划分目录,一级目录,二级目录,三级目录,(目录是映射,不是容器),,,这就是页目录,,,用来方便查找线性地址到物理地址的逻辑关系的
内存: 线性地址 <<-->>物理地址 空间映射
映射的芯片还具有内存保护的能力,翻译过程中 若发现,不允许某进程访问某空间,就访问不了了,免得多进程之间覆盖地址使用的
外设IO设备也可以虚拟的,只有一个进程的话,IO就不需要虚拟了,哪个进程获得cpu的使用权,cpu一中断,IO设备就给哪个进程了,,,,,
如果在当前机器上使用了虚拟机,每个虚拟机有自己独立的操作系统,本来虚拟化了cpu,让各个进程运行了,现在某个进程运行虚拟机,这个进程上是不是也要进行cpu的切片?也要进行自己的cpu中断等各种管理,,,本来cpu就是虚拟的,虚拟机内部进程切换的时候,外面的电脑并不认为进程切换了,,,,虚拟机的cpu的cpu时间本就不是完整的时间,但是它认为自己就是完整的时间,,,,
X86的机器设计就是用来运行一个操作系统的,不能用来运行虚拟机,,,,,,后来cpu支持硬件虚拟化,它还能够在os虚拟化的基础上再虚拟一层,,,,,,,,,,,,
本来在进程的层次上,我们的资源己经被虚拟过一次了
在进程的层次上,I/O虚拟不需要专门去做,因为谁(哪个进程)获到当前焦点,谁(哪个进程)就获得IO
I/O是硬件控制,真正只有内核才能控制硬件,由内核转给进程
如下图
要么内核在cpu上运行,叫内核模式,占据的内存空间,叫内核空间
要么进程在cpu上运行,叫用户模式,占据的内存空间,叫用户空间
如下图
X86架构中,
cpu权限分为四层环,环0,环1,环2,环3
环0是最内层的最核心的特权指令,内核模式,特权指令模式,内核可以运行在环0上
环1,环2,没有用
环3是最外层的,用户模式,进程只能运行在环3模式上,
如下图
假设虚拟机情况下,虚拟机也有内核,它只是一个用户进程,所以不能运行在环0上,运行在环3上,又不能操作硬件,
只能让虚拟机运行在限制模式下??????,,,,,或者给虚拟机模拟(仿真)出一层硬件,,,,在真正的内核基础上,通过软件模拟的方式,让虚拟机操作系统看来这是一个真正的硬件,cpu,内存,外设都有,虚拟机只是运行在软件的基础上,,,,当虚拟机用到特权指令的时候,由真正的操作系统的内核翻译到真正的硬件上的,,,,,虚拟机以为自己用到环0上,事实上运行在环3上?????,,,,,,这种虚拟化,叫完全虚拟化,,,,,,
虚拟机也能执行特权指令,但是执行之前要经过真正的内核审核的????虚拟机需要真正的内核翻译,才能操作硬件,
1)完全虚拟化,,虚拟机执行的任何一个指令都得由真正的内核来翻译了,,,虚拟机执行的指令用软件来模拟,还得经过真正的内核翻译一遍,再去执行,速度会慢,是正式运行的60%-70%左右,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2)硬件虚拟化,虚拟机有些指令直接运行在环0上,性能会好很多,给cpu再加个环-1,,,-1上让真正的内核运行,虚拟机运行在环0上,环0上的特权都被抽走了,最特权的东西,,还得虚拟机向真正的内核(就是虚拟机管理程序)申请,,,,虚拟机认为自己直接运行在硬件上,不需要通过完全的软件模拟来实现,,,,性能会好很多,但是,也能够让它不运行特权指令了,,,,所谓的硬件虚拟化就是提供了环-1,,,,,不是做研究的,不必理解得太深,,,有了环-1, 还得有其它许多机制
如下图
假如一个进程,需要访问资源,资源在内存里,线性地址到物理地址映射的,,,,,,,程序运行具有局部性,刚开始可能只加载一部分数据,假如程序在运行中间需要加载一个文件,从硬盘(辅存)加载,需要特权指令,用户进程没有权限,所以进行系统调用(向内核发起),此时用户进程退出cpu,内核到cpu上运行,由内核把数据装载进物理内存,然后映射到进程的地址空间,一旦映射完成了,进程就能够访问物理内存中的数据了,(数据是先到内核的物理内存空间,再到进程的物理内存空间,,到了进程的物理内存空间,则线性地址与物理内存地址的映射关系就建立起来了),于是内核退出cpu,内核唤醒进程进驻cpu, 进程执行后续的工作,,,,,由于是多进程,所以内核退出cpu后,不一定是这个进程直接占据cpu,因为进程有好多呢,进程要重新排队,,,,,,,这么多进程,要选一个来运行,就是进程队列,哪一个进程来运行?(准备好了的进程?就是所需要的资源如打开文件都在内存中准备好了.Ready状态,就绪状态)(如果进程没Ready状态的话,就是Sleeping状态,睡眠状态)(Sleeping 分为可打断的,(即可以立即随时唤醒的,一个阶段的活已经结束了,下个阶段的活还没来????),不可打断的(比如数据加载中的状态,要获取的资源还未完全获取到))
如下图
我们要想让进程公平的运行在cpu上,按一定的方法轮流在cpu上运行,,, 但是有些事件是紧急的,进程有优先级,调度的优先性和长期使用cpu的能力,,, 我们需要一个设计精良的算法,,,,,,队长越长,挑某个进程的时间越长,此算法差,,,队长越长,挑某个进程的时间差不多,这个O(1)算法,此算法好,,,内核调度进程的算法也需要用时间复杂度来衡量的,,,2.6及以后的算法都是O(1)的