未更新完毕 仅用来个人学习
文章目录
1、进程和线程的联系与区别
进程:进程是一个有特定功能的程序在某个数据集合上的一次运行。
线程:线程是系统调度的最小单位,包含在进程之中。
联系
进程可以有多个线程,最少包含一个线程,即主线程。一个线程只能属于一个进程。
线程是进程执行的实体。
区别
1、进程是资源分配的最小单位。进程拥有资源,而线程不拥有资源,但是进程中的多个线程可以共享所属进程中的资源。
2、线程是系统调度的最小单位。
3、进程的创建或撤销,系统需要为它分配或者回收资源,开销远大于线程的创建或撤销。进程间的切换需要保存当前CPU环境还需要配置新的CPU环境,而线程切换只需要保存和设置少量寄存器,开销很小。
4、进程的崩溃不会引起其他进程的崩溃,而线程的崩溃,会引起整个进程的崩溃。
线程占有的都是不共享的,其中包括:栈、寄存器、状态、程序计数器
线程间共享的有:堆,全局变量,静态变量;
2、为什么需要有线程
1.因为进程执行过程中会因为阻塞而导致整个进程挂起,比如等待输入,即使进程中有些不依赖这个资源的工作,仍然不会执行。线程的引入能减少时空开销,更好的实现并发。
2.线程的创建和销毁,只需要保留线程自己的栈区和少量寄存器,而进程的创建和销毁远远大于线程的开销
3、线程的类型
用户级线程
这些线程的管理的所有工作都由应用程序完成。执行一个应用程序,操作系统会为该应用程序分配进程号、内存空间等资源。然后会在一个线程上运行这个应用程序,这个线程就是主线程。
优点是非常高效,因为不需要进入内核空间,但是不能很好的实现并发
内核级线程
这类线程的管理的所有工作都由内核完成。应用程序不能够进行线程管理,只能够调用内核对外开放的该线程的接口。
优点是内核可以讲不同线程分配给不同CPU,更好的实现并发,但是效率不高,因为需要在用户态和系统态之间不断切换。
4、并发和并行
并发是指在一段时间内,多个任务都在执行,也就是宏观上看是同时进行的,但是微观上其实同一时刻只有一个任务在执行。多个任务交替执行,交替时间非常快,所以宏观上看起来是同时的。
并行是真正的实现了物理上的同时执行。在同一时刻多个任务同时执行。
5、进程的状态
就绪、阻塞、执行
就绪->执行:在就绪队列中等待进入执行状态
执行->就绪:时间片用完了,进入就绪
执行->阻塞:因为一些资源等待阻塞了,比如等待IO输入
阻塞->就绪:等待的条件已经满足
6、进程调度算法
①先来先服务 FCFS
按照进程进入就绪队列的顺序,从队列头开始处理进程,利于长作业,不利于短作业。
短作业可能会因为前面长作业运行之间太长而饿死。
②短作业优先 SJF
按照运行时间最短排序,然后开始执行,是一种抢占式的调度算法
利于短作业,长作业可能会被饿死
③最短剩余时间优先算法
当一个新的进程满足执行条件时候,和当前之前运行的进程,进行剩余时间比较,剩余时间较短的先执行。
④时间片轮转
按照FCFS算法排成一个队列,每个进程都统一执行一个时间片,没执行完的进程加入队尾。
时间片如果太大,大到超过就绪队列中进程的最大执行时间,就退化成FCFS
如果时间片太小,那么需要不断进行进程之间的切换,开销非常大
⑤优先级算法
对进程进行优先级编号,优先级高的优先,对于一直等待的进程,可以适当提高优先级,防止被饿死。
⑥多级反馈队列
是对时间片轮转算法的一种改进,每个队列维护一个不同的时间片轮转时间。1、2、4、8…
每次从当前队列执行完时间片时间后,如果还没运行后,就加入下一个队列中,就是提高了时间片。
如果一个进程需要用时间片轮转七次,用多级反馈队列只需要三次,减少了进程切换的次数,减少开销。
7、上下文切换
上下文切换指内核在CPU上对进程或者线程进行切换。
上下文切换有三个步骤:
①保存上一个CPU的上下文
②将新任务的上下文加载到CPU(CPU寄存器和程序计数器)
③跳转到新任务的程序计数器所指的新指令
上下文被保存在系统内核中
系统调用
进程的运行空间分为用户空间和内核空间
在用户空间运行的进程叫做用户态,在内核空间运行的叫做内核态(系统态)
从用户态到内核态需要经过系统调用
系统调用会发生CPU上下文切换,先保存用户态状态,然后加载内核态内容。系统调用结束后,在加载回用户态状态。一次系统调用,会有两次CPU上下文切换
进程上下文切换
进程是由内核管理和调度的,进程的切换只能发生在内核态
进程的上下文不但包括虚拟内存、栈、全局变量等用户空间资源,还包括内核堆栈、寄存器等内核空间状态。
线程上下文切换
线程上下文切换时,共享相同的虚拟内存和全局变量等资源不需要修改。而线程自己的私有数据,如栈和寄存器等,上下文切换时需要保存。
线程上下文切换为什么比进程快
这是一个超链接
每个进程都有自己的虚拟地址空间,进程内的所有线程共享进程的虚拟地址空间。进程切换涉及虚拟地址空间的切换而线程不会。
8、虚拟内存
虚拟内存的目的是为了让物理内存扩充成更大的逻辑内存,从而让程序获得更多的可用内存。虚拟内存使用部分加载的技术,让一个进程或者资源的某些页面加载进内存,从而能够加载更多的进程,甚至能加载比内存大的进程,这样看起来好像内存变大了,这部分内存其实包含了磁盘或者硬盘,并且就叫做虚拟内存。
9、分页和分段
10、页面置换算法
先进先出算法(First in first out,FIFO) :将在内存中最久的的页面淘汰
最近最久未使用算法(Least Recently used,LRU):将最久没使用的淘汰
最不常用算法(Least Frequently Used,LFU):·将内存中页面使用次数最少的给淘汰掉
11、死锁
死锁
指一个进程集合中的每个进程,都在等待该集合中的其他进程释放资源所形成的僵局,若无外力推进将无法继续执行。
根本原因
系统资源不足,导致资源不够分配。
四个必要条件
1.占有和等待,进程占有资源,并且等待剩下所需要的资源
2.互斥,资源要么被分配给了一个进程,要么未分配
3.不可抢占,不能进行抢占式的占有资源
4.环路等待,每个进程都在等待其他进程释放资源为自己所用
解决方法
1.鸵鸟策略:忽略死锁的发生,当死锁发生的概率很低或者不会造成什么影响的时候选择忽略它。因为解决死锁的成本可能很高。
2.死锁预防:指破坏死锁的必要条件
- 破坏互斥,让多个进程同时访问资源
- 破坏占有和等待,一次性申请所需要的全部资源
- 破坏不可抢占,抢占式占有资源
- 破坏环路等待,必须按顺序请求资源
3.死锁的避免:采用银行家算法:假设将资源分配给进程P1后,最后所有的进程都能够得以释放资源,那么就分配给它
4.死锁的检测与修复
12、磁盘调度算法
这是一个超链接
上述博客讲的很好,推荐阅读
1.先来先服务 FCFS
2.最短寻道时间优先算法 SSTF
3.扫描算法(电梯算法) SCAN
4.循环扫描算法 C-SCAN
5.LOOK调库和C-LOOK调度(其实就是扫描算法和循环扫描算法的优化,每次不需要到磁盘边缘,而是到最远的请求地方即可)
13、进程间通信方式
无名管道、有名管道、消息队列、信号量、信号、共享内存、套接字
共享内存是最快的通信方式、而套接字是最常用的通信方式,它可以实现不同主机的进程通信
14、进程间同步方式
15、中断
中断是指CPU对系统发生的某个事件做出的一种反应,CPU暂停正在执行的程序,保存现场后自动去执行相应的处理程序,处理完该事件后再返回中断处继续执行原来的程序。中断一般三类,一种是由CPU外部引起的,如I/O中断、时钟中断,一种是来自CPU内部事件或程序执行中引起的中断,也叫异常,例如程序非法操作,地址越界、浮点溢出、缺页中断,最后一种是在程序中使用了系统调用引起的。而中断处理一般分为中断响应和中断处理两个步骤,中断响应由硬件实施,中断处理主要由软件实施。