进程&线程
进程是操作系统资源分配的基本单位。一个进程运行时,会获取必要的CPU、内存地址空间,以及运行时必要的IO设备。
线程则是执行调度的最小单位。一个进程会由一个线程或者多个线程执行调度任务。多个线程之前共享进程资源,也有自己的私有资源(程序计数器,方法栈)。
比如一个音乐播放器上,播放器是一个进程,播放器上的听歌和下载音乐就是两个线程
并发&并行
并发是值一段时间内,有多个应用可以一同执行或者发生。看起来每个程序都在进行,但是实际在这段时间内的更小的时间片上,是交替执行的。
并行则是指多个事件可以在同一时刻发生,通过多核CPU可以实现并行,一个时刻一个CPU只有一个程序在运行,强调的是时刻的概念。
内中断&外中断
在操作系统中,主要通过中断来控制不同程序的交互。
当发生中断时,CPU会陷入·核心态,暂停当前运行的进程,由操作系统对中断进行处理
中断一般分为内中断和外中断
内中断:来自CPU内部,和当前的指令有关,也叫异常、陷入
外中断:来自CPU外部,指令无关,外部中断实质是外部设备发起的一些中断请求(键盘、鼠标等)
不同中断之前,存在一定优先级,操作系统优先处理优先级较高的中断
每执行一个指令后,CPU检查是否由中断信号,如果存在中断信号,CPU会保护被中断进程的CPU环境(进程id,寄存器、进程调度信息(进程状态、优先级、事件)等),存在在PCB中
为了描述控制进程的运行,系统中存放进程的管理和控制信息的数据结构称为进程控制块(PCB Process Control Block)
PCB用于描述和控制进程运行的通用数据结构,记录进程当前状态和进程运行的全部信息,是进程存在的唯一标识。其,主要包括以下信息
CPU会更具进程状态进行调度,
进程有以下状态:
就绪态:PCB、内存、堆栈空间等资源分配好,只差CPU的状态
执行态:进程获取CPU正在执行
阻塞态:进程中断放弃CPU的状态
创建状态:拥有PCB,但是其他资源未就绪
中止态:进程结束由系统清理或者归还CPU的状态
操作系统通过进程调度决策哪个就绪态的进程可以获取CPU使用权
当进程主动终止、时间片结束、或者中断时,会触发进程调度
进程调度一般分为两种方式:
进程调度主要有以下方法
1.先来先服务算法
不考虑用户体验&吞吐
2.短进程优先调度算法
考虑吞吐&不考虑长进程
3.最短剩余时间优先
考虑吞吐&不考虑长进程
此外,也可能无法预估进程剩余时间
4高优先级调度算法
考虑优先级
5.时间片轮转调度算法
相对公平,但是优先级
6反馈法(高优先级+先来先服务+时间片)
考虑优先级
执行越多,掉优先级
7多级反馈队列调度算法
考虑优先级+吞吐量
执行越多,掉优先级,不同优先级时间片不一致,优先级第时间片高
临界资源:(哲学家进餐问题)作为共享资源,但是有不能同时被多个进程使用的资源。当有进程在使用临界资源时,其他进程需要根据操作系统同步机制等待资源释放后重新竞争共享资源。
进程同步:主要在于协调临界资源使用次序,保障多个进程并发执行时的资源协调和合作
原则:空闲让进,忙则等待,等待有限,等待让权(CPU)
1.fork系统调用创建子进程:此时子进程代码段是与父进程共享以外,其他所有的都是得到父进程的一个副本(内存),但是子进程可以消费父进程的匿名管道,以此通信。管道的本质就是内核在内存中开辟了一个缓冲区,这个缓冲区与管道文件相关联,对管道文件的操作,被内核转换成对这块缓冲区的操作
2.有名管道:内核内存创建有名管道,可以不同进程通信,FIFO,无格式字节流
3.消息队列:消息队列的本质就是存放在内存中的消息的链表,而消息本质上是用户自定义的数据结构。于用户进程写入数据到内存中的消息队列时,会发生从用户态拷贝数据到内核态的过程;同样的,另一个用户进程读取内存中的消息数据时,会发生从内核态拷贝数据到用户态的过程。因此,如果数据量较大,使用消息队列就会造成频繁的系统调用,也就是需要消耗更多的时间以便内核介入。
4.共享内存:允许不相干的进程将同一段物理内存连接到它们各自的地址空间中,使得这些进程可以访问同一个物理内存,最快
5 信号量:共享内存无法保证内存同步,可以借助信号量进行同步。PV操作
6.套接字:不同机器间通信
进程同步
死锁&饥饿
死锁:指多个进程在竞争资源或者由于彼此通信造成永久等待的阻塞现象。
饥饿:长期得不到资源导致进程无法推进
当资源不足或者进程顺序调度不当就会产生死锁
死锁的4个必要条件
1.互斥使用资源
2.资源不可抢占
3.请求保持条件:保持一个资源不释放,有请求新资源
4.环路等待,资源环路
接触死锁就需要破坏上面4个条件之一即可