进程
代码是一个存储在硬盘的静态文件,通过编译后就会生成二进制可执行文件,当我们运行这个可执行文件后,它会被装载到内存中,接着CPU会执行程序中的每一条指令,那么这个运行中的程序就被称为进程。
并行和并发
进程的状态
运行状态(runing):该时刻进程占用CPU
就绪状态(ready):可运行,但由于其他进程处于运行状态而暂时停止运行
阻塞状态(blocked):该进程正在等待某一事件发生而暂时停止运行,这时机试给他CPU控制权,它也无法运行
创建状态(new):进程正在被创建时的状态
结束状态(Exit):进程正在从系统中消失的状态
如果有大量处于阻塞状态的进程,进程可能会占用大量的物理内存空间,所以在虚拟内存管理的操作系统中,通常会把阻塞状态的进程的物理内存空间换出到磁盘,需要等再次运行的时候,再从硬盘换入到物理内存。
挂起状态:来描述进程没有占用实际的物理内存空间的情况。进程挂起的原因还有通过sleep函数,用户通过ctrl+z挂起进程。
阻塞挂起状态:进程在外存等待某个事件的出现
就绪挂起状态:进程在外存,只要进入内存就立即运行
进程的控制结构
操作系统中用进程控制块(PCB)来描述进程。PCB是进程存在的唯一标识。通常通过链表的方式进行组织,把具有相同状态的进程链接在一起,组成各种队列。
- 进程描述信息:进程标识符,进程归属的用户
- 进程控制和管理信息:进程当前的状态,进程的优先级(抢占CPU时的优先级)
- 资源分配清单:内存地址空间或虚拟地址空间的信息,所打开文件的列表和所使用的I/O设备信息
- CPU相关信息:CPU中各个寄存器的值,当进程被切换时,CPU的状态信息都会被保存在相应的PCB中,以便进程重新执行时能从断点出继续执行
进程的上下文切换
各个进程之间共享CPU资源,进程间需要进行切换让不同进程可以在CPU执行,那么这个进程切换到另一个进程运行就叫做进程的上下文切换。
CPU的上下文:CPU寄存器和程序计数器
进程的上下文切换:不仅包含了虚拟内存、栈、全局变量等用户空间的资源,还包括了内核堆栈、寄存器等内核空间的资源。通常会把交换的信息保存在进程的PCB中,当要运行另外一个进程的时候,只需要在其PCB中取出上下文,并回复到CPU中即可。
线程
线程是进程中的一条执行流程。同一个进程内多个线程之间可以共享代码段,数据段,打开的文件等资源,但是每个线程都有一套属于自己的寄存器和栈。
当进程中的一个线程崩溃时,会导致其所属进程的所有线程崩溃。
线程的上下文切换
- 如果两个线程不属于同一个进程,则切换的过程就跟进程上下文切换一样。
- 如果两个线程是输入同一个进程,因为虚拟内存是共享的,所以在切换时就只需要切换线程的私有数据、寄存器等不共享的数据。
线程的实现
- 用户线程:在用户空间实现的线程,不是由内核管理的线程,是由用户态的线程库来完成线程的管理
- 内核线程:在内核中实现的线程,是由内核管理的线程
- 轻量级线程:在内核中来支持用户线程