执行器

  • 执行器的概念也是一致的,将问题域隔离开来,使设计更加简单明了

  • Linux 进程是 Linux 操作系统中的主要执行器。另外,还有线程,虽然 Linux 中的线程与进程相比,由 Linux内核操作完全一样。

    1
    2
    3
    4
    5
    将一个独立的执行单元称为执行器
    以执行器的身份运行一个执行序列
    执行单元是在一个上下文中运行
    或者在一个环境下运行
    我们称执行环境为上下文

    隔离运行的执行器拥有自带的内部数据,并通过一些预定的通道(套接字、 管道、文件、共享内存等)与其他执行器进行通信或对整体环境进行修改

每种类型的执行器功能不同,运行成本不同,但都会消耗资源。所以,我们 应该合理的架构和使用它们,使整体性能更好。

每个执行器都有一个生命周期,它总是由另一个执行器创建的。执行器的生 命周期应该正确管理,操作系统会为执行器分配一些资源,并在释放执行器 之前索回资源。

执行器(Executor)在计算机科学领域通常是一个广义的概念,是指负责实现和执行计算任务的工具、算法或组件。简而言之,执行器负责对指定的代码或任务进行计算和运行。在不同的编程领域和场景中,执行器的概念和实现可能有所不同。下面列举了一些与执行器相关的概念和领域:

  1. 线程池和Executor框架 (Java):在Java多线程编程中,Executor是一个接口,通常与线程池一起使用,负责控制和管理线程的调度、执行和生命周期。例如,Java标准库提供了ThreadPoolExecutor类,它实现了Executor接口,提供了线程访问、任务提交等功能,并为任务的执行提供了内部线程池。

  2. 异步编程 (例如Node.js):在异步编程中,执行器可以指定回调函数、Promise和async/await异步技术中负责控制和并发执行异步任务的组件。

  3. 任务队列和事件循环:在事件驱动型应用中,执行器经常出现在任务队列和事件循环的情景下。它负责处理异步请求并执行回调。例如在JavaScript中,setTimeout、setInterval和Promise等异步API,都需要将回调函数放入任务队列,由事件循环中的执行器执行。

  4. 大数据处理:在大数据处理领域,比如Spark、Hadoop等分布式计算框架中,具有执行器的概念。执行器负责在集群中执行各种计算任务,并将结果返回给主节点或存储至分布式文件系统。

  5. GPU编程:在面向图形处理器(GPU)的编程中,执行器可以是负责在GPU上执行并行计算任务的一组线程。例如CUDA和OpenCL是两种常见的GPU编程模型,它们都有自己的执行器组件,控制任务在GPU上的分配和处理。

每个执行器都有自己的特点和优势,取决于所处的领域和使用场景。在学术研究中,执行器通常涉及到调度算法、资源管理、并发控制、性能优化等诸多方面。

执行容器

执行容器(Execution Container)通常是指在计算机科学领域里的一种抽象概念,它代表一个可运行和管理处理任务的环境。这种环境可以为任务提供所需的资源、依赖管理和执行上下文。在不同的计算模型和技术领域中,执行容器可以有不同的体现形式和应用场景。

  1. Java的Java EE容器:在Java EE应用中,执行容器有两类,一种是Web容器,另一种是EJB容器。这些容器为Java EE应用提供了所需的运行时环境、资源管理和调度等功能,简化了开发过程,让开发者能够专注于业务逻辑的实现。

  2. OSGI容器:OSGI(Open Service Gateway Initiative)是一种模块化、动态部署和动态更新的Java应用框架。OSGI容器主要负责管理、部署、运行这些框架下的模块,它提供了一个具有运行时隔离、动态部署、资源调度等功能的环境。

  3. Docker容器:Docker容器是目前比较流行的一种轻量级虚拟化技术,它可以将应用及其依赖打包在一个独立的、可移植的、安全的运行环境下(也即执行容器)。Docker容器使用Linux内核的特性(例如CGroups和Namespaces)实现了对应用的隔离和资源限制,使得容器之间可以同时运行在同一台主机上,且具有较高的性能和隔离性。

  4. Serverless执行环境:Serverless是一种无服务器架构,用户无需直接管理服务器资源,而是将代码部署到执行容器(如AWS Lambda、Azure Function等)。这些容器按需分配资源,可自动扩展,并根据实际执行时间计费。这大大简化了基础设施的管理,并允许资源更加灵活地响应业务需求。

总的来说,执行容器这一概念在计算机科学领域具有广泛的应用,它主要通过为任务提供一个可控的、隔离的和可扩展的执行环境来简化开发和运维复杂性、优化资源利用率和提高软件灵活性。不同类型的执行容器有不同的特性和优势,需要根据具体的应用场景和需求来选择和使用。

常见执行容器

  • 服务
  • 服务器和云实例
  • 进程(一般来说,只有 CPU开销大的计算才能通过多进程来加速。)
  • 线程(众所周知,用线程和锁来编写和调试高性能的并发程序是非常困难 的。我们必须处理死锁、数据竞争等问题。一些现代编程语言甚至没 有用户态线程的概念,比如 Node.js或PHP)
  • 协程(coroutine是指在一个进程中创建的用户空间轻量级线 程。每个 coroutine都可以以协作的方式地将执行权交给其他 coroutine)

    抢占调度多任务和协同调度多任务

    协同调度是coroutine的多任务调度所采用的思想。它解决了一个非常简单 的问题,允许多个正在一起工作的任务共享CPU。每个coroutine通过显 式调用函数yield()主动释放CPU给其他任务。被释放的coroutine可以通 过调用函数resume()来请求CPU。 协同调度的成本更低,更容易实现或使 用。协同调度的最佳用例是单用户和单供应商系统,比如如小型物联网设 备。
    如果一个任务忙于运行而 没有调用yield()函数,其他的coroutine可能会被挂起而无法执行
    抢占调度是现代操作系统所使用的调度方法,它解决了一个非常复杂的问 题,就是让所有的任务有效地共享CPU资源。每一个任务在经过一段时间 或CPU周期后,都会获得使用CPU的机会。由于系统越来越复杂,大多数 现代设备和OS 都有抢占调度的功能

通信和状态同步

当我们抽象出一个执行器或者执行容器的时候,我们面临的是类似的输入、 输出和任务执行等问题
我们要解决的两大问题非常简单。I/O和 CPU。通常我们可以预期 I/O是慢 的,CPU是快的。通信成本总是高于执行实际任务的成本

生命周期

某些元素的生命周期是由操作系统或运行时管理的。例如,我们不 必释放一个进程被杀死的内存;我们不必释放一个局部变量的内存。
管理资源的时候,我们要考虑 到资源的生命周期