Linux:进程概念(二.查看进程、父进程与子进程、进程状态详解)
目录
1. 查看进程
1.1 准备工作
1.2 指令:ps—显示当前系统中运行的进程信息
1.3 查看进程属性
1.4 通过 /proc 系统文件夹看进程
2. 父进程与子进程
2.1 介绍
2.2 getpid() \getppid()
2.3 fork()函数—通过系统调用创建进程
fork()函数疑问
3. 进程状态
3.1 进程排队
3.2 教材上进程状态的表述——运行、阻塞、挂起
运行
阻塞
挂起
3.3 Linux中状态初步认识
1. 查看进程
1.1 准备工作
先写好代码:
#include<stdio.h>
#include<unistd.h>int main()
{while(1){printf("I'm a process\n");sleep(2)}//写一个死循环,没两秒打印一次return 0;
}
makefile
文件也写好:
mycode:code.cgcc -o $@ $^ -std=c99
.PHONY:clean
clean rm -f mycode
1.2 指令:ps—显示当前系统中运行的进程信息
ps
是一个常用的 Unix/Linux 命令,用于显示当前系统中运行的进程信息。它的名称来源于 “process status”(进程状态)的缩写。通过 ps
命令,您可以查看正在运行的进程的各种信息,例如进程 ID、CPU 使用情况、内存占用、进程状态等。
常用的 ps
命令选项和参数:
- -e 或 -A:显示所有进程,等同于 -e。
- -f:显示全格式,包括进程的 UID、PID、PPID、C、STIME、TTY、TIME 和 CMD 等信息。
- -l:以长格式显示进程信息,包括 UID、PID、PPID、C、PRI、NI、ADDR、SZ、WCHAN、TTY、TIME 和 CMD 等。
- -u:以用户格式显示进程信息,包括 USER、PID、%CPU、%MEM、VSZ、RSS、TTY、STAT、START 和 TIME。
- -a:显示所有进程,包括其他用户的进程。
- -j:以作业格式显示进程信息,包括 PID、PPID、PGID、SID、UID、C、STIME、TTY、TIME 和 CMD 等。
- -x:同时显示没有控制终端的进程(守护进程)。
综合来说,
ps -ajx
命令会列出当前系统中所有进程的详细信息,包括进程的作业信息以及其他相关信息
常见的 ps
命令用法包括:
ps
:显示当前用户的正在运行的进程。ps ajx
:ps -ajx
是一个常用的 Unix/Linux 命令,用于显示当前系统中所有进程的详细信息,并以完整的格式输出ps ajx | grep process_name
:查找特定进程名的进程。- ps adj | head -1 :显示进程的字段
在输出中,第一个进程是你的可执行文件 mycode 的进程,第二个进程是由于你使用了 grep 命令进行字符串匹配而产生的 grep 进程
具体来说:
- 第一个进程(PID为10995)是你的可执行文件 mycode,它的 PPID(Parent Process ID)是10138,表示它的父进程是PID为10138的进程。
- 第二个进程(PID为10999)是 grep 命令,它用于搜索包含字符串 “mycode” 的进程。
终止后:
1.3 查看进程属性
进程的属性都在task_struct 里,而task_struct是操作系统内部的数据,我们想要访问内部的数据只能通过系统调用
#include<stdio.h>
#include<unistd.h> int main()
{pid_t id =getpid();//获取进程pid的函数while(1){printf("I'm a process,pid:%d\n",id);sleep(2);}//写一个死循环,没两秒打印一次return 0;
}
getgid()
函数是一个系统调用,用于获取调用进程的有效组 ID(Group ID)。在 Linux 中,每个进程都属于一个或多个组,
getgid()
函数返回调用进程的有效组 ID。其函数原型定义在<unistd.h>
头文件中:#include <unistd.h>gid_t getgid(void);
其中,
gid_t
是一个类型,通常是一个无符号整数类型,用于表示组 ID。
1.4 通过 /proc 系统文件夹看进程
在Linux系统中,/proc文件系统提供了关于运行中进程的详细信息。你可以通过查看/proc文件系统中的特定目录和文件来获取有关进程的信息。下面是一些你可以在/proc文件系统中找到的有关进程的信息:
1. /proc/[PID]:这是一个以进程ID(PID)命名的目录,其中包含有关特定进程的详细信息。你可以使用命令
ls /proc/[PID]
来查看。2. /proc/[PID]/status:此文件包含有关进程的各种状态信息,例如进程ID、父进程ID、进程状态、内存使用情况等。你可以使用命 令
cat /proc/[PID]/status
查看。3. /proc/[PID]/cmdline:此文件包含启动进程时使用的完整命令行参数。你可以使用命令
cat /proc/[PID]/cmdline
查看。4. /proc/[PID]/exe:这是一个符号链接,指向正在运行的进程的可执行文件。你可以使用命令
ls -l /proc/[PID]/exe
查看。5. /proc/[PID]/fd:这是一个目录,包含有关进程打开的所有文件描述符的信息。你可以使用命令
ls /proc/[PID]/fd
查看。
2. 父进程与子进程
2.1 介绍
在操作系统中,当一个进程(称为父进程)创建另一个新进程(称为子进程)时,父子进程之间建立了一种特殊的关系。这种关系具有以下特点和行为:
1. 父子关系:
- 子进程的父进程是创建它的进程,即父进程。
- 每个进程都有唯一的父进程。
2. PID关系:
- 子进程的PID(进程标识符)是由父进程调用
fork()
或类似系统调用创建的。- 子进程的PPID(父进程标识符)与创建它的父进程的PID相同。
3. 资源继承:
- 子进程继承了父进程的大部分属性和资源,包括内存映像、文件描述符、信号处理器等。
- 子进程在创建时拥有父进程的副本,但在其生命周期中可以独立修改这些副本。
几乎所有进程都是由其他进程创建的,因为通常情况下,操作系统启动时会先创建一个初始进程(通常是init进程或systemd),然后其他进程都是由这些初始进程创建的。但是,也有一些特殊情况下的进程,比如内核线程和守护进程,它们可能是由操作系统内核直接创建的,而不是由其他进程创建的。总体而言,大多数进程都是有其父进程创建的。
2.2 getpid() \getppid()
父进程和子进程之间的关系是一个重要的概念,它们之间的关系可以通过系统调用来获取。在Unix/Linux系统中,可以使用 getpid()
系统调用来获取当前进程的PID,使用 getppid()
系统调用来获取当前进程的父进程的PID。
以下是这两个系统调用的简要说明:
-
getpid()
:该系统调用返回调用进程的PID,即当前进程的PID。 -
getppid()
:该系统调用返回调用进程的父进程的PID,即当前进程的父进程的PID。
#include <stdio.h>
#include <unistd.h>int main() {pid_t pid = getpid(); // 获取当前进程的PIDpid_t ppid = getppid(); // 获取当前进程的父进程的PIDprintf("PID: %d\n", pid);printf("PPID: %d\n", ppid);return 0;
}
2.3 fork()函数—通过系统调用创建进程
我们要创建一个进程,那一定涉及到访问操作系统的内部数据,肯定也需要使用系统调用
fork
是一个系统调用(也是库函数),用于创建一个新的进程。它会复制调用进程(父进程)的内存和上下文,包括代码段、数据段、堆栈等,然后将这个副本分配给新创建的进程(子进程)。fork
系统调用的原型通常定义在 <unistd.h>
头文件中。
pid_t
是一个类型,用于表示进程 ID,fork
函数返回的是一个pid_t
类型的值。
fork
调用成功时,在父进程中返回子进程的 PID,而在子进程中返回 0。- 如果
fork
调用失败,则返回一个负数,表示错误。
在 fork
调用后,父子进程都会继续执行 fork
调用之后的指令,但是它们会在不同的地址空间中运行,即它们各自拥有独立的内存空间。这意味着,父进程和子进程之间的数据是相互独立的,任何一个进程对内存的修改都不会影响到另一个进程。
父子进程代码共享的原理是采用写时拷贝(copy-on-write)。在 fork 调用后,操作系统并不会立即复制父进程的内存给子进程,而是让父子进程共享同一段内存空间。只有当其中一个进程试图修改共享的内存时,操作系统才会复制该内存页,确保修改不会影响到其他进程。这样做可以节省内存,并提高效率。
fork()函数疑问
1. 怎么理解fork()
是系统调用也是库函数
fork
在 Unix-like 系统中既是一个系统调用,也是一个库函数,可以这样理解:
- 系统调用(System Call):系统调用是操作系统提供给用户空间程序访问内核功能的一种机制。
fork
系统调用是由操作系统内核实现的,用于创建一个新的进程。当用户程序调用fork
时,实际上是请求操作系统内核为其创建一个新的进程,这需要通过系统调用来完成。- 库函数:库函数是一组在编程时可调用的函数,这些函数通常包含在标准库或其他库中。在 Unix-like 系统中,C 标准库中包含了对
fork
函数的封装,这意味着用户程序可以通过调用fork
库函数来发起对fork
系统调用的请求,而不必直接调用系统调用。从用户程序的角度来看,
fork
可以被视为一个库函数,因为它是通过调用库函数来实现的。从操作系统内核的角度来看,
fork
是一个系统调用,因为它需要通过内核来创建新的进程。
fork
函数在调用后会返回两次,这是因为它是一个复制当前进程的系统调用。下面是对这两个返回值的解释:
- 给父进程返回子进程的 PID:在父进程中,fork 返回新创建子进程的进程 ID(PID),这个 PID 是子进程的标识符,父进程通过这个 PID 可以识别并操作子进程。
- 给子进程返回 0:在子进程中,fork 也会返回一个值,但是返回的是 0。这是因为在 Unix-like 系统中,子进程是通过复制父进程的地址空间而创建的,因此子进程从父进程继承了大部分的内存布局和数据。为了区分父进程和子进程,fork 在子进程中返回 0,表示这是子进程执行的代码路径。
- fork函数为什么会返回两次:fork 函数在调用后会创建一个新的子进程(在return之前就已经创建好子进程了),新的子进程拥有父进程的副本。因此,fork 在执行时会返回两次:一次在父进程中(返回子进程的 PID),另一次在子进程中(返回 0)。这样做是为了让父进程和子进程可以根据返回值来执行不同的代码路径。
使用fork()函数
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>int main()
{printf("最开始的进程pid:%d, ppid:%d\n",getpid(),getppid());sleep(1);pid_t id=fork();printf("使用fork函数之后的进程\n");if(id<0) return 1;//说明创建失败else if(id==0){//只有子进程能进这里,我们就可以让子进程做自己的事printf("子进程pid:%d, ppid:%d\n",getpid(),getppid());sleep(2);}else { //只有父进程能进这里printf("父进程pid:%d, ppid:%d\n",getpid(),getppid());}return 0;
}
3. 进程状态
3.1 进程排队
我们首先要知道:进程不是一直在运行的。进程放在了CPU上,也不是一直会运行的,可能在等待某种软硬件资源
而且计算机的资源相对来说一直是不够的,那么必然出现进程排队的情况,那么排队是怎么个排法呢?
- 排队是进程的
task_struct
结构体在排队——放到一个队列里
3.2 教材上进程状态的表述——运行、阻塞、挂起
在操作系统中,进程的状态可以分为多种,常见的包括运行、阻塞和挂起。每种状态都对应着一个状态队列,用于存储处于相应状态的进程
1. 进程状态的本质:
- 进程状态通常被表示为整数值,这些整数值定义了进程当前所处的状态。在内核中,进程的状态由一个整型变量表示,通常称为状态字段。不同的操作系统可能会使用不同的状态值和命名,但通常包括就绪、运行、阻塞等状态。
2. 状态决定的后续动作:
- 进程的状态决定了操作系统对其后续动作的处理方式。不同状态的进程可能会有不同的处理逻辑,以确保系统的正常运行和资源的合理利用。
- 例如处于运行状态的进程会被分配 CPU 时间片并执行指令;处于阻塞状态的进程会被放入阻塞队列中等待某种事件的发生,如 I/O 操作的完成
运行
1. 一个 CPU 一个运行队列:
- 在操作系统中,为了有效地管理进程的调度和执行,通常会为每个 CPU 维护一个运行队列。这个运行队列存储了当前可运行的进程,即那些已经准备好被 CPU 调度执行的进程
2. 运行队列结构体定义:
- 为了管理运行队列,可以定义一个结构体来表示,通常包括两个重要的字段:
- num:表示队列中当前的进程数量,即队列长度。
- q:一个指针,指向保存了 PCB(Process Control Block,进程控制块)信息的结构体。这个结构体可能是链表或其他数据结构,存储了就绪状态的进程的信息。
3. 已加载到运行队列的含义:
- 当一个进程被加载到运行队列中时,意味着它已经准备好被 CPU 随时调度执行了。这意味着进程已经完成了一些初始化工作,获取了所需的资源,并且已经被操作系统标记为可执行状态。它随时可以被操作系统的调度器选择,并分配 CPU 时间片来执行其任务。
阻塞
- 当进程需要等待某种事件发生时,例如等待 I/O 操作完成或等待某个信号,它会进入阻塞状态。在阻塞状态下,进程暂时停止执行,让出 CPU 给其他可以执行的进程。
- 对应的状态队列是阻塞队列,其中存储了因为等待某种事件而被阻塞的进程的信息。一旦等待的事件发生,进程就会从阻塞队列中移出,并重新进入就绪状态,等待 CPU 调度执行。
- 阻塞状态有一个阻塞队列,这个队列通常由操作系统维护,用于存放因为等待某种事件而被阻塞的进程。
- 阻塞队列通常与特定的硬件设备相关联。例如,如果一个进程等待磁盘 I/O 操作完成,那么它就会被放入磁盘 I/O 队列中。这样,当硬件设备完成相应的操作时,操作系统可以方便地找到并唤醒等待的进程。
- 进程进入等待队列确实意味着它被链接到底层设备。这样,当设备就绪并且有了相应的数据或事件时,操作系统可以从等待队列中找到相应的进程,并唤醒它们以继续执行。
- 当设备已经就绪时,操作系统会通知相关的进程,告诉它们可以执行了。这个状态由操作系统来管理,因为操作系统能够监控硬件设备的状态并作出相应的调度决策。
#include<stdio.h>int main()
{int a=0;scnaf("%d",&a);printf("%d",a);return 0;
}
- 这段代码中,需要获取软硬件的资源所以进入阻塞状态
- 阻塞队列(等待队列)是由对应的的硬件提供的,scanf这里就是键盘
- 进程进入等待队列是把进程链入底层设备的一个过程!
这个过程:
- 当进程执行到 scanf() 函数时,它会尝试从标准输入读取数据。如果标准输入是终端设备(比如键盘),则进程需要等待用户输入数据。此时,操作系统将会将进程状态从运行状态更改为阻塞状态,表示进程暂时无法继续执行,因为它在等待外部事件的发生。
- 此时,进程的 task_struct 将从运行队列中移除,并加入到描述键盘的结构中,以便在键盘输入数据后能够唤醒这个进程。
- 当用户输入数据并按下回车键后,操作系统会将输入的数据传递给进程,并将该进程的状态从阻塞状态更改为就绪状态。接着,进程将重新加入到运行队列中,等待 CPU 的调度执行。
- 一旦进程再次被调度到 CPU 上执行,它将继续执行 printf() 函数,并输出用户输入的数据。然后进程执行完成,返回0,最终退出。
挂起
- 进程进入挂起状态通常是因为系统资源已经极度紧张,没有足够的资源来继续运行所有进程。此时,操作系统会将一些不活跃的进程暂时挂起,以释放资源给其他更重要或更活跃的进程使用。
- 挂起状态也可以称为阻塞挂起,因为进程在挂起状态下被阻塞,无法执行任何操作,直到被重新唤醒。
- 在挂起状态下,操作系统可能会将进程的代码和数据从内存中转移到外部存储设备中,以节省内存空间。这样做的目的是为了释放内存资源,让其他活跃的进程有更多的空间来执行。
- 挂起状态的意义在于,通过暂时挂起一些不活跃的进程,可以避免系统资源耗尽导致操作系统崩溃或无法响应。虽然挂起状态可能会导致一些进程的执行速度变慢,但这是为了整个系统的稳定性和可靠性考虑的。
3.3 Linux中状态初步认识
一个进程可以有几个状态(在Linux内核里,进程有时候也叫做任务)进程的状态通常由几个不同的状态标识符表示。以下是一些常见的进程状态及其在内核源代码中的定义:
static const char* const task_state_array[] =
{"R (running)", /* 0 */"S (sleeping)", /* 1 */"D (disk sleep)", /* 2 */"T (stopped)", /* 4 */"t (tracing stop)", /* 8 */"X (dead)", /* 16 */"Z (zombie)", /* 32 */
};
R运行状态(running): 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里。
S睡眠状态(sleeping): 意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠(interruptible sleep))
D磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。
T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行。
X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态
相关文章:
![](https://i-blog.csdnimg.cn/direct/4ebcadf69a1b47168fb6c1d1cdd20b45.png)
Linux:进程概念(二.查看进程、父进程与子进程、进程状态详解)
目录 1. 查看进程 1.1 准备工作 1.2 指令:ps—显示当前系统中运行的进程信息 1.3 查看进程属性 1.4 通过 /proc 系统文件夹看进程 2. 父进程与子进程 2.1 介绍 2.2 getpid() \getppid() 2.3 fork()函数—通过系统调用创建进程 fork()函数疑问 3. 进程状态…...
![](https://i-blog.csdnimg.cn/direct/5122388d58524b12b2a10b56e71a0535.png)
苍穹外卖07——来单提醒和客户催单(涉及SpringTask、WebSocket协议、苍穹外卖跳过微信支付同时保证可以收到订单功能)
Spring Task介绍 应用场景: 信用卡每月还款提醒银行贷款每月还款提醒火车票销售系统处理未付款订单入职纪念日为用户发送通知 cron表达式 cron表达式其实就是一个字符串,通过cron表达式可以定义任务触发的时间。 构成规则:分为6或7个域&…...
![](https://www.ngui.cc/images/no-images.jpg)
C语言二级考试
你必须知道的 二级考试不是编写程序,或者说不只是编程的考核,它还会考核计算机C语言相关语言还有内涵等基础知识,比较全面综合(说人话,要看最新考纲具备一定的基础知识) 考试时间 120 分钟 分值 100 分&…...
![](https://i-blog.csdnimg.cn/img_convert/dafcf22ad2e0e0df2f57de264d7a8ab6.png)
IDEA Maven构建时报错:无效的目标发行版17
报错分析 报错原因:Maven 构建时,Java 版本配置不匹配 我安装的JDK版本是1.8,但由于种种原因,Maven构建时指定了 Java 17 作为目标发行版,从而导致错误 解决方案 首先,java -version,查看环…...
![](https://www.ngui.cc/images/no-images.jpg)
javafx 将项目打包为 Windows 的可执行文件exe
要将 JavaFX 项目打包为 .exe 文件,你可以使用一些工具将你的应用程序封装为 Windows 可执行文件。以下是两种常用的方法: 方法 1:使用 jpackage(适用于 JDK 14 及更高版本) jpackage 是 JDK 内置的工具,…...
![](https://www.ngui.cc/images/no-images.jpg)
Python操作Excel的库openpyxl使用入门
openpyxl 是一个用于读写 Excel 2010 xlsx/xlsm/xltx/xltm 文件的 Python 库。以下是一些 openpyxl 的基本使用方法: 安装 openpyxl 首先,确保已经安装了 openpyxl。如果没有安装,可以使用以下命令进行安装: pip install openp…...
![](https://www.ngui.cc/images/no-images.jpg)
数据通过canal 同步es,存在延迟问题,解决方案
当使用 Canal 同步数据到 Elasticsearch(ES)时,出现延迟问题通常源于多个因素,如 Canal 配置、网络延迟、ES 的负载和性能瓶颈等。以下是一些解决方案,帮助减少和解决延迟问题: 1. 优化 Canal 配置 Canal…...
![](https://i-blog.csdnimg.cn/direct/ee79747754594d1c8334ad1e70528a93.jpeg)
了解Node.js
Node.js是一个基于V8引擎的JavaScript运行时环境,它允许JavaScript代码在服务器端运行,从而实现后端开发。Node.js的出现,使得前端开发人员可以利用他们已经掌握的JavaScript技能,扩展技能树并成为全栈开发人员。本文将深入浅出地…...
![](https://i-blog.csdnimg.cn/direct/1e8805c6babe4ac4ba1e7b5a576b8409.png)
Android Studio创建新项目并引入第三方jar、aar库驱动NFC读写器读写IC卡
本示例使用设备:https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.52de2c1bbW3AUC&ftt&id615391857885 一、打开Android Studio,点击 File> New>New project 菜单,选择 要创建的项目模版,点击 Next 二、输入项目名称…...
![](https://www.ngui.cc/images/no-images.jpg)
Oracle Dataguard(主库为双节点集群)配置详解(4):配置备库
Oracle Dataguard(主库为双节点集群)配置详解(4):配置备库 目录 Oracle Dataguard(主库为双节点集群)配置详解(4):配置备库一、为备库配置静态监听1、配置 li…...
![](https://i-blog.csdnimg.cn/direct/0bf4356aeb2f415db03578b0ac5854aa.png)
前端炫酷动画--文字(二)
目录 一、弧形边框选项卡 二、零宽字符 三、目录滚动时自动高亮 四、高亮关键字 五、文字描边 六、按钮边框的旋转动画 七、视频文字特效 八、立体文字特效让文字立起来 九、文字连续光影特效 十、重复渐变的边框 十一、磨砂玻璃效果 十二、FLIP动画 一、弧形边框…...
![](https://www.ngui.cc/images/no-images.jpg)
ceph 数据均衡
实现数据均衡的主要方法 在 Ceph 集群中,实现 OSD(对象存储守护进程)之间的数据均衡对于提升性能和资源利用率至关重要。以下是实现数据均衡的主要方法: 1. 调整 OSD 权重(Reweight) 通过调整 OSD 的权重,可以控制数据在各个 OSD 之间的分布。Ceph 提供了根据利用率或…...
![](https://i-blog.csdnimg.cn/direct/e69a5fe92be34f3f91b1a89271c88761.png)
代码随想录算法训练营day29
代码随想录算法训练营 —day29 文章目录 代码随想录算法训练营前言一、134. 加油站暴力解法贪心算法 二、135. 分发糖果三、860. 柠檬水找零四、406.根据身高重建队列vector版list版 总结 前言 今天是算法营的第29天,希望自己能够坚持下来! 今日任务&a…...
![](https://i-blog.csdnimg.cn/direct/68a9e0e0eb684b63a1987e05f3fac106.png)
android studio根据包名获取当前安装包信息
package com.example.myapplication2;import android.content.Context; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.util.Log;/**** 获取版本信息*/ public class SystemHelper {/*** 获取本地软件版本号*/public stat…...
![](https://www.ngui.cc/images/no-images.jpg)
学习第六十五行
仔细观察键盘,会发现一个$符号,其实是有含义的。 在 shell 脚本中,美元符号 $ 有几种重要的含义: 变量引用:$ 用于引用变量的值。例如,如果你有一个变量 name,可以通过 $name 来获取它的值。 n…...
![](https://www.ngui.cc/images/no-images.jpg)
零碎的知识点(七):线性二次调节器(LQR)是什么?
线性二次调节器(LQR)是什么? 1. LQR的定义与目标2. LQR的原理性能指标 J J J最优解的计算控制律 3. LQR的性质4. 举例说明问题描述解步骤仿真结果 5. 实际应用总结 线性二次调节器(LQR) 是一种经典的最优控制方法&…...
![](https://i-blog.csdnimg.cn/direct/ed5cabed0f024fa69634cc062b5011b7.png#pic_center)
Matlab一些使用技巧
代码分段 两个百分号就可以实现代码的分段,不同段之间会以不同的背景色显示,方便调试 如下: %% 腐蚀 stlen TimeWidth*Fs/50; %线性算子的长度,1/100的脉宽,对应0.5us,15个采样点 stlen 100; SE strel…...
![](https://i-blog.csdnimg.cn/direct/9c9e8ecc0e3643d1abb20ce638fe06b7.png)
Linux 发行版介绍与对比:Red Hat、Ubuntu、Kylin、Debian
Linux 操作系统有众多发行版(Distros),每个发行版的设计目标、目标用户、应用场景和使用方式有所不同。常见的 Linux 发行版包括 Red Hat、Ubuntu、Kylin 和 Debian。以下是这些发行版的详细介绍与对比,以及它们的应用场景和使用方…...
![](https://i-blog.csdnimg.cn/direct/e91cf11d5d504c6cba1a1aa78a92aea9.png)
从CentOS到龙蜥:企业级Linux迁移实践记录(龙蜥开局)
引言: 在我们之前的文章中,我们详细探讨了从CentOS迁移到龙蜥操作系统的基本过程和考虑因素。今天,我们将继续这个系列,重点关注龙蜥系统的实际应用——特别是常用软件的安装和配置。 龙蜥操作系统(OpenAnolis&#…...
![](https://www.ngui.cc/images/no-images.jpg)
java1-相对路径与绝对路径
注意注意~开始新部分啦! 开始正式分享java前,先为大家分享一下一个常用的概念---文件的相对路径与绝对路径. 开篇明义: 相对路径是指一个文件或目录相对于当前工作目录的路径。相对路径不包含根目录,而是从当前目录开始计算。 绝对路径是指一个文件或目录从根目录…...
![](https://i-blog.csdnimg.cn/img_convert/4a75672b3887975020c693e15af73674.png)
iChainfo 品牌升級為 ichaingo,打造 Web3 數據基礎設施新標杆
Web3 數據基礎設施服務商 iChainfo 今⽇正式宣佈,全新名稱 「ichaingo」 重磅登場,新的官⽅網站 ichaingo.com 正式上線。此次品牌升級基於 Web3 ⾏業的發展趨勢和公司⾃⾝的戰略布局,旨在為全 球⽤戶提供更準確、即時、全⾯、深⼊的 Web3 數…...
![](https://www.ngui.cc/images/no-images.jpg)
Flink概念知识讲解之:Restart重启策略配置
Flink概念知识讲解之:Restart重启策略配置 当 Task 发生故障时,Flink 需要重启出错的 Task 以及其他受到影响的 Task ,以使得作业恢复到正常执行状态。 Flink 通过重启策略和故障恢复策略来控制 Task 重启:重启策略决定是否可以…...
![](https://i-blog.csdnimg.cn/direct/e00bf11a77034ac79b072d470b9c3e0b.png)
[java基础-集合篇]LinkedList源码粗析
LinkedList 的数据结构 实现List、Deque 接口,基于 双向链表实现的列表。与基于数组的 ArrayList 不同,基于链表的LinkedList 允许在列表的任何位置快速地插入和删除元素。 Java中LinkedList实现了Deque,它提供了 add, offer, remove, poll, …...
![](https://www.ngui.cc/images/no-images.jpg)
面试:C++类成员初始化顺序
1、非静态数据成员:按它们在类定义的声明顺序初始化,不会按它们在初始化列表的顺序。 2、静态数据成员:在main函数启动之前,并且只初始化一次 3、基类构造函数:如果类从一个或多个基类继承而来,基类的构造…...
![](https://i-blog.csdnimg.cn/direct/f553c49a863b4e419f922653ccba7722.png#pic_center)
【Python】Python与C的区别
文章目录 语句结束符代码块表示变量声明函数定义注释格式Python的标识符数据输入input()函数数据输出print()函数 语句结束符 C 语言 C 语言中每条语句必须以分号;结束。例如,int a 10;、printf("Hello, World!");。分号是语句的一部分,用于…...
![](https://i-blog.csdnimg.cn/direct/6b25cc4ca1ad4f9a90b32efe06f070f1.png)
[开源]自动化定位建图系统(视频)
系统状态机: 效果展示: 1、 机器人建图定位系统-基础重定位,定位功能演示 2、 机器人建图定位系统-增量地图构建,手动回环检测演示 3、… 开源链接: https://gitee.com/li-wenhao-lwh/lifelong-backend Qt人机交互…...
![](https://i-blog.csdnimg.cn/img_convert/caa166256384118b9bdbf370f47bb601.png)
ISP流程--去马赛克详解
前言 本期我们将深入讨论ISP流程中的去马赛克处理。我们熟知,彩色图像由一个个像元组成,每个像元又由红、绿、蓝(RGB)三通道构成。而相机传感器只能感知光的强度,无法直接感知光谱信息,即只有亮暗而没有颜色…...
![](https://www.ngui.cc/images/no-images.jpg)
Objective-C语言的软件工程
Objective-C语言的软件工程探讨 引言 在软件工程的领域中,编程语言的选择是至关重要的。Objective-C,作为一种为苹果公司的macOS和iOS操作系统而开发的编程语言,凭借其灵活性和强大的功能被广泛应用于应用开发。然而,随着Swift等…...
![](https://www.ngui.cc/images/no-images.jpg)
Objective-C语言的语法糖
Objective-C语言的语法糖探秘 在编程语言的发展历程中,语法糖(Syntactic Sugar)是一个颇具趣味性和重要性的概念。它让编程的表达更加简洁直观,同时提高了代码的可读性和可维护性。Objective-C 作为一种面向对象的编程语言&#…...
![](https://www.ngui.cc/images/no-images.jpg)
设计模式中的代理模式
在Java中,代理模式(Proxy Pattern)可以通过静态代理和动态代理两种主要方式实现。 一、静态代理模式 在编译时就已经确定了代理类和被代理类的关系。 代理类和目标对象通常实现相同的接口或继承相同父类。 缺点是对于每个需要代理的目标对象…...
![](/images/no-images.jpg)
百度商桥怎样绑定网站/口碑营销策略
全国计算机技术与软件专业技术资格(水平)考试 2016年上半年 信息系统项目管理师 下午试卷 II (考试时间 15:20~17:20 共 120 分钟) 1. 本试卷满分 75 分。 2. 在答题纸的指定位置填写你所在的省、自治区、直辖市、计划单列市的名称。 3. 在答题纸的指定位置填写准考证…...
![](https://img-blog.csdnimg.cn/img_convert/18a699c6cc4efb9d557db44938123d5c.png)
网站建设费税率/网站的seo
译文出自:登链翻译计划译者:翻译小组校对:Tiny 熊原文链接:learnblockchain.cn/article…欢迎阅读跟我学习 Solidity系列中的另一篇文章。在上一篇文章,中,我们了解了数据位置的工作方式以及何时可以使用以下三个位置&…...
![](/images/no-images.jpg)
网站开发 -(广告)/网站优化公司收费
// ClassPathXmlApplicationContext: 是 ApplicationContext的实现类,从类路径下来加载配置文件ApplicationContext ctxnew ClassPathXmlApplicationContext("applicationContext.xml");//2.从IOC容器中获取bean实例//利用id定位到IOC容器中的beanHelloWo…...
![](/images/no-images.jpg)
查询网站建设/seo人员是什么意思
从股票市场崩溃到1932年(大萧条时期最惨的一年),经济一直在螺旋式下降,而这个下降趋 势又因为采取了某些措施的缘故而更加速了。按老规矩说,这些措施本该使经济复兴的,可 是事实恰好相反。为了保障投资者的利益,物价是…...
![](/images/no-images.jpg)
宁波电器网站制作/新闻稿撰写
mybatis3中增加了使用注解来配置Mapper的新特性,本篇文章主要介绍其中几个Provider的使用方式,他们是:SelectProvider、UpdateProvider、InsertProvider和DeleteProvider。MyBatis 3 User Guide中的最后一章描述了注解的简单用法,…...
![](/images/no-images.jpg)
类似wordpress的建站/网站建设的重要性
【问题描述】 楼梯有n阶台阶,上楼可以一步上1阶,2阶或3阶,编程计算共有多少种不同的走法?【算法分析】 此问题是“计数型”问题,适用于利用动态规划方法解决。利用“最后一步法”求解的分析步骤如下:1.确定…...