1.运行ping命令会产生一个进程,运行其他服务也会产生一个进程,那么在系统看来,这些进程有什么本质区别吗?
-
进程的共性(系统视角的统一管理)
- 资源分配单位:每个进程都拥有独立的虚拟地址空间、文件描述符、信号处理等资源。
- 调度实体:内核通过进程控制块(PCB/Task Struct)统一管理,参与CPU时间片轮转。
- 生命周期:均通过
fork()
、exec()
等系统调用创建,通过exit()
终止。
-
进程的关键区别(本质差异)
- 进程的创建来源:
- 用户主动启动
- 系统/服务守护进程(如
nginx
、sshd
)
- 进程的权限与身份:
- 普通用户
- root用户
- 资源占用类型:
- CPU密集型:如
gcc
编译进程会长期占用CPU - I/O密集型:如
nginx
服务进程大部分时间阻塞在网络I/O上 - 短暂任务:
ping
是短期进程,而mysqld
是长期运行的服务
- CPU密集型:如
- 进程间的关系:
- 会话(Session)与进程组
- ping通常属于用户终端会话,退出终端会收到
SIGHUP
信号终止 - 服务进程通常是独立会话领导者(例如systemd托管的服务)
- ping通常属于用户终端会话,退出终端会收到
- 父子关系:服务进程可能通过
fork()
创建子进程池
- 会话(Session)与进程组
- 内核视角的特殊性:
- 内核线程:
- 无用户空间,直接运行在内核态,以
[]
标记(ps aux
中可见) - 与用户进程(如
ping
)的地址空间、权限级别完全不同
- 无用户空间,直接运行在内核态,以
- 内核线程:
- 进程的创建来源:
2.线程与进程有什么区别
进程是资源分配的基本单位,线程是执行的基本单位,多个线程可以共享进程的资源,但每个进程都有独立的资源空间
- 定义:
- 进程:是程序的一个执行实例,每个进程都有自己独立的内存空间和资源(如文件描述符)。
- 线程:是进程内的一个执行单元,是程序执行的最小单位,多个线程共享进程的内存和资源。
- 资源占用:
- 进程:每个进程有独立的内存空间,切换进程时会涉及较高的开销。
- 线程:线程之间共享进程的内存和资源,因此线程之间的切换开销较小。
- 执行:
- 进程:进程是独立的执行实体,彼此间通信需要使用进程间通信(IPC)机制。
- 线程:线程共享进程资源,线程之间的通信通常比较轻便,可以通过共享内存或消息队列等方式。
- 开销:
- 进程:创建和销毁进程的开销较大,进程间的上下文切换较为耗时。
- 线程:创建和销毁线程的开销较小,线程之间的上下文切换也相对较快。
3.多进程服务的结构
- 主进程(Master Process)
- 负责管理服务的生命周期。
- 通常用来监听客户端请求,负责进程的创建和销毁。
- 在某些情况下,主进程还会负责任务的分配,比如使用任务队列。
- 也会处理一些全局共享资源(如配置、日志等)。
- 工作进程(Worker Process)
- 负责实际的业务处理。
- 每个工作进程独立处理一个请求,完成特定的任务。
- 工作进程之间可以通过共享内存、消息队列或其他IPC(进程间通信)方式来协调。
- 由于每个工作进程有独立的内存空间和资源,它们之间的崩溃不会直接影响其他进程。
- 进程间通信(IPC)
- 由于进程之间是独立的,它们需要某种方式来共享数据或协调工作。
- 常见的进程间通信方式包括:
- 共享内存:多个进程共享同一块内存区域。
- 消息队列:进程通过消息队列发送和接收消息。
- 管道:一种进程间通过写入和读取数据流进行通信的机制。
- 套接字(Socket):在网络上或本地进程间通过套接字进行通信。
- 负载均衡
- 多进程架构通常会使用负载均衡策略来分配请求到不同的工作进程。
- 负载均衡器可以是由主进程实现,或者是通过外部系统(如反向代理服务器)来平衡请求。
- 进程管理
- 主进程负责监控工作进程的状态,确保工作进程在失败后能够重启。
- 一些多进程框架或工具(如
supervisord
或systemd
)会帮助管理和监控进程。
4.什么是并行?什么是并发?它们的区别是什么?
-
并发(Concurrency)
并发是指系统能够在同一时间段内处理多个任务,但不一定是同时进行的。并发的核心在于任务的交替执行,即系统可以在多个任务之间切换,给人一种“同时”的感觉,但实际上它们是在共享资源的情况下交替运行。
- 特点:
- 任务是交替执行的,可能是由单个处理器(核心)在不同时间片轮流处理多个任务。
- 并发通常强调的是管理多个任务的执行,并不要求任务必须是同时进行的。
- 并发可以通过多线程或多进程等方式实现,但在单核CPU上,任务的执行是轮流进行的。
- 特点:
-
并行(Parallelism)
并行是指多个任务在同一时间(真正的同时)被多个处理器(或处理器核心)同时处理。并行的核心在于任务的同步执行,任务在多个处理单元上同时进行,能够加速处理。
- 特点:
- 任务同时执行,在不同的处理器或核心上同时运行,通常需要多核CPU或多台计算机。
- 并行要求任务是可以独立处理的,通常这些任务是通过分解成更小的子任务来并行执行的。
- 并行的目标是加速任务的完成,通过同时执行多个任务,减少整体处理时间。
- 特点:
特点 | 并发 | 并行 |
---|---|---|
定义 | 任务交替执行,看起来是同时进行的 | 任务真正同时执行,在多个处理器或核心上 |
执行方式 | 多个任务共享处理器资源,任务在时间上交替 | 多个任务在多个处理器核心上同时执行 |
系统需求 | 单核心系统也可以实现 | 需要多核处理器或多台计算机 |
重点 | 任务调度和管理 | 任务的同时执行 |
性能优化 | 优化资源使用和任务调度 | 通过多核同时执行来减少处理时间 |
5.Linux下的信号(Signal)是什么?如何发送信号给进程?给出具体命令
在Linux中,信号(Signal)是操作系统用于通知进程发生某种事件的一种机制。信号是一种异步的事件通知,通常用于进程间通信或控制进程的执行。
信号有两种类型:
- 预定义信号:这些信号由系统定义,并具有固定的含义,例如
SIGKILL
、SIGTERM
等。 - 用户定义信号:用户可以定义并发送自定义的信号,通常是
SIGUSR1
和SIGUSR2
。
信号的作用包括:
- 终止进程(如
SIGKILL
、SIGTERM
) - 暂停进程(如
SIGSTOP
) - 继续执行暂停的进程(如
SIGCONT
) - 启动某些特定操作(如
SIGUSR1
、SIGUSR2
)
信号 | 数值 | 描述 |
---|---|---|
SIGINT | 2 | 中断进程,通常由Ctrl+C触发 |
SIGTERM | 15 | 请求进程终止,优雅退出 |
SIGKILL | 9 | 强制杀死进程,进程无法捕获或忽略该信号 |
SIGSTOP | 19 | 停止进程,进程会暂停执行(不可捕获或忽略) |
SIGCONT | 18 | 继续执行被暂停的进程 |
SIGUSR1 | 10 | 用户定义的信号1 |
SIGUSR2 | 12 | 用户定义的信号2 |
SIGSEGV | 11 | 进程访问了非法内存地址(段错误) |
例如:kill -9 1234
表示强制杀死进程
6.常用的信号有9和15,它们有什么区别
SIGTERM
(信号15):是一个请求进程优雅终止的信号。它会告知进程需要终止,但进程可以捕获该信号并执行清理操作(如保存数据、关闭文件等),然后安全地退出。SIGKILL
(信号9):是一个强制杀死进程的信号。它会立即终止进程,进程无法捕获或阻止该信号,也无法执行任何清理操作(如保存文件、关闭数据库连接等)。
7.如何将服务放到后台运行?比如将ping命令放到后台运行
- 使用
&
:将命令放到后台。 - 使用
nohup
:确保命令在关闭终端后继续运行。 - 使用
disown
:将后台任务从Shell会话中分离。 - 使用
screen
或tmux
:创建持久会话,可以随时分离和恢复。
我习惯使用tmux
,将ping命令放到后台运行步骤如下:
# 创建tmux会话tmux new -s ping# 在tmux会话中执行pingping 127.0.0.1# 将会话挂到后台Ctrl B然后按D
8.学习byobu,进行窗口上下拆分,左右拆分,并能将其切换到后台运行,唤起到前台
9.如何设置一个脚本开机自动执行
-
使用
systemd
创建服务Terminal window vim /etc/systemd/system/my_script.service在文件中输入以下内容,注释需要删掉:
Terminal window [Unit]Description=My script at startupAfter=network.target[Service]ExecStart=/path/to/your/script.shRestart=alwaysUser=your_user # 可选,指定用户执行脚本[Install]WantedBy=multi-user.targetAfter=network.target
:确保脚本在网络服务启动之后执行(如果脚本需要网络)。Restart=always
:如果脚本崩溃,systemd
会自动重启它。WantedBy=multi-user.target
:这意味着该服务在进入多用户模式(即常规操作模式)时启动。
重新加载配置:
systemctl daemon-reload
设置为开机自动执行:
systemctl enable my_script.service
启动服务:
systemctl start my_script.service
-
使用
crontab
设置开机自启cron
是 Linux 中一个定时任务调度工具,它允许你设置在特定时间执行脚本,包括系统启动时- 编辑
crontab
文件:crontab -e
- 添加一条启动时执行的任务:
@reboot /path/to/your/script.sh
,@reboot
表示在系统启动时执行指定的脚本 - 确认是否添加成功:
crontab -l
- 编辑
10.如何设置定时任务,让脚本定时执行?并解释’* * * * *‘这五个星号各自的含义
- 设置定时任务:
- 编辑
crontab
文件:crontab -e
- 添加一条定时执行的任务:
* * * * * /path/to/your/script.sh
,这五个星号代表定时任务的时间设置 - 确认是否添加成功:
crontab -l
- 编辑
- 五个星号的含义:
- 第一位(分钟):表示任务在每小时的哪一分钟执行,范围是
0-59
。- 例如:
5
表示每小时的第 5 分钟执行任务,*/5
表示每 5 分钟执行一次。
- 例如:
- 第二位(小时):表示任务在每天的哪个小时执行,范围是
0-23
(0 表示午夜 12 点,23 表示 11 点 PM)。- 例如:
3
表示每天的 3 点执行任务,*/2
表示每 2 小时执行一次。
- 例如:
- 第三位(日):表示任务在每月的哪一天执行,范围是
1-31
。- 例如:
15
表示每个月的 15 日执行任务,*/2
表示每 2 天执行一次。
- 例如:
- 第四位(月):表示任务在每年的哪个月执行,范围是
1-12
(1 表示 1 月,12 表示 12 月)。- 例如:
6
表示每年的 6 月执行任务,*/3
表示每 3 个月执行一次。
- 例如:
- 第五位(星期几):表示任务在每周的哪一天执行,范围是
0-7
(0 和 7 都表示星期天,1 表示星期一,以此类推)。- 例如:
1
表示每周的星期一执行任务,*/2
表示每 2 天执行一次。
- 例如:
- 第一位(分钟):表示任务在每小时的哪一分钟执行,范围是
- 例如:
- 每分钟执行一次:
* * * * * /path/to/your/script.sh
- 每天凌晨1点执行:
0 1 * * * /path/to/your/script.sh
- 每两小时执行一次
0 */2 * * * /path/to/your/script.sh
- 每周一执行:
0 0 * * 1 /path/to/your/script.sh
- 每小时的第15分钟执行:
15 * * * * /path/to/your/script.sh
- 每分钟执行一次:
11.什么是环境变量?PATH这个环境变量的作用是什么?
1.什么是环境变量
环境变量是操作系统中用于存储系统级或者应用级配置的变量,它们对系统中运行的程序和脚本起着重要作用
2.环境变量的类型
- 系统环境变量:这些环境变量在整个系统范围内生效,通常由操作系统在启动时定义,影响所有用户和进程。例如:
PATH
、HOME
、USER
、LANG
等。 - 用户环境变量:这些环境变量仅在特定用户的会话中生效。用户可以自己定义这些变量,通常存储在如
.bashrc
、.bash_profile
、.zshrc
等文件中。 - 局部环境变量:这些变量只在特定进程或脚本的执行期间生效,通常通过命令行或脚本临时设置。
3.PATH环境变量的作用
PATH
告诉操作系统在什么目录下去查找命令和程序
例如PATH包含以下路径:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
,那么当输入 ls
命令时,系统会按照以下顺序查找 ls
可执行文件:
- 首先在
/usr/local/bin
目录下查找ls
。 - 如果没找到,再在
/usr/bin
目录下查找。 - 接着在
/bin
目录下查找。 - 继续在
/usr/sbin
和/sbin
目录下查找。 - 如果
ls
文件在这些目录中都找不到,系统会显示“ls
not found”错误
12.如何在PATH中添加内容,并使其永久生效?
临时修改 PATH
(仅对当前会话有效)
export PATH=$PATH:/new/directory
- 这个命令将
/new/directory
添加到当前PATH
的末尾
永久修改 PATH
(对所有会话有效)
修改用户的 shell 配置文件(如 ~/.bashrc
、~/.bash_profile
、~/.zshrc
等),并在文件末尾添加类似以下的行:
export PATH=$PATH:/new/directory
后通过运行 source ~/.bashrc
(或其他配置文件)使更改生效。
13.crontab中的环境变量与平常的环境变量有什么不同?
- 作用范围不同
- 平常的环境变量:这些环境变量通常在用户的会话中有效,适用于当前的用户登录终端或图形界面程序
crontab
中的环境变量:crontab
文件中的环境变量仅对定时任务(即cron
作业)有效。它们不会影响到其他终端或会话中的环境。cron
作业是由cron
守护进程执行的,这个进程在执行任务时使用的是最基础的环境变量,因此你需要在crontab
中明确设置一些关键环境变量,如PATH
、HOME
、USER
等,确保脚本正确执行。
- 加载方式不同
- 平常的环境变量:这些环境变量通常由系统或用户的 shell 配置文件加载,例如:
/etc/profile
、/etc/bash.bashrc
(系统范围)~/.bashrc
、~/.bash_profile
(用户范围) 这些文件会在用户登录或启动新的 shell 会话时被加载,包含了很多系统或应用的配置。
crontab
中的环境变量:cron
任务运行时并不自动加载用户的 shell 配置文件(例如.bashrc
、.bash_profile
等)。这意味着任何在这些文件中定义的环境变量,cron
不会默认加载。你必须手动在crontab
文件中指定这些变量。
- 平常的环境变量:这些环境变量通常由系统或用户的 shell 配置文件加载,例如:
- 可用的默认环境变量不同
- 平常的环境变量:正常登录时,操作系统会设置许多常用的环境变量,例如
PATH
、HOME
、USER
、SHELL
、LANG
等,供用户和程序使用。 crontab
中的环境变量:cron
作业通常会有一个非常简化的环境(最小化),这意味着许多标准的环境变量(比如PATH
)可能不存在或不完整。因此,通常需要手动在crontab
文件中指定这些变量,以确保任务能够正常执行。例如,PATH
可能只包含很少的系统路径,这会导致一些常见的命令无法找到。
- 平常的环境变量:正常登录时,操作系统会设置许多常用的环境变量,例如
14.Linux系统中什么能够与硬件直接交互?
-
内核(Kernel)
Linux 内核是操作系统的核心,负责管理硬件资源与软件之间的交互。
内核通过设备驱动程序(device drivers)与硬件进行交互。每个硬件设备通常都有一个专门的驱动程序,它们位于内核空间,并且能够将硬件操作转化为软件操作。
-
设备驱动(Device Drivers)
设备驱动是内核中与硬件设备进行通信的程序模块。它们负责管理硬件设备的具体细节
- 磁盘驱动:例如
ext4
、NTFS
驱动程序,用于与存储设备交互。 - 图形驱动:如 NVIDIA、AMD 或开源的
nouveau
,用于图形卡的操作。 - 网络驱动:如
eth0
、wlan0
等,用于与网络接口设备(如网卡、Wi-Fi)通信。 - USB 驱动:负责管理与 USB 设备(如打印机、摄像头、闪存)之间的交互。
- 磁盘驱动:例如
-
系统调用(System Calls)
系统调用是应用程序与内核之间的接口。通过系统调用,用户空间的程序能够请求内核进行硬件访问。这些调用可能包括:
- 读/写文件:访问磁盘上的文件。
- I/O 操作:与硬件进行交互,通常通过文件描述符实现。
- 网络通信:通过套接字与网络接口卡交互。
比如,在访问硬盘或其他外设时,用户程序会通过系统调用(如
read()
或write()
)将操作请求传递给内核,然后由内核驱动程序与硬件设备交互。
15.应用程序是如何操作硬件的
在 Linux 操作系统中,应用程序通过一系列中介层来操作硬件。这些中介层包括 系统调用、设备驱动程序 和 内核
-
应用程序与内核交互
应用程序无法直接操作硬件,因为它们运行在 用户空间,而硬件操作需要运行在 内核空间。为了解决这个问题,应用程序通过 系统调用 来请求内核执行特定的硬件操作
-
内核处理请求
在接收到系统调用后,内核会通过相应的 设备驱动程序 来与硬件进行交互
-
设备驱动程序(Device Drivers)
设备驱动程序是内核的一部分,它充当了应用程序和硬件之间的桥梁。设备驱动程序直接与硬件通信,并将硬件的低级操作封装成更高层次的接口,供内核或应用程序使用
-
硬件访问
设备驱动程序通过特定的接口(如 I/O 端口、内存映射 I/O)与硬件进行通信
-
硬件设备交互
设备驱动程序将内核或应用程序的请求翻译成硬件能够理解的信
16.什么是驱动?内核依赖驱动还是驱动依赖内核?
- 什么是驱动(Device Driver)
- 驱动(Device Driver)是操作系统中与硬件设备进行通信的程序模块。它充当了硬件与操作系统之间的桥梁,允许操作系统及其应用程序通过抽象的接口访问和控制硬件设备。
- 内核依赖驱动还是驱动依赖内核
- 操作系统内核与驱动程序是相互依赖、相互配合的关系。
- 内核为驱动程序提供运行环境,驱动程序为内核提供对硬件设备的访问能力。
- 两者共同构成了操作系统对硬件设备的管理和控制体系。
17.不同的Linux系统,使用的内核有什么区别?这些内核由谁进行维护?
不同的 Linux 发行版可能会使用不同版本的内核
内核的开发由 Linus Torvalds 主持,全球的开发者和社区进行贡献。以下是内核的主要维护者和组织:
- Linus Torvalds:Linux 内核的创始人和主要维护者,负责主线内核的开发和发布。
- Linux 基金会:Linux 基金会通过其支持的项目和社区为内核开发提供资源和协作平台,负责长期支持(LTS)内核的维护。
- 内核开发者社区:全球的开发者贡献补丁和新特性。内核的更新周期通常为 每个季度发布一个新版本,而每个版本的支持期大约为 6 周左右,除 LTS 内核外,后者的支持期为 6 年。
- 发行版开发者:Linux 发行版(如 Ubuntu、Red Hat 等)会对主线内核进行补丁和定制,提供长期的安全更新和维护。每个发行版会为其用户维护特定的内核版本。
18.软件的版本号一般分为几位?
软件的版本号通常由 三位或四位组成,表示软件的不同更新级别
- 三位版本号:主版本号.次版本号.修订号
- 主版本号(Major version):通常在软件发生重大变化、架构变化、功能大幅度改动或不兼容更新时增加
- 次版本号的更新通常是向后兼容的
- 修订号(Patch version / Bugfix version):修复小的 bug、漏洞或进行性能优化时增加,通常不影响功能
- 四位版本号:主版本号.次版本号.修订号.构建号
- 构建号(Build number):通常用于标识软件的具体构建或版本号,尤其在自动化构建系统中,构建号用于跟踪每次构建的不同版本。这种编号系统对于开发者和测试人员来说非常有用,可以精确标识软件版本
19.将ping 127.0.0.1制作为system服务,并设置为开机启动
创建.service
文件
vim /etc/systemd/system/ping-localhost.service
将以下内容写入该文件
[Unit]Description=Continuous ping to localhost (127.0.0.1)After=network.target
[Service]Type=simpleExecStart=/bin/ping 127.0.0.1Restart=alwaysRestartSec=3User=nobody
[Install]WantedBy=multi-user.target
Description
:服务描述。After=network.target
:确保网络就绪后启动。Type=simple
:服务进程为主进程(非派生型)。ExecStart
:实际执行的命令(这里是ping 127.0.0.1
)。Restart=always
:进程退出时自动重启。RestartSec=3
:重启间隔(秒)。User=nobody
:以低权限用户运行(增强安全性)
重载systemd配置
systemctl daemon-reload
启动服务并验证
systemctl start ping-localhostsystemctl status ping-localhost
设置开机自启
systemctl enable ping-localhost
20.如何启动、停止、重启、设置开机启动/取消开机启动system服务
# 启动systemctl start <服务名>.service# 停止systemctl stop <服务名>.service# 重启systemctl restart <服务名>.service# 开机自动运行system服务systemctl enable <服务名>.service# 取消开机自动运行system服务systemctl disable <服务名>.service
21.如何查看system服务的日志?以Ubuntu24和Alma最新版为例
查看指定服务的日志
journalctl -u <服务名>.service
参数 | 作用 |
---|---|
-f | 实时跟踪日志(类似 tail -f ) |
-n <行数> | 显示最近 N 行(如 -n 50 ) |
--since "YYYY-MM-DD HH:MM:SS" | 查看指定时间后的日志 |
--until "YYYY-MM-DD HH:MM:SS" | 查看指定时间前的日志 |
-p <优先级> | 按日志级别过滤(如 -p err 只看错误) |
查看所有服务的日志
journalctl