7

进程的定义

  • 一个进程实体包括三部分:程序段,数据段,pcb,这个进程实体就简称为进程

进程的特征

  1. 动态性

    • 进程由创建而产生,由调度而执行,由撤销而消亡
    • 有一定生命期
    • 进程的实质是进程实体的执行过程
  2. 并发性

    • 指多个进程实体能够同时存在内存中,且能够在一段时间内同时运行。这也正是引入进程概念的目的
  3. 异步性

    • 每个进程都是按各自独立的、不可预知的速度向前推进
    • 正是由于有异步性,os 才会引进相应的同步机制,才能保证进程并发执行的结果是可再现的
  4. 独立性

    • 进程是独立运行,独立接受调度的基本单位

进程的基本状态及转换

  • 创建、就绪、执行、阻塞、终止
  • 切记,创建完并非立即执行,而是就绪状态,当 CPU 调度时才转变为执行状态
  • 执行->就绪,是由于时间片用完,让出 CPU 资源,变回就绪状态
  • 就绪状态:指进程已经处于准备好运行的状态,那具体什么是准备好呢?即进程已分配到除 CPU 以外的所有必要资源后,只要再获得 CPU,便可立即执行

clipboard.png

  • 创建、静止就绪、活动就绪、执行、静止阻塞、活动阻塞、终止
  • 创建 -> 活动就绪:在当前系统的性能和内存的容量均允许的情况下,完成对进程创建的必要操作后,进程便为活动就绪状态
  • 创建 -> 静止就绪:不分配给新建进程所需资源,主要是主存,所以该进程被安置在外存,不参与调度,状态转为静止就绪状态

clipboard.png

操作系统内核

定义

将一些与硬件紧密联系的模块(如中断处理程序等)、各种常用设备的驱动程序、运行频率较高的模块(如时钟管理,进程调度),都安排在紧靠硬件的软件层次中,将它们常驻内存,即通常称为 OS 内核。
目的或者有点有两个:

  • 对这些软件进行保护,防止遭受其他应用程序的破坏
  • 提高 OS 的运行效率(因为常驻内存)

OS 内核两大功能:

  1. 支撑功能

    • 中断处理

      • 内核最基本的功能
      • 各种类型的系统调用、键盘命令的输入、进程调度、设备驱动等,都依赖于中断
    • 时钟管理

      • 内核的一项基本功能
      • 例如时间片轮转调度中,每当时间片用完时,便由时钟管理产生一个中断信号,促使调度程序重新进行调度
      • 实时系统中的截止时间截止、批处理系统中的最长运行时间控制等也依赖于时钟管理
    • 原语操作

      • 所谓原语,就是由若干条指令组成的,用于完成一定功能的一个过程。
      • 原子操作是指一个操作中的所有动作要么全做,要么全不做。它是一个不可分割的基本单位。
  2. 资源管理功能,包括进程管理、 存储器管理、设备管理

进程和线程的区别

从调度性、并发性、系统开销、拥有资源、独立性、支持多处理机系统方面比较

  • 调度性

    • 线程是调度的基本单位,是能独立运行的基本单位,线程切换代价低
    • 只有从一个进程中的线程切换到另一个进程中的线程时,才会引起进程的切换
  • 拥有资源

    • 进程是拥有资源的基本单位,而线程仅有一点必不可少,能保证独立运行的资源而已
    • 那线程拥有哪些必不可少的资源呢?如线程控制块 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/...
汤小丹-计算机操作系统(第四版)

CanThink
107 声望16 粉丝

I am a Gopher! I love back-end development, I like to research source code, support open source, and enjoy sharing.