多通道模式 线程进程

线程(多通道模式)
过程我们都知道计算机的核心是CPU,承担所有的计算任务;操作系统是计算机的管理者 , 负责任务调度、资源分配和管理 , 统领整个计算机硬件;应用程序是运行在操作系统上的具有一定功能的程序 。
进程是具有一定独立功能的程序在数据集上的动态执行过程,是操作系统进行资源分配和调度的独立单元,是应用程序运行的载体 。过程是一个抽象的概念,从来没有统一的标准定义 。
通常,一个过程由三部分组成:程序、数据收集和过程控制块 。
程序用于描述进程要完成的功能,是控制进程执行的指令集;
集合是程序执行时需要的数据和工作空间;
程序控制块(PCB)包含进程的描述信息和控制信息,是进程存在的唯一标志 。
流程的特点:
动态性:进程是程序的执行过程,是临时的,有生存期,动态生成 , 动态消亡;
并发性:任何进程都可以与其他进程并发执行;
独立性:进程是系统中用于资源分配和调度的独立单元;
结构:过程由三部分组成:程序、数据和过程控制块 。
线在早期的操作系统中,没有线程的概念 。进程是能够拥有资源并独立运行的最小单位,也是程序执行的最小单位 。任务调度采用时间片轮换的抢占式调度模式,进程是任务调度的最小单位 。每个进程都有自己独立的内存 , 使得每个进程的内存地址相互隔离 。
后来随着计算机的发展,对CPU的要求越来越高,进程间的切换代价昂贵 , 已经不能满足越来越复杂的程序的要求 。所以我发明了线 。
它是线程程序执行中的单个顺序控制流,是程序执行流的最小单位,也是处理器调度和分派的基本单位 。一个进程可以有一个或多个线程,每个线程共享程序的内存空(也就是自己进程的内存空) 。一个标准线程由线程ID、当前指令指针(PC)、寄存器和堆栈组成 。进程由内存空(代码、数据、进程空、打开的文件)和一个或多个线程组成 。
(有些读者看到这里可能会很困惑,觉得这和Java的memory 空模型不一样,但是如果你看过《Java虚拟机深度理解》这本书 , 你就会恍然大悟 。)
如上图,在任务管理器的进程列中,一个字典和一个云笔记是进程 , 进程下有多个线程执行不同的任务 。
任务调度什么是线程?要理解这个概念,我们需要了解操作系统的一些相关概念 。大多数操作系统(如Windows、Linux)采用时间片轮换的抢占式调度方式 。
在一个进程中,当一个线程的任务执行了几个毫秒,就会被操作系统的内核(负责管理每个任务)调度 。处理器将被硬件计数器中断,线程将被迫暂停,其寄存器将被放入内存 。通过检查线程列表,它会决定下一步执行哪个线程 , 并从内存中回收该线程的寄存器,最后恢复该线程的执行,从而执行下一个任务 。
在上述过程中,一个任务被执行的短暂时间称为时间片,任务正在被执行的状态称为运行状态 , 被挂起的线程任务状态称为就绪状态,即等待属于它的下一个时间片 。
这种方式保证了每个线程轮流执行 。因为CPU的执行效率非常高,时间片非常短,在任务之间快速切换,给人多任务“同时”的感觉,这就是我们所说的并发(不要以为并发有多高级,它的实现很复杂,但它的概念很简单,就是一句话:多个任务同时执行) 。多任务操作流程示意图如下:
操作系统中的任务调度
进程和线程之间的差异前面讲了进程和线程,大家可能还是会觉得很困惑,觉得很像 。事实上,进程与线程密不可分 。让我们一起来看看它们:
是线程程序执行的最小单位,而进程是操作系统资源分配的最小单位;
一个进程由一个或多个线程组成 , 线程是一个进程中代码的不同执行路径;
进程之间是相互独立的,但是同一个进程中的每个线程共享程序的内存空(包括代码段、数据集、堆等 。)和一些进程级资源(比如打开文件和信号),一个进程中的线程对其他进程是不可见的;
和调度切换:线程上下文切换比进程上下文切换快得多 。
线程和进程之间的关系示意图:
与流程的资源共享关系
单线程和多线程的关系
总之,线程和进程都是抽象概念 。线程是比进程更小的抽象,线程和进程都可以用来实现并发 。
在早期的操作系统中 , 没有线程的概念 。进程是能够拥有资源并独立运行的最小单位,也是程序执行的最小单位 。相当于一个进程中只有一个线程,进程本身就是一个线程 。因此,线程有时被称为轻量级进程(LWP) 。

推荐阅读