并发与并行

  • 并发在一段时间内,多个任务都会被处理。但在某一时刻,只有一个任务在执行。单核处理器做到的并发,其实是利用时间片的轮转,例如有两个进程 A 和 B,A 运行一个时间片之后,切换到 B,B 运行一个时间片之后又切换到 A。因为切换速度足够快,所以宏观上表现为在一段时间内能同时运行多个程序。
  • 并行在同一时刻,有多个任务在执行。这个需要多核处理器才能完成,在微观上就能同时执行多条指令,不同的程序被放到不同的处理器上运行,这个是物理上的多个进程同时进行。

并发与并行

进程的状态

  • 运⾏状态(Runing):该时刻进程占用 CPU;
  • 就绪状态(Ready):可运行,由于其他进程处于运行状态而暂时停止运行;
  • 阻塞状态(Blocked):该进程正在等待某⼀事件发生(如等待输⼊/输出操作的完成)而暂时停止运行,这时,即使给它 CPU 控制权,它也无法运行;
  • 创建状态(new):进程正在被创建时的状态;
  • 结束状态(Exit):进程正在从系统中消失时的状态;

进程的状态

进程与线程

  • 进程是一个正在执行的程序的实例。每个进程有自己独立的地址空间、全局变量、堆栈、和文件描述符等资源
  • 线程是进程中的一个执行单元。一个进程可以包含多个线程,它们共享进程的地址空间和资源
  • 每个进程在独立的地址空间中运行,不会直接影响其他进程。线程共享同一个进程的内存空间、全局变量和文件描述符。
  • 进程切换需要保存和恢复大量的上下文信息,代价较高。线程切换相对较轻量,因为线程共享进程的地址空间,只需要保存和恢复线程私有的数据。
  • 线程的生命周期由进程控制,进程终止时,其所有线程也会终止。
特性 进程 线程
地址空间 独立 共享
内存开销
上下文切换 慢,开销大 快,开销小
通信 需要IPC机制,开销较大 共享内存,直接通信
创建销毁 开销大,较慢 开销小,较快
并发性
崩溃影响 一个进程崩溃不会影响其他进程 一个线程崩溃可能导致整个进程崩溃

线程上下文切换

  • 这还得看线程是不是属于同⼀个进程:
    1. 当两个线程不属于同⼀个进程,则切换的过程就跟进程上下文切换⼀样;
    2. 当两个线程属于同⼀个进程,因为虚拟内存是共享的,所以在切换时,虚拟内存这些资源就保持不动,只需要切换线程的私有数据、寄存器等不共享的数据
  • 所以,线程的上下文切换相比进程,开销要小很多。

共享内存

  • 允许两个或多个进程共享一个给定的内存区,一个进程写⼊的东西,其他进程⻢上就能看到。
  • 共享内存是最快的进程间通信方式,它是针对其他进程间通信方式运行效率低而专门设计的。
  • 缺点:当多进程竞争同一个共享资源时,会造成数据错乱的问题。

共享内存

虚拟内存

  • 我们实际的物理内存主要是主存,但是物理主存空间有限,所以一般现代操作系统都会想办法把一部分内存块放到磁盘中,用到的时候再装入主存,但是对用户程序而言,是不需要注意实际的物理内存的,为什么呢?因为有虚拟内存的机制。
  • 简单说,虚拟内存是操作系统提供的⼀种机制,将不同进程的虚拟地址和不同内存的物理地址映射起来
  • 每个进程都有自己独立的地址空间,再由操作系统映射到到实际的物理内存。
  • 于是,这里就引出了两种地址的概念:
    1. 程序所使用的内存地址叫做虚拟内存地址(Virtual Memory Address)。
    2. 实际存在硬件里面的空间地址叫物理内存地址(Physical Memory Address)。
      虚拟内存

为什么要使用虚拟内存?

  • 程序是运行在内存中的,程序运行时会将保存在硬盘上的程复制到RAM内存(载入内存),然后CPU执行内存中的程序代码。
  • 如果执行的程序占用内存很大或很多,或同时执行多个程序,就会导致内存消耗殆尽。从而导致程序执行异常或崩溃。

虚拟内存工作原理

  • 当进程开始运行时,先将一部分程序装入内存,另一部分暂时留在外存;当要执行的指令不在内存时,由系统自动完成将它们调入内存的工作;当没有足够的内存时,系统自动选择部分内存(暂不执行的程序)空间,将其中原有的内容交换到磁盘上,并释放这些内存空间供其他进程使用。
  • 这样做的结果使程序的运行丝毫不受影响,使程序在运行中感觉到拥有一个不受内存容量约束的、虚拟的、能够满足自己需求的存储器。