进程
进程是操作系统中最核心的概念,是对正在运行程序的一个抽象。
在进程模型中,计算机上所有可运行的软件,通常也包括操纵系统,被组织成若干顺序进程,简称进程。而为了实现这进程模型,操作系统维护着一张表格(一个数据结构),即进程表。每个进程占用一个表项,该表项包含了进程的状态的重要信息,比如程序计数器,堆栈指针,内存分配状态,所打开文件的状态,账号和调度信息,以及其他进程运行态转换或阻塞态时必须保存的信息,从而保证该进程随后能再次启动,就像从未中断过一样
进程与程序的区别
例如:当你去做饭时,你拿着食谱,原料。此时,你根据手中的食谱做菜,每当执行下一步时,你都可能用到原料。
在这个例子中,你本人相当于计算机里的CPU,而食谱相当于程序,原料相当于数据,而完成这一切所组成的总和叫做进程。
进程中的层次结构
UNIX(及其他类似的系统)
存在父子进程,子进程只有一个父进程,它们共同组成一个进程的层次结构Windows
没有进程层次的概念,所有进程都是地位相同的。唯一类似于进程的按时是在创建进程的时候,父进程会得到一个句柄,该句柄口语控制子进程。
进程的状态
每个进程都是一个独立的个体,存在三种状态:运行,就绪和阻塞。并且这三种状态都能够进行转换。
- 运行态 – 该时刻进程时间占用CPU
- 就绪态 – 可运行,单位其他进程正在运行而暂时停止
- 阻塞态 – 除非某种外部事件发生,否则进程不能运行
线程
线程也叫作“迷你进程”。
线程是程序中一个单一的顺序控制流程。在传统操作系统中,每个进程有一个地址空间和一个控制线程。不过,经常存在同一个地址空间中准并行运行多个控制线程的情况。
线程概念试图实现的是:共享一组资源的多个线程的执行能力,以便这些线程可以为完成某一任务而共同工作。
由于线程比进程更轻量级,所以它的创建比进程更容易,也更容易撤销。这也是需要多线程的理由之一。
线程模型
进程模型基于两种独立的概念:资源分组处理和执行
进程拥有一个执行的线程,通常简写为线程。在线程中有一个程序计数器,用来记录接着要执行哪一条指令。线程拥有寄存器,用来保存线程当前的工作变量。线程还拥有一个堆栈,用来记录执行历史,其中每一帧保存了一个已调用的但是还没有从中返回的过程。
多线程的伪并行
通过在多个进程之间来回切换,系统制造了不同的顺序进程并行运行的假象。多线程的工作方式也是类似的。CPU在线程之间的快速切换,制造了线程并行运行的假象。
进程中的不同线程不像不同进程之间那样存在很大的独立性。所有的线程都有完全一样的地址空间(进程间都有各自的地址空间),这意味着它们也共享同样的全局变量。并且线程之间是没有保护的。
线程实现
多数计算机有两种运行模式:内核态和用户态
因此实现线程包的两种主要方法:在用户空间中和在内核中。