并发编程概念
并发编程
【一】操作系统及计算机发展
【1】操作系统
【1.1】操作系统的出现
- 程序员无法把所有的硬件操作细节都了解到
- 管理这些硬件并且加以优化使用是非常繁琐的工作,这个繁琐的工作就是操作系统来干的
- 有了他,程序员就从这些繁琐的工作中解脱了出来,只需要考虑自己的应用软件的编写就可以了
- 应用软件直接使用操作系统提供的功能来间接使用硬件。
【1.2】操作系统的本质是一个软件
- 操作系统就是一个协调、管理和控制计算机硬件资源和软件资源的控制程序。
- 操作系统位于计算机硬件与应用软件之间,本质也是一个软件。
- 操作系统由操作系统的内核(运行于内核态,管理硬件资源)以及系统调用(运行于用户态,为应用程序员写的应用程序提供系统调用接口)两部分组成
【1.2.1】操作系统的内核(运行于内核态,管理硬件资源)
-
隐藏硬件调用接口
-
隐藏了丑陋的硬件调用接口,为应用程序员提供调用硬件资源的更好,更简单,更清晰的模型(系统调用接口)。
-
应用程序员有了这些接口后,就不用再考虑操作硬件的细节,专心开发自己的应用程序即可。
-
例如:操作系统提供了文件这个抽象概念,对文件的操作就是对磁盘的操作,有了文件我们无需再去考虑关于磁盘的读写控制(比如控制磁盘转动,移动磁头读写数据等细节)
-
【1.2.2】系统调用(运行于用户态,为应用程序员写的应用程序提供系统调用接口)
- 资源有序化
- 将应用程序对硬件资源的竞态请求变得有序化
- 例如:很多应用软件其实是共享一套计算机硬件,比方说有可能有三个应用程序同时需要申请打印机来输出内容,那么a程序竞争到了打印机资源就打印,然后可能是b竞争到打印机资源,也可能是c,这就导致了无序,打印机可能打印一段a的内容然后又去打印c...,操作系统的一个功能就是将这种无序变得有序。
【2】计算机发展
计算机发展阶段 | 时间 | 组成 | 改进 | 缺陷 |
---|---|---|---|---|
第一代计算机 | 1940~1955 | 真空管和穿孔卡片 | 没有操作系统的概念 所有的程序设计都是直接操控硬件 | |
第二代计算机 | 1955~1965 | 晶体管和批处理系统 | 批处理,节省机时 | 全程需要人参与,仍是串行,无法及时调试程序 |
第三代计算机 | 1965~1980 | 集成电路芯片和多道程序设计 | 运用多道技术 | |
第四代计算机 | 1980至今 | 个人计算机 | 支持(伪)并发的能力 |
【1.1】第二代计算机
批处理系统
批处理系统是一种计算机操作系统的执行模式,它主要用于处理一批预定的作业(Job)或任务,而不需要用户的交互。这些作业通常是按照一定的顺序提交的,系统在后台自动执行,无需用户的实时干预。批处理系统的主要特点包括:
- 自动执行: 用户提交的作业按照一定的顺序在系统中自动执行,无需用户实时监控和交互。
- 预定作业: 用户可以预先编写一批作业,并按照一定的规则提交给批处理系统。这些作业可以包括程序、脚本或其他需要在计算机上执行的任务。
- 无人值守: 作业执行过程中,系统不需要用户的干预,整个过程是无人值守的。
- 资源分配: 批处理系统负责合理分配计算机资源,例如处理器时间、内存等,以确保每个作业都能够得到适当的资源。
- 作业队列: 批处理系统通常会维护一个作业队列,按照先后顺序执行队列中的作业。
- 日志记录: 批处理系统会记录作业的执行情况,包括开始时间、结束时间、执行结果等,以便后续的跟踪和分析。
批处理系统适用于一些需要周期性执行、无需用户交互、能够预先计划的任务。它在许多领域都得到了广泛应用,特别是在大型数据中心、服务器管理和定期执行的任务中。
一些操作系统提供了专门的批处理工具和系统,例如Unix/Linux中的Cron,Windows中的任务计划器。这些工具允许用户配置定时执行的任务,实现了批处理系统的功能。
【1.1.1】批处理系统的缺点
尽管批处理系统在一些场景下非常有效,但它也有一些缺点和局限性,这些缺点可能在某些应用环境中成为问题:
- 延迟问题: 批处理系统通常按照作业队列的顺序执行作业,如果某个作业因为某种原因执行时间过长,可能会延迟后续作业的执行。
- 不适合交互式任务: 批处理系统更适用于无人值守、预定计划的任务。对于需要用户交互或实时响应的任务,批处理系统并不是最合适的选择。
- 资源分配难以优化: 批处理系统在资源分配方面可能存在一定的难以优化的问题。如果某个作业需要较多的计算资源,可能会影响其他作业的执行。
- 难以适应动态环境: 批处理系统通常是静态的,对于动态变化的环境不够灵活。在需要动态调整任务执行顺序或频率的情况下,批处理系统可能显得不够灵活。
- 难以处理突发事件: 批处理系统通常是按照预定的计划执行作业,难以适应突发事件或紧急任务的处理需求。
- 作业依赖性: 如果作业之间存在依赖关系,而批处理系统没有足够的支持来管理和解决这些依赖关系,可能会导致作业执行的不确定性和错误。
- 难以监控和调试: 由于批处理系统是自动执行的,可能难以实时监控和调试作业的执行过程。一旦发生问题,排查和修复可能会相对困难。
- 经过硬件的更新和技术的迭代,开发出了多道程序设计的执行模式
【1.2】第三代计算机
【1.2.1】多道程序设计
多道程序设计(Multiprogramming)是一种操作系统的执行模式,其主要目标是提高计算机系统的利用率。在多道程序设计中,多个程序同时存在于内存中,CPU能够在这些程序之间进行切换执行,从而减少CPU的空闲时间,提高系统的吞吐量。
关键特征和原理包括:
- 内存中同时存在多个程序: 多道程序设计允许多个程序同时存在于内存中,而不是等待一个程序的执行结束后再加载下一个程序。
- 程序的并发执行: CPU在多个程序之间进行快速的切换,使得多个程序在并发执行的感觉下,共享计算机系统的资源。
- 中断机制: 中断机制用于实现程序的切换和处理外部事件。当一个程序等待I/O或发生其他事件时,操作系统会中断当前程序的执行,将CPU切换到另一个程序。
- 进程调度: 操作系统负责进程的调度,决定哪个程序获得CPU的执行权。进程调度算法的选择对系统性能有重要影响。
- 虚拟存储: 多道程序设计通常涉及虚拟存储的使用,以便将不同程序的代码和数据存放在内存中。
- 提高系统吞吐量: 多道程序设计通过减少CPU的空闲时间,提高了计算机系统的吞吐量,充分利用了计算机资源。
【1.2.1.1】多路复用
在多道程序设计(Multiprogramming)中,多路复用是一种关键的技术,它用于在多个程序之间有效地共享计算机系统的资源,特别是 CPU 时间。多路复用允许系统在多个程序之间进行快速的切换,以提高系统的吞吐量和效率。
主要特点和原理包括:
- 并发执行: 多道程序设计允许多个程序同时存在于内存中,每个程序都被分配一个时间片段,在其时间片段内执行。这使得程序在并发执行的感觉下,共享计算机系统的资源。
- 时间片轮转: 系统采用时间片轮转(Time Sharing)或其他调度算法,将CPU的执行时间划分成小的时间片,每个程序在一个时间片内执行。当一个程序的时间片用完时,系统会切换到下一个程序。
- 中断机制: 当一个程序等待I/O或发生其他事件时,系统会中断当前程序的执行,将CPU切换到另一个程序。这种中断机制是多道程序设计中实现多路复用的重要手段。
- 进程调度: 操作系统负责进程的调度,决定哪个程序获得CPU的执行权。进程调度算法的选择影响着多道程序设计的性能。
- 提高系统吞吐量: 多路复用通过在多个程序之间迅速切换,减少了CPU的空闲时间,提高了计算机系统的吞吐量。
- 虚拟存储: 多道程序设计通常涉及虚拟存储的使用,以便将不同程序的代码和数据存放在内存中。
【1.2.1.2】多路复用的两种方式
- 路复用的两种方式包括空间上的复用和时间上的复用,用于有效地共享通信通道或资源。
-
空间上的复用:
-
在空间上的复用是指多个通信实体共享同一物理通道或媒体的过程。这种复用方式通常涉及将通信通道划分成不同的频率带、波长、空间路径等,以便多个独立的通信实体能够同时使用同一通道,而彼此不会干扰。
-
例子:
-
频分复用(Frequency Division Multiplexing,FDM): 不同通信实体通过使用不同的频率带来共享通信媒体。每个通信实体占用独立的频率范围,使它们可以在同一通信媒体上同时传输。
-
波分复用(Wavelength Division Multiplexing,WDM): 在光纤通信中,不同通信实体使用不同的光波长,使它们能够在同一光纤上传输数据。
-
-
-
时间上的复用:
-
在时间上的复用是指多个通信实体在不同的时间段内共享同一通信通道或媒体。这种复用方式涉及到将时间划分成不同的时隙,使得不同的通信实体能够在不同的时刻使用通信通道。
-
例子:
-
时分复用(Time Division Multiplexing,TDM): 不同通信实体在不同的时隙内传输数据。通信通道被划分成一系列时间片,每个通信实体在自己的时隙内传输数据。
-
统计时分复用(Statistical Time Division Multiplexing,STDM): 时分复用的一种变体,允许通信实体根据实际需要动态分配时隙,提高了灵活性和效率。
-
-
这两种复用方式可以单独应用,也可以结合使用,以实现更高效的通信资源利用。在实际应用中,选择何种复用方式取决于通信系统的要求、特性和可用资源。
【1.2.2】分时系统
分时系统(Time-Sharing System)是一种操作系统的设计和执行模式,其主要目标是允许多个用户通过终端同时访问计算机系统,并在用户之间共享计算机资源。这种系统设计模式的核心思想是将计算机的处理时间分成小的时间片段,轮流分配给不同的用户,以实现多用户之间的交互式使用。
以下是分时系统的主要特点和原理:
- 多用户支持: 分时系统支持多个用户通过终端访问计算机系统。每个用户都被分配一个独立的终端,并能够同时与计算机系统进行交互。
- 虚拟机制: 对每个用户提供一个虚拟机,使得每个用户感觉像拥有整个计算机系统一样。每个虚拟机都运行一个独立的用户程序,用户之间相互隔离。
- 时间片轮转: 计算机系统将处理时间划分成小的时间片段(time slices),通常称为时间片(time slice)或量子(quantum)。每个用户程序在一个时间片内执行,当时间片用完时,系统会切换到下一个用户程序。
- 进程调度: 操作系统负责对用户程序的进程进行调度,决定哪个程序获得CPU的执行权。采用时间片轮转或其他调度算法,以公平地分配CPU时间。
- 用户交互: 分时系统允许用户在其终端上输入命令,执行程序,并实时地获取计算机系统的响应。这提供了一种交互式的计算环境。
- 资源共享: 多个用户共享计算机系统的资源,包括CPU、内存、存储等。资源的共享通过合理的调度和隔离机制来实现。
- 响应时间: 分时系统注重提高系统的响应时间,使得用户能够迅速获得计算机系统的反馈。
分时系统在大学实验室、企业办公环境等场景中得到广泛应用。它使得多个用户能够在同一台计算机上同时进行工作,共享计算机资源,提高了系统的效率和利用率。
【1.2.3】实时系统
实时系统(Real-Time System)是一种操作系统设计和执行模式,其主要目标是满足对任务执行时间的严格要求,即在规定的时间内完成任务。实时系统通常用于处理对时间要求敏感的应用,例如航空航天控制、医疗设备监控、工业自动化等领域,其中任务的完成时间对系统的性能和安全性至关重要。
以下是实时系统的主要特点和原理:
- 任务完成时间: 实时系统要求任务在规定的时间内完成,包括硬实时系统(必须在规定的时间内完成任务)和软实时系统(对任务的时间要求有一定的宽限度)。
- 可预测性: 实时系统对任务响应时间的可预测性有较高要求,系统需要在规定的时间内产生可靠的结果。
- 任务调度: 实时系统采用严格的任务调度算法,确保高优先级任务能够及时获得CPU执行权,以满足其对实时性的要求。
- 中断处理: 实时系统通常具有优先级中断处理机制,以确保及时响应系统事件,例如传感器数据的采集、紧急任务的处理等。
- 硬件支持: 实时系统可能需要特定的硬件支持,例如硬实时时钟、实时操作系统内核等,以确保系统能够准确地控制任务的执行时间。
- 可靠性: 实时系统对系统的可靠性要求较高,确保在各种条件下都能够按照预定的时间完成任务。
- 应用领域: 实时系统广泛应用于对时间敏感的领域,如航空航天、医疗、工业自动化、汽车控制系统等。
实时系统的设计和实现涉及到对任务的时间分析、调度算法的选择、中断处理机制的优化等方面的考虑。硬实时系统通常更加严格,要求对任务执行的时间进行精确保障,而软实时系统则更灵活,允许在一定条件下略微超时。
【1.3】第四代计算机
- 即使可以利用的cpu只有一个(早期的计算机确实如此),也能保证支持(伪)并发的能力。
- 将一个单独的cpu变成多个虚拟的cpu(多道技术:时间多路复用和空间多路复用+硬件上支持隔离),没有进程的抽象,现代计算机将不复存在。
【1.4】操作系统提高效率的技术迭代
操作系统提高效率的技术迭代发展史的主要阶段:
- 批处理系统(Batch Processing System):
- 时期: 1950年代初至1960年代中期
- 特点: 批处理系统允许多个作业一次性提交到计算机系统中,由系统按照预定顺序执行。这种方式提高了计算机的利用率,但作业之间的切换和中断较少。
- 分时系统(Time-Sharing System):
- 时期: 1960年代中期至1970年代中期
- 特点: 分时系统允许多个用户同时通过终端访问计算机系统,系统在用户之间快速切换,实现了交互性。分时系统为每个用户提供了独立的虚拟机,共享计算机资源。
- 实时系统(Real-Time System):
- 时期: 1960年代末至1970年代末
- 特点: 实时系统用于处理对时间要求敏感的应用,如航空航天、工业控制等。实时系统要求在指定的时间内完成任务,对系统响应时间和可预测性提出更高要求。
- 多道程序设计(Multiprogramming):
- 时期: 1960年代中期至今
- 特点: 多道程序设计允许多个程序同时存在于内存中,CPU能够在这些程序之间进行切换执行,提高了计算机系统的吞吐量。引入了中断机制、进程调度等概念。
- 虚拟存储(Virtual Memory):
- 时期: 1960年代末至今
- 特点: 虚拟存储允许将程序的一部分加载到内存,而不是整个程序。这样,计算机系统可以运行比物理内存更大的程序,提高了程序的大小和复杂度。
- 微内核结构(Microkernel Architecture):
- 时期: 1980年代末至今
- 特点: 微内核结构将操作系统内核中的核心功能抽象为最小的模块,其他服务和功能则以外部插件形式存在。这样的架构更加模块化、可维护,方便定制和扩展。
- 分布式系统(Distributed Systems):
- 时期: 1990年代至今
- 特点: 分布式系统将计算资源分布在多个计算机上,通过网络连接进行协同工作。分布式系统提高了系统的可靠性、可扩展性和容错性。
- 虚拟化技术(Virtualization):
- 时期: 2000年代至今
- 特点: 虚拟化技术通过在一台物理机上创建多个虚拟机,使得每个虚拟机可以独立运行操作系统和应用程序。这提高了服务器资源的利用率和灵活性。
- 容器化技术(Containerization):
- 时期: 2010年代至今
- 特点: 容器化技术通过容器将应用程序和其依赖项打包在一起,实现轻量级、可移植的部署。容器化提高了应用程序的可移植性和可部署性。
【3】总结
【3.1】操作系统的作用
- 隐藏丑陋复杂的硬件接口,提供良好的抽象接口
- 管理、调度进程,并且将多个进程对硬件的竞争变得有序
【3.2】多道技术
(1)产生背景:针对单核,实现并发
- 现在的主机一般是多核,那么每个核都会利用多道技术 有4个cpu,运行于cpu1的某个程序遇到io阻塞,会等到io结束再重新调度,会被调度到4个cpu中的任意一个,具体由操作系统调度算法决定。
(2)空间上的复用:如内存中同时有多道程序
- 空间上的复用指的是在内存中同时运行多个程序,这样可以有效地利用内存资源。
(3)时间上的复用:复用一个cpu的时间片
-
指共享同一台机器的多个进程可以轮流使用CPU,从而避免了长时间等待的情况发生。
-
强调:遇到io切,占用cpu时间过长也切,核心在于切之前将进程的状态保存下来,这样才能保证下次切换回来时,能基于上次切走的位置继续运行
【3.3】操作系统发展史
- 第一代计算机(1940~1955):真空管和穿孔卡片
- 第二代计算机(1955~1965):晶体管和批处理系统
- 第三代计算机(1965~1980):集成电路芯片和多道程序设计
- 第四代计算机(1980~至今):个人计算机
【二】进程
【1】程序与进程
- 程序(Program):
- 定义: 程序是一组按照特定顺序执行的指令或代码,它是一种静态的概念,通常保存在存储介质中(如硬盘、固态硬盘、光盘等)。
- 特点: 程序是一段可执行的二进制代码或源代码,它描述了计算机应该执行的任务,但在运行之前不占用系统的资源。
- 例子: 一个可执行文件、源代码文件或者脚本可以被称为程序。
- 进程(Process):
- 定义: 进程是程序在运行时的实例。它包括程序执行时所需的资源(如内存、文件句柄等)和程序计数器(指示程序执行的位置)。
- 特点: 进程是一个动态的概念,是程序在执行时的状态。每个进程都是独立的、拥有自己的地址空间和系统资源,与其他进程隔离。
- 例子: 当你运行一个应用程序时,该应用程序的执行实例就成为一个进程。
关键区别:
- 时序关系: 程序是静态的,是一组指令的集合;而进程是程序的运行实例,是动态的,包括了程序在执行时所需的状态和资源。
- 资源占用: 程序在运行之前不占用系统资源,而进程在运行时占用了系统资源,包括内存、文件句柄等。
- 隔离性: 进程之间是相互隔离的,每个进程拥有独立的地址空间,而程序是可以被共享和复用的。
简而言之,程序是指静态的代码,而进程是指运行时的动态实例,是程序的执行状态。多个进程可以同时执行,每个进程都有自己的独立状态和资源。
- 进程:正在进行的一个过程或者说一个任务,而负责执行任务则是cpu。
- 程序:程序仅仅只是一堆代码而已,而进程指的是程序的运行过程。
【2】进程与线程
【2.1】进程
在计算机科学中,进程(Process)是指在系统中正在运行的一个程序的实例。每个进程都是一个独立的、独立运行的程序单位,拥有自己的内存空间、文件和系统资源。进程是操作系统进行任务调度和资源分配的基本单位。
以下是进程的主要特征和概念:
- 独立性: 每个进程都是独立运行的,一个进程的崩溃不会影响其他进程的执行。每个进程拥有自己的地址空间,不会直接访问其他进程的数据。
- 资源分配: 操作系统为每个进程分配必要的资源,包括内存、文件描述符、CPU时间等。进程可以通过系统调用向操作系统请求额外的资源。
- 并发执行: 多个进程可以并发执行,即同时运行在计算机系统中。这通过操作系统的任务调度机制来实现,每个进程在时间片内交替执行。
- 通信机制: 进程之间可能需要进行通信,共享数据或进行协同工作。操作系统提供了不同的进程间通信(Inter-Process Communication,IPC)机制,如管道、消息队列、共享内存等。
- 状态: 一个进程可以处于不同的状态,例如就绪、运行、阻塞等。操作系统通过进程调度算法控制进程的状态转换。
- 创建和销毁: 操作系统负责创建新的进程,称为父进程。新创建的进程称为子进程。进程在完成任务后,可以被终止或销毁。
- 上下文切换: 当操作系统切换到另一个进程执行时,会进行上下文切换,保存当前进程的状态并加载新进程的状态。这确保了多个进程之间的平滑切换。
- 进程控制块(PCB): 操作系统为每个进程维护一个数据结构,称为进程控制块。PCB包含了进程的关键信息,如程序计数器、寄存器状态、内存分配信息等。
【2.2】线程
线程(Thread)是进程中的一个执行流,是操作系统能够进行运算调度的最小单位。一个进程可以包含多个线程,它们共享进程的资源,但拥有独立的执行流。线程在一个进程内共享同一地址空间,可以访问相同的变量和数据结构,但每个线程有自己的寄存器和栈。
以下是线程的主要特点和概念:
- 轻量级: 相对于进程而言,线程是轻量级的执行单元。因为线程在同一地址空间内运行,创建和切换线程的开销相对较小。
- 共享资源: 线程在同一进程中共享进程的资源,包括内存、文件描述符等。这使得线程之间更容易进行通信和共享数据。
- 独立执行: 每个线程拥有自己的执行流,可以并发执行。多线程可以在同一时间内执行不同的任务,提高系统的并发性能。
- 上下文切换: 线程之间的切换称为上下文切换。在同一进程中的线程切换相对较快,因为它们共享相同的地址空间,不需要切换内存空间。
- 线程安全: 多线程访问共享资源可能导致数据竞争和不确定的结果。线程安全是一种设计和编码的原则,确保多个线程可以安全地访问共享资源。
- 创建和销毁: 操作系统负责线程的创建和销毁。线程的创建开销相对较小,可以更灵活地适应任务的需求。
- 并发编程: 线程是并发编程的基本单元。通过多线程编程,可以实现异步操作、提高程序的响应性和效率。
- 用户级线程和内核级线程: 用户级线程是由用户空间的线程库管理的,而内核级线程由操作系统内核管理。一些系统使用混合模型,将用户级线程映射到内核级线程。
- 线程池: 为了提高线程的管理效率,可以创建线程池,预先创建一组线程,重复使用它们来执行任务,而不是频繁地创建和销毁线程。
"""
厨师做饭,厨师做一道菜、应该有菜谱,安装菜谱的程序一步一步的做,在这个过程中,菜谱就是程序,程序就是路程. 做菜的过程就是进程,厨师就是线程,如果做菜完毕了,进程就不存在了,线程是进程中实际做事儿的.
"""
# 在一个进程中,可以有多个线程,一个进程中只有一个线程,也是可以的。
# 一个进程中至少要有一个线程
【3】调度算法
【3.1】调度算法的由来
- 要想多个进程交替运行
- 操作系统必须对这些进程进行调度
- 这个调度也不是随即进行的,而是需要遵循一定的法则
- 由此就有了进程的调度算法。
【3.2】常见的调度算法
- 先来先服务(First-Come, First-Served,FCFS):
- 原则: 按照进程到达就绪队列的顺序进行调度,先到达的进程先执行。
- 特点: 简单直观,但可能导致"等待时间过长"的问题(即先到达的长作业可能会影响后到达的短作业)。
- 最短作业优先(Shortest Job Next,SJN):
- 原则: 选择执行时间最短的进程先执行。
- 特点: 能够最小化平均等待时间,但可能导致长作业被饿死(一直等待短作业执行完)。
- 最短剩余时间优先(Shortest Remaining Time First,SRTF):
- 原则: 在执行过程中,如果新到达的进程有更短的执行时间,就抢占当前正在执行的进程。
- 特点: 是 SJN 的抢占式版本,能够更灵活地响应新到达的进程。
- 轮转调度(Round Robin,RR):
- 原则: 按照就绪队列的顺序轮流执行每个进程,每个进程执行一个时间片后切换到下一个进程。
- 特点: 公平且简单,但可能导致高响应时间和低吞吐量。
- 多级队列调度(Multilevel Queue Scheduling):
- 原则: 将就绪队列分成多个优先级队列,每个队列使用不同的调度算法。进程根据优先级分配到相应队列中。
- 特点: 不同优先级的进程可以使用不同的调度策略,适用于具有多种类型作业的系统。
- 多级反馈队列调度(Multilevel Feedback Queue Scheduling):
- 原则: 类似于多级队列,但进程可以在不同队列之间移动。进程等待时间越长,优先级越低。
- 特点: 适应性强,能够在不同优先级之间动态调整。
- 最高响应比优先(Highest Response Ratio Next,HRRN):
- 原则: 选择响应比最高的进程先执行,响应比定义为(等待时间 + 服务时间)/ 服务时间。
- 特点: 能够综合考虑等待时间和服务时间,优先执行响应比最高的进程。
【4】并发与并行
-
并发(Concurrency)和并行(Parallelism)描述了多个任务或操作在计算机系统中执行的方式。
- 并发(Concurrency):
- 定义: 并发指的是多个任务在相同的时间段内执行,但不一定是同时进行的。在并发执行中,任务可能以交替的方式共享 CPU 时间,通过操作系统的调度算法来实现。
- 特点: 并发强调多个任务之间可能存在重叠的执行时间,任务在时间上可能交替执行,但并不要求它们同时进行。
- 并行(Parallelism):
- 定义: 并行指的是多个任务在同一时刻同时执行,利用多个处理单元或者多核处理器实现。在并行执行中,各个任务同时运行,提高了整体的处理能力。
- 特点: 并行强调多个任务在同一时刻独立执行,通常需要多个物理或逻辑处理单元。
- 关键区别:
- 时间上的关系: 并发是指任务在时间上可能有重叠,但不一定是同时;而并行是指任务在同一时刻同时进行。
- 资源需求: 并发通常可以在单个处理单元上实现,通过任务切换来模拟交替执行;而并行通常需要多个处理单元,可以是多核处理器、多台计算机等。
- 任务之间的关系: 并发强调任务之间可能有交替执行的关系,而并行强调任务在同一时刻独立执行。
- 并发(Concurrency):
在实际应用中,通常会同时使用并发和并行的概念,通过并发来处理任务之间的逻辑关系,通过并行来提高整体系统的性能。例如,一个应用程序可能通过并发处理用户界面和后台任务,同时通过并行利用多核处理器提高计算性能。
- 每日一道面试题-并发与并行有什么区别? - 知乎 (zhihu.com)
- 并发和并行的区别
- 并发,指的是多个事情,在同一时间段内同时发生了。
并行,指的是多个事情,在同一时间点上同时发生了。 - 并发的多个任务之间是互相抢占资源的。
并行的多个任务之间是不互相抢占资源的、 - 只有在多CPU的情况中,才会发生并行。否则,看似同时发生的事情,其实都是并发执行的。
- 并发,指的是多个事情,在同一时间段内同时发生了。
- 并发和并行的区别
【5】同步/异步/阻塞/非阻塞
【5.1】同步与异步
- 同步(Synchronous):
- 定义: 同步是指程序按照顺序执行,每个操作都必须等待上一个操作完成后才能执行。程序的执行是阻塞的,直到一个操作完成,才能继续执行下一个操作。
- 特点: 同步操作是顺序的、有序的,执行顺序是可预测的。在同步模式下,程序会等待任务的完成,直到任务完成才会继续执行下一步。
- 异步(Asynchronous):
- 定义: 异步是指程序的执行不按照代码的顺序来,某个操作的完成不需要等待,而是通过回调、事件等机制通知程序。
- 特点: 异步操作不阻塞程序的执行,允许程序继续执行其他任务。任务的完成可能是通过回调函数、事件触发等方式通知程序。
【5.2】阻塞与非阻塞
- 阻塞(Blocking):
- 定义: 阻塞是指调用结果返回之前,当前线程会被挂起,无法执行其他操作。程序会一直等待,直到得到结果或者超时。
- 特点: 阻塞模式下,调用者需要等待调用的操作完成后才能继续执行下一步操作。
- 非阻塞(Non-blocking):
- 定义: 非阻塞是指在等待调用结果的过程中,当前线程不会被挂起,而是可以继续执行其他操作。调用者需要通过轮询、回调等方式来获取调用结果。
- 特点: 非阻塞模式下,调用者不需要等待调用的操作完成,可以继续执行其他任务。
【5.3】同步与阻塞和异步与非阻塞
- 同步与阻塞:
- 同步: 同步是指程序按照顺序执行,每个操作都必须等待上一个操作完成后才能执行。
- 阻塞: 阻塞是指在执行一个操作时,程序会被挂起或阻塞,直到这个操作完成。在阻塞模式下,程序可能无法执行其他操作。
- 异步与非阻塞:
- 异步: 异步是指程序的执行顺序不是按照代码的顺序来的,某个操作的完成不需要等待,而是通过回调、事件等机制通知程序。
- 非阻塞: 非阻塞是指程序在执行一个操作时,不会被挂起,而是会立即返回,继续执行下一条语句。程序可以通过轮询或回调等方式检查操作是否完成。
关键区别:
- 等待方式: 同步与异步关注的是等待结果的方式,同步等待结果,而异步通过回调或事件通知。
- 是否挂起: 阻塞与非阻塞关注的是程序执行时是否被挂起,阻塞时程序可能无法执行其他操作,而非阻塞时可以继续执行其他操作。
实际应用中,同步与异步、阻塞与非阻塞常常结合使用。例如,可以使用异步模型来处理 I/O 操作,以提高程序的性能,同时在需要等待结果的地方使用同步或者非阻塞的方式。这种组合使用可以更灵活地处理不同场景下的需求。
【5.4】组合使用
- 同步非阻塞
- 同步: 操作仍然以同步的方式发起,即按照代码的顺序执行,任务的调用者等待任务的完成。
- 非阻塞: 调用操作后,程序不会被挂起或等待,而是立即返回。此时,程序可以继续执行后续的任务,而不必等待操作完成。
- 异步非阻塞
- 异步: 操作以异步的方式进行,即调用者发起操作后,可以继续执行后续的任务,而不必等待操作完成。操作完成后,通常通过回调函数、事件等方式来处理结果。
- 非阻塞: 在发起异步操作后,调用者不会被挂起或等待操作完成,而是可以继续执行其他任务。通常,调用者通过轮询或回调等方式来检查异步操作是否完成。
【6】进程的层次结构
进程的层次结构指的是在操作系统中,进程之间可能存在的父子关系,形成一个树状结构。这个树状结构反映了进程的派生和关联关系。在一般的操作系统中,进程的层次结构可以描述为:
- 根进程(Root Process): 操作系统启动时创建的第一个进程通常被称为根进程。根进程是整个进程树的起点。
- 父进程和子进程: 当一个进程创建另一个进程时,创建者被称为父进程,而被创建的进程是子进程。子进程可以继续创建更多的子进程,形成层次结构。
- 兄弟进程: 同一个父进程下的子进程被称为兄弟进程。兄弟进程是由同一个父进程创建的并行执行的进程。
这样的层次结构可以用一个树状图表示,其中根节点是根进程,每个节点表示一个进程,边表示父子关系。这种层次结构有助于理解和管理多个进程之间的关系,也有助于资源的管理和分配。
这个结构的一个示意图如下:
Root Process
|
------------
| | |
Child Child Child
|
------------
| | |
Grand Grand Grand
...
- 无论UNIX还是windows
- 进程只有一个父进程
- 不同的是:
- 在UNIX中所有的进程
- 都是以init进程为根,组成树形结构。
- 父子进程共同组成一个进程组
- 这样,当从键盘发出一个信号时,该信号被送给当前与键盘相关的进程组中的所有成员。
- 在windows中,没有进程层次的概念
- 所有的进程都是地位相同的
- 唯一类似于进程层次的暗示
- 是在创建进程时
- 父进程得到一个特别的令牌(称为句柄)
- 该句柄可以用来控制子进程
- 但是父进程有权把该句柄传给其他子进程
- 这样就没有层次了。
- 在UNIX中所有的进程
【7】进程的状态
在操作系统中,一个进程可以处于多种不同的状态,而这些状态通常通过进程的状态图来描述。进程的状态主要包括以下几种:
- 创建(Creation): 进程被创建但还未执行。在这个状态下,操作系统正在为进程分配必要的资源和初始化进程控制块等信息。
- 就绪(Ready): 进程已经准备好执行,但由于系统中可能有多个就绪状态的进程,操作系统还未选择具体的进程执行。在这个状态下,进程等待被调度。
- 运行(Running): 进程正在执行其指令,占用 CPU 时间。在多任务系统中,可能有多个进程轮流执行。
- 阻塞(Blocked): 进程暂时无法执行,因为它正在等待某个事件的发生,比如等待 I/O 操作完成、等待某个信号等。在这个状态下,进程暂时让出 CPU,等待特定条件满足后重新进入就绪状态。
- 终止(Terminated): 进程已经执行完毕,或者由于某种原因被终止。在这个状态下,系统会释放进程占用的资源,清理相关的进程控制块等信息。
进程在这些状态之间可能会发生状态转换,具体的状态转换图可能会因操作系统的不同而有所差异。一般而言,典型的状态转换包括:
- 创建 -> 就绪:当进程被创建后,分配了必要的资源,它可以进入就绪状态等待调度。
- 就绪 -> 运行:当操作系统选择了就绪状态的某个进程来执行时,进程进入运行状态。
- 运行 -> 阻塞:当进程需要等待某个事件时,比如等待 I/O 操作完成,它可以从运行状态转换为阻塞状态。
- 阻塞 -> 就绪:当进程等待的事件发生时,它可以从阻塞状态转换为就绪状态,等待重新被调度。
【7.1】查看进程状态
-
[windows环境下,CMD控制台查看进程、结束进程相关命令_cmd怎么查找带关键字的进程-CSDN博客](https://blog.csdn.net/sinat_29217765/article/details/105302244#:~:text=windows环境下,CMD控制台查看进程、结束进程相关命令 1 1、查看进程:%23netstat -tanp | grep "进程名关键字”,结果就可以查看到进程的pid号 2,-ef | grep "pid号",查看这个进程是否在运行 3 3、如果是在运行的话,用%23kill -9 pid号即可结束进程。)
-
只有windows电脑,命令为:
netstat