进程/线程并发/并行1.引子下面这张图片非常生动形象地描述了进程与线程和它们之间的关系。2.进程2.1.什么是进程系统分配资源的基本单位。进程是程序运行所需的完整环境是一个活动的实体不仅包含程序代码还包含以下内容堆栈Stack用于存储函数参数、局部变量等临时数据数据段Data Section用于存储全局变量堆Heap运行时动态分配的内存区域ps甚至可以包含文件列表、输入输出设备等。2.2.进程控制块Process Control Block进程控制块PCB是操作系统中用于描述进程状态和属性的数据结构。它包含以下信息进程状态程序计数器PCCPU寄存器状态内存管理信息调度信息2.3.进程状态进程在其生命周期中会经历多个状态转换新建New进程刚被创建就绪Ready等待 CPU 调度执行运行Running正在执行等待Waiting等待 I/O 或其他事件完成终止Terminated执行完成或被强制终止下面是更为详细的七态图挂起静止就绪进程具备运行条件但目前在二级存储器中只有当它被调换到主存才能被调度执行。挂起静止等待进程正在等待某一个事件且在二级存储器中。2.4.进程类型独立进程不与其它进程共享数据或相互影响的进程协作进程需要与其它进程共享数据或协同工作的进程但是进程之间是本来是相互独立的那么协作进程是怎么进行的这就涉及了——进程通信(IPC)。2.5.进程通信内存共享顾名思义就是多个进程共享一个内存空间。一个进程将数据写入共享的内存空间另一个进程从中读取实现通信。ps: 开辟这块共享的内存空间是需要系统调用的但接下来操作内存无需系统调用。消息传递类似邮箱(端口)可以设立消息缓冲区处于操作系统空间需要提供系统调用 ( send(), receive() ) 来发送和接收信息。在这种模式下进程通过操作系统传递消息进行通信直接通信进程直接指定发送或接收方例如send(B, message) 表示 A 向 B 发送消息间接通信通过邮箱mailbox传递消息例如send(X, message) 表示发送到邮箱 X同步机制发送或接收时可选择阻塞或非阻塞模式缓冲机制消息可暂存于队列中队列容量可为 0无缓冲、有限或无限管道、套接字和远程过程调用等都是属于消息传递。监听端口保持开放接收所有进程的消息。3.线程3.1.什么是线程CPU调度和执行的基本单位。线程本身不包含代码通过程序计数器指向特定代码段(打破一个进程拥有单一PC的限制)同时每个线程拥有自己的栈空间从而可以并发处理特定代码段。一个进程可以有多个线程而且同一进程中的线程共享资源调度所需的成本远小于进程。3.2.线程的实现方式内核级线程Kernel-level Thread由操作系统直接管理调度开销大但支持真正的并发。用户级线程User-level Thread由线程库在用户空间管理创建和切换快但无法利用多核CPU。混合线程Hybrid Thread结合上述两种方式如 Java 的线程模型就是基于操作系统线程实现的。4.并发与并行并发通过快速切换上下文或者是CPU调度以达到同一时刻处理多个任务的假象并行真正同时执行多个任务通过多核CPU。上下文就是进程所处环境的状态包括PC、CPU寄存器的数据、主存的内容。中断触发时CPU硬件会自动做1.切换到内核栈;2.把PC等数据压入栈;3.跳转到中断处理程序。数据并行数据分配到多个核心同时执行相同操作。比如在对一个数组判断其中质数的个数时将数组分为多组同时进行判断计数。任务并行数据可以相同也可以不同同时执行不同操作。比如对一个数组同时执行max, min, avg操作也可以是对两个数组一个执行max另一个执行min。