共计 2517 个字符,预计需要花费 7 分钟才能阅读完成。
进程的定义
一个进程实体包括三部分:程序段,数据段,pcb,这个进程实体就简称为进程
进程的特征
动态性
进程由创建而产生,由调度而执行,由撤销而消亡
有一定生命期
进程的实质是进程实体的执行过程
并发性
指多个进程实体能够同时存在内存中,且能够在一段时间内同时运行。这也正是引入进程概念的目的
异步性
每个进程都是按各自独立的、不可预知的速度向前推进
正是由于有异步性,os 才会引进相应的同步机制,才能保证进程并发执行的结果是可再现的
独立性
进程是独立运行,独立接受调度的基本单位
进程的基本状态及转换
创建、就绪、执行、阻塞、终止
切记,创建完并非立即执行,而是就绪状态,当 CPU 调度时才转变为执行状态
执行 -> 就绪,是由于时间片用完,让出 CPU 资源,变回就绪状态
就绪状态:指进程已经处于准备好运行的状态,那具体什么是准备好呢?即进程已分配到除 CPU 以外的所有必要资源后,只要再获得 CPU, 便可立即执行
创建、静止就绪、活动就绪、执行、静止阻塞、活动阻塞、终止
创建 -> 活动就绪:在当前系统的性能和内存的容量均允许的情况下,完成对进程创建的必要操作后,进程便为活动就绪状态
创建 -> 静止就绪:不分配给新建进程所需资源,主要是主存,所以该进程被安置在外存,不参与调度,状态转为静止就绪状态
操作系统内核
定义
将一些与硬件紧密联系的模块(如中断处理程序等)、各种常用设备的驱动程序、运行频率较高的模块(如时钟管理,进程调度),都安排在紧靠硬件的软件层次中,将它们常驻内存,即通常称为 OS 内核。目的或者有点有两个:
对这些软件进行保护,防止遭受其他应用程序的破坏
提高 OS 的运行效率(因为常驻内存)
OS 内核两大功能:
支撑功能
中断处理
内核最基本的功能
各种类型的系统调用、键盘命令的输入、进程调度、设备驱动等,都依赖于中断
时钟管理
内核的一项基本功能
例如时间片轮转调度中,每当时间片用完时,便由时钟管理产生一个中断信号,促使调度程序重新进行调度
实时系统中的截止时间截止、批处理系统中的最长运行时间控制等也依赖于时钟管理
原语操作
所谓原语,就是由若干条指令组成的,用于完成一定功能的一个过程。
原子操作是指一个操作中的所有动作要么全做,要么全不做。它是一个不可分割的基本单位。
资源管理功能,包括进程管理、存储器管理、设备管理
进程和线程的区别
从调度性、并发性、系统开销、拥有资源、独立性、支持多处理机系统方面比较
调度性
线程是调度的基本单位,是能独立运行的基本单位,线程切换代价低
只有从一个进程中的线程切换到另一个进程中的线程时,才会引起进程的切换
拥有资源
进程是拥有资源的基本单位,而线程仅有一点必不可少,能保证独立运行的资源而已
那线程拥有哪些必不可少的资源呢?如线程控制块 TCB,程序计数器,保留局部变量,少数状态参数和返回地址等的一组寄存器和堆栈
多个线程共享所属进程拥有的资源
并发性
进程之间可以并发执行,一个进程中的多个线程之间也可以并发执行
独立性
同一进程下的线程之间的独立性低,不同进程之间的独立性高
每个进程都拥有一个独立的地址空间和其他资源,除了共享全局变量外,不允许其他进程的访问
同一进程的不同线程,共享进程的内存地址空间和资源,如一个线程的堆栈可以被其他线程读写
系统开销
创建和撤销进程,系统要为之分配和回收 PCB 以及其他资源如内存空间和 I/O 设备
而线程由于共享进程所拥有的资源,所以线程的创建、撤销快,上下文切换也快
线程之间的同步和通信也比进程的简单
多处理机系统支持
传统的进程,即单线程进程,无论有多少处理机,该进程只能运行在一个处理机上
但对于多线程进程,就可以将一个进程中的多个线程分配到多个处理机上,并行执行
多进程和多线程的应用场景
首先,多进程单线程模型,简称为多进程;单进程多线程模型,简称为多线程。
多进程模型
优点
编程相对容易;通常不需要考虑锁和同步资源的问题。
更强的容错性: 比起多线程的一个好处是一个进程崩溃了不会影响其他进程。
有内核保证的隔离:数据和错误隔离。
对于使用如 C /C++ 这些语言编写的本地代码,错误隔离是非常有用的
采用多进程架构的程序一般可以做到一定程度的自恢复(master 守护进程监控所有 worker 进程,发现进程挂掉后将其重启)
案例
nginx 主流的工作模式是多进程模式(也支持多线程模型)
几乎所有的 web server 服务器服务都有多进程的,至少有一个守护进程配合一个 worker 进程,例如 apached,httpd 等等以 d 结尾的进程包括 init.d 本身就是 0 级总进程,所有你认知的进程都是它的子进程;
chrome 浏览器也是多进程方式。
redis 也可以归类到“多进程单线程”模型(平时工作是单个进程,涉及到耗时操作如持久化或 aof 重写时会用到多个进程)
多线程模型
优点
创建速度快,方便高效的数据共享
多个线程之间可以共享相同的地址空间
适用场景
线程间有数据共享,并且数据是需要修改的(不同任务间需要大量共享数据或频繁通信时);
提供非均质的服务(有优先级任务处理)事件响应有优先级;
单任务并行计算,在非 CPU Bound 的场景下提高响应速度,降低时延;
与人有 IO 交互的应用,良好的用户体验(键盘鼠标的输入,立刻响应)
如何选用
单进程多线程和多进程单线程,2 种模式如何取舍?
进程线程间创建的开销不足以作为选择的依据,因为一般我们都是使用线程池或者进程池,在系统启动时就创建了固定的线程或进程,不会频繁的创建和销毁;
首先,根据工作集(需要共享的内存)的大小来定;如果工作集较大,就用多线程,避免 cpu cache 频繁的换入换出;比如 memcached 缓存系统;
其次,选择的依据根据以上多线程适用的场景来对比自身的业务场景,是否有这样场景需求:数据共享、提供非均质的服务,单任务拆散并行化等;
如果没有必要,或者多进程就可以很好的胜任,就多用多进程,享受单线程编程带来便利;
RCU 的发明者,Paul McKenny 在《Is Parallel Programming Hard, And, If So, What Can You Do About It?》说过:能用多进程方便的解决问题的时候不要使用多线程。
引用出处 https://blog.csdn.net/PirLCK/… 汤小丹 - 计算机操作系统(第四版)