Linux任务管理与守护进程
文章目录
- 🍅任务管理
- 进程组概念
- 作业概念
- 会话概念
- 相关操作
- 前台进程&后台进程
- jobs
- fg
- bg
- ps命令查看指定的选项
- 🫒守护进程
- 守护进程的概念
- 作用
- 守护进程的查看
- 守护进程的创建
- 原生创建守护进程
- 调用daemon函数创建守护进程
- 模拟实现daemon函数
🍅任务管理
进程组概念
进程组是一组相关联的进程集合,这些进程可以共同执行某个任务,并且可以通过信号进行通信和管理。
特征
- 唯一标识:每个进程组都有一个唯一的组标识符(GID),用于区分不同的进程组。
- 信号传递:信号可以发送到整个进程组,而不仅仅是单个进程。这使得对一组进程的管理更为高效,例如,可以通过发送信号来终止或暂停整个组内的所有进程。
- 作业控制:进程组通常用于作业控制。用户可以将一组进程视为一个整体来进行管理,例如前台和后台作业。
- 管理特性:当一个进程组中的某个进程终止时,其他进程通常会收到通知。进程组中的进程可以共享某些资源,如标准输入输出。
- 组长进程:每个进程组都可以有一个组长进程。组长进程的进程ID等于进程组ID。
需要注意的是,只要在某个进程组中有一个进程存在,则该进程组就存在,这与其组长进程是否终止无关。
作业概念
Shell分前后台来控制的不是进程而是作业(Job)或者进程组(Process Group)。
作业是用户通过操作系统提交的一组相关任务和请求,通常包括程序的执行、所需的数据和资源的使用。
特征
- 任务集合:作业可以包括一个或多个进程。这些进程共同完成特定的计算或数据处理任务。
- 资源需求:每个作业通常需要特定的系统资源,如CPU时间、内存、输入输出设备等。
- 状态管理:作业会经历不同的状态,如就绪、运行、等待等。操作系统负责管理这些状态,以确保作业能够顺利执行。
- 调度:操作系统根据某种调度算法决定作业的执行顺序,以优化资源利用率和系统响应时间。
一个前台作业可以由多个进程组成,一个后台作业也可以由多个进程组成,Shell可以运行一个前台作业和任意多个后台作业,这称为作业控制。
进程组和作业之间的关系:每个作业都对应一个进程组,但不是每个进程组都是一个作业。只有由shell启动的进程组才是作业,而其他程序启动的进程组则不是。例如,系统启动时创建的init进程和它的子进程就不属于任何作业。另外,如果作业中的某个进程又创建了子进程,则子进程不属于原来的作业,而是属于另一个进程组。
注意:
-
当作业(进程组)中的某个进程创建了一个新的子进程时,这个子进程实际上是属于它的父进程的进程组,而不是原作业的进程组。也就是说,尽管子进程是由作业中的进程创建的,但它不被视为原作业的一部分。
-
若作业中(进程组)的某个进程创建了一个新的子进程,当作业运行结束以后,shell会将它自己作为前台作业,如果原先的前台进程依然存在,即这个新的子进程还未终止,那么它将会变成后台进程组。这意味着子进程不会再属于原来的作业,而是独立于作业之外,成为一个后台进程。
会话概念
会话(Session)是一个或多个进程组的集合。
一个会话可以有一个控制终端,这通常是登录到其上的终端设备(在终端登录情况下)或伪终端设备(在网络登录情况下)。建立与控制终端连接的会话首进程被称为控制进程。一个会话中的几个进程组可被分为一个前台进程组以及一个或多个后台进程组。所以一个会话中,应该包括控制进程(会话首进程),一个前台进程组和任意多个后台进程组。
会话的创建和终止由终端设备控制。当一个用户登录到一个终端(计算机)时,登录进程就会为这个用户创建一个新的会话,该会话的首个进程是登录shell,登录shell被作为“会话首进程”。登录shell可以启动其他的进程或进程组,从而形成该会话的作业。会话首进程的PID就被作为会话ID。会话是一个或多个进程组的集合。会话囊括了登录用户的所有活动,并且分配给用户一个控制终端(controling terminal)。控制终端是用于处理用户I/O的特定tty设备。因此,会话的功能和shell差不多。实际上,没有谁刻意去区分它们。
当用户退出终端时,会向前端进程组中的所有进程发送SIGQUIT信号。当终端发现网络中断的情况时,会向前端进程组中的所有进程发送SIGHUP信号。当用户敲入了终止键(一般是Ctrl+C
),会向前端进程组中的所有进程发送SIGINT信号。因此,会话使得shell可以更容易管理终端以及登录行为。
不同的会话之间可以通过管道或其他方式进行通信,但是每个会话都有自己独立的命名空间,不能直接访问其他会话的进程组或作业。每个会话都有自己的前台作业和后台作业,它们可以通过shell命令(如fg、bg、jobs等)进行切换和管理。
用计算机的“登录”和“注销”操作来解释会话、进程组以及作业:
- 当在计算机上登录时,就开始了一个新的会话,输入的用户名和密码会被验证,然后会进入一个shell环境,这个shell是会话首进程,也是控制终端的控制进程,它也是自己的进程组的唯一成员。
- 当在shell中输入一个命令或者通过管道连接的一组命令时,shell就会创建一个或多个新的进程,并把它们放在一个新的进程组中,这个进程组就是一个作业。如果在命令后面加上&符号,就表示让这个作业在后台运行,否则就让它在前台运行。可以用shell提供的一些命令来管理作业。
- 当在计算机上注销时,就结束了当前的会话,所有属于这个会话的进程组和作业都会被终止,控制终端也会被释放。如果还有其他的会话在运行(比如通过远程登录或者打开多个终端窗口),它们不会受到影响。
测试
下面我们用同一个死循环代码生成了5个可执行程序。
我们将test1和test2放到后台运行,将test3、test4和test5放到前台运行。
其中test1与test2属于同一个后台进程组,test3、test4和test5属于同一个前台进程组,而Shell本身属于一个单独的进程组。
这些进程组的控制终端相同,它们同属于一个会话,当用户在控制终端输入特殊的控制键(如Ctrl+C
产生SIGINT,Ctrl+\
产生SIGQUIT,Ctrl+Z
产生SIGTSTP),内核就会发送相应的信号给前台进程组中的所有进程。
相关操作
前台进程&后台进程
直接运行某一可执行程序,例如./可执行程序
,此时默认将程序放到前台运行,在前台运行的进程的状态后有一个+
号,例如R+
。
运行可执行程序时在后面加上&,可以指定将程序放到后台运行,例如./可执行程序 &
,在后台运行的进程的状态后没有+
号。
我们将程序放到后台运行时会发现多了一行提示信息,例如上述的:
[1] 4023
其中[1]是作业的编号,如果同时运行多个作业可以用这个编号进行区分,4023是该作业中某个进程的id(一个作业可以由多个进程组成)。
我们可以用该可执行程序同时创建四个进程放到后台运行:
此时我们就可以将它们分别叫做当前终端下的1号作业、2号作业、3号作业和4号作业。
jobs
使用jobs
命令,可以查看当前会话当中有哪些作业。
fg
使用fg
命令(foreground),可以将某个作业提至前台运行,如果该作业正在后台运行则直接提至前台运行,如果该作业处于停止状态,则给进程组的每个进程发SIGCONT信号使它继续运行并提至前台。
例如,使用fg 1
命令将1号作业提到前台运行。
由于1号作业被提至前台运行,所以其运行状态也由R
变成了R+
。
注意:前台进程只能有一个,当一个进程变成前台进程后,bash会自动变为后台进程,此时bash就无法进行命令行解释了。
例如,我们将1号作业提至前台运行后,bash进程的状态后面的+
号就没有了,也就意味着bash自动由前台进程变为了后台进程。
bg
将一个前台进程放到后台运行可以先使用Ctrl+Z
将进程停止,使用Ctrl+Z
后该进程就会处于停止状态(Stopped)。
使用bg
命令,可以让某个停止的作业在后台继续运行(Running),本质就是给该作业的进程组的每个进程发SIGCONT信号。
例如,使用bg 1
命令让1号作业在后台继续运行。
ps命令查看指定的选项
使用ps
命令时携带-o
选项,可以查看指定的信息。
每次“登录”的操作就是创建bash进程的操作,即新建一个会话。所有的命令行启动的任务都是在对应的会话内运行的。同一个会话中的所有进程的SESS是相同的。例如我在另一个shell中输入同样的指令:
注:ps命令是一个系统级的命令,该命令能查看所有进程的信息,例如ps axj
,只不过-o
选项只查看当前会话的进程信息。
🫒守护进程
守护进程的概念
守护进程也称精灵进程(Daemon),是运行在后台的一种特殊进程,它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。
守护进程的特点:
- 它们由系统启动时或其他进程创建,而不是由用户登录时创建。
- 它们没有控制终端,也不会接收终端上的信号。
- 它们通常有一个特殊的父进程(init或launchd),当它们的创建者退出时,不会成为孤儿进程。
- 它们通常以root用户或者其他特殊的用户(例如apache和postfix)运行,并处理一些系统级的任务。
- 习惯上守护进程的名字通常以d结尾,例如httpd(Web服务器的守护进程)、sshd(SSH服务器的守护进程)、crond(作业规划进程)等等。
作用
守护进程的作用是在后台运行不受终端控制的进程,这样就能在系统运行期间在后台执行某些特定任务,通常是为了提供系统服务,例如Web服务器、邮件服务器、数据库服务器等等,一般的网络服务都是以守护进程的方式运行的。它们可以在系统启动时启动,并在整个系统运行期间一直存在,以便在需要时随时提供服务。
系统服务进程会启动很多系统服务进程和守护进程,例如网络服务、文件系统服务、日志服务、安全服务等等。这些服务进程和守护进程提供的功能是Linux系统正常运行所必需的。因此,守护进程是Linux系统中非常重要的一部分,它们保证了系统的可靠性和稳定性。
守护进程可以突破终端的限制,即使关闭终端,守护进程也不会被关闭,而是一直运行到系统关机或者被kill命令终止。
守护进程的查看
最常用的方式是使用ps
指令,当使用ps
命令时,可以使用各种选项来控制显示的进程信息。下面是一些常用的选项:
a
:显示所有进程,包括其他用户的进程。u
:显示进程的详细信息,例如用户、CPU使用率、内存使用情况等。x
:显示没有控制终端的进程(通常是后台进程)。j
:显示与作业控制相关的信息。f
:以树形结构显示进程,其中父进程和子进程之间通过缩进来表示。e
:显示所有进程,包括没有控制终端的进程。r
:显示当前正在运行的进程。o
:自定义输出格式,可以指定要显示的字段。t
:指定要显示的进程类型,例如TTY进程、批处理进程或用户进程。p
:指定要显示的进程ID。
可以使用ps axj
查看系统中的进程:
其中,TPGID为-1表示没有控制终端的进程,即守护进程。
除此之外,在COMMAND一列用[ ]括起来的名字表示内核线程,这些线程在内核里创建,没有用户空间代码,因此没有程序文件名和命令行,通常采用以k开头的名字,表示Kernel。
补充说明:
- udevd负责维护/dev目录下的设备文件。
- acpid负责电源管理。
- syslogd负责维护/var/log下的日志文件。
可以看出,守护进程通常采用以d结尾的名字,表示Daemon。
守护进程的创建
原生创建守护进程
守护进程的创建步骤如下:
- 忽略可能引起程序异常的信号(如SIGCHLD、SIGPIPE等)。
- 调用fork(),创建子进程,并终止父进程,该子进程将会成为守护进程。
- 子进程创建新会话。
- 将子进程的CWD更改为根目录(
\
)。 - 将标准输入、标准输出和标准错误重定向到
/dev/null
。
相关说明:
- 忽略信号
在创建守护进程时,通常会忽略可能引起程序异常的信号,例如
SIGCHLD
和SIGPIPE
。这样可以避免在进程运行时由于这些信号导致的意外中断。
- 调用fork创建子进程
通过调用fork创建一个子进程,并终止父进程。子进程将会成为守护进程。
- 子进程创建新会话
为了与终端脱离关系,确保守护进程不再与用户交互,子进程需要创建新会话。而调用setsid创建新会话时,要求调用进程不能是进程组组长,但是当我们在命令行上启动多个进程协同完成某种任务时,其中第一个被创建出来的进程就是组长进程,因此我们需要fork创建子进程,让子进程调用setsid创建新会话并继续执行后续代码,而父进程我们直接让其退出即可。
- 更改当前工作目录
将子进程的当前工作目录更改为根目录(
/
)。这样可以使守护进程以绝对路径的形式访问所需资源,避免在挂载点或文件系统变更时出现路径问题。虽然这不是必须的,但通常是一个良好的实践。
- 重定向标准输入、输出和错误
将守护进程的标准输入、标准输出和标准错误重定向到
/dev/null
。/dev/null
是一个特殊的字符设备,通常用于丢弃不需要的输入输出信息。这确保了守护进程不会尝试与终端进行交互,也避免了因缺少终端而导致的潜在错误。
- 补充
- 由于守护进程不能直接与用户交互,因此在创建守护进程时,可以采用防御性编程的方法,通过再次fork创建另一个子进程。这一操作确保了新的子进程不是会话首进程,从而防止它打开新的终端。
- 守护进程的设计旨在在后台运行,通常用于处理系统任务、服务和定时任务等。
测试
代码如下:
#include <iostream>
#include <cstdlib>
#include <signal.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>const char *root = "/";
const char *dev_null = "/dev/null";int main()
{// 1. 忽略可能引起程序异常退出的信号signal(SIGCHLD, SIG_IGN);signal(SIGPIPE, SIG_IGN);// 2. 让自己不要成为组长if (fork() > 0)exit(0);// 3. 设置让自己成为一个新的会话, 后面的代码其实是子进程在走setsid();// 4. 再次fork,终止父进程,保持子进程不是会话首进程,// 从而保证后续不会再和其他终端相关联(不是必须的,防御性编程)if (fork() > 0){// fatherexit(0);}// 5. 每一个进程都有自己的CWD,将当前进程的CWD更改成为 / 根目录(可选)chdir(root);// 6. 已经变成守护进程啦,不需要和用户的输入、输出和错误进行关联了(可选)int fd = open(dev_null, O_RDWR);if (fd > 0){dup2(fd, 0);dup2(fd, 1);dup2(fd, 2);close(fd);}// 7.执行守护进程的任务while (1);return 0;
}
运行代码,用ps命令查看该进程,会发现该进程的TPGID为-1
,TTY显示的是?
,也就意味着该进程已经与终端去关联了。
其次,我们还可以看到该进程的PID与其PGID和SID是不同的,也就是说该进程既不是组长进程也不是会话首进程。
此外,我们还可以看到该进程的SID与bash进程的SID是不同的,即它们不属于同一个会话。
通过ls /proc/进程id -al
命令,可以看到该进程的工作目录已经成功改为了根目录。
通过ls /proc/进程id/fd -al
命令,可以看到该进程的标准输入、标准输出以及标准错误也成功重定向到了/dev/null
。
调用daemon函数创建守护进程
实际当我们创建守护进程时可以直接调用daemon接口进行创建,daemon函数的函数原型如下:
int daemon(int nochdir, int noclose);
参数说明:
- 如果参数nochdir为0,则将守护进程的工作目录该为根目录,否则不做处理。
- 如果参数noclose为0,则将守护进程的标准输入、标准输出以及标准错误重定向到
/dev/null
,否则不做处理。
调用示例:
#include <unistd.h>int main()
{daemon(0, 0);while (1);return 0;
}
调用daemon函数创建的守护进程与我们原生创建的守护进程差距不大,唯一区别就是daemon函数创建出来的守护进程,既是组长进程也是会话首进程,也就是说系统实现的daemon函数没有防止守护进程打开终端。
模拟实现daemon函数
有了上述创建守护进程的代码,要模拟实现daemon函数就很容易了,我们只需要设置两个参数nochdir和noclose,当所给nochdir为0时,我们将守护进程的工作目录该为根目录,当所给noclose为0时,我们则将守护进程的标准输入、标准输出以及标准错误重定向到/dev/null
即可。(这里为了和操作系统中的daemon函数保持一致,我们删去了防御性编程代码)
daemon.hpp代码如下:
#pragma once#include <iostream>
#include <cstdlib>
#include <signal.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>const char *root = "/";
const char *dev_null = "/dev/null";void Daemon(int ischdir, int isclose)
{// 1. 忽略可能引起程序异常退出的信号signal(SIGCHLD, SIG_IGN);signal(SIGPIPE, SIG_IGN);// 2. 让自己不要成为组长if (fork() > 0)exit(0);// 3. 设置让自己成为一个新的会话, 后面的代码其实是子进程在走setsid();// 4. 每一个进程都有自己的CWD,是否将当前进程的CWD更改成为 / 根目录if (ischdir == 0)chdir(root);// 5. 已经变成守护进程啦,不需要和用户的输入、输出和错误进行关联了if (isclose){close(0);close(1);close(2);}else{int fd = open(dev_null, O_RDWR);if (fd > 0){dup2(fd, 0);dup2(fd, 1);dup2(fd, 2);close(fd);}}
}
相关文章:
Linux任务管理与守护进程
文章目录 🍅任务管理进程组概念作业概念会话概念相关操作前台进程&后台进程jobsfgbgps命令查看指定的选项 🫒守护进程守护进程的概念作用守护进程的查看守护进程的创建原生创建守护进程调用daemon函数创建守护进程模拟实现daemon函数 🍅任…...
《Trustzone/TEE/安全从入门到精通-标准版》
CSDN学院课程连接:https://edu.csdn.net/course/detail/39573 讲师介绍 拥有 12 年手机安全、汽车安全、芯片安全开发经验,擅长 Trustzone/TEE/ 安全的设计与开发,对 ARM 架构的安全领域有着深入的研究和丰富的实践经验,能够将复杂的安全知识和处理器架构知识进行系统整…...
java 字符串日期字段格式化前端显示
在 Java 应用程序中,如果你有一个字符串类型的日期字段,并希望将其格式化后显示在前端,可以通过多种方式实现。这通常涉及到在后端将字符串转换为 Date 或 LocalDateTime 等对象,然后使用适当的注解或配置来确保它们以正确的格式序…...
LabVIEW橡胶动态特性测试系统
本文介绍了一个利用LabVIEW软件和NI高速数据采集设备构建的橡胶动态特性测试系统。该系统实现了橡胶材料动态性能的精确测量,并通过虚拟仪器技术,提高了测试数据的处理效率和准确性。系统支持实时数据处理和多种信号的动态分析,适用于工业和科…...
deepseek-r1 本地部署
deepseek 最近太火了 1:环境 win10 cpu 6c 内存 16G 2: 部署 1>首先下载ollama 官网:https://ollama.com ollama 安装在c盘 模型可以配置下载到其他盘 OLLAMA_MODELS D:\Ollama 2>下载模型并运行 ollama run deepseek-r1:<标签> 1.5b 7b 8…...
28. 【.NET 8 实战--孢子记账--从单体到微服务】--简易报表--报表定时器与报表数据修正
这篇文章是《.NET 8 实战–孢子记账–从单体到微服务》系列专栏的《单体应用》专栏的最后一片和开发有关的文章。在这片文章中我们一起来实现一个数据统计的功能:报表数据汇总。这个功能为用户查看月度、年度、季度报表提供数据支持。 一、需求 数据统计方面&…...
具身智能技术趋势
参考: 【北京大学-董豪】具身智能技术趋势分析 2024.8 回答了具身智能技术G3、G4的必要性,以及真实数据、仿真数据、互联网数据之间的关系 具身智能趋势 趋势:寻求一个通用路径实现所有的上肢操作 要求:① 低成本 ② 拓展到所有…...
JavaScript逆向高阶指南:突破基础,掌握核心逆向技术
JavaScript逆向高阶指南:突破基础,掌握核心逆向技术 JavaScript逆向工程是Web开发者和安全分析师的核心竞争力。无论是解析混淆代码、分析压缩脚本,还是逆向Web应用架构,掌握高阶逆向技术都将助您深入理解复杂JavaScript逻辑。本…...
C#面试常考随笔6:ArrayList和 List的主要区别?
在 C# 中,ArrayList和List<T>(泛型列表)都可用于存储一组对象。推荐优先使用List<T>,因为它具有更好的类型安全性、性能和语法简洁性,并且提供了更丰富的功能。只有在需要与旧代码兼容或存储不同类型对象的…...
【数据结构】 并查集 + 路径压缩与按秩合并 python
目录 前言模板朴素实现路径压缩按秩合并按树高为秩按节点数为秩 总结 前言 并查集的基本实现通常使用森林来表示不同的集合,每个集合用一棵树表示,树的每个节点有一个指向其父节点的指针。 如果一个节点是它自己的父节点,那么它就是该集合的代…...
使用 Redis List 和 Pub/Sub 实现简单的消息队列
使用 Redis List 和 Pub/Sub 实现简单的消息队列 Redis 本身不是专门的消息队列系统,但它提供了多种数据结构(如 List、Pub/Sub、Stream)来实现消息队列功能。根据不同的业务需求,可以选择不同的方式: 在 Redis 中&a…...
aerodrome交易所读合约分析
池地址 0xb2cc224c1c9fee385f8ad6a55b4d94e92359dc59token0 0x4200000000000000000000000000000000000006token1 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913tickSpacing 100stakedLiquidity 4579376109215388530 snapshotCumulativesInside tickLower tickUpperslot0 …...
mybatis(112/134)
多对一 第一种方法: 一的表参数设置: <association property"clazz" javaType"Clazz"> <id property"cid" column"cid"/> <result property"cname" column"cname"/> <…...
Node.js与MySQL模块结合:打造安全高效的用户信息管理系统
摘要 本文探讨使用Node.js构建前端项目并导入MySQL模块创建数据库连接对象的方法。文中讲解了共享数据库连接对象,定义SQL语句查询和更新用户信息(排除密码字段以保护隐私),以及根据用户ID更新基本信息、重置密码和更新头像的具体…...
【C++】设计模式详解:单例模式
文章目录 Ⅰ. 设计一个类,不允许被拷贝Ⅱ. 请设计一个类,只能在堆上创建对象Ⅲ. 请设计一个类,只能在栈上创建对象Ⅳ. 请设计一个类,不能被继承Ⅴ. 请设计一个类,只能创建一个对象(单例模式)&am…...
在ubuntu下一键安装 Open WebUI
该脚本用于自动化安装 Open WebUI,并支持以下功能: 可选跳过 Ollama 安装:通过 --no-ollama 参数跳过 Ollama 的安装。自动清理旧目录:如果安装目录 (~/open-webui) 已存在,脚本会自动删除旧目录并重新安装。完整的依…...
【某大厂一面】数组和链表区别
在 Java 中,数组(Array)和链表(LinkedList)是两种常见的数据结构,它们在存储和操作方式上有显著的区别。了解它们的差异有助于选择适合特定应用场景的结构。下面是数组和链表之间的详细比较。 1. 存储结构…...
MySQL常用数据类型和表的操作
文章目录 (一)常用数据类型1.数值类2.字符串类型3.二进制类型4.日期类型 (二)表的操作1查看指定库中所有表2.创建表3.查看表结构和查看表的创建语句4.修改表5.删除表 (三)总代码 (一)常用数据类型 1.数值类 BIT([M]) 大小:bit M表示每个数的位数,取值范围为1~64,若…...
深入 Rollup:从入门到精通(三)Rollup CLI命令行实战
准备阶段:初始化项目 初始化项目,这里使用的是pnpm,也可以使用yarn或者npm # npm npm init -y # yarn yarn init -y # pnpm pnpm init安装rollup # npm npm install rollup -D # yarn yarn add rollup -D # pnpm pnpm install rollup -D在…...
3.日常英语笔记
screening discrepancies 筛选差异 The team found some screening discrepancies in the data. 团队在数据筛选中发现了些差异。 Don’t tug at it ,or it will fall over and crush you. tug 拉,拽,拖 He tugged the door open with all his might…...
sqlite3 学习笔记
文章目录 前言SQL的概念与表格相关的操作i.创建表格(增)ii 删除表格(删)iii 更改表格(改)iv 查询表格(查) 与记录相关的操作i 插入记录ii 删除记录iii 查询记录iv 修改记录 Linux中使…...
C++ | 红黑树
前言 本篇博客讲解c中数据结构红黑树,看这篇博客之前请先去看: C | AVL树_c avl树能有重复节点吗-CSDN博客 💓 个人主页:普通young man-CSDN博客 ⏩ 文章专栏:C_普通young man的博客-CSDN博客 ⏩ 本人giee: 普通小青…...
使用Ollama 在Ubuntu运行deepseek大模型:以DeepSeek-coder为例
DeepSeek大模型这几天冲上热搜啦! 咱们来亲身感受下DeepSeek模型的魅力吧! 整个操作流程非常简单方便,只需要2步,先安装Ollama,然后执行大模型即可。 安装Ollama 在Ubuntu下安装Ollama非常简单,直接sna…...
詳細講一下RN(React Native)中的列表組件FlatList和SectionList
1. FlatList 基礎使用 import React from react; import { View, Text, FlatList, StyleSheet } from react-native;export const SimpleListDemo: React.FC () > {// 1. 準備數據const data [{ id: 1, title: 項目 1 },{ id: 2, title: 項目 2 },{ id: 3, title: 項目 3…...
《深度揭秘:TPU张量计算架构如何重塑深度学习运算》
在深度学习领域,计算性能始终是推动技术发展的关键因素。从传统CPU到GPU,再到如今大放异彩的TPU(张量处理单元),每一次硬件架构的革新都为深度学习带来了质的飞跃。今天,就让我们深入探讨TPU的张量计算架构…...
QT使用eigen
QT使用eigen 1. 下载eigen https://eigen.tuxfamily.org/index.php?titleMain_Page#Download 下载后解压 2. QT引入eigen eigen源码好像只有头文件,因此只需要引入头文件就好了 qt新建项目后。修改pro文件. INCLUDEPATH E:\222078\qt\eigen-3.4.0\eigen-3.…...
工业“MCU+AI”
随着工业4.0的推进,传统工业设备正向智能化和自动化方向转型。这要求设备具备更高的算力、更强的实时处理能力以及支持AI算法的能力,以应对工业机器人、电机控制、预测性维护等复杂应用场景。 近年来越来越多的芯片厂商纷纷推出工业“MCUAI”产品&#…...
【Linux】Linux C判断两个IPv6地址是否有包含关系
功能说明 要判断两个 IPv6 地址是否具有包含关系,包括前缀的比较,可以通过以下步骤实现: 解析 IPv6 地址和前缀:将两个 IPv6 地址和它们的前缀长度解析为二进制形式。生成掩码:根据前缀长度生成掩码。按位比较&#…...
多模态论文笔记——TECO
大家好,这里是好评笔记,公主号:Goodnote,专栏文章私信限时Free。本文详细解读多模态论文TECO(Temporally Consistent Transformer),即时间一致变换器,是一种用于视频生成的创新模型&…...
AI学习(vscode+deepseek+cline)
1、网页生成不成功时,直接根据提示让模型替你解决问题 2、http://localhost:3000 拒绝链接时,cmd输入命令InetMgr,网站右键新建-配置你的网页代码物理地址,这里我还输入本机登录名及密码了,并把端口地址由默认80修改为…...
物业软件推动物业行业数字化转型 实现高效管理和优质客户体验
内容概要 在当今高速发展的数字化时代,物业软件的出现不仅使物业管理变得更加高效,也为行业转型提供了强大的支持。通过整合多种功能,物业软件显著提升了管理效率和客户体验。例如,在线收费和停车管理功能,让业主享受…...
WGCLOUD使用手册 - 登录验证码如何设置
登录页面默认是不用输入验证码的,但是我们也可以根据自己的实际场景,配置登录页面显示验证码,要求用户输入 提示:您需要需要升级到v3.5.3或以上版本,才可以支持此功能 我们在server配置文件里找到配置项vercodeCheck&…...
C# 9.0记录类型:解锁开发效率的魔法密码
一、引言:记录类型的神奇登场 在 C# 的编程世界中,数据结构就像是构建软件大厦的基石,其重要性不言而喻。然而,传统的数据结构定义方式,尤其是在处理简单的数据承载对象时,常常显得繁琐复杂。例如…...
Python 函数魔法书:基础、范例、避坑、测验与项目实战
Python 函数魔法书:基础、范例、避坑、测验与项目实战 内容简介 本系列文章是为 Python3 学习者精心设计的一套全面、实用的学习指南,旨在帮助读者从基础入门到项目实战,全面提升编程能力。文章结构由 5 个版块组成,内容层层递进…...
Unbutu虚拟机+eclipse+CDT编译调试环境搭建
问题1: 安装CDT,直接Help->eclipse Market space-> 搜cdt , install,等待重启即可. 问题2:C变量不识别vector ’could not be resolved 这是库的头文件没加好,右键Properties->C Build->Enviroment,增加…...
项目部署(springboot项目)
1、安装Nginx,并开启 2、前端项目打包:npm run build:prod--->dist 3、后端项目打包:install--->xxx.jar 4、开放需要的端口号:比如我的后端项目端口号为8282,则需要防火墙和服务器同时开发8282端口 5、将di…...
Spring MVC拦截器
文章目录 1. 拦截器(interceptor)的作用2. 拦截器和过滤器区别3. 拦截器是快速入门 1. 拦截器(interceptor)的作用 Spring MVC 的拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理。 将拦截器按一定的顺序联结成一条链,这条…...
Nginx 路由匹配(Nginx Route Matching)
从小白到高手:深入Nginx 路由匹配 在现代互联网应用中,Nginx 作为一款高性能的 Web 服务器,因其灵活性和高效性而广泛应用于各类网站和服务。Nginx 的路由匹配规则是其核心功能之一,负责决定如何处理传入的请求。通过这些规则&am…...
基于RIP的MGRE实验
实验拓扑 实验要求 按照图示配置IP地址配置静态路由协议,搞通公网配置MGRE VPNNHRP的配置配置RIP路由协议来传递两端私网路由测试全网通 实验配置 1、配置IP地址 [R1]int g0/0/0 [R1-GigabitEthernet0/0/0]ip add 15.0.0.1 24 [R1]int LoopBack 0 [R1-LoopBack0]i…...
Spring Boot 中的事件发布与监听:深入理解 ApplicationEventPublisher(附Demo)
目录 前言1. 基本知识2. Demo3. 实战代码 前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 基本的Java知识推荐阅读: java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全&am…...
【Java基础-41.5】深入解析Java异常链:构建清晰的错误追踪体系
在Java编程中,异常处理是保证程序健壮性和可维护性的重要部分。然而,在实际开发中,异常往往不是孤立发生的,而是由一系列相关的异常引发的。为了更好地理解和处理这种复杂的异常场景,Java引入了 异常链(Exc…...
STM32使用VScode开发
文章目录 Makefile形式创建项目新建stm项目下载stm32cubemx新建项目IED makefile保存到本地arm gcc是编译的工具链G++配置编译Cmake +vscode +MSYS2方式bilibiliMSYS2 统一环境配置mingw32-make -> makewindows环境变量Cmake CmakeListnijia 编译输出elfCMAKE_GENERATOR查询…...
特权模式docker逃逸
目录 1.环境 2.上线哥斯拉 3.特权模式逃逸 1.判断是否为docker环境 2.判断是否为特权模式 3.挂载宿主机磁盘到docker 4.计划任务反弹shell 1.环境 ubuntu部署一个存在CVE-2017-12615的docker: (ip:192.168.117.147) kali(ip:192.168.117.128) 哥斯拉 2.上线哥斯拉…...
装出字符串中国第一个匹配项的下标
hello 大家好!今天开写一个新章节,每一天一道算法题。让我们一起来学习算法思维吧! function strStr(haystack, needle) {return haystack.indexOf(needle); }// 测试示例 const haystack "sadbutsad"; const needle "sad&q…...
从腾讯云数据仓库TCHouse安全地转移数据到AWS Redshift
实现从AWS Direct Connect连接到腾讯云数据仓库TCHouse-P、TCHouse-C或TCHouse-D,然后使用AWS Glue读取数据并在AWS Redshift中创建对应表并复制数据,需要按照以下步骤进行操作: 网络连接设置 AWS Direct Connect配置: 在AWS管理…...
DataComp:探索下一代多模态数据集
目录 一、TL;DR 二、方法 2.1 为什么要单独研究数据质量? 2.2 数据质量的研究范式 三、其他的工作(related work) 3.1 传统的做法 3.2 数据剪枝和去重(paper直接翻译) 四、DataComp的benchmark 4.1 竞赛条件限…...
【linux】Linux 常见目录特性、权限和功能
目录特性默认权限主要功能/用途/根目录,所有目录的起点755文件系统的顶层目录,包含所有其他子目录和文件/bin基础二进制命令目录(系统启动和修复必需的命令)755存放所有用户可用的基本命令(如 ls, cp, bash 等…...
基于SpringBoot电脑组装系统平台系统功能实现六
一、前言介绍: 1.1 项目摘要 随着科技的进步,计算机硬件技术日新月异,包括处理器(CPU)、主板、内存、显卡等关键部件的性能不断提升,为电脑组装提供了更多的选择和可能性。不同的硬件组合可以构建出不同类…...
Direct2D 极速教程(1) —— 画图形
极速导航 Direct2D 简介创建新项目:001-DrawGraphics弄一个白窗口在窗口上画图 Direct2D 简介 大家在学 WINAPI 的时候的时候有没有想过,怎么在一副窗口上画图呢?大家知道 Windows 系统是 GUI 图形用户界面 系统,以 Graphics 图形…...
DF 开发1
https://www.bilibili.com/video/BV1RFChYxEhJ/ 多个 workspace 图片上传 S3 上传大量文档 https://www.bilibili.com/video/BV1ySsEeUE6i 解决方案 返回 metadata https://www.bilibili.com/video/BV1t3e5eaENo 给出内容引用出处 模型负载均衡 可以以 ollama 在不同端口起服…...