【操作系统考研】2进程管理(1)

在翻看操作系统知识框架的时候,对一些概念的理解还比较模糊,现在我来理清他们的关系。

操作系统、处理器、进程、线程、内存、存储器、设备、文件的关系

咱们可以把计算机系统想象成一个大工厂,来理解这些概念之间的关系。

操作系统:就像是工厂的大总管。它负责安排各项工作,决定哪个工人(进程或线程)什么时候使用什么机器(处理器),管理仓库(内存和存储器)的货物存放和取出,协调各个车间(设备)的运作,还负责整理和管理工厂里的各种文件资料。

处理器:相当于工厂里的核心动力设备,比如大型的发电机。它提供强大的动力,让各种工作能够快速进行。操作系统会根据需要安排不同的工人(进程或线程)来使用这个强大的动力设备干活。

进程:可以理解为工厂里的一个大项目组。这个项目组有自己独立的工作任务、工作场地(内存空间)和工具。项目组里可能有很多不同的具体工作在同时进行。

线程:是进程这个项目组里的具体工作人员。他们共同为完成项目组的任务而努力,共享项目组的资源,但又可以独立地执行不同的小任务。

内存:就像是工厂里的临时工作区。工人(进程或线程)在这里快速地进行工作,存放一些马上要用的工具和材料。但是这个工作区空间有限,而且一旦停电(关机),这里的东西就会消失。

存储器:相当于工厂的大仓库。可以长期存放各种货物(数据和程序),即使停电了,东西也还在。需要的时候,大总管(操作系统)会从仓库里把东西拿到临时工作区(内存)供工人使用。

设备:比如键盘、鼠标、显示器等就像是工厂里的各种特殊车间或者工具。它们在大总管(操作系统)的协调下,和工人(进程或线程)配合完成各种特定的任务。

文件:可以看作是工厂里的各种资料、图纸和记录。它们被存放在仓库(存储器)里,大总管(操作系统)可以安排工人(进程或线程)去查阅、修改或者创建这些文件。


1. 进程

1.1. 定义

进程是并发执行的程序在一个数据集合上的执行过程

进程(Process)是计算机中的程序的一次执行,是系统进行资源分配的基本单位,是操作系统结构的基础。

1.2. 特性

动态性、并发性、独立性、异步性、结构性

1.3. 组成

1.3.1. 进程控制块(PCB)

定义:为了描述控制进程的运行,系统中存放进程的管理和控制信息的数据结构称为进程控制块(PCB Process Control Block)。

重要性:PCB是进程实体的一部分,是操作系统中最重要的数据结构。PCB是进程的唯一标识。

Q:为什么说PCB是进程的唯一标识?

A:在进程整个生命周期中,系统总是通过PCB对进程进行控制,即系统是根据PCB感知进程的存在,所以PCB是进程存在唯一标识。

生命周期:每一个进程均有一个PCB,在创建进程时,建立PCB,伴随进程运行的全过程,直到进程撤销而撤销。

★包含的具体信息(简答题常考):

  1. 程序ID(PID、进程句柄)★:它是唯一的,一个进程都必须对应一个PID。PID一般是一个整形数字。
  2. 特征信息★:一般分系统进程、用户进程、或者内核进程等
  3. 进程状态★:运行、就绪、阻塞,表示进程现在的运行情况
  4. 优先级:表示获得CPU控制权的优先级大小
  5. 通信信息:进程之间的通信关系的反映,由于操作系统会提供通信通道
  6. 现场保护区:保护阻塞的进程
  7. 资源需求、分配控制信息
  8. 进程实体信息,指明程序路径和名称,进程数据在物理内存还是在交换分区(分页)中
  9. 其他信息:工作单位,工作区,文件信息等

1.3.2. 数据段

定义:存储的是进程的原始数据或者执行中产生的中间数据结果数据

1.3.3. 程序段

定义:存储的是指令代码集合

1.4. 状态与转换

1.4.1. 三态模型

执行状态

进程已获得处理机(CPU),其程序正在执行。

在单处理机系统中,只有一个进程处于执行状态;在多处理机系统中,则有多个进程处于执行状态。

就绪状态

当进程已分配到除处理机(CPU)以外的所有必要资源后,只要再获得处理机(CPU),便可立即执行,进程这时的状态就称为就绪状态。

在一个系统中处于就绪状态的进程可能有多个,通常将他们排成一个队列, 称为就绪队列。

阻塞状态

正在执行的进程由于发生某事件(申请资源或者发出IO请求等)而暂时无法继续执行时,便放弃处理机(CPU)而处于暂停状态,亦即程序的执行受到阻塞,把这种暂停状态称为阻塞状态,有时也称为等待状态或封锁状态。

Q:处理器资源和CPU的关系

A:

处理器资源主要由中央处理器(CPU)提供,但处理器资源并不仅仅局限于 CPU。

CPU 是计算机系统的核心部件,负责执行指令和进行各种计算任务。它是处理器资源的主要提供者,包括算术逻辑运算能力、控制指令执行的能力等。可以说,CPU 是实现处理器资源的关键硬件。

然而,处理器资源还可以包括与 CPU 协同工作的其他硬件和技术。例如,现代计算机中可能有多个 CPU 核心,这些核心共同提供处理器资源。此外,还有一些辅助处理器,如图形处理器(GPU)在某些特定任务中也可以提供一定的处理器资源。另外,一些硬件加速技术,如硬件解码器等,也可以在特定领域提供部分处理器资源。

总之,CPU 是处理器资源的核心组成部分,但处理器资源不仅仅取决于 CPU,还涉及到其他相关的硬件和技术。

1.4.2. 五态模型

执行状态(同上)

进程已获得处理机(CPU),其程序正在执行。

在单处理机系统中,只有一个进程处于执行状态;在多处理机系统中,则有多个进程处于执行状态。

活跃就绪状态(同上)

当进程已分配到除处理机(CPU)以外的所有必要资源后,只要再获得处理机(CPU),便可立即执行,进程这时的状态就称为就绪状态。

在一个系统中处于就绪状态的进程可能有多个,通常将他们排成一个队列, 称为就绪队列。

活跃阻塞状态(同上)

正在执行的进程由于发生某事件(申请资源或者发出IO请求等)而暂时无法继续执行时,便放弃处理机(CPU)而处于暂停状态,亦即程序的执行受到阻塞,把这种暂停状态称为阻塞状态,有时也称为等待状态或封锁状态。

静止就绪(挂起就绪)

进程被对换到辅存(即外存)时的就绪状态,是不能被直接调度的状态,只有当主存中没有活跃就绪态进程,或者是挂起就绪态进程具有更高的优先级,系统将把挂起就绪态进程调回主存并转换为活跃就绪。

静止阻塞(挂起阻塞)

因为本身已经在辅助存储中,再遭遇等待事件,则进程对换到辅存时的阻塞状态。

1.5. 控制

1.5.1. 进程的创建

定义

进程创建是指在操作系统中为一个新的任务或程序实例分配资源并建立相应的管理数据结构,使其能够独立运行。

原因

进程的创建是操作系统执行程序的需要或者用户\进程要求创建一个新的进程。

过程

1.申请空白 PCB(进程控制块)

操作系统为新进程分配一个唯一的进程控制块,这个控制块就像是新进程的 “身份证”,用于记录进程的各种属性和状态信息,如进程标识符、进程状态、优先级、资源分配情况等。

2.为新进程分配资源

分配内存空间:为新进程分配一定的内存区域,用于存储进程的代码、数据和栈等。这个内存空间可以从系统的空闲内存池中分配,确保新进程有足够的空间来执行其任务。

分配其他资源:根据进程的需求,可能还需要分配文件资源、设备资源等。例如,如果新进程需要读取或写入文件,就需要为其分配文件描述符;如果需要使用特定的设备,如打印机或网络接口,就需要为其分配相应的设备资源。

3.初始化 PCB

初始化标志信息:设置各种标志位,用于表示进程的不同状态和特性。例如,设置进程是否为前台进程或后台进程的标志,设置进程是否处于等待特定事件的标志等。

初始化处理机状态信息:包括程序计数器的值,指示下一条要执行的指令地址;寄存器的值,保存当前进程的各种数据和状态;栈指针,指向进程的栈顶等。这些信息在进程被调度执行时用于恢复进程的执行状态。

初始化处理器控制信息:如设置进程的调度策略、时间片大小等。这些信息决定了进程在处理器上的执行方式和时间分配。

设置进程的优先级:为新进程分配一个初始的优先级,这个优先级将决定在多个就绪进程中,该进程被调度执行的先后顺序。优先级可以根据进程的类型、重要性等因素来确定。

4.将新进程插入就绪队列

如果进程就绪队列能够接纳新进程,就将新进程插入就绪队列等待调度执行。当调度程序选择到这个新进程时,它将获得 CPU 时间并开始执行。

1.5.2. 进程的切换★

定义

操作系统为了控制进程的执行,必须有能力挂起正在CPU上运行的进程,并回复以前挂起的某个进程的执行,这种行为被称为进程切换、任务切换或上下文切换。

其发生的场景主要包括:当正在运行的进程由于时间片用完,此时当前进程不能继续独占处理器,需暂停并将处理器控制权转移给另一个就绪进程;当进程处于等待资源状态而无法继续执行时,也会暂停该进程并切换到其他无需等待该资源的就绪进程;以及当有更高优先级进程就绪时,为保障系统高效运行和重要任务及时处理,会暂停当前进程,将处理器分配给高优先级进程。

过程

1.保存处理机上下文,包括程序计数器和其他寄存器。

可以把正在运行的进程想象成一个正在工作的人。处理机上下文就像是这个人正在做的事情的状态记录,程序计数器好比这个人正在看的书的页码,其他寄存器就像是他手里拿着的各种工具的状态。当要切换进程时,先把这个人当前做事的状态和工具状态都记录下来,这样以后回来还能接着干。

进程切换要动处理机上下文是因为处理机(通常是 CPU)在不同进程之间切换时,需要知道每个进程上次执行到哪里了,各种寄存器里的数据是什么,这样才能在下次轮到这个进程时接着正确的地方继续执行。如果不保存和恢复处理机上下文,进程就会丢失执行状态,无法正常运行。

2.更新PCB信息。

进程控制块(PCB)就像是这个进程的档案夹。更新 PCB 信息就是在档案夹里记录下这个进程现在的情况,比如它暂停的原因等。

3.把进程PCB移入相应队列,如就绪、某时间阻塞等队列。

不同的队列就像是不同的房间。根据进程现在的状态,把它的档案夹放到对应的房间里。如果进程在等待某个事情发生,就放到阻塞队列的房间;如果进程准备好了可以随时运行,就放到就绪队列的房间。

4.选择另一个进程执行,并更新其PCB。

从就绪队列的房间里选一个新的进程出来干活。同时在这个新进程的档案夹(PCB)里记录它开始干活的信息。

5.更新内存管理的数据结构。

内存就像是一个大仓库,不同的进程会用到仓库里的不同地方。更新内存管理的数据结构就是整理一下仓库的记录,让新的进程能正确地找到它要用的东西,也确保旧进程的东西不会被新进程乱用。

对于内存的操作是因为不同进程有不同的内存需求和使用情况。更新内存管理的数据结构可以确保每个进程都能正确地访问自己的内存空间,不会和其他进程发生冲突。同时,合理管理内存可以提高系统的效率和稳定性,让不同进程能更好地共享有限的内存资源。

6.恢复处理机上下文。

对于新选出来的进程,就像给新干活的人把他之前记录的做事状态和工具状态拿出来,让他能接着之前的进度继续干活。

1.5.3. 进程的阻塞

定义

正在执行的进程,

由于期待的某些事件未发生,如请求系统资源失败、等待某种操作的完成、新数据尚未到达或无新工作做等,

则由系统自动执行阻塞原语(Block),使自己由运行状态变为阻塞状态。

过程

1.进程立即停止运行。

2.把PCB中的现行状态由“执行”改为“阻塞”,并将PCB插入相应阻塞队列

3.转调度程序进行重新调度,将处理机分配给另一就绪程序,并进行切换。保留被阻塞进程的处理机状态,按新进程的PCB中的处理机状态设置CPU的进程。

4.转到进程调度程序,从就绪队列中选择一个新的进程投入运行。

1.5.3. 进程的唤醒

定义

当被阻塞进程

所期待的事件出现时,如它所启动的I/O操作已完成或其所期待的数据已到达,

则由有关进程(比如,提供数据的进程)调用唤醒原语(Wakeup),将等待该事件的进程唤醒。

过程

1.在该事件的等待队列中找到相应进程的PCB

2.将被唤醒进程从相应的队列中移除,并置其状态为就绪状态。

3.插入就绪队列,等待调度。

1.5.4. 进程的撤销

定义

进程的撤销是指一个进程完成特定的任务后,系统回收这个任务所占用的内存区域和取消该进程的进程控制块。

过程

1.从PCB集合中找到被撤销进程的PCB。

2.若被撤销进程正处于执行状态,则应立即停止该进程的执行,设置重新调度标志以便进程撤销后将处理器分配给其他进程。

3.若被撤销进程有子孙进程,有两种策略。策略一:撤销子进程。策略二:不撤销子进程,子进程变成孤儿进程或者由其他进程接管。

4.回收被撤销后进程所占资源,或者归还给父进程,或者归还给系统,最后回收它的PCB。

1.6. 知识辨析

1.6.1. 阻塞与挂起

阻塞

  • 定义:当一个进程由于等待某个事件的发生(如等待输入 / 输出操作完成、等待信号量等)而暂时不能继续执行时,就进入阻塞状态。在阻塞状态下,进程暂停执行并等待特定事件的到来以解除阻塞。
  • 举例:一个进程正在等待用户从键盘输入数据,此时该进程就处于阻塞状态,直到用户输入数据后,进程才会被唤醒继续执行。
  • 特点:进程主动进入阻塞状态是因为自身的运行需求,它需要等待特定的条件满足后才能继续。阻塞通常是与某个具体的事件相关联,并且进程在阻塞期间不会占用 CPU 资源,操作系统会将 CPU 分配给其他就绪进程。

挂起

  • 定义:挂起是由操作系统或用户主动发起的操作,将一个进程从内存中移出到外存(通常是磁盘),或者从运行状态切换到静止状态。挂起的目的可能是为了释放内存资源、进行进程调试、暂停某些进程的执行等。
  • 举例:当系统内存资源紧张时,操作系统可能会选择一些进程进行挂起,将它们的内存空间交换到磁盘上,以腾出内存供其他更紧急的进程使用。
  • 特点:挂起是一种相对较为宏观的操作,不一定与特定的事件直接相关。挂起后的进程可以在适当的时候被恢复到内存中继续执行。

两者区别

  • 触发原因不同:阻塞是进程因自身等待特定事件而主动进入的状态;挂起是由操作系统或用户出于系统管理等原因主动实施的操作。
  • 涉及范围不同:阻塞主要影响进程的执行状态,使其暂停等待特定事件;挂起不仅影响进程的执行状态,还涉及到进程在内存和外存之间的转移。
  • 对资源占用不同:阻塞的进程通常仍然在内存中,只是不占用 CPU 资源;挂起的进程可能会被移出内存,释放部分内存资源。

1.6.2. 进程的切换与处理机模式切换

进程切换

  • 定义:在多任务操作系统中,当正在运行的进程由于时间片用完、等待资源或更高优先级进程就绪等原因,暂停当前进程的执行,将处理器的控制权转移给另一个就绪进程
  • 举例:一个进程的时间片用完后,操作系统会保存当前进程的上下文,选择另一个就绪进程,并恢复该进程的上下文,使其在处理器上继续执行。
  • 特点:进程切换是在操作系统的管理下,为了实现多任务并发执行而进行的操作。它涉及到保存和恢复进程的上下文信息,包括程序计数器、寄存器值、栈指针等。

处理机模式切换

  • 定义:处理机(通常是 CPU)具有不同的运行模式,如用户模式和内核模式。处理机模式切换是指在不同的运行模式之间进行切换。例如,当用户程序执行系统调用时,处理机会从用户模式切换到内核模式,以执行操作系统的内核代码。
  • 举例:当用户程序需要读取文件时,会发起一个系统调用,此时处理机从用户模式切换到内核模式,操作系统内核执行文件读取操作,完成后再切换回用户模式,将结果返回给用户程序。
  • 特点:处理机模式切换主要是为了实现不同权限级别的代码执行。在用户模式下,程序只能访问受限的资源和执行特定的指令;在内核模式下,程序可以访问系统的所有资源并执行特权指令,以完成系统管理和服务提供等任务。

两者区别

  • 操作对象不同:进程切换是针对不同的进程进行的操作,涉及到多个进程之间的切换;处理机模式切换是针对处理机的运行模式进行的切换,不涉及不同进程的切换。
  • 目的不同:进程切换是为了实现多任务并发执行,提高系统的资源利用率和响应性能;处理机模式切换是为了实现不同权限级别的代码执行,保证系统的安全性和稳定性。
  • 涉及范围不同:进程切换涉及到保存和恢复进程的上下文信息,以及选择下一个要运行的进程等操作;处理机模式切换主要是改变处理机的运行模式,涉及到特权级的改变和相应的系统资源访问权限的调整。

1.6.3. 调度与切换

调度

  • 定义:调度是操作系统决定哪个进程在何时获得处理器资源的过程。调度程序根据一定的调度算法,从就绪队列中选择一个或多个进程,并分配处理器时间给它们。
  • 举例:常见的调度算法有先来先服务、短作业优先、时间片轮转等。例如,在时间片轮转调度算法中,每个进程被分配一个固定的时间片,当时间片用完后,操作系统会选择另一个进程执行。
  • 特点:调度是一种决策过程,它根据系统的状态和需求,选择合适的进程来执行。调度的目标是提高系统的资源利用率、公平性和响应性能。

切换

  • 定义:切换是指在多任务操作系统中,当正在运行的进程由于各种原因(如时间片用完、等待资源、更高优先级进程就绪等)暂停执行,将处理器的控制权转移给另一个就绪进程的过程
  • 举例:一个进程在等待 I/O 操作完成时,操作系统会进行进程切换,将处理器分配给其他就绪进程。当 I/O 操作完成后,被阻塞的进程会被唤醒并重新进入就绪状态,等待下一次被调度执行。
  • 特点:切换是在调度的基础上进行的具体操作,它涉及到保存和恢复进程的上下文信息,以及选择下一个要运行的进程等步骤。

两者区别

  • 概念层次不同:调度是一种决策过程,决定哪些进程应该获得处理器资源;切换是具体的操作过程,实现处理器控制权从一个进程转移到另一个进程。
  • 先后顺序不同:调度先于切换发生,调度确定了下一个要运行的进程后,才会进行切换操作。
  • 涉及内容不同:调度主要涉及到调度算法的选择和应用,以及对系统状态的评估;切换主要涉及到进程上下文的保存和恢复,以及处理器控制权的转移。

1.6.4. 父子进程

  1. 子进程继承了对应的父进程的大部分属性,如文件描述符。子进程一开始就是父进程的副本
  2. 父进程可以创建一个或者多个子进程,子进程是指由另一个进程(对应称之为父进程)所创建的进程。
  3. 一个进程可能下属多个子进程,但最多只能有1个父进程,而若某一进程没有父进程,则可知该进程很可能由内核直接生成。(父子进程创建后是独立运行的)
  4. 父进程和子进程的关系是子进程是父进程的一个副本,创建子进程后,子进程会有自己的空间,然后把父进程的数据拷贝到子进程的空间里。运行时,谁先运行是不确定的,这由系统决定。父进程终止,则子进程必须立刻终止。一个进程可以没有父进程,也可以没有子进程。

1.7. 通信(大致了解即可)

1.7.1. 定义

进程通信是指在进程间传输数据(交换信息)。

1.7.2. 分类

共享内存模式(共享存储)

相互通讯的进程有共享存储区。进程间可以通过直接读写共享存储区的变量来交互数据,同步与互斥在并发程序设计时安排进入程序。

是直接通过变量来进行通讯,其通信效率最高,但是通信过程不受操作系统控制,必须通过程序员来进行控制(就是后面使用的PV操作)。

消息传递模式

若通信的进程之间不存在可直接访问的共享空间则通过操作系统的相应系统调用进行消息传递通讯。

系统是以有固定格式的数据(即消息)为单位来进行数据交换,而共享内存中交换的数据没有固定的格式。消息传递中操作系统对消息的传递有一定的控制,是通过发送原语(具有发送消息功能的程序)和接收原语(具有接收消息的功能)对消息进行发送和接收。

其中间接通信中的中间实体是一个与消息对应的结构体,用来存储消息,称为信箱。

分为直接和间接两种:

直接通信方式

点到点的发送:发送进程直接把消息发送给接收进程,并将它挂在接收队列的消息缓冲队列上,如消息队列。

间接通信方式

以信箱为媒介进行传递,可以广播。从消息缓冲队列中取得信息,发送进程把消息发送到中间实体中,接收进程从中间实体中取得消息,这种中间实体一般称为信箱,称为信箱通信方式。

管道通信模式(共享文件模式)

即发送进程以字符流形式将大量数据送入管道,接收进程可从管道接收数据,二者利用管道进行通信。

管道是一个共享文件,它连接一个读进程和一个写进程,信息从写进程通过管道到读进程。管道通信是一个半双工通信,某一时刻只能单向传输

管道是一个共享文件(共享存储中共享的是内存,这里共享的是文件,共享文件是一个固定大小的缓冲区),可以理解为共享存储的优化和发展。管道机制提供了三方面的协调能力:互斥、同步和确定对方存在,减少了人为的干预。

2. 线程 

2.1. 概念

定义

线程是程序中一个单一的顺序控制流程;一个相对独立的、可调度的执行单元;是系统独立调度和分派CPU的基本单位;是操作系统能够进行运算调度的最小单位。

线程自己不拥有资源,只拥有一点必不可少的资源(如:程序计数器、一组寄存器、栈、线程控制块(TCB),但是它可以与同属一个进程的其他线程共享进程所拥有的全部资源。

它被包含在进程之中,是进程中的实际运作单位。一个进程可以包含多个线程,这些线程共享进程的资源,如内存空间、文件描述符等。

线程有自己的执行路径,包括程序计数器、栈等用于记录执行状态的结构。线程可以独立执行特定的任务,多个线程可以在同一进程内并发执行,从而提高程序的并发性和响应性。

例如,在一个多线程的图形处理软件中,一个线程可以负责用户界面的响应,另一个线程可以负责图像的渲染,它们协同工作以提高软件的性能和用户体验。

与进程相比,线程的创建和切换通常消耗更少的资源,因为线程共享进程的大部分资源,不需要像进程那样进行全面的资源分配和初始化。同时,多线程编程可以更方便地实现并行处理和异步操作,使得程序能够更高效地利用系统资源。

深入理解

  1. 线程是可调度的最基本的执行单元,比进程更小。
  2. 线程是进程内的一个可调度实体。
  3. 线程是进程中的一个相对独立的流序列。
  4. 一个进程中的多个线程可以并发运行,不同进程中的线程也可以并发运行。
  5. 线程资源上依附于进程,调度上独立于进程。

2.2. 目的

为了减少程序并发执行时所付出的时空开销,使操作系统有更好的并发性。

2.3. 特点

  1. 线程具有高并发性。
  2. 线程的切换开销小。
  3. 同一进程内的线程共享内存,通信更加便利。
  4. 创建线程的代价小,无需重新分配资源。

3. 进程与线程的比较★

资源:进程是拥有系统资源的基本单位,而线程不拥有系统资源,但线程可以访问其隶属进程的系统资源。
调度:传统操作系统中,拥有资源和独立调度的基本单位均为进程;而在引入线程的操作系统中,线程是独立调度的基本单位,进程是拥有资源的基本单位。同一进程中的线程切换不会引起进程切换,不同进程中的线程切换会引起进程切换。
并发性:同一进程内多个线程之间也可以并发,提高了系统并发性。
系统开销:线程切换只需保存和设置少量寄存器内容,开销小。进程切换远大于线程切换的开销。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1556915.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Error:WPF项目中使用oxyplot,错误提示命名空间中不存在“Plot”名称

在OxyPlot中&#xff0c;<oxy:PlotView>和<oxy:Plot>都是用来显示图表的控件&#xff0c;在WPF项目中使用oxyplot之前&#xff0c;先通过NuGet安装依赖包&#xff1a;OxyPlot.Wpf。 <oxy:PlotView>和<oxy:Plot>使用示例&#xff1a; <oxy:PlotVie…

使用Markdown Here插件生成邮件样式

使用Markdown Here插件生成邮件样式 通常大学生们都有给老师、助教使用邮箱发送作业的情景&#xff0c;怎样让自己发送的邮件美观呢&#xff0c;我们可以使用Markdown Here插件美化 以下为结果展示 Markdown Here 插件 官网地址 html代码 <font size"7", face…

复杂度分析复习(C语言版)

一.算法复杂度 算法在编写成可执行程序以后&#xff0c;运行时需要耗费时间资源和&#xff08;内存&#xff09;资源。因此衡量一个算法的好坏&#xff0c;一般是从时间、空间两个维度来衡量的&#xff0c;即时间复杂度和空间复杂度。 现如今&#xff0c;计算机内存越来越大&am…

数学公式编辑器免费版下载,mathtype和latex哪个好用

选择适合自己的公式编辑器需要考虑多个因素。首先&#xff0c;您需要确定编辑器支持的功能和格式是否符合您的需求&#xff0c;例如是否可以插入图片、导出各种文件格式等。其次&#xff0c;您可以考虑编辑器的易用性和界面设计是否符合您的个人喜好。另外&#xff0c;您还可以…

基于LORA的一主多从监测系统_框架搭建

第一节、框架搭建 打开CubeMAX&#xff0c;选择好芯片&#xff0c;进行基础配置 第一步、先配置时钟源 第二步、配置SYS选项 配置debug口以及计数器源&#xff0c;我这里选择TIM1 第三步、选择I2C接口 配置如下即可&#xff0c;默认配置不用改 第四步、串口选择 我们这里使…

传奇服务端快捷助手

定位传奇各目录&#xff0c;一键打开各配置文件。<br>收纳引擎、端口配置检查&#xff08;批量&#xff09;、路径配置、文本搜索、文件同步、一键重载&#xff08;跨桌面&#xff09;、命令管理 参考资料 传奇服务端快捷助手2024-06-20 - 工具软件程序 - 51开发者联盟 -…

51单片机的自动制冷系统【proteus仿真+程序+报告+原理图+演示视频】

1、主要功能 该系统由AT89C51/STC89C52单片机LCD1602显示模块温度传感器继电器LED、按键和蜂鸣器等模块构成。适用于车载便携式自动制冷系统、冰箱制冷、温度控制等相似项目。 可实现功能: 1、LCD1602实时显示当前温度 2、温度传感器DS18B20采集温度 3、按键可设置温度的阈…

JS 入门

文章目录 JS 入门一、JS 概述1、JS 特点2、JS 组成3、JS 初体验4、HTML引入JS 二、JS 基础语法1、变量声明2、基本数据类型3、引用数据类型1&#xff09;数组2&#xff09;对象3&#xff09;函数4&#xff09;null 4、运算符5、条件判断6、循环语句 三、JS 函数0、JS 函数特点1…

【unity进阶知识9】序列化字典,场景,vector,color,Quaternion

文章目录 前言一、可序列化字典类普通字典简单的使用可序列化字典简单的使用 二、序列化场景三、序列化vector四、序列化color五、序列化旋转Quaternion完结 前言 自定义序列化的主要原因&#xff1a; 可读性&#xff1a;使数据结构更清晰&#xff0c;便于理解和维护。优化 I…

字符编码发展史5 — UTF-16和UTF-32

上一篇《字符编码发展史4 — Unicode与UTF-8》我们讲解了Unicode字符集与UTF-8编码。本篇我们将继续讲解字符编码的第三个发展阶段中的UTF-16和UTF-32。 2.3. 第三个阶段 国际化 2.3.2. Unicode的编码方式 2.3.2.2. UTF-16 UTF-16也是一种变长编码&#xff0c;对于一个Unic…

第Y2周:训练自己的数据集

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 在上一次体验yolov5s的为基础上&#xff0c;这次将训练自己的数据集。 在YOLO目标检测算法中常用的三种标签格式&#xff1a;voc(xml)、coco(json)和yolo(txt…

【多线程】详解 CAS 机制

&#x1f970;&#x1f970;&#x1f970;来都来了&#xff0c;不妨点个关注叭&#xff01; &#x1f449;博客主页&#xff1a;欢迎各位大佬!&#x1f448; 文章目录 1. CAS 是什么1.1 CAS 具体步骤1.2 CAS 伪代码 2. CAS 的应用2.1 实现原子类2.1.1 AtomInteger 类2.1.2 伪代…

Rspamd:开源垃圾邮件过滤系统

Rspamd 是一个开源垃圾邮件过滤和电子邮件处理框架&#xff0c;旨在根据各种规则评估消息&#xff0c;包括正则表达式、统计分析以及与 URL 黑名单等自定义服务的集成。 系统会分析每封邮件并做出判定&#xff0c;MTA可据此采取进一步行动&#xff0c;例如拒绝邮件或添加垃圾邮…

低照度图像增强网络——EnlightenGAN

系列文章目录 GAN生成对抗网络介绍https://blog.csdn.net/m0_58941767/article/details/142704354?spm1001.2014.3001.5501 循环生成对抗网络——CycleGANhttps://blog.csdn.net/m0_58941767/article/details/142704671?spm1001.2014.3001.5501 目录 系列文章目录 前言 …

SSM社区慢性病管理系统—计算机毕业设计源码37572

摘 要 社区慢性病管理是社区卫生服务的主要内容&#xff0c;发展社区卫生服务是提供基本卫生服务、满足人民群众日益增长的卫生服务需求&#xff0c;也是提高人民健康水平的重要保障。为迎接慢性病防治的挑战我国进行了社区卫生服务改革&#xff0c;但由于社区卫生存在的诸多问…

OJ在线评测系统 微服务 OpenFeign调整后端下 nacos注册中心配置 不给前端调用的代码 全局引入负载均衡器

OpenFeign内部调用二 4.修改各业务服务的调用代码为feignClient 开启nacos注册 把Client变成bean 该服务仅内部调用&#xff0c;不是给前端的 将某个服务标记为“内部调用”的目的主要有以下几个方面&#xff1a; 安全性: 内部API通常不对外部用户公开&#xff0c;这样可以防止…

【CF2021E】Digital Village(All Version)

题目 给你一张 n n n 个点 m m m 条边的无向图&#xff0c;有 p p p 个关键点。你需要选择 k k k 个点染黑&#xff0c;使得这 p p p 个关键点到这 k k k 个黑点的代价和最小。定义代价为两点之间边权最大的边的最小值。 你需要求出 k 1,2,…,n 的所有答案 E1 n,m,p&l…

fiddler抓包20_弱网模拟

课程大纲 ① 打开CustomRules.js文件&#xff1a;Fiddler快捷键“CtrlR”(或鼠标点击&#xff0c;菜单栏 - Rules - Customize Rules)。 ② 设置速率&#xff1a;“CtrlF”&#xff0c;搜索 “m_SimulateModem”&#xff0c;定位至函数。在函数里设置上传、下载速率&#xff0c…

乔斯编程——P3283 通信救援

说明 众所周知&#xff0c;在同一平面内到定点的距离等于定长的点的集合叫做圆。这个定点叫做圆的圆心&#xff0c;定长即圆的半径。 同时用圆心的坐标和圆的半径&#xff0c;就可以确定圆在平面内的位置&#xff0c; 在本题当中&#xff0c;我们根据圆在平面覆盖的区域来描述…

全面解析大型模型Agent智能体原理及实践案例

1 什么是大模型 Agent &#xff1f; 大模型 Agent&#xff0c;作为一种人工智能体&#xff0c;是具备环境感知能力、自主理解、决策制定及执行行动能力的智能实体。简而言之&#xff0c;它是构建于大模型之上的计算机程序&#xff0c;能够模拟独立思考过程&#xff0c;灵活调…