一、进程
从系统层面看就是系统调用资源的最小单位,换句话就是手机上跑的App就是一个进程。
如果频繁切换不同App 会让用户感觉到他们都是在同时运行的,其实不是这样,本质上CPU给不同进程分配了很短的时间去运行,机会让用户有这样的错觉。
进程之间切换上下文会耗时很多的原因是寄存器(CPU里的一个flash)和程序计数(保存在当前指令的位置以及下一个指令的位置),就好比说开着BYD但是你还得开BMW,那么是不是得来回切换不同操作流程。进程是内核管理和调度。准备-运行-阻塞-运行-挂起。。。。
二、线程
线程就是进程当中一条执行流程,同一个进程多个线程之间可以共享代码段,数据段,打开文件等资源,但是每个线程都有独立一套寄存器和栈,以确保线程的控制流式相对独立的。
多线程的好处有就是一个进程可以同时存在多个线程,线程之间可以并发执行,线程之间可以共享地址空间和文件等资源。但是缺点就是一个线程出问题会影响其他关联线程。
线程上下文切换:
两个线程不属于同一个进程,则切换过程和进程上下文切换一样的代价。
当两个线程属于同一个进程,因为虚拟内存是共享的,上下文切换时,只需要切换私有数据,寄存器等不共享的数据。
线程有三种:
用户线程:用户态线程。
每个进程都需要有它私有的线程控制块(TCB)列表,用来跟踪记录它各个线程状态信息,TCB由用户级线程函数来维护;切换通过线程库函数来完成,无需用户态和内核态切换,速度快。
缺点:
- 由于操作系统不参与线程的调度,如果一个线程发起了系统调用而阻塞,那进程所包含的用户线程都不能执行了。
- 当一个线程开始运行后,除非它主动地交出 CPU 的使用权,否则它所在的进程当中的其他线程无法运行,因为用户态的线程没法打断当前运行中的线程,它没有这个特权,只有操作系统才有,但是用户线程不是由操作系统管理的。
- 由于时间片分配给进程,故与其他进程比,在多线程执行时,每个线程得到的时间片较少,执行会比较慢;
内核线程:内核实现的线程。内核线程是由操作系统管理的,线程对应的 TCB 自然是放在操作系统里的,这样线程的创建、终止和管理都是由操作系统负责。一对一的关系,即一个用户线程对应一个内核线程。
某个内核线程发起系统调用而被阻塞,并不会影响其他内核线程的运行;给配给线程,多线程的进程获得更多的CPU运行时间。同时缺点也明显,内核来维护进程和线程上下文信息,线程的创建终止和切换都是通过系统调用的方式来进行,因此对于系统来说,系统开销比较大。
轻量级进程:内核中来支持用户的线程。
一个进程可有一个或多个 LWP,每个 LWP 是跟内核线程一对一映射的,也就是 LWP 都是由一个内核线程支持。用户线程和内核线程有多对一 一对一 多对多
三、调度程序
选择哪个进程功能在OS中完成
在进程的生命周期中,当进程从一个运行状态到另外一状态变化的时候,其实会触发一次调度。
比如,以下状态的变化都会触发操作系统的调度:
- 从就绪态 -> 运行态:当进程被创建时,会进入到就绪队列,操作系统会从就绪队列选择一个进程运行;
- 从运行态 -> 阻塞态:当进程发生 I/O 事件而阻塞时,操作系统必须另外一个进程运行;
- 从运行态 -> 结束态:当进程退出结束后,操作系统得从就绪队列选择另外一个进程运行;
因为,这些状态变化的时候,操作系统需要考虑是否要让新的进程给 CPU 运行,或者是否让当前进程从 CPU 上退出来而换另一个进程运行。
另外,如果硬件时钟提供某个频率的周期性中断,那么可以根据如何处理时钟中断
,把调度算法分为两类:
- 非抢占式调度算法挑选一个进程,然后让该进程运行直到被阻塞,或者直到该进程退出,才会调用另外一个进程,也就是说不会理时钟中断这个事情。
- 抢占式调度算法挑选一个进程,然后让该进程只运行某段时间,如果在该时段结束时,该进程仍然在运行时,则会把它挂起,接着调度程序从就绪队列挑选另外一个进程。这种抢占式调度处理,需要在时间间隔的末端发生时钟中断,以便把 CPU 控制返回给调度程序进行调度,也就是常说的时间片机制。
- CPU 利用率:调度程序应确保 CPU 是始终匆忙的状态,这可提高 CPU 的利用率;
- 系统吞吐量:吞吐量表示的是单位时间内 CPU 完成进程的数量,长作业的进程会占用较长的 CPU 资源,因此会降低吞吐量,相反,短作业的进程会提升系统吞吐量;
- 周转时间:周转时间是进程运行和阻塞时间总和,一个进程的周转时间越小越好;
- 等待时间:这个等待时间不是阻塞状态的时间,而是进程处于就绪队列的时间,等待的时间越长,用户越不满意;
- 响应时间:用户提交请求到系统第一次产生响应所花费的时间,在交互式系统中,响应时间是衡量调度算法好坏的主要标准。
三、调度算法
先来先服务;最短作业优先调度;高响应比;时间片轮转调度;最高优先级,
多级反馈队列调度;