管理计算机硬件与软件资源的程序,是计算机系统的内核与基石html
本质上是运行在计算机上的软件程序java
为用户提供一个与系统交互的操做界面算法
分为内核与外壳,其中内核是能操做硬件的程序,而外壳则是围绕着内核的应用程序数组
根据系统资源分配资源所规定的资源分配算法缓存
FCFS调度算法每次从就绪队列中选择最早进入该队列的进程,将处理机分配给它,使之投入运行,直到完成或因某种缘由而阻塞时才释放处理机。数据结构
不可剥夺算法。对长做业有利,对短做业不利。有利于CPU繁忙型做业,不利于I/O繁忙型做业socket
适用于分时系统函数
系统将全部就绪进程按到达时间的前后次序排成一个队列,进程调度程序老是选择就绪队列中第一个进程执行,即先来先服务的原则,但仅能运行一个时间片,如100ms。在使用完一个时间片后,即便进程并未完成其运行,它也必须释放出(被剥夺)处理机给下一个就绪的进程,而被剥夺的进程返回到就绪队列的末尾从新排队,等候再次运行。性能
时间片的大小对系统性能影响很大。若是时间片太短,则处理机在进程间过于频繁切换,处理机的开销增大;若过长,则退化为先来先服务算法this
从就绪队列中选择一个估计运行时间最短的进程,将处理机分配给它,使之当即执行,直到完成或发生某事件而阻塞时,才释放处理机。
非抢占策略。可是长做业不利,不能保证紧迫性做业(进程)被及时处理,做业的长短只是被估算出来的。
平均等待时间、平均周转时间最少
增长抢占机制,进程调度老是选择预期剩余时间最短的进程
当一个进程加入到就绪队列时,他可能比当前运行的进程具备更短的剩余时间,所以只要新进程就绪,调度程序就能可能抢占当前正在运行的进程。
主要用于做业调度。
R=(w+s)/s (R为响应比,w为等待处理的时间,s为预计的服务时间)
当前进程完成或被阻塞时,选择R值最大的就绪进程,它说明了进程的年龄。当偏向短做业时,长进程因为得不到服务,等待时间不断增长,从而增长比值,最终在竞争中赢了短进程。
优先级用于描述做业运行的紧迫程度
在进程调度中,优先级调度算法每次从就绪队列中选择优先级最高的进程,将处理机分配给它,使之投入运行。
可分为非剥夺式优先级调度算法&剥夺式优先级调度算法
可分为静态优先级(肯定优先级的依据有进程类型、进程对资源的要求、用户要求。)和动态优先级(肯定依据为进程占有CPU时间的长短、就绪进程等待CPU时间的长短。)(根据建立后优先级是否能够改变)
没必要事先知道各进程所须要执行的时间
实现思路:
设置多个就绪队列,并为每一个队列赋予不一样的优先级
赋予各个队列中进程执行时间片的大小也各不相同,优先级越高的队列中,各进程的运行时间片就越小。
每一个队列都采用先来先服务算法。当一个新进程进入内存后,首先将它放入第1级队列的末尾,按先来先服务原则排队等待调度。当轮到该进程执行时,如它能在该时间片内完成,即可准备撤离系统;若是它在一个时间片结束时还没有完成,调度程序便将该进程转入第2级队列的末尾,再一样地按FCFS 原则等待调度执行……如此下去,当一个长进程从第1级队列依次降到第 n 级队列后,在第 n 级队列中便釆用时间片轮转的方式运行。
按队列优先级调度。仅当第1级队列为空时,调度程序才调度第2级队列中的进程运行;若优先级低队列执行中有优先级高队列进程执行,应马上将此进程放入队列末尾,把处理机分配给新到高优先级进程。
因为有时候进程 发送 对磁盘进行读/写操做的请求 的速度 比 磁盘响应 的还要快,所以为每一个磁盘设备创建一个等待队列
它根据进程请求访问磁盘的前后次序进行调度。每一个进程的请求都能依次获得处理
选择 要求访问的磁道与当前磁头所在的磁道距离最近 的进程,使得每次的寻道时间最短,算法有比较好的吞吐量,但不能保证平均寻道时间最短。
缺点在于对用户的服务请求的响应机会并不均等,所以致使响应时间的变化幅度很大。
除了考虑欲访问的磁道与当前磁道的距离,更优先考虑的是磁头的当前移动方向。
当磁头正在自里向外移动时,扫描算法所选择的的下一个访问对象应是其欲访问的磁道既在当前磁道以外,又是距离最近的。这样自里向外地访问,直到再无更外的磁道须要访问才将磁臂换向,自外向里移动。
吞吐量较大,平均响应时间较小,但因为是摆动式的扫描方法,两侧磁道被访问的频率仍低于中间磁道。
若是对磁道的访问请求是均匀分布的,当磁头到达磁盘的一端,并反向运动时落在磁头以后的访问请求相对较少。
所以规定磁头单向移动。如只自里向外移动,当磁头移到最外的被访问磁道时,磁头当即返回到最里的欲访磁道,即将最小磁道号紧接着最大磁道号构成循环,进行扫描。
匿名管道:如netstat -tulnp | grep 8080,其中'|'就是管道的意思,即把前一条命令的输出做为后一条命令的输入(单向,要互相通讯须要建立两个管道)。
命名管道:如mkfifo test,即建立一个名字为test的命名管道;echo "this is a pipe" > test,即用一个进程向这个管道里面写数据;cat < test,另外一个进程把test里面的内容读出来,此时前一条命令才会结束。
管道的通知机制相似于缓存,就像一个进程把数据放在某个缓存区域,而后等着另一个进程去拿,而且是管道是单向传输的。
改进管道,把进程的数据放在某个内存以后就立刻让进程返回,无需等着另外一个进程去读取。
例如a进程要给b进程发送消息,只须要把消息放在对应的消息队列里就好了,b进程须要的时候再去对应的消息队列里取出来。同理,b进程要给a进程发送消息也同样。
缺点在于当a进程发送的数据占内存大,且两个进程通讯频繁时,发送消息(拷贝)这个过程须要花不少时间读内存。
解决拷贝所消耗的时间
让两个进程各自拿出一块虚拟地址空间来(则虚拟地址独立),而后映射到相同的物理内存中。因为系统加载一个进程时,分配给进程的内存是虚拟内存空间
缺点在于存在多进程竞争内存
本质是一个计数器,用来实现进程之间的互斥与同步。
如信号量的初始值是 1,而后 a 进程来访问内存1的时候,就把信号量的值设为 0,而后进程b 也要来访问内存1的时候,看到信号量的值为 0 就知道已经有进程在访问内存1了,这个时候进程 b 就会访问不了内存1。
以上都是多个进程在一台主机之间的通讯,socket实现物理距离很远的主机上的进程进行通讯。
选择合适的页面调度算法
由于运行的程度太多,形成程序没法同时将全部频繁访问的页面调入内存,则要下降多道程序的数量
终止该进程或者增长物理内存容量
空间上:内存中被访问的页的周围页也可能被访问
时间上:最近被访问的页在不久的未来也可能被访问
协程(Coroutines)是一种比线程更加轻量级的存在,正如一个进程能够拥有多个线程同样,一个线程能够拥有多个协程。
协程不是被操做系统内核所管理的,而是彻底由程序所控制,也就是在用户态执行。这样带来的好处是性能大幅度的提高,由于不会像线程切换那样消耗资源。
进程与线程见:http://www.javashuo.com/article/p-rnypdfez-a.html
一个java程序运行时,程序通常会在内存中开辟一些空间供运行
栈空间通常线程独享,存放一些简单的基本类型byte、short、int、long、float、double、char、boolean),以及方法,对象的地址等
堆空间的内容全局共享,存放大部分的引用类型和数据(堆内存用来存放由new建立的对象和数组)。比栈内存大得多
堆主要用来存放对象,栈主要用来执行程序
堆是应用程序在运行的时候请求操做系统分配给本身内存,因为从操做系统管理的内存分配,因此在分配和销毁时都要占用时间,所以用堆。
栈的优点是存取速度比堆要快,仅次于寄存器,栈数据能够共享。缺点是存在栈中的数据大小与生存期必须是缺点的,缺乏灵活性。
虚拟内存
虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续可用的内存(一个连续完整的地址空间),而实际上,它一般是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在须要时进行数据交换。
使用空分复用技术,进程使用虚拟内存中的地址,由操做系统协助相关硬件,把它“转换”成真正的物理地址。
结构:
用户须要调用函数时,通常都会生成一个称为栈帧的结构,从而致使虚拟内存中的栈空间增加。
用户须要单独申请内存空间时,就会从堆空间分配,从而致使虚拟内存中的堆空间增加。
分页与分段
段是信息的逻辑单位,根据用户的需求划分,所以段对用户是可见的。且段的大小不固定,由所完成的功能决定;向用户提供二维地址空间;便于存储保护以及信息的共享
页则是信息的物理单位,为了方便管理主存而划分,对用户是透明的。所以页的大小固定,由系统决定;向用户提供一维地址空间;
分页系统地址映射
将主存空间和辅存空间分别等分为大小相等的若干页,而且为每一个页按顺序指定一个页号。
当程序运行时,以“页”为单位进行地址映射,即操做系统以页为单位把逻辑页从辅存调入主存,存放在物理页面上,供CPU执行。在分页存储管理机制中,把逻辑页对应的逻辑地址称为线性地址。
CPU访问某页时,首先要查找页表,判断要访问的页是否在主存,若在主存则命中,不然未命中。而后将未命中的页按某种调度算法由辅存调入主存,并根据逻辑页号和存放的物理页面号的对应关系,将线性地址转换为物理地址。
物理地址=页的大小*页面号+页内地址
内存置换算法
最佳置换算法OPT(理论算法)
将再也不使用的页面换出,而实际中不能预知哪一个页面再也不使用,可是这个算法是最优算法,能够做为评测其余算法的性能。
FIFO
按照页面装进内存的时间进行置换,越老的页面最早被换出,无论该页面是否常用,这样就有可能致使缺页率增长,致使页面置换次数增长。
最少使用页面置换算法
按照上次使用时间进行排序,将离上次使用时间最长的页面换出,能够采用栈的数据结构,每次页面被访问将该页面号放在栈顶。
最近未使用页面置换算法
设置引用位R,每次调用将R=1,系统每隔一段时间将R=0,当进行置换式检查哪一个页面R=0说明近期不会再使用,能够将其换出。
时钟页面置换算法
设置引用位R,R=1表示被引用过。根据装入内存时间和是否被引用过做为标准,首先从时间最长项检查,若R=0则置换出,若为1则检查下一项并将R=0。若所有R=1,则按照FIFO方法进行置换。