进程
进程就是运行中的程序。 单核cpu在某个时间,只能运行一个进程,但是在一秒钟期间,它可能会运行多个进程,这样就会产生并行的错觉,实际上这是并发。
进程、程序、CPU、数据之间的关系:
菜谱就是程序,买的菜就是程序需要的数据,炒菜的人就是cpu,做菜的过程就是进程。进程有运行-暂停-运行的活动规律。
进程的状态变迁图:
为了防止大量处于阻塞状态的进程占用物理存储空间,在虚拟内存管理的操作系统中,会把阻塞状态的进程的物理内存换成到硬盘,等再次需要运行的时候,再从硬盘换入到物理内存。
挂起状态就是为了描述进程没有占用实际的物理内存空间的情况。
PCB是进程存在的唯一标识,PCB包含的有:
- 进程描述信息:进程标识符;用户标识符;
- 进程控制和管理信息:进程当前状态;进程优先级;
- 资源分配清单:有关内存地址空间或虚拟地址空间的信息,所打开文件的列表和所使用的 I/O 设备信息
- CPU相关信息:CPU中各个寄存器的值,当进程被切换的时候,CPU的状态信息都会被保存在响应的PCB中,以便进程重新执行的时候,能从断点处继续执行
进程的上下文切换就是一个进程切换到另外一个进程运行。进程的上下文切换不仅包含虚拟内存、栈、全局变量等用户空间的资源,还有内核堆栈、寄存器等内核空间的资源。这些交换的信息通常会保存在进程的PCB中,当要运行另外一个进程的时候,需要擦这个进程的PCB取出来上下文,然后恢复到CPU中,使得这个进程可以继续执行。
任务是交给CPU执行的,每个任务执行之前,CPU需要知道任务从哪里加载,又从哪里开始运行。所以,需要操作系统实现帮助CPU设置好CPU寄存器和程序计数器。
CPU寄存器是一个CPU内部一个容量小,但是速度极快的内存;
程序计数器则是用来存储CPU正在执行的指令位置、或者即将执行的下一条指令
CPU的上下文就是CPU寄存器和程序计数器,CPU的上下文切换就是把前一个任务的CPU上下文(CPU寄存器和程序计数器)保存起来(系统内核会存储保存下来的上下文信息),然后加载新的任务的上下文到这些寄存器和程序计数器,最后在跳转到程序技术期所指向的新位置,允许新任务。
进程的上下文切换的场景有哪些?
- cpu时间片用完
- 系统资源不足,进程会被挂起
- sleep函数
- 让给更高优先级的进程
- 硬件中断
线程
线程是进程中的一条执行流程,同一进程中的多个线程可以共享代码段、数据段、打开的文件等资源,同时每个线程各自都有一套独立的寄存器和栈,线程的控制流是相对独立的。
进程和线程的比较:
- 进程是资源分配的基本单位,线程是cpu调度的单位;
- 进程拥有一个完整的资源平台,进程只独享必不可少的资源
线程相对于进程能减少开销,具体体现在:
线程有三种实现方式:
- 用户线程,基于用户态的线程管理库来实现,线程控制块也是在库里面来实现的,对于操作系统而言是看不到这个TCB(线程控制块)的,操作系统不直接参与
- 内核线程
- 轻量级进程(内核支持的用户线程)
调度
调度原则:
- 为了提高CPU利用率,如果发生I/O事件导致CPU空闲,调度程序需要从就绪队列中选择一个进程来执行。
- 为提高系统的吞吐率,调度系统需要权衡长任务和短任务进程的运行完成数量
调度算法:
- 先来先服务
- 短作业优先
- 高响应比优先
- 时间片轮转
- 最高优先级调度
- 多级反馈队列调度