文章目录
1 进程
1.1 进程的概念
核心概念:进程是对正在运行程序的一个抽象。
1.2 进程与程序的区别
-
程序只是一组指令的有序集合,它本身没有任何运行的含义,它只是
一个静态的实体。而进程则不同,它是程序在某个数据集上的执行。
进程是一个 动态的实体,它有自己的生命周期它因创建而产生,因
调度而运行,因等待资源或事件而被处于等待状态,因完成任务而被
撤消。反映了一个程序在一定的数据集上运行的全部动态过程。 -
例子:王富贵正在为她女儿做生日蛋糕,做蛋糕的食谱就是程序(即适当形式描述的算法),王富贵就是处理机(cpu),而做蛋糕的原料就是输入程序。进程就是厨师阅读食谱,取来各种原料以及烘焙蛋糕等一系列动作的总和
关键思想是:一个进程是某种类型的一个活动,它有程序,输入,输出,状态。
1.3 进程的创建
-
系统初始化
-
执行了从事进程的一个系统调用
-
用户请求新进程
-
批处理作业
1.4 进程的终止
-
正常退出(自愿的)
-
出错退出(自愿的)
-
严重错误(非自愿)
-
被其他进程杀死(非自愿)
正常退出
完成工作后退出。当编译器完成所给定程序的编译后,编译器执行一个系统调用,通知操作系统它工作完成。
出错退出
进程发现严重错误。
用户输入命令 cc foo.c,编译器发现改文件不存在,就会退出。面向屏幕的交互式一般不退出,而是弹出一个对话框,要求再试一次。
严重错误
由进程引起的错误。通常是程序中的错误。
执行了一条非法指令,引用不存在的内存,除数为零等
被其他进程杀死
在Unix系统下 执行kill命令。
1.5 进程的状态
1.5.1 三态
-
运行态(该时刻进程实际占用cpu)
-
就绪态 (可运行,但因为其他进程正在运行而暂时停止)
-
阻塞态 (除非某种外部事件发生,否则不能运行)
状态转变:
-
运行态转阻塞态,是需要执行一个系统调用(block或pause)。
-
运行态与就绪态互转换是进程调度程序(调度算法)引起的,进程调度程序是操作系统的一部分。当cpu决定让其他进程使用cpu时,会发生运行态转成就绪态。当调度程序重新让此进程占用cpu运行时,会发生就绪态到运行态的转变。
图片地址:https://juejin.cn/post/6934500044057870350#heading-31
阻塞与就绪态区别:
当一个进程在逻辑上不能执行时就是处于阻塞状态。而在逻辑上可以运行的进程被迫停止,是因为操作系统调用另一个进程占用了cpu。第一种情况(转阻塞),进程挂起是程序自身的原因(用户输入命令之前无法执行程序),第二种(转就绪)是因为系统技术上的原因(没有足够的cpu,不能使每一个进程拥有自己的处理器)
1.5.2 五态
比正常三态多了个新建态与终止态
-
新建态:进程在创建时需要申请一个空白进程管理块,向其中填写控制和管理进程的信息,完成资源分配;
-
终止态:进程结束,或出现错误,或被系统终止,进入终止状态。
1.5.3进程的实现
为实现进程,操作系统在内核中维护者一张表格,即进程表(PCB),里面不仅包含了进程状态信息,还保存了进程由运行态转就绪或阻塞时必须保存的信息
2 线程
2.1 线程的概念
-
来源:每个进程都有一个地址空间与控制线程起作用是为了将进程中资源分组处理与执行分开。
-
创建进程时,分配资源,建立PCB;撤销进程时,回收资源,撤销PCB;进程切换时,保存当前进程的状态,可以看出OS维护进程开销比较大,所以提出了比进程更小的能独立运行的基本单位线程(Thread),与进程一样线程也有其数据结构线程控制块(Thread Control Block,TCB)
-
线程之间可以并发执行,同一进程的不同线程之间共享相同的地址空间(线程 = 进程 - 共享资源)
-
进程是用于把资源集中在一起,而线程是在cpu上调度执行的实体
-
线程的状态和进程的一样
2.2线程的实现
2.2.1 用户空间实现
-
线程管理的所有工作都由应用程序完成,内核意识不到多线程的存在。 从内核角度考虑,就是按正常的方式管理,即单线程进程
-
在用户空间实现时,每个进程有其专用的线程表,改线程表由运行时系统(列:jre)管理
2.2.2 用户线程优缺点
-
可以在不支持线程的操作系统中实现。
-
创建和销毁线程、线程切换代价等线程管理的代价比内核线程少, 因为保存线程状态的过程和调用程序都只是本进程空间的操作
-
线程调度无需上下文切换,不需要陷入,也不需要对内存高速缓存刷新。
-
用户级线程可以自己定制调度算法
-
缺点:系统调用的阻塞问题。在基于进程机制的OS中,如果如果一个线程阻塞,那么该进程内所有的线程都会阻塞。统一进程内线程的并行在这不存在(在操作系统中它是一个进程)。
2.2.3 内核中实现线程
- 内核中有记录系统中所有线程的线程表,当一个线程希望新建线程或撤销时,它会进行一个系统调用,此系统调用通过对线程表的更新完成创建或销毁。
2.2.4 内核中的优缺点
- 多处理器系统中,内核能够并行执行同一进程内的多个线程。
- 如果进程中的一个线程被阻塞,能够切换同一进程内的其他线程继续执行(用户级线程的一个缺点)。
- 所有能够阻塞线程的调用都以系统调用的形式实现,代价较大。
当一个线程阻塞时(内核中实现),内核根据其选择可以运行 同一进程中的另一线程,而在用户级线程,运行时系统会始终运行自己进程中的线程(因为内核态是把它当成一个进程看待的),直到cpu时间片轮转完
2.2.5组合方式实现
-
混合线程实现是用户线程和内核线程的交叉,使得库和操作系统都可以管理线程。用户线程由运行时库调度器管理,内核线程由操作系统调度器管理
-
用户线程通过时分多路复用内核技术,实现了用户级线程加内核支持线程的结合。从而形成了三种不同的模型分别是:一对一、多对一、多对多模型。
2.2.5.1 多对一模型
-
即是将所有的用户线程(同一个进程)映射到一个内核控制线程。对这些线程的调度也是在该进程的用户空间进行。仅当用户线程需要访问内核时,才映射到一个内核控制线程,但每次只允许一个线程进行映射。
-
该模型的主要优点就是线程管理的开销小,效率高;缺点就是只要有一个线程阻塞,整个进程就会阻塞。因为在任意时刻,只有一个线程可以访问内核,所以无法利用多处理机的优势。(对应前面的用户级线程)
2.2.5.2 一对一模型
-
即是,每一个用户线程都会映射到一个内核控制线程。每一个用户线程都有一个内核线程与之连接。
-
该模型的主要优点就是当同一进程的一个线程阻塞时,不会影响进程内的其他线程,具有很好的并发功能,并可以利用多处理机的优点;缺点就是每创建一个用户线程,就需要创建一个内核线程,开销较大,也限制了操作系统的线程数。
2.2.5.3 多对多模型
- 即将许多用户线程映射到同样数量或更少数量的内核线程上。该模结合了上述两种模型的特点,它可以像一对一模型那样,使一个进程的多个线程并行地运行在多处理机系统上,也可以像多对一模型,减少线程的管理开销。