1、进程和线程的区别
进程的定义:进程是一段程序作用于某个数据集上的一次运行。
引入进程的目的:为了使多个程序能够并发执行,以提高资源利用率和系统吞吐量。
线程的定义:线程是一段程序片段作用于某个数据集上的一次运行。
引入线程的目的:减少进程在并发时付出的时空开销,进一步提高OS的并发性,从而提高资源利用率和系统吞吐量。
注意:
(1)在没有引入线程的操作系统中,进程是资源分配、独立调度和分配的基本单位。
(2)在引入线程的操作系统中,进程是资源分配的基本单位,线程是调度和分派的基本单位。
进程和线程的区别:
(1)从属关系:
一个线程只属于一个进程,但是进程可以拥有多个线程,且至少拥有一个线程
(2)从资源上看:
<1> 无论是传统的还是现在的OS系统中,进程拥有资源,都是资源分配的基本单位。
<2> 线程不拥有系统资源,而仅仅包含一点能够支撑自己运行的资源,使得线程能够轻装上阵,从而显著提高系统的并发性。
注意,线程虽不包含系统资源,但是它可以访问它所隶属进程的资源。
(3)并发性:
<1> 在传统的OS中,仅仅是进程之间可以并发。
<2> 在引入线程后,不仅进程之间可以并发,属于一个进程的多个线程也可以并发,使得OS有较好的并发性,从而提高资源利用率和系统吞吐量。
(4)系统开销:进程在创建、销毁、切换、通信、同步代价都比较大。
<1> 在创建和撤销进程时,OS需要创建和回收进程控制块,分配和回收资源,OS付出的代价比较大。线程仅仅需要创建和回收线程控制块。
<2> 在进程进行切换时,OS需要保存当前环境以及新被调度进程的环境,而线程仅仅需要保存和设置少量寄存器即可。除此之外属于同一个进程的线程相互切换时不会引起线程的切换,但是属于不同进程的线程相互切换时,会引起进程切换。
<3> 在线程进行通信和同步时,属于同一个进程的多个线程具有相同的地址,所以通信和同步代价会容易点。
2、资源调度算法:
(1)实质是资源分配(分配CPU)的方式。
(2)分类
<1> 先来先服务算法
思想:总是选择一个最先进入队列的进程,为之分配处理器,一直到进程执行结束或者阻塞而放弃处理机。
特点:属于非抢占式调度。
缺点:
<1> 仅考虑进程的等待时间,有利于长进程,不利于短进程。
<2> 实时性不好,未考虑进程的紧迫程度。
影响:会导致短进程(执行时间短)等待时间太长,使得短进程的周转时间太长(执行时间 - 到达时间)。
评价:先来先服务算法有利于CPU繁忙型(执行时间长)的进程,而不利于IO繁忙型(执行时间短)的进程。
<2> 短作业优先算法
思想:总是先执行运行时间短的进程。
特点:可以是抢占式调度,也可以是非抢占式调度。
缺点:
<1> 进考虑进程的运行时间,对长进程不利,会出现长进程饿死现象。
<2> 实时性不好,未考虑进程的紧迫程度。
<3> 进程的运行时间是估计值,不能准确衡量短进程。
优点:能有效地降低所有进程的平均等待时间,提高系统的吞吐量。
(体现在数据上,其实就是降低短进程的等待时间,使得进程的平均周转时间和平均等待时间都降低)。
<3> 高优先权优先调度算法
思想:总是先执行优先级高的进程。
特点:可以是抢占式调度,也可以是非抢占式调度。
分类:根据获得优先权时间可以分为两类:
(1)静态优先权
特点:创建进程时分配。
优点:简单易行,系统开销小。
缺点:不够精确,而且很可能出现优先权低的进程得不到调度的情况(饿死)
(2)动态优先权
特点:进程的优先权能够随着进程的推进和等待时间而改变。
典型代表:高响应比优先调度算法。
进程优先级 = 1 + (等待时间 / 要求服务时间)。
优点:折中了短作业优先 + 先来先服务。即照顾短进程,又考虑进程到达的先后顺序,不会使得作业长期得不到服务。
<4> 基于时间片的轮转算法
思想:先来先服务 + 时间片轮转。
特点:抢占式调度(执行不完,也得闪人)。
<5> 多级反馈队列调度算法
思想:
(1)在多个队列间,属于高优先级优先调度。
(2)在队列内,属于先来先服务 + 时间片轮转。
特点:抢占式调度
优点:不必知道各个进程需要的执行时间,而且还可以满足各种类型的进程的需要。
硬件设置:
<1> 设置多个就绪队列,
<2> 在不同的队列间设置不同的优先级,且优先级下降(越下面的队列优先级越小)。
<3> 在不同的队列内设置不同的时间片,且时间片上升(越下面的队列中时间片越长)。
工作方式:
<1> 新进程进入第一队列末尾,按先来先服务排队等待调度。
<2> 能在一个时间片内执行完,则可以直接离开os,不能在时间片执行完,在放入第二队列。...。
<3> 若到最后一个队列仍没有执行完,则放到本队列的队尾,继续循环执行。
注意:
<1> 当前i-1个队列为空时,才能调度第i个队列的进程。
<2> 若第i个队列中的进程A正在执行,但是有进程B进入第1个队列,此时进程A被强占了CPU,之后应该放到所在队列的队尾,等待执行。注意,不是放入下一队列。
3、进程通信
(1)定义:进程之间需要交换数据
(2)分类:
<1> 低级通信:
特点:效率低(传输数据少),通信过程对用户不透明(需要程序员操作太多)。
包括:信号量机制、共享存储结构
注意:为什么共享数据结构是低级通信而共享存储器系统是高级通信?
答:共享存储结构仅仅是共享数据结构,但数据结构的设置,数据的传输,进程的互斥和同步OS都不管,需要程序员自己处理)。但是共享存储器系统用户仅仅输入一些命令就好,其他的都有OS来处理。所以传输数据多,且用户处理很容易。
<2> 高级通信:
特点:用户利用OS提供的一些命令,就可以传送大量数据,且对用户来说,隐藏通信细节,通信过程对用户是透明的。
包括:共享存储器系统、消息机制系统、管道通信系统
1)共享存储器系统:OS划出一块共享存储区,进程可以对其进行正常的读写来实现通信。
2)消息机制:OS提供一些通信命令,让程序传输大量数据。
3)管道通信:OS提供一个文件供其通信。
在高级通信中,共享存储器系统(共享存储区)速度最快。
4、内存分配算法
(1)分类:
<1> 为用户程序分配连续的内存空间 -> 连续分配方式
<2> 为用户程序分配不连续的内存空间 -> 页式存储管理方式 + 段式存储管理方式 + 段页式存储管理方式
具体解释。。。。
(1)连续分配方式
目的:把连续的内存空间给用户程序。
分类:先是实现固定大小(单一连续分配和固定分区分配)-后是按需分配(动态分区分配)
目的:提高内存利用率。
<1> 单一连续分配
思想:
1)把内存分成系统区和用户区
2)系统区仅供OS使用
3)用户区是除了系统区以外的全部内存空间,供用户程序使用。
特点:
1)适用于单用户和单任务的OS
2)无外碎片,但是有内碎片
优点:易管理,简单。
缺点:存在内存浪费。
<2> 固定分区分配
思想:
1)把内存分成系统区和用户区,
2)用户区还分成若干个大小固定的区域,但是注意,每一个用户区大小可以不同,也可以相同。
3)系统区仅供OS使用
4)用户区仅供用户程序使用,属于用户区的每一个区域都只装入一个作业
内存分配(每个用户分区大小不同的情况):
1)将分区按大小进行排序,并建立分区使用表(存放分区是否的状态,是否用过,大小等)
2)在程序装入时,检索内存分配表找出能够满足要求且未分配的分区,分给改程序。
特点:
1)最简单的多道程序的存储管理方式
2)无外碎片,但是有内碎片
优点:易管理,简单。
缺点:存在内存浪费。
<3> 动态分区分配
思想:事先不处理用户区内存,根据用户程序的需要,分配空闲的内存。
特点:存在外碎片,但是不存在内碎片。
需要的数据结构:在空闲分区表中记录着每个空闲分区的情况。
内存分配算法:
1)首次适应算法
要求:空闲分区按照地址递增排序
分配:依次遍历空闲区,有则占用,无则失败。
优点:优先利用内存中低地址的空闲分区,而保留高地址分区,无内碎片。
缺点:低地址留下许多外碎片。
2)循环首次适应算法
思想:
3)最佳适应算法
思想:
4)最坏适应算法
思想:
5)快速适应算法
思想:
注意:
1)
2)
<4> 伙伴系统
<5> 哈希算法
说明:
(2)