啥是进程和线程?
0.啥是并发与并行?
老生常谈了,并发只是在同一时间段一起执行,并行才是真正意义上的同时执行。
举个例子,
某个工厂有三条流水线要生产不同的零件,但是只有一个工人,老板让他一天时间内 每条流水线都生产十个零件,
打工老哥就很辛苦,上午生产流水线1,下午生产流水线2,晚上还得加班去流水线3生产。最后按一天的时间算,看起来好像是三个流水线同时生产了,其实只有老哥一个人 具体的辛苦谁知道? ——并发
另一个工厂就很舒服,三条流水线有三个工人去工作,也是每天每条流水线生产十个零件,每个人只负责自己的 并且可以真正意义上的同时进行生产。 ——并行
像极了互联网打工人现状,目前实际计算机多数时候也都是并发执行调的
(因为cpu资源很昂贵,本着尽可能的压榨cpu的原则,假如单核cpu让他忙起来可以同时并发处理十个任务,那我同一时间最多也就二十个任务,两核cpu的配置不就够了吗,那么贵的cpu我搞那么多 排不满会产生空闲时间我多亏啊,像极了资本)
由于人们日益发展的物质文化需求,cpu也由单核慢慢演变为多处理器,多处理器系统由于可以共享资源,因此可以开源节流,省钱。整个系统的可靠性也随之提高。
1.啥是进程和进程表?
进程
就是正在执行程序的实例,比如说 Web 程序就是一个进程,shell 也是一个进程,LoL也是一个进程。
操作系统负责管理所有正在运行的进程,操作系统会为每个进程分配特定的时间来占用 CPU,操作系统还会为每个进程分配特定的资源。
操作系统为了跟踪每个进程的活动状态,维护了一个进程表
。在进程表的内部,列出了每个进程的状态以及每个进程使用的资源等。
2.啥是线程?
线程其实就是进程中的单条流向,因为线程具有进程中的某些属性,所以线程又被称为轻量级的进程。浏览器如果是一个进程的话,那么浏览器下面的每个 tab 页可以看作是一个个的线程。
线程不像进程那样具有很强的独立性,线程之间会共享数据
创建线程的开销要比进程小很多,因为创建线程仅仅需要堆栈指针
和程序计数器
就可以了,而创建进程需要操作系统分配新的地址空间,数据资源等,这个开销比较大。
3. 啥是上下文切换?
上下文切换 (Context Switch) 是一种 将 CPU 资源从一个进程分配给另一个进程的机制。(也就是让打工人老哥从流水线1干完去流水线2)
从用户角度看,计算机能够并行运行多个进程,这恰恰是操作系统通过快速上下文切换造成的结果。
在切换的过程中,操作系统需要先存储当前进程的状态 (包括内存空间的指针,当前执行完的指令等等),再读入下一个进程的状态,然后执行此进程。
4.进程终止的几种方式?
执行完正常退出: exit
错误退出: 例如执行linux某个指令 文件不存在,提示错误退出
严重错误: 在编译或运行过程中程序本身发生错误(例如java空指针),进程收到中断信号 终止
被其他进程杀死: 执行的好好的呢 被kill了
5.进程之间的通信方式?
也叫进程之间的并发问题(这名我起的)
竞态条件:多个线程对同意共享数据进行修改 (典型的多线程并发问题)
临界区:禁止一个或多个进程在同一时刻对共享资源(包括共享内存、共享文件等)进行读写。 也就是临界区互斥
-
消息传递
:消息传递是进程间实现通信和同步等待的机制,使用消息传递,进程间的交流不需要共享变量,直接就可以进行通信;消息传递分为发送方和接收方 -
先进先出队列
:先进先出队列指的是两个不相关联进程间的通信,两个进程之间可以彼此相互进程通信,这是一种全双工通信方式 -
管道
:管道用于两个相关进程之间的通信,这是一种半双工的通信方式,如果需要全双工,需要另外一个管道。 -
直接通信
:在这种进程通信的方式中,进程与进程之间只存在一条链接,进程间要明确通信双方的命名。 -
间接通信
:间接通信是通信双方不会直接建立连接,而是找到一个中介者,这个中介者可能是个对象等等,进程可以在其中放置消息,并且可以从中删除消息,以此达到进程间通信的目的。 -
消息队列
:消息队列是内核中存储消息的链表,它由消息队列标识符进行标识,这种方式能够在不同的进程之间提供全双工的通信连接。 -
共享内存
:共享内存是使用所有进程之间的内存来建立连接,这种类型需要同步进程访问来相互保护。
6.进程的状态模型?
-
运行态
:运行态指的就是进程实际占用 CPU 时间片运行时 -
就绪态
:就绪态指的是可运行,但因为其他进程正在运行而处于就绪状态 -
阻塞态
:阻塞态又被称为睡眠态,它指的是进程不具备运行条件,正在等待被 CPU 调度。
逻辑上来说,运行态和就绪态是很相似的。这两种情况下都表示进程可运行
,但是第二种情况没有获得 CPU 时间分片。第三种状态与前两种状态不同的原因是这个进程不能运行,CPU 空闲时也不能运行。
转换 2 和转换 3 都是由进程调度程序(操作系统的一部分)引起的,进程本身不知道调度程序的存在。转换 2 的出现说明进程调度器认定当前进程已经运行了足够长的时间,是时候让其他进程运行 CPU 时间片了。
当所有其他进程都运行过后,这时候该是让第一个进程重新获得 CPU 时间片的时候了,就会发生转换 3。
当进程等待的一个外部事件发生时(如从外部输入一些数据后),则发生转换 4。如果此时没有其他进程在运行,则立刻触发转换 3,该进程便开始运行,否则该进程会处于就绪阶段,等待 CPU 空闲后再轮到它运行。
创建进程需要两个步骤:即为新进程分配所需要的资源和空间,设置进程为就绪态,并等待调度执行。
终止一个进程需要两个步骤:
-
先等待操作系统或相关的进程进行善后处理。
-
然后回收占用的资源并被系统删除。
7.调度算法都有哪些?
调度算法分为三大类:批处理中的调度、交互系统中的调度、实时系统中的调度
批处理中的调度:
先来先服务,队列原理,FIFO先来的进程先调用
最短作业优先,最短作业的每个进程调度的平均用时最少。在所有的进程都可以运行的情况下,最短作业优先的算法才是最优的。
最短剩余时间优先,最短作业优先的抢占式版本,这种方式能够使短期作业获得良好的服务。
交互式系统中的调度:
轮训调度,每个进程都会被分配一个时间段。在这个时间片内允许进程运行。如果时间片结束时进程还在运行的话,则抢占一个 CPU 并将其分配给另一个进程。如果进程在时间片结束前阻塞或结束,则 CPU 立即进行切换。
优先级调度,按照进程优先级调度。但是也不意味着高优先级的进程能够永远一直运行下去,调度程序会在每个时钟中断期间降低当前运行进程的优先级。如果此操作导致其优先级降低到下一个最高进程的优先级以下,则会发生进程切换。或者,可以为每个进程分配允许运行的最大时间间隔。当时间间隔用完后,下一个高优先级的进程会得到运行的机会。(防止富人垄断呗 给穷人点活路)
8.进程调度的性能?
CPU不处于空闲状态的时间百分比 (越尽力压榨cpu,cpu利用率越高)
进程切换的等待时间
单位时间内完成进程任务的数量
响应时间