当前位置: 首页 > news >正文

Linux进程学习【进程状态】

🌼🌼前言:在操作系统中,进程是最基本的资源管理单位,而操作系统通过精确管理这些进程的状态来确保系统能够高效运行。进程的状态不仅仅是操作系统设计的一部分,它对系统的性能、稳定性以及资源的分配起着至关重要的作用。本文将带你全面了解Linux操作系统中的常见进程状态,并结合实际场景探讨每种状态的危害与好处。我们还将分享一些个人思考,帮助大家更好地理解操作系统在管理这些状态时的决策过程。

进程 只有被OS管理好了,才能发挥它的全部功效,而系统中存在多个 进程,OS无法做到面面俱到,因此为了更好的管理进程,OS把 进程 分成了几种状态:阻塞、挂起、运行、休眠等等,至于每种状态的应用场景是什么、有什么用?本文将会带着大家认识的各种 进程 状态 。

🖋️ 运行状态(R)

应用场景:

运行状态是进程最基本的状态之一,表示进程正被操作系统的CPU调度并正在执行。任何我们在日常操作中看到的、正在执行的程序,如浏览器、文本编辑器、音乐播放器等,其背后的进程都在运行状态。

当你在编辑一个文档时,你的文本编辑器进程就是处于运行状态;而当你在浏览器中浏览网页时,浏览器的进程也是在运行状态。尽管这些进程很可能会同时执行多个任务,但它们都在等待CPU时间片来完成自己的任务。

好处:

  1. 系统高效响应:当进程处于运行状态时,操作系统正在将资源分配给它,意味着任务正在进行中,系统的响应也最为及时。

  2. 保证系统稳定性:处于运行状态的进程是系统最为关键的部分之一,确保系统能够按预期完成其工作任务。

下面的代码可以验证这一点:

#include<iostream>
using namespace std;#include<unistd.h>
#include<sys/types.h>int main()
{while(1){cout << "I'm a process, my PID is:" << getpid() << endl;sleep(1);}return 0;
}

  • 只要你的程序出现,输出,输入(只要有输入输出(I/O)操作,你通常不会看到进程处于 R+ 状态) 因为很多程序都要用(I/O) ,所以大家要排队。打印一句输出语句对于CPU就几微秒,CPU在这个时间里又去运行其他的进程了。等到时间片轮转下一次在运行到当前的程序时,中间的时间,进程 都在外设等待队列中 排队。

具体流程:

  1. I/O 操作:比如打印一行信息到屏幕,这个操作本身可能非常快速,几微秒内就完成。然而,打印输出到屏幕的过程并不仅仅是 CPU 计算,它还涉及显示器的响应和系统的输出操作。进程需要等待 I/O 操作完成

  2. 时间片轮转:进程通常是分时执行的,也就是说,操作系统会将 CPU 的时间片分配给多个进程运行。当当前进程在进行 I/O 操作时(比如输出到屏幕),它可能会被挂起,等待 I/O 完成,而操作系统会将 CPU 时间片分配给其他进程。因此,当前进程短暂地失去 CPU 的控制权,被放到 等待队列中,等待 I/O 完成。

  3. 进入等待队列:进程进行 I/O 操作时,通常会进入 S 状态,也就是“睡眠状态”,表示它在等待 I/O 资源(如等待数据从磁盘读取、等待网络包到达等)。一旦操作系统发现进程需要等待资源,它就会将该进程从 CPU 上移除,换其他进程执行。

  4. R+ 状态的消失:只有当进程不需要等待外部资源,并且能够持续占用 CPU 执行计算任务时,它才会维持 R+ 状态。一旦进程进行 I/O 操作,它就会进入 S 状态,因此你通常看不到进程持续处于 R+ 状态,除非它真的不涉及 I/O 操作。 

当我们将打印语句和睡眠语句屏蔽后,进程 不用在等待队列中 排队, CPU 就一直在处理死循环,此时可以观察到 运行 R 状态。
 

🖋️ 睡眠状态(S)

应用场景:

进程进入睡眠状态通常是因为等待某些外部资源的到来。这些资源包括I/O设备、网络连接、文件读取等。当一个进程发起了I/O请求后,通常会进入睡眠状态,等待设备响应。会从CPU上面拿下来。

比如,你在Linux系统上执行一个程序,它需要从磁盘读取数据。在数据被读取之前,进程会进入睡眠状态,直到磁盘I/O操作完成,进程才会被唤醒并继续执行。

好处:

  1. 资源高效利用:在等待某些资源时,进程会进入睡眠状态,这样可以释放CPU,让其他有任务的进程能够继续运行。这使得CPU的使用更加高效,避免无谓的空转。

  2. 降低系统负载:进程在睡眠状态时不会占用CPU,能够降低系统的负载,并确保其他进程能够顺利执行。

操作系统通过异步I/O处理机制(例如,使用事件驱动框架)能够更好地管理进程的睡眠状态,减少不必要的等待时间,提高系统的并发性。进一步的优化可以帮助减少I/O等待的影响,提高系统响应能力。

🖋️ 休眠状态(D)

应用场景:

休眠状态是指进程因等待不可中断的资源而进入的一种特殊状态。通常,进程会进入休眠状态是因为它需要进行I/O操作或等待硬件设备的响应。这种状态与睡眠状态(S可中断休眠)不同,休眠状态下的进程无法通过常规信号中断。Kill -9 指令无法中断这种状态。

例如,操作系统在访问磁盘时,如果磁盘I/O操作没有完成,进程就会进入休眠状态,直到硬件设备准备好或I/O操作完成。

好处:

  1. 避免浪费CPU资源:在进程等待硬件设备响应时,进入休眠状态可以避免不必要的CPU消耗。这有助于系统优化资源使用,避免过度的CPU占用。

  2. 保证I/O操作稳定性:休眠状态通常出现在I/O操作期间,操作系统通过这种方式确保I/O操作能够顺利完成,而不至于受到其他进程的影响。

危害:

  1. 进程卡住:一旦进程进入休眠状态,如果长时间没有硬件设备响应,可能会导致进程“卡住”,从而拖慢整个系统的效率。

  2. 系统响应缓慢如果系统中大量进程都进入休眠状态,可能会导致整体系统的响应变慢,用户可能会感觉到系统的不流畅。

  3. 可能导致死锁或系统不响应:如果多个进程因为等待同一资源而进入D状态,可能会导致死锁,这时候系统可能会出现不响应的现象,特别是在没有正确的资源管理机制时。

休眠状态虽然能够减少CPU资源的浪费,但它也可能成为系统性能瓶颈的一部分。随着硬件的进步(如更快的SSD、改进的网络硬件等),操作系统可以通过更高效的硬件支持来减少进程进入休眠状态的时间,从而提升整体系统响应速度。

 典型场景:

  • S态:

    • 等待磁盘文件读取时,进程处于S态,操作系统允许进程响应信号和中断。这意味着进程在等待磁盘I/O的同时,操作系统可以调度其他进程执行,甚至可能会唤醒该进程继续执行。

    • 进程等待用户输入时,进程会进入S态,此时等待可以被外部中断,例如用户可以按 Ctrl+C 中断操作。

    • 场景示例:当你运行 cat 命令读取一个文件时,进程会进入 S态,直到操作系统完成磁盘I/O。

  • D态:

    • 等待硬盘设备I/O操作完成时,进程可能进入D态。例如,当程序等待硬盘读取数据时,操作系统无法中断这一过程,直到硬盘完成数据传输。

    • 系统内核的某些操作(如访问硬件、等待驱动程序响应等)可能会使进程进入D态。此时,即使你发送 kill 信号,进程也无法响应,只能等到硬件操作完成。

    • 场景示例:进程在进行磁盘的深度读取(如文件系统操作)时,可能会进入D态,如果硬盘在执行操作时非常慢,进程可能会长时间处于此状态。

🖋️ 进程暂停 T 状态

进程的**暂停状态(T状态)**是通过操作系统发出的暂停信号让进程暂时停止运行的状态,通常是出于调试或者需要临时停止进程的目的。

如何进入T状态:

你提到的命令:

  • kill -19 PID 发送 SIGSTOP 信号,该信号将使进程进入暂停状态(T状态)。

  • kill -18 PID 发送 SIGCONT 信号,该信号会让暂停的进程恢复执行。

T 状态的工作原理:

  1. 进入 T 状态:

    • 当我们使用 kill -19 PID 命令时,实际上是向指定进程发送了 SIGSTOP 信号,告诉操作系统将该进程暂停。操作系统会将该进程的状态从运行中(R,R看不到一般是S+)转换为暂停(T)。暂停状态的进程不会占用 CPU 资源,但它的所有资源(内存、文件描述符等)依然保持,直到它被恢复。

  2. 恢复进程:

    • 使用 kill -18 PID 命令发送 SIGCONT 信号,可以让暂停的进程恢复执行。操作系统会将暂停状态的进程重新调度,使其继续从中断的地方执行。恢复后,进程的状态通常会变为运行状态(R)。

我们可以通过 kill -18 PID 使 进程 恢复运行,恢复后的 进程 在后台运行 注意: 进程 在后台运行时,是无法通过 ctrl+c 指令终止的,只能通过 kill -9 PID 终止。

S+是在前台运行的,可以用ctrl+c,而S在后台运行只能用Kill -9 PID 杀死。

使用场景:
  • 调试: 在调试程序时,可能需要暂停进程的执行,以便检查当前的程序状态或修改某些变量。开发人员可以通过 kill -19 暂停进程,然后使用调试工具(如 GDB)查看程序的当前堆栈、内存、变量等状态。

  • 系统资源管理: 在系统负载过高时,管理员可能会选择暂停某些不重要的进程,以释放 CPU 时间给高优先级任务。这种情况下,暂停某些进程后可以恢复它们,避免系统出现性能瓶颈。

  • 临时停止某些进程: 有时候我们需要临时停止某些进程(例如长时间运行的服务、后台任务等),但又不想完全终止它们,避免以后再重启或者重新创建时浪费时间。暂停进程会节省系统资源,直到恢复时它们会继续运行。

T 状态的影响和风险:

  1. 优点:

    • 灵活性: 进程暂停并不意味着进程完全终止,所有资源(如内存)仍然保留。这样做可以避免进程的重新初始化或重启,提高系统运行效率。

    • 调试便利: 在调试期间,我们可以暂停进程,检查程序的状态,然后继续执行程序,这对于排查问题或错误非常有帮助。

  2. 缺点:

    • 无响应: 一旦进程进入暂停状态,它就不再响应任何输入或执行任何任务,可能会导致系统的某些功能暂停或失效。如果有多个进程被暂停,会影响到整个系统的响应速度。

    • 资源占用: 虽然暂停状态的进程不消耗 CPU,但它仍然占用系统的其他资源(如内存、文件句柄等)。如果大量进程都处于暂停状态,可能会导致系统资源紧张。

    • 可能影响用户体验: 如果你暂停的是一个用户交互的进程(比如服务程序、后台处理任务等),可能会造成用户无法获得实时反馈,影响用户体验。

举个例子:

假设你正在运行一个计算密集型的程序,而你的服务器的CPU使用率已经很高,你希望暂时让它停止,释放CPU给其他任务处理。此时,你可以通过 kill -19 <pid> 命令暂停它,等到CPU负载下降后,再通过 kill -18 <pid> 恢复该进程。

另一种情况是在调试一个程序时,你可能希望在某个特定的地方暂停执行(例如某个函数或某个循环),而通过暂停和恢复进程,你可以检查程序状态或变量,进行故障排查

🖋️ 僵尸进程(Zombie)

应用场景:

僵尸进程是在进程终止后,父进程尚未回收其退出状态而留下的进程。僵尸进程没有实际的执行任务,它们只是占用了系统的PID和资源,等待父进程读取它们的退出状态并回收资源。

当一个子进程终止时,操作系统会将它的退出状态保留在进程表中,直到父进程通过 wait()waitpid() 来读取该状态。如果父进程没有及时回收,子进程就会成为僵尸进程。

 我们可以利用 fork() 函数自己创建 父子进程 关系,观察到这一现象:

#include<iostream>
using namespace std;#include<unistd.h>
#include<sys/types.h>int main()
{pid_t ret = fork();if(ret == 0){while(1){cout << "I'm son process, my PID: " << getpid() << " PPID: " << getppid() << endl;sleep(1);}}else if(ret > 0){while(1){cout << "I'm father process, my PID: " << getpid() << " PPID: " << getppid() << endl;sleep(1);}}else{while(1){cout << "Make son process fail!" << endl;sleep(1);}}return 0;
}

此时输入指令 kill -9 PID 即 kill -9 28315 终止 子进程
再次查看进程状态: 危害:

  1. 资源占用:尽管僵尸进程不再执行任务,但它们仍然占据着PID等资源。如果系统中存在大量僵尸进程,它们会导致进程表的资源被占满,影响系统的正常运行。

  2. 内存泄漏:未及时回收的僵尸进程会导致内存泄漏,增加系统的负担,影响系统稳定性。

 个人思考:

操作系统通过在进程终止时自动回收资源或通过父进程的 wait() 系统调用回收僵尸进程,能够有效地减少僵尸进程的出现。然而,如果父进程长时间不回收子进程的退出状态,就会导致资源的浪费。因此,设计合理的进程管理机制可以帮助系统避免僵尸进程的积累。

🖋️孤儿进程

孤儿进程是操作系统中的一种特殊进程状态,指的是父进程在子进程运行期间退出或终止,导致该子进程没有父进程的状态。此时,操作系统会自动将这个子进程“领养”,并将它的父进程 ID(PID)修改为 1,即 init 进程(在 Linux 中为系统的第一个进程)。

孤儿进程的形成:

孤儿进程的形成通常是在以下两种情况发生时:

  1. 父进程提前终止:父进程在子进程还在运行时结束,导致子进程失去了原本的父进程。

  2. 父进程不再管理子进程:父进程虽然未终止,但可能退出了某些工作范围,或者未能处理子进程的退出,导致系统将子进程重新分配给 init(PID = 1)进程。

孤儿进程的处理方式:

  • OS的处理:操作系统会通过将孤儿进程的父进程设为 init 进程来“领养”它。这是因为 init 进程是操作系统的根进程,负责管理所有的子进程。init 进程负责回收孤儿进程,确保它们最终能够被清理,避免内存泄漏。

  • 子进程的状态:一旦父进程退出,子进程进入孤儿状态,操作系统会重新安排该进程的父进程为 init 进程。即便没有原父进程,孤儿进程依然可以正常运行,直到结束。

 孤儿进程的例子:

假设有以下的程序逻辑:

  1. 父进程创建一个子进程。

  2. 父进程在子进程运行过程中退出。

  3. 子进程继续执行,但由于父进程已经结束,它就变成了孤儿进程,父进程 ID 被设置为 1(即 init)。

    #include <iostream>
    #include <unistd.h>int main() {pid_t pid = fork();if (pid > 0) {// 父进程std::cout << "Parent process is terminating. PID: " << getpid() << std::endl;sleep(2);  // 等待子进程std::cout << "Parent process exited." << std::endl;} else if (pid == 0) {// 子进程std::cout << "Child process is running. PID: " << getpid() << " Parent PID: " << getppid() << std::endl;sleep(5);  // 假装子进程在做某些操作std::cout << "Child process finished. PID: " << getpid() << " Parent PID: " << getppid() << std::endl;} else {std::cout << "Fork failed!" << std::endl;}return 0;
    }
    

    孤儿进程的危害

    孤儿进程本身并不会直接造成资源泄漏,因为它会被 init 进程领养并最终清理。但如果系统中频繁产生孤儿进程且没有及时回收,它们可能会成为系统中僵尸进程的来源,导致系统的 PID 空间被占满,从而影响新进程的创建。

🖋️ 守护进程(Daemon)

应用场景:

守护进程是那些在后台运行,通常不与用户直接交互的进程。它们通常负责处理长期运行的任务,如定时任务、日志记录、系统监控等。例如,cron 用于执行定时任务,syslog 负责系统日志管理。

守护进程会在系统启动时启动,并会一直保持运行,直到系统关闭或进程被显式终止。它们不会被终端关闭或控制,因此常常在后台悄无声息地工作。

好处:

  1. 后台服务支持:守护进程能够确保后台任务的持续运行,保证系统正常运行。例如,定时备份、系统日志收集、监控任务等都依赖守护进程。

  2. 提高系统稳定性:守护进程通常负责关键任务的执行,确保系统资源的持续管理和服务的正常提供。

危害:

  1. 资源消耗:守护进程通常会持续运行,占用系统资源。如果守护进程设计不当,可能会导致资源浪费或系统负载过高。

  2. 调试困难:守护进程通常没有用户界面,难以进行调试。如果守护进程出现问题,可能需要通过日志或其他监控工具才能发现。

个人思考:

守护进程在系统中扮演着极其重要的角色,尤其是在服务型操作系统中。合理设计和管理守护进程的资源消耗、性能监控,以及日志管理至关重要。在实际应用中,开发者需要确保守护进程的资源利用高效,避免出现无限循环、内存泄漏等问题。


1. 阻塞(Blocked)状态

进程在阻塞状态下,通常是因为它正在等待某些资源的就绪,比如等待 I/O 操作完成、等待文件锁定、等待网络响应等。进程在这个状态下并不会占用 CPU 时间,而是进入等待队列,直到所需的资源变得可用,才会被操作系统重新调度执行。包括(S,D)状态。

阻塞的原因:
  • I/O 操作:例如,读取文件、网络请求、硬盘访问等。

  • 资源等待:例如,等待 CPU 时间片、内存、锁等。

  • 同步等待:例如,等待其他进程的信号或消息。

阻塞状态的表现:
  • 阻塞状态的进程不能继续执行,直到它所等待的资源或事件发生。

  • 阻塞的进程进入操作系统的等待队列,并不占用 CPU 资源。

  • 操作系统根据不同的等待类型(I/O、锁等)将进程排入不同的队列。

例子:

假设你在使用某个应用程序,它需要从网络获取数据。在等待数据从服务器返回之前,进程就会进入阻塞状态。在此期间,它不会占用 CPU,而是等待数据返回。 

2. 挂起(Suspended)状态

挂起状态(也称为交换至磁盘状态)是指进程暂时被移出内存,挂起等待恢复。这种状态通常发生在系统内存紧张时,操作系统会选择将某些进程的状态保存在磁盘上,而非继续占用内存资源。挂起的进程处于“非活动”状态,它没有被调度执行,直到操作系统将其从磁盘中恢复到内存中,才会重新进入就绪状态。

挂起的原因:
  • 内存不足当系统内存不足时,操作系统可能会将某些进程挂起,转移到磁盘中保存,从而释放内存空间给其他进程使用。

  • 操作系统的调度策略:操作系统可能根据优先级等因素选择挂起某些进程。

挂起状态的表现:
  • 挂起状态的进程暂时被从内存中移除,进程的上下文信息被保存到磁盘中,直到它再次被调度。

  • 挂起的进程不会占用 CPU 和内存资源。

  • 与阻塞状态不同,挂起状态通常由操作系统主动控制,而不是进程由于等待资源而进入这种状态。

例子:

假设操作系统内存资源紧张,操作系统选择将一些低优先级的进程挂起,保存到磁盘中,直到有足够的内存空间,再将它们恢复到内存中继续执行。

#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <fcntl.h>int main() {int fd = open("example_file.txt", O_RDONLY);if (fd == -1) {std::cerr << "Failed to open file, blocking..." << std::endl;// 阻塞状态:等待文件打开sleep(10);  // 假设等待文件就绪}close(fd);return 0;
}

阻塞与挂起的区别

虽然 阻塞挂起 都意味着进程不会执行,但它们有以下几点不同:

区别阻塞(Blocked)挂起(Suspended)
触发原因进程等待某些资源(如 I/O 操作、信号等)进程主动或被动从内存移到磁盘,通常是由于内存不足
操作系统行为操作系统将进程放入等待队列,等待资源操作系统主动将进程状态保存到磁盘,节省内存
资源占用进程不占用 CPU 资源,但仍占用内存资源进程不占用 CPU 和内存资源
恢复条件进程等待的资源可用时会恢复执行进程从磁盘恢复到内存时才会恢复执行

总结

  • 阻塞状态通常是进程等待某些资源(如 I/O)的结果,这种状态下进程不会占用 CPU 资源。

  • 挂起状态通常发生在内存不足时,操作系统将进程的状态保存在磁盘上,以便稍后恢复。挂起进程不会占用内存和 CPU 资源。

相关文章:

Linux进程学习【进程状态】

&#x1f33c;&#x1f33c;前言&#xff1a;在操作系统中&#xff0c;进程是最基本的资源管理单位&#xff0c;而操作系统通过精确管理这些进程的状态来确保系统能够高效运行。进程的状态不仅仅是操作系统设计的一部分&#xff0c;它对系统的性能、稳定性以及资源的分配起着至…...

用 ESP32 模拟 Wiegand 刷卡器:开发门禁系统必备的小工具

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…...

什么是 MCP?与 AI Agent 的关系是什么?

首先先回答一下什么是MCP&#xff1f; 如果你经常使用像Claude这样的大语言模型&#xff0c;你可能已经注意到它们虽然强大&#xff0c;但有时候也有局限性&#xff0c;比如无法获取实时信息或访问特定工具。 模型上下文协议&#xff08;Model Context Protocol&#xff0c;简…...

Python ZIP文件操作全解析:从基础压缩到高级技巧

目录 一、ZIP文件操作基础三板斧 1.1 创建压缩包 1.2 解压操作 1.3 文件遍历与信息获取 二、进阶技巧&#xff1a;让压缩更智能 2.1 加密压缩实战 2.2 增量更新策略 2.3 性能优化技巧 三、高级场景解决方案 3.1 分卷压缩实现 3.2 跨平台路径处理 3.3 异常处理最佳实…...

Linux:进程的等待

当以一个进程结束时&#xff0c;它会变成僵尸进程&#xff0c;这个僵尸进程如果不处理&#xff0c;就会一直占用CPU资源&#xff0c;如果父进程要回收这个进程会通过进程等待的方式处理&#xff0c;回收子进程只会&#xff0c;会得到进程的退出信息 进程等待 父进程通过进程等…...

玉米产量遥感估产系统的开发实践(持续迭代与更新)

项目地址&#xff1a;项目首页 - maize_yield_estimation:玉米估产的flaskvue项目 - GitCode 开发中&#xff0c;敬请期待。。。 以下是预先写的提纲&#xff0c;准备慢慢补充 一、项目背景与工程目标 业务需求分析 农业遥感估产的行业痛点&#xff08;数据分散、模型精度不足…...

Python解析地址中省市区街道

Python解析地址中省市区街道 1、效果 输入&#xff1a;海珠区沙园街道西基村 输出&#xff1a; 2、导入库 pip install jionlp3、示例代码 import jionlp as jiotext 海珠区沙园街道西基村 res jio.parse_location(text, town_villageTrue) print(res)...

论文学习:《聚类矩阵正则化指导的层次图池化》

原文标题&#xff1a;Clustering matrix regularization guided hierarchical graph pooling 原文链接&#xff1a;https://www.sciencedirect.com/science/article/abs/pii/S0950705125001558 图池化技术大致可以分为两类&#xff1a;平面图池化和层次图池化。后者通过迭代粗化…...

【金仓数据库征文】- 国产化迁移实战:从Oracle到KingbaseES的平滑过渡

文章目录 引言&#xff1a;国产数据库的崛起与迁移需求一、兼容性架构设计与配置优化1.1 Oracle兼容模式的核心实现1.2 潜在语法差异的深度处理1.3 环境预配置关键技术1.3.1 用户与模式映射1.3.2 字符集与日期格式 1.4 深度兼容模式配置1.4.1 语法兼容开关1.4.2 数据类型映射策…...

「零配置陷阱」:现代全栈工具链的复杂度管控实践

一、工具链膨胀的「死亡螺旋」 2024年典型全栈项目的初始化噩梦&#xff1a; $ npm create vitelatest ✔ Project name: … demo ✔ Select a framework: › React ✔ Select a variant: › TypeScript SWC ✔ Install shadcn/ui? … Yes ✔ Add Storybook? … Yes ✔ Co…...

浅析锁的应用与场景

锁的应用与场景&#xff1a;从单机到分布式 摘要&#xff1a;在多线程和分布式系统中&#xff0c;“锁”是避免资源竞争、保障数据一致性的核心机制。但你真的了解锁吗&#xff1f;什么时候该用锁&#xff1f;用哪种锁&#xff1f;本文通过通俗的比喻和代码示例&#xff0c;带…...

图论---Kruskal(稀疏图)

O( m * log n )。 1&#xff0c;将所有边按权重从小到大排序&#xff0c;调用系统的sort() 2&#xff0c;枚举每条边的 a , b ,权重 if(a、b 不联通) 就将这条边加入集合中 // 最小生成树 —Kruskal算法(稀疏图) #include<iostream> #include<algorithm> using …...

MySQL 从入门到精通:第二篇 - 数据类型、约束与索引

1. MySQL数据类型详解 数值类型 整数类型 -- 常用整数类型及范围 CREATE TABLE integer_types (tiny_col TINYINT, -- 1字节,有符号(-128~127),无符号(0~255)small_col SMALLINT, -- 2字节,有符号(-32768~32767),无符号(0~65535)medium_col MEDIUMINT,...

基于AI技术的高速公路交通引流系统设计与应用研究

基于AI技术的高速公路交通引流系统设计与应用研究 1. 研究背景与意义 1.1 交通系统演化脉络 1.1.1 发展阶段划分 机械化时代&#xff08;1950-1990&#xff09;&#xff1a;固定式信号控制信息化时代&#xff08;1991-2010&#xff09;&#xff1a;SCATS/SCOOT系统智能化时代…...

n8n 中文系列教程_09. 从原始需求到精准实现:n8n节点选择指南

在自动化工作流工具n8n中&#xff0c;正确选择和使用节点是高效实现需求的关键。本文将从需求分析入手&#xff0c;逐步解析触发节点与执行节点的区别&#xff0c;梳理n8n的节点分类逻辑&#xff0c;并揭示外部服务节点的本质&#xff0c;帮助您精准匹配需求与实现方案。无论您…...

P19:Inception v1算法实战与解析

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 一、模型结构 Inception V1 的主要特点是在一个网络中同时使用不同大小的卷积核&#xff08;1x1、3x3、5x5&#xff09;和池化操作来提取多尺度特征。以下是…...

day32 学习笔记

文章目录 前言一、霍夫变换二、标准霍夫变换三、统计概率霍夫变换四、霍夫圆变换 前言 通过今天的学习&#xff0c;我掌握了霍夫变换的基本原本原理及其在OpenCV中的应用方法 一、霍夫变换 霍夫变换是图像处理中的常用技术&#xff0c;主要用于检测图像中的直线&#xff0c;圆…...

2025时间序列都有哪些创新点可做——总结篇

作为AI和数据科学的核心方向之一&#xff0c;时间序列在2025年依然保持着强劲的发展势头&#xff0c;稳站各大顶会顶刊投稿主题前列。 关于它的研究&#xff0c;目前在结合传统统计方法和深度学习的基础上&#xff0c;已延伸至频域等数理工具与神经网络的交叉创新。同时针对垂…...

头歌实训之索引

&#x1f31f; 各位看官好&#xff0c;我是maomi_9526&#xff01; &#x1f30d; 种一棵树最好是十年前&#xff0c;其次是现在&#xff01; &#x1f680; 今天来学习C语言的相关知识。 &#x1f44d; 如果觉得这篇文章有帮助&#xff0c;欢迎您一键三连&#xff0c;分享给更…...

通讯的基础概念:涵盖串行通信、并行通信、TCP、UDP、Socket 等关键概念和技术

一、通信基础概念 1. 串行通信与并行通信 串行通信 定义&#xff1a;通过一条线路逐位传输数据&#xff0c;每个字节包含起始位、数据位、校验位和停止位。特点&#xff1a; 传输稳定&#xff0c;但速度较慢&#xff08;因逐位传输&#xff09;。常用接口&#xff1a;RS-232、…...

Uni-App 多端电子合同开源项目介绍

项目概述 本项目是一款基于 uni-app框架开发的多端电子合同管理平台&#xff0c;旨在为企业及个人用户提供高效、安全、便捷的电子合同签署与管理服务。项目创新性地引入了 “证据链”与“非证据链”两种签署模式&#xff0c;满足不同场景下的签署需求&#xff0c;支持多种签署…...

一个非常快速的 Latex 入门教程【Part 1】

目录 1.LaTex简介 2.LaTex 中最基础的格式化命令 2.1加粗&#xff0c;斜体&#xff0c;下划线&#xff0c;添加新段落 2.2文档分节 2.3 图片 2.4 LaTeX 中列表的创建 无序列表 有序列表 2.5对数学公式的排版 2.6表格 1.LaTex简介 LaTex的主要优势是它会将文…...

用Obsidian四个插件打造小说故事关联管理系统:从模板到图谱的全流程实践

用Obsidian四个插件打造小说故事关联管理系统&#xff1a;从模板到图谱的全流程实践 一、前言&#xff1a;为什么需要故事关联管理系统 在小说创作中&#xff0c;复杂的人物关系、交错的情节线和多维的世界观常导致创作混乱。本文将通过 Dataview&#xff08;数据查询&#xf…...

C++ 日志系统实战第三步:熟悉掌握各种设计模式

全是通俗易懂的讲解&#xff0c;如果你本节之前的知识都掌握清楚&#xff0c;那就速速来看我的项目笔记吧~ 相关技术知识补充&#xff0c;也是最后的补充知识了~ 下文将加入项目代码编写&#xff01; 目录 设计模式 单例模式 饿汉模式 懒汉模式 工厂模式 简单…...

[ESP-IDF]:esp32-camera 使用指南 ESP32S3-OV2640 用例测试

【核知坊】&#xff1a;释放青春想象&#xff0c;码动全新视野。 我们希望使用精简的信息传达知识的骨架&#xff0c;启发创造者开启创造之路&#xff01;&#xff01;&#xff01; 内容摘要&#xff1a;esp32-camera 组件为 ESP32 系列 SoC 提供了兼容的图…...

在统信UOS/麒麟Kylin OS中创建网页桌面快捷方式

在统信UOS/麒麟Kylin OS中创建网页桌面快捷方式 本文将详细介绍如何在统信UOS或麒麟KYLINOS中使用命令行创建一个网页桌面快捷方式&#xff0c;以方便构建云桌面模板及镜像模板。欢迎大家浏览、分享和转发&#xff01;请关注我以获取更多技术分享。 1. 查看系统信息 首先&am…...

SQLite 是什么?

&#x1f4cc; 一、SQLite 是什么&#xff1f; SQLite 是一个轻量级、嵌入式数据库&#xff0c;意思是它直接集成在你的 App 内部&#xff0c;不需要单独安装数据库服务端。 ✅ 特点&#xff1a; 特点说明本地使用所有数据保存在手机内部存储文件形式数据以 .db 文件形式存储…...

恒创科技「香港大带宽云」新老用户专享实例及热门配置

全球化数字浪潮下&#xff0c;高带宽应用正深度重构各行业运营模式——从跨境电商、流媒体与视频点播&#xff0c;到在线游戏与云游戏加速&#xff0c;涵盖所有高并发、强交互的业务场景。在此背景下&#xff0c;企业对高性能 IT 基础架构的需求持续升级&#xff0c;以此来支持…...

fpga系列 HDL:verilog latch在fpga中的作用 避免latch的常见做法

目录 Latch在FPGA中的作用Quartus中有关latch的警告⚠避免Latch的常见做法1. if-else 语句未覆盖所有条件生成Latch的代码&#xff1a;修复后的代码&#xff1a; 2. case语句未覆盖所有分支生成Latch的代码&#xff1a;修复后的代码&#xff1a; 3. 组合逻辑中缺少默认赋值生成…...

java配置

环境变量...

解决虚拟主机ping不通本地主机问题

win11 1 问题 虚拟主机和本地主机在同一网段。 2 解决方案 以win11为例&#xff1a; 设置 -> 网络和 Internet -> 高级网路设置 -> Windows 防火墙 -> 高级设置 -> 入站规则 -> 新建规则 需要设置&#xff1a;规则类型、 协议和端口、名称&#xff0c;其…...

Move Registry 发布,实现 Sui 的超级互操作性

Move Registry&#xff08;MVR&#xff09;的到来对 Sui 来说是一件大事。MVR 是一个功能齐全的链上包管理系统&#xff0c;提升了整个生态的可发现性、可信度和互操作性。Sui 本身就是最具互操作性的链之一&#xff0c;凭借 Move 语言和可编程交易区块&#xff08;PTBs&#x…...

【Linux】gdb工具,Linux 下程序调试的 “透视眼”

目录 调试代码调试注意事项gdb和Cgdb调试命令汇总行号显示断点设置查看断点信息删除断点开启 / 禁用断点运行 / 调试逐过程和逐语句打印 / 追踪变量指定行号跳转强制执行函数 补充命令watchset var 替换变量值条件断点 end 调试代码 这是本次调试要用的代码 1 #include <st…...

脚本分享:快速作图对比wannier拟合能带python脚本

本脚本通过Python实现电子能带结构数据的快速作图&#xff0c;能够从两个不同的数据文件&#xff08;BAND.dat 和 wannier90_band.dat&#xff09;中提取有效数据&#xff0c;并在同一坐标系下绘制对比图。 准备工作&#xff1a;使用VASPKIT处理获得能带数据BAND.dat&#xff…...

解决ssh拉取服务器数据,要多次输入密码的问题

问题在于&#xff0c;每次循环调用 rsync 都是新开一个连接&#xff0c;所以每次都需要输入一次密码。为了只输入一次密码&#xff0c;有以下几种方式可以解决&#xff1a; ✅ 推荐方案&#xff1a;设置 SSH 免密登录 最稳最安全的方式是&#xff1a;配置 SSH 免密登录&#x…...

金仓数据库 KingbaseES 产品深度优化提案:迈向卓越的全面升级

文章目录 一、引言二、性能优化&#xff08;一&#xff09;查询性能提升1. 优化查询优化器引入基于代价的查询优化算法支持更多的查询优化提示 2. 索引优化支持更多类型的索引优化索引的创建和维护策略 &#xff08;二&#xff09;并发处理能力增强1. 锁机制优化采用更细粒度的…...

企业级智能合同管理解决方案升级报告:道本科技携手DeepSeek打造智能合同管理新标杆

当传统合同管理系统还在与堆积如山的纸质文档较劲时&#xff0c;道本科技与DeepSeek联合开发的智能合同平台已为国央企打开新视界。我们以某大型能源集团的实际应用为例&#xff0c;带您直观感受技术升级带来的管理变革。 一、技术升级的具象化呈现 在未接入DeepSeek技术前&a…...

C#并行编程极大提升集合处理速度,再也没人敢说你程序性能差了!

马工撰写的年入30万C#上位机项目实战必备教程&#xff08;点击下方链接即可访问文章目录&#xff09; 1、《C#串口通信从入门到精通》 2、《C#与PLC通信从入门到精通 》 3、《C# Modbus通信从入门到精通》 4、《C#Socket通信从入门到精通 》 5、《C# MES通信从入门到精通》 6、…...

[贪心_7] 最优除法 | 跳跃游戏 II | 加油站

目录 1.最优除法 题解 2.跳跃游戏 II 题解 3.加油站 题解 利用 单调性&#xff0c;可以实现 区间跳跃 1.最优除法 链接&#xff1a; 553. 最优除法 给定一正整数数组 nums&#xff0c;nums 中的相邻整数将进行浮点除法。 例如&#xff0c;nums [2,3,4]&#xff0c;我…...

【Rust】Rust中的枚举与模式匹配,原理解析与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…...

【CUDA 编译 bug】ld: cannot find -lcudart

我们使用 Conda 安装 pytorch 和 CUDA 环境之后&#xff0c;要用 Conda 的CUDA环境进行某个库编译时&#xff0c;出现了bug&#xff1a; /mnt/data/home/xxxx/miniforge3/envs/GAGAvatar/compiler_compat/ld: cannot find -lcudart: No such file or directorycollect2: error…...

MYSQL之数据类型

数据类型分类 数值类型 在MySQL中, 整型可以指定是有符号的和无符号的, 默认是有符号的. 可以通过 UNSIGNED 来说明某个字段是无符号的. tinyint类型 以tinyint为例, 其它的整型类型都只是数据范围的区别. 数据越界 创建一个 tinyint 类型的 num 的属性, 大小为 1 字节, 不…...

Asp.Net Core 异常筛选器ExceptionFilter

文章目录 前言一、异常筛选器的核心概念用途&#xff1a;实现接口&#xff1a;执行时机&#xff1a; 二、使用步骤1.创建自定义异常筛选器2.注册异常筛选器全局注册&#xff08;对所有 Controller 生效&#xff09;&#xff1a;局部注册&#xff08;通过特性标记特定的 **Contr…...

WebUI可视化:第2章:技术基础准备

学习目标 ✅ 掌握HTML/CSS基础语法 ✅ 理解JavaScript核心功能 ✅ 了解前后端交互原理 2.1 HTML基础:网页的骨架 2.1.1 基础结构 每个HTML文件都必须包含以下基本结构: html <!DOCTYPE html> <html> <head><title>我的第一个网页</title> …...

Java基础集合 面试经典八股总结 [连载ing]

序言 八股&#xff0c;怎么说呢。我之前系统学习的内容&#xff0c;进行梳理。通过问题的方式&#xff0c;表达出得当的内容&#xff0c;这件事本身就很难。面试时心态、状态、掌握知识的情况等。关于八股文&#xff0c;我不想有太多死记硬背的内容&#xff0c;更多的是希望自我…...

大数据运维面试题

华为大数据运维面试题可能涵盖多个方面&#xff0c;以下是一些可能的面试问题及解析&#xff0c;这些问题旨在考察应聘者的技术知识、问题解决能力和对大数据运维的理解&#xff1a; 一、技术知识类问题 简述大数据运维的主要职责和工作内容 回答示例&#xff1a;大数据运维工…...

OpenBMC:BmcWeb login认证

BmcWeb在include\login_routes.hpp中实现了/login用于完成web的登录: BMCWEB_ROUTE(app, "/login").methods(boost::beast::http::verb::post)(handleLogin);inline void handleLogin(const crow::Request& req,const std::shared_ptr<bmcweb::AsyncResp>…...

Python学习之路(五)-接口API

在 Python 中结合数据库开发接口 API 通常使用 Web 框架(如 Flask 或 Django)和 ORM(对象关系映射)工具(如 SQLAlchemy 或 Django ORM)。以下是使用 Flask 和 SQLAlchemy 的详细步骤,展示如何结合数据库开发一个简单的 API。 使用 Flask 和 SQLAlchemy 开发 API 1. 安…...

数据库+Docker+SSH三合一!深度评测HexHub的全栈开发体验

作为一名技术博主&#xff0c;我最近一直被各种开发工具切换搞得焦头烂额。数据库要用Navicat&#xff0c;服务器管理得开Termius&#xff0c;Docker操作还得切到命令行&#xff0c;每天光在不同工具间切换就浪费了大量时间。直到团队里的一位架构师向我推荐了HexHub这个一体化…...

涂料油墨制造数字化转型的关键技术与挑战

涂料油墨制造行业正处于数字化转型的关键时期&#xff0c;这一转型是提升生产效率、增强产品质量和降低成本的重要途径。以下是该行业在数字化转型中的关键技术与面临的挑战&#xff1a; 关键技术&#xff1a; 工业互联网技术&#xff1a;通过在生产设备上安装传感器&#xf…...