1、进程和线程的概念、以及他们的区别
(1)基本概念
进程:是系统进行资源调度和分配的的基本单位,实现了操作系统的并发;
线程:是进程的子任务,是CPU调度和分派的基本单位,用于保证程序的实时性,实现进程内部的并发;线程是操作系统可识别的最小执行和调度单位。每个线程都独自占用一个虚拟处理器:独自的寄存器组,指令计数器和处理器状态。每个线程完成不同的任务,但是共享同一地址空间(也就是同样的动态内存,映射文件,目标代码等等),打开的文件队列和其他内核资源。
【一句话:进程是资源分配的基本单位;线程是CPU调度的基本单位】
(2)区别
1.一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。线程依赖于进程而存在。
2.进程在执行过程中拥有独立的内存单元,而多个线程共享进程的内存。(资源分配给进程,同一进程的所有线程共享该进程的所有资源。同一进程中的多个线程共享代码段(代码和常量),数据段(全局变量和静态变量),扩展段(堆存储)。但是每个线程拥有自己的栈段,栈段又叫运行时段,用来存放所有局部变量和临时变量。)
3.进程是资源分配的最小单位,线程是CPU调度的最小单位;
4.系统开销: 由于在创建或撤消进程时,系统都要为之分配或回收资源,如内存空间、I/o设备等。因此,操作系统所付出的开销将显著地大于在创建或撤消线程时的开销。类似地,在进行进程切换时,涉及到整个当前进程CPU环境的保存以及新被调度运行的进程的CPU环境的设置。而线程切换只须保存和设置少量寄存器的内容,并不涉及存储器管理方面的操作。可见,进程切换的开销也远大于线程切换的开销。
5.通信:由于同一进程中的多个线程具有相同的地址空间,致使它们之间的同步和通信的实现,也变得比较容易。进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。在有的系统中,线程的切换、同步和通信都无须操作系统内核的干预
6.进程编程调试简单可靠性高,但是创建销毁开销大;线程正相反,开销小,切换速度快,但是编程调试相对复杂。
7.进程间不会相互影响 ;线程一个线程挂掉将导致整个进程挂掉
8.进程适应于多核、多机分布;线程适用于多核
【一句话:(1)线程依赖于进程存在;(2)进程有独立的内存单元,多个线程共享同一进程的资源;(3)进程和线程的定义;(4)创建、切换的开销;(5)通信方式;】
2、进程间通讯方式、线程的通讯方式⭐️
(1)进程间通信的方式
管道、消息队列、信号量、信号、共享内存、以及套接字socket。
(2)线程间通信的方式(也是线程的同步方式)
临界区:通过多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问;
互斥量(锁):采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有一个,所以可以保证公共资源不会被多个线程同时访问
信号量(P、V操作):为控制具有有限数量的用户资源而设计的,它允许多个线程在同一时刻去访问同一个资源,但一般需要限制同一时刻访问此资源的最大线程数目。
事件(信号):通过通知操作的方式来保持多线程同步,还可以方便的实现多线程优先级的比较操作
3、协程的概念
协程是一种用户态的轻量级线程,协程的调度完全由用户控制。 无论是进程还是线程,都是由操作系统所管理的。协程不是被操作系统内核所管理的,而是完全由程序所控制,也就是在用户态执行。这样带来的好处是性能大幅度的提升,因为不会像线程切换那样消耗资源。协程既不是进程也不是线程,协程仅仅是一个特殊的函数,协程它进程和进程不是一个维度的。一个进程可以包含多个线程,一个线程可以包含多个协程。
【一句话:完全由用户控制】
4、Linux虚拟地址空间(虚拟内存)
所有进程共享同一物理内存,每个进程只把自己目前需要的虚拟内存空间映射并存储到物理内存上。在每个进程创建加载时,内核只是为进程“创建”了虚拟内存,等到运行到对应的程序时,才会通过缺页异常,来拷贝数据。
虚拟内存使得应用程序认为它拥有一个连续的地址空间,而实际上,它通常是被分隔成多个物理内 存碎片,还有一部分存储在外部磁盘存储器上,在需要时进行数据交换。虚拟内存可以让程序可以拥有超过系统物理内存大小的可用内存空间。虚拟内存让每个进程拥有一 片连续完整的内存空间。
【一句话:进程创建时只分配了虚拟内存,当运行到该进程时,发生缺页中断,并将虚拟内存空间映射到物理内存上】
5、虚拟内存的页面置换算法
(1))最佳置换算法(Optimal):即选择那些永不使用的,或者是在最长时间内不再被访问的页面置换出去。
(2)先进先出置换算法(FIFO):该算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰。
(3)最近最久未使用置换算法(LRU):该算法是选择最近最久未使用的页面予以淘汰
(4)最少使用置换算法(LFU):该算法选择最近时期使用最少的页面作为淘汰页。
(5)时钟置换算法(CLOCK):该算法为每个页面设置一位访问位,将内存中的所有页面都通过链接指针链成一个循环队列。当某页被访问时,其访问位置“1”。在选择一页淘汰时,就检查其访问位,如果是“0”,就选择该页换出;若为“1”,则重新置为“0”,暂不换出该页,在循环队列中检查下一个页面,直到访问位为“0”的页面为止。
【一句话:LRU、最少使用、先进先出、最佳置换、时钟置换】
6、内存调度算法⭐️
(1)先来先服务调度算法
(2)时间片轮转调度算法:系统将所有就绪进程按到达时间的先后次序排成一个队列,进程调度程序总是选择就绪队列中第一个进程执行,即先来先服务的原则,但仅能运行一个时间片。
(3)短作业优先调度算法:从后备队列中选择一个或若干个估计运行时间最短的作业,将它们调入内存运行。
(4)最短剩余时间优先调度算法:最短剩余时间是针对最短进程优先增加了抢占机制的版本。在这种情况下,进程调度总是选择预期剩余时间最短的进程。
(5)高响应比优先调度算法
(6)优先级调度算法:选择优先级最高的一个或几个作业,将它们调入内存
(7)多级反馈队列
【一句话:先来先服务、时间片轮转、优先级调度、短作业优先、最短剩余时间优先、高响应比优先、多级反馈队列】
7、进程调度算法
和内存调度算法很像
a)先来先去服务
b)时间片轮转法
c)短作业优先
d)多级反馈队列调度算法
e)优先级调度
8、内存分配方法⭐️
(1)首次适应算法 : 按从小到大的顺序形成空闲区链,从空闲分区链首开始查找,直至找到一个能满足其大小需求的空闲分区为止 。(从头找到尾)
(2)邻近适应算法 :(从上次结束位置开始找)
(3)最佳适应算法 : 该算法总是把既能满足需求,又是最小的空闲分区分配给作业。 (从最小的找)
(4)最差适应算法 : 该算法按大小递减的顺序形成空闲区链,分配时直接从空闲区链的第一个空闲分区中分配(从最大的找)
算法 | 算法思想 | 分区排列顺序 | 优点 | 缺点 |
---|---|---|---|---|
首次适应 | 从头到尾找适合的分区 | 空闲分区以地址递增次序排列 | 综合看性能最好。算法开销小,回收分区后一.般不需要对空闲分区队列重新排序 | |
最佳适应 | 优先使用更小的分区,以保留更多大分区 | 空闲分区以容量递增次序排列 | 会有更多的大分区被保留下来,更能满足大进程需求 | 会产生很多太小的、难以利用的碎片;算法开销大,回收分区后可能需要对空闲分区队列重新排序 |
最坏适应 | 优先使用更大的分区,以防止产生太小的不可用的碎片 | 空闲分区以容量递减次序排列 | 可以减少难以利用的小碎片 | 大分区容易被用完,不利于大进程;算法开销大(原因同上) |
邻近适应 | 由首次适应演变而来,每次从上次查找结束位置开始查找 | 空闲分区以地址递增次序排列(可排列成循环链表) | 不用每次都从低地址的小分区开始检索。算法开销小(原因同首次适应算法) | 会使高地址的大分区也被用完 |