一、Linux基础概念类(必问,奠定面试基础)
1. 什么是Linux?Linux的核心特点是什么?
答案:
Linux是一套开源的、免费的类Unix操作系统,由Linus Torvalds于1991年发起开发,基于Unix的设计思想,核心是Linux内核(Kernel),搭配各类开源软件(如Shell、编译器、数据库等),组成完整的操作系统。
Linux的核心特点(面试必答,分点清晰):
- 开源免费:源代码公开,任何人都可以查看、修改、分发,无需支付版权费用,这是Linux普及的核心优势,也是企业选择Linux的重要原因(降低运维成本)。
- 多用户、多任务:支持同时多个用户登录系统,每个用户拥有独立的权限和工作环境;同时支持多个进程(任务)并发运行,系统通过进程调度机制,合理分配CPU资源,提高运行效率。
- 稳定性高、可靠性强:Linux内核设计严谨,无死机、蓝屏问题,可长时间连续运行(服务器场景可稳定运行数月甚至数年),远优于Windows系统,适合作为服务器操作系统。
- 安全性高:内置完善的权限管理机制(用户、组、文件权限),支持防火墙、SELinux等安全组件,可有效抵御病毒、黑客攻击,不易被恶意入侵,是服务器首选的安全操作系统。
- 可移植性强:支持多种硬件架构(x86、x86_64、ARM等),可运行在服务器、个人电脑、嵌入式设备(路由器、机顶盒)等各类硬件上,适配性极强。
- 模块化设计:Linux内核采用模块化设计,核心功能(如进程管理、内存管理、文件系统)以模块形式存在,可根据需求动态加载或卸载模块,无需重启系统,灵活且高效。
原理拓展:
Linux的核心是“内核(Kernel)”,内核是操作系统的核心组件,负责管理系统的硬件资源(CPU、内存、磁盘、网络等),为上层应用程序提供底层服务(如进程调度、内存分配、设备驱动);上层的Shell(命令行解释器)、应用程序(如nginx、mysql)都依赖内核运行。
Linux与Unix的关系:Linux源于Unix,借鉴了Unix的设计思想和命令规范,但并非Unix的分支(Unix是闭源的,Linux是开源的);二者命令高度兼容,很多Unix命令在Linux中可以直接使用,区别在于Linux更轻量、开源、可移植,Unix更侧重大型机、小型机场景,闭源且收费。
延伸考点: 常见的Linux发行版(Distro)——Linux内核本身不包含应用程序,发行版是“内核+开源软件”的组合,常见的有:① 服务器常用:CentOS(已停止维护,被AlmaLinux、Rocky Linux替代)、Ubuntu Server、RedHat Enterprise Linux(RHEL,收费,企业级首选);② 桌面常用:Ubuntu Desktop、Fedora;③ 嵌入式常用:Debian、OpenWrt。
2. Linux的运行级别有哪些?分别对应什么场景?
答案:
Linux运行级别(Runlevel)是指系统启动后,运行的服务和程序的集合,不同运行级别对应不同的使用场景,核心用于系统启动、关机、重启时的服务管理,CentOS 6及之前的系统使用runlevel,CentOS 7及之后采用systemd(目标target),但面试中仍常考察传统运行级别。
传统运行级别(0-6,共7个,重点记0、1、3、5、6):
- 0:关机级别(halt) :系统关闭所有服务和进程,执行关机操作,不能设置为默认运行级别(否则系统无法启动)。
- 1:单用户模式(single user mode) :仅启动最基本的系统服务(如内核、Shell),不启动网络服务、图形界面,无需密码即可登录,核心用于系统故障排查、密码重置(如root密码忘记时,进入单用户模式修改密码)。
- 2:多用户模式(multi-user mode) :启动多用户服务,但不启动网络服务和图形界面,较少使用(部分老系统用于无网络场景)。
- 3:完全多用户模式(multi-user with networking) :启动多用户服务、网络服务,不启动图形界面,是服务器默认运行级别(如CentOS 6服务器默认级别),适合生产环境(无图形界面,节省系统资源)。
- 4:未使用(reserved) :系统预留级别,无默认用途,用户可自定义。
- 5:图形界面模式(graphical mode) :启动多用户服务、网络服务、图形界面(GUI),适合桌面版Linux(如Ubuntu Desktop),服务器一般不使用(浪费资源)。
- 6:重启级别(reboot) :系统关闭所有服务和进程,执行重启操作,不能设置为默认运行级别(否则系统会无限重启)。
原理拓展:
传统运行级别的管理依赖“/etc/inittab”文件(CentOS 6及之前),文件中通过“id:3:initdefault:”指定默认运行级别(如3表示默认进入完全多用户模式);当系统启动时,init进程会根据默认运行级别,启动对应的服务(服务脚本存放在/etc/rc.d/rc[0-6].d目录下)。
CentOS 7及之后的变化:采用systemd替代init进程,运行级别被“目标(target)”替代,对应关系:0→poweroff.target(关机)、1→rescue.target(单用户)、3→multi-user.target(完全多用户)、5→graphical.target(图形界面)、6→reboot.target(重启);查看当前目标:systemctl get-default;设置默认目标:systemctl set-default multi-user.target。
延伸考点: 如何进入单用户模式重置root密码?(实战操作,面试高频)——① 系统启动时,按e进入GRUB菜单编辑模式;② 找到“linux16”开头的行,在末尾添加“single”或“init=/bin/bash”;③ 按Ctrl+X启动系统,进入单用户模式;④ 执行“passwd root”,输入新密码,确认后重启系统即可。
3. Linux中Shell是什么?常见的Shell有哪些?
答案:
Shell是Linux中的“命令行解释器”,是用户与Linux内核之间的交互接口——用户输入的命令(如ls、cd),通过Shell解析后,传递给内核执行,内核执行完成后,将结果返回给Shell,再显示给用户。简单来说,Shell是“用户操作内核的桥梁”。
Shell的核心功能:① 解析用户输入的命令,将其转换为内核可识别的指令;② 执行命令并返回结果;③ 支持脚本编写(Shell脚本),实现命令的批量执行,提高运维效率;④ 支持环境变量、管道、重定向等高级功能。
常见的Shell(重点记前3个):
- bash(Bourne Again Shell) :最常用、默认的Shell,几乎所有Linux发行版(CentOS、Ubuntu、RHEL)都默认使用bash,兼容sh(Bourne Shell),支持命令补全、历史命令、Shell脚本、管道、重定向等功能,是面试和生产环境的核心Shell。
- sh(Bourne Shell) :最早期的Shell,功能简单,不支持命令补全、历史命令等高级功能,目前已基本被bash替代,但部分老脚本仍会指定用sh执行。
- zsh(Z Shell) :功能强大的Shell,兼容bash,支持更多高级特性(如语法高亮、自动补全、主题自定义),适合个人桌面或对命令行体验有要求的场景,很多开发者喜欢使用zsh(搭配oh-my-zsh插件)。
- csh(C Shell) :语法类似C语言,支持命令历史、别名等功能,但兼容性较差,使用较少。
- ksh(Korn Shell) :结合了sh和csh的优点,支持高级特性,但使用范围不如bash广泛。
原理拓展:
Shell的运行机制:当用户登录Linux系统时,系统会为用户分配一个Shell进程(父进程),用户输入命令后,Shell会创建一个子进程,执行该命令(子进程执行完成后退出),父进程等待子进程执行完毕,再接收下一个命令;这种“父进程等待子进程”的机制,称为“阻塞式执行”,若命令后加“&”,则子进程后台运行,父进程不阻塞,可继续接收命令。
延伸考点: 如何查看当前使用的Shell?——执行命令“echo $SHELL”(显示当前用户的默认Shell)或“ps -p 表示当前Shell进程的PID,ps命令查看该PID对应的进程名称);如何切换Shell?——执行“bash”“zsh”等命令,即可切换到对应Shell,退出切换后的Shell,回到原来的Shell。
二、Linux文件系统与文件操作类(高频,考察基础操作)
1. Linux的文件系统结构是什么样的?核心目录的作用是什么?
答案:
Linux采用“树形文件系统结构”,所有文件和目录都挂载在根目录(/)下,不存在Windows中的“盘符(C盘、D盘)”,所有目录都是根目录的子目录,这种结构的核心优势是“统一管理、层次清晰”。
核心目录(必记,面试高频,每个目录的作用必须掌握):
- /(根目录) :所有文件和目录的顶层目录,是Linux文件系统的根,所有其他目录都挂载在根目录下,不能删除,否则系统会崩溃。
- /bin(binary) :存放系统基础命令(如ls、cd、cp、mv、rm等),所有用户都可以执行,这些命令是系统启动和日常操作必需的,且是二进制可执行文件。
- /sbin(super binary) :存放管理员专用命令(如root用户才能执行的命令,如reboot、shutdown、ifconfig、fdisk等),用于系统管理和维护,普通用户无法直接执行(需通过sudo授权)。
- /etc(etcetera) :存放系统配置文件(如网络配置、用户配置、服务配置等),核心目录,面试高频,如/etc/passwd(用户信息)、/etc/group(组信息)、/etc/sysconfig/network-scripts(网络配置)、/etc/fstab(挂载配置)。
- /home:存放普通用户的家目录,每个普通用户都有一个独立的目录(如用户test的家目录是/home/test),用户的个人文件、配置都存放在自己的家目录下,普通用户只能操作自己家目录下的文件。
- /root:root用户的家目录,与普通用户的家目录分开,root用户的所有操作和配置都存放在这里,权限最高,普通用户无法访问。
- /var(variable) :存放动态变化的文件(如日志文件、缓存文件、数据库文件等),核心子目录:/var/log(系统日志,如/var/log/messages、/var/log/secure,故障排查常用)、/var/www(Web服务根目录)、/var/lib(数据库数据目录)。
- /tmp(temporary) :存放临时文件,系统重启后,该目录下的文件会被自动清空,所有用户都可以读写,适合存放临时生成的文件(如安装包、临时日志)。
- /usr(unix shared resources) :存放共享资源,相当于Windows的“Program Files”,核心子目录:/usr/bin(普通用户的应用程序命令)、/usr/sbin(管理员的应用程序命令)、/usr/lib(应用程序的库文件)、/usr/local(手动安装的软件目录,如源码安装的nginx、mysql,默认存放在这里)。
- /boot:存放系统启动相关文件(如Linux内核、GRUB启动菜单、启动配置等),是系统启动的核心目录,若该目录损坏,系统无法启动,建议单独分区(避免根目录满导致启动失败)。
- /dev(device) :存放设备文件,Linux中“一切皆文件”,所有硬件设备(硬盘、键盘、鼠标、网卡等)都以文件形式存在于此,如/dev/sda(第一块SATA硬盘)、/dev/sda1(第一块硬盘的第一个分区)、/dev/eth0(第一块网卡)。
原理拓展:
Linux文件系统的核心是“挂载(mount)”——所有分区、磁盘、U盘等存储设备,都需要挂载到某个目录下,才能被系统识别和访问(相当于Windows中给盘符分配路径);挂载的配置文件是/etc/fstab,该文件中记录了存储设备与挂载目录的对应关系,系统启动时会自动挂载该文件中配置的设备。
常见的文件系统格式(面试补充):① ext4(CentOS 7默认,最常用,支持大文件,稳定性高);② xfs(CentOS 8默认,性能优于ext4,适合大存储、高IO场景);③ ext3(ext4的前身,已逐步被替代);④ swap(交换分区,用于虚拟内存,当物理内存不足时,系统会使用swap分区,建议大小为物理内存的1-2倍)。
延伸考点: 如何查看系统的文件系统格式?——执行“df -Th”(查看所有挂载的设备、文件系统格式、挂载目录、空间使用情况);如何手动挂载U盘?——① 查看U盘设备名:fdisk -l;② 创建挂载目录:mkdir /mnt/usb;③ 挂载:mount /dev/sdb1 /mnt/usb(/dev/sdb1是U盘设备名);④ 卸载:umount /mnt/usb(卸载前需退出挂载目录)。
2. Linux中文件权限的含义是什么?如何修改文件权限和所有者?
答案:
Linux是多用户系统,为了保证文件安全,引入了“文件权限”机制,通过权限控制不同用户对文件/目录的操作权限(读、写、执行),核心是“按用户身份分配权限”,用户身份分为三类:
- 所有者(owner) :文件的创建者,对文件拥有最高权限,可修改文件权限、删除文件等。
- 所属组(group) :文件所属的用户组,组内用户拥有相同的组权限,可共同操作文件(如团队共享文件)。
- 其他用户(other) :既不是文件所有者,也不属于文件所属组的用户,权限最低,通常只能读取文件(或无权限)。
(1)文件权限的表示方式(两种,面试都需掌握):
-
符号表示法:用r(read,读权限)、w(write,写权限)、x(execute,执行权限)表示,分别对应所有者、所属组、其他用户,共9个字符,例如“rwxr-xr--”:
- 前3个字符(rwx):所有者权限,可读、可写、可执行;
- 中间3个字符(r-x):所属组权限,可读、不可写、可执行;
- 后3个字符(r--):其他用户权限,可读、不可写、不可执行。
-
数字表示法:用数字对应权限(r=4,w=2,x=1,无权限=0),每个用户身份的权限是对应数字的和,共3个数字,例如“rwxr-xr--”对应数字“754”:
- 所有者权限:rwx=4+2+1=7;
- 所属组权限:r-x=4+0+1=5;
- 其他用户权限:r--=4+0+0=4。
补充:目录的权限与文件的权限区别——① 目录的r权限:可查看目录下的文件列表(如ls命令);② 目录的w权限:可在目录下创建、删除、重命名文件/目录;③ 目录的x权限:可进入目录(如cd命令);文件的x权限:可执行该文件(如Shell脚本、二进制文件),若文件无x权限,即使是可执行文件也无法运行。
(2)修改文件权限和所有者的命令(实战高频,必须掌握):
-
修改权限:chmod(change mode)
-
语法1(数字表示法):chmod 数字 文件名/目录名,例如:chmod 754 test.txt(将test.txt的权限改为rwxr-xr--);
-
语法2(符号表示法):chmod [u/g/o/a] [+/-/=] [r/w/x] 文件名/目录名,例如:
- chmod u+x test.sh(给所有者添加执行权限);
- chmod g-w test.txt(给所属组移除写权限);
- chmod o=r test.txt(给其他用户设置只读权限);
- chmod a+r test.txt(给所有用户添加读权限,a=all)。
-
拓展:递归修改目录及子目录/文件的权限:chmod -R 755 /home/test(-R表示递归,将/home/test目录下所有文件和子目录的权限改为755)。
-
-
修改所有者:chown(change owner)
- 语法:chown 用户名:组名 文件名/目录名,例如:chown test:test test.txt(将test.txt的所有者改为test,所属组改为test);
- 单独修改所有者:chown test test.txt;
- 单独修改所属组:chown :test test.txt;
- 拓展:递归修改目录及子目录/文件的所有者:chown -R test:test /home/test。
-
修改所属组:chgrp(change group) (可选,可被chown替代)
- 语法:chgrp 组名 文件名/目录名,例如:chgrp test test.txt(将test.txt的所属组改为test)。
原理拓展:
Linux文件权限的底层存储:每个文件的权限信息存储在“inode(索引节点)”中,inode包含文件的权限、所有者、所属组、大小、修改时间等元数据,文件系统通过inode识别文件,而不是文件名(文件名只是inode的“别名”);当修改文件权限时,本质是修改inode中的权限位(r、w、x对应的二进制位)。
延伸考点: 特殊权限(SUID、SGID、Sticky Bit,面试进阶)——① SUID(Set User ID):给可执行文件设置,执行该文件时,临时拥有文件所有者的权限(如passwd命令,普通用户执行时,临时拥有root权限,才能修改/etc/passwd文件),用chmod u+s 文件名设置;② SGID(Set Group ID):给目录设置,目录下新建的文件/目录,所属组与该目录的所属组一致(适合团队共享目录),用chmod g+s 目录名设置;③ Sticky Bit(粘滞位):给目录设置,只有目录所有者、文件所有者才能删除目录下的文件(如/tmp目录,所有用户可创建文件,但只能删除自己的文件),用chmod o+t 目录名设置。
3. 常用的文件操作命令有哪些?(ls、cd、cp、mv、rm、cat、tail等,重点)
答案:
文件操作命令是Linux基础,面试中常考察“命令用法+参数+场景”,以下是高频命令,每个命令需掌握核心参数和使用场景:
-
ls(list):查看目录下的文件/目录
-
核心参数:
- -l:以长格式显示(显示权限、所有者、大小、修改时间等详细信息),常用“ls -l”(可简写为ll);
- -a:显示所有文件/目录,包括隐藏文件(以“.”开头的文件,如.bashrc);
- -h:以人类可读的格式显示文件大小(如KB、MB、GB),搭配-l使用,即“ls -lh”;
- -d:只显示目录本身,不显示目录下的内容,如“ls -d /home”。
-
示例:ls -lha /etc(查看/etc目录下所有文件/目录的详细信息,包括隐藏文件,大小以人类可读格式显示)。
-
-
cd(change directory):切换目录
-
核心用法:
- cd 目录路径:切换到指定目录,如“cd /home/test”;
- cd ~:切换到当前用户的家目录(如root用户切换到/root,test用户切换到/home/test);
- cd ..:切换到上一级目录(如当前在/home/test,cd ..切换到/home);
- cd -:切换到上一次所在的目录(如先cd /etc,再cd /var,执行cd -回到/etc);
- cd /:切换到根目录。
-
-
cp(copy):复制文件/目录
-
核心参数:
- -i:复制时若目标文件已存在,提示是否覆盖(避免误删);
- -r/R:递归复制目录(复制目录时必须加此参数,否则无法复制子目录);
- -v:显示复制过程(verbose,详细输出);
- -p:保留原文件的权限、所有者、修改时间等属性(复制时不改变文件元数据)。
-
示例:
- cp test.txt /home/test(将当前目录的test.txt复制到/home/test目录下);
- cp -r /home/test /tmp(将/home/test目录及子目录、文件复制到/tmp目录下);
- cp -ip test.txt /home/test(复制test.txt到/home/test,保留属性,若目标文件存在则提示覆盖)。
-
-
mv(move):移动/重命名文件/目录
-
核心用法:
- 重命名:mv 原文件名 新文件名,如“mv test.txt test1.txt”(将test.txt重命名为test1.txt);
- 移动:mv 原路径 目标路径,如“mv test.txt /home/test”(将test.txt移动到/home/test目录下);
- 核心参数:-i(移动时若目标文件已存在,提示是否覆盖)、-v(显示移动过程)。
-
注意:mv命令移动目录时,无需加-r参数(与cp不同),如“mv /home/test /tmp”(将/home/test目录移动到/tmp)。
-
-
rm(remove):删除文件/目录
-
核心参数(重点,注意风险):
- -i:删除前提示是否确认(避免误删,推荐使用);
- -r/R:递归删除目录(删除目录时必须加此参数,否则无法删除子目录);
- -f:强制删除(force),不提示、不报错(即使文件不存在或无权限,慎用!尤其是rm -rf /*,会删除根目录下所有文件,导致系统崩溃)。
-
示例:
- rm -i test.txt(删除test.txt,删除前提示确认);
- rm -rf /home/test(强制递归删除/home/test目录及所有内容,无提示,慎用);
- rm -f *.txt(强制删除当前目录下所有.txt后缀的文件,无提示)。
-
-
cat(concatenate):查看文件内容(适合小文件)
-
核心用法:cat 文件名,如“cat /etc/passwd”(查看用户信息文件);
-
核心参数:
- -n:显示行号,如“cat -n /etc/passwd”(查看文件内容并显示每行的行号);
- -A:显示所有字符(包括隐藏字符,如换行符、制表符)。
-
注意:cat适合查看小文件,若文件过大(如日志文件),会一次性显示所有内容,无法分页查看,此时推荐用more、less命令。
-
-
more/less:分页查看文件内容(适合大文件)
- more:分页显示,按空格键翻页,按q键退出,如“more /var/log/messages”;
- less:比more功能更强大,支持上下键滚动、搜索(按/输入关键词搜索,按n下一个匹配,按N上一个匹配),按q键退出,如“less /var/log/secure”(查看安全日志,适合大文件)。
-
tail:查看文件末尾内容(高频,用于查看日志)
-
核心参数(重点,日志排查常用):
- -n:查看文件末尾n行,如“tail -n 10 /var/log/messages”(查看日志末尾10行);
- -f:实时监控文件变化(follow),文件有新内容时会自动显示,适合实时查看日志(如监控应用日志),按Ctrl+C退出,如“tail -f /var/log/nginx/access.log”(实时查看nginx访问日志);
- -F:与-f类似,但文件被删除后,会等待文件重新创建并继续监控(比-f更稳定,推荐使用)。
-
-
head:查看文件开头内容
- 核心参数:-n:查看文件开头n行,如“head -n 5 /etc/passwd”(查看用户信息文件的前5行)。
-
touch:创建空文件/修改文件时间戳
-
核心用法:
- 创建空文件:touch 文件名,如“touch test.txt”(创建一个空的test.txt文件);
- 修改文件时间戳:若文件已存在,touch命令会修改文件的访问时间和修改时间为当前时间(不改变文件内容)。
-
-
mkdir(make directory):创建目录
- 核心参数:-p:递归创建多级目录(若父目录不存在,自动创建),如“mkdir -p /home/test/abc”(创建/home/test/abc目录,若/home/test不存在,自动创建)。
原理拓展:
所有文件操作命令的底层,都是通过调用Linux内核的文件系统接口(如open()、read()、write()、unlink()等系统调用)实现的;例如,执行ls命令时,Shell调用open()系统调用打开目录,read()系统调用读取目录内容,再通过write()系统调用将内容显示到终端;cp命令则是通过read()读取原文件内容,再通过write()将内容写入目标文件,实现复制。
延伸考点: 如何查找文件?(find、grep命令,高频)——① find:按文件名、大小、修改时间等条件查找文件,语法:find 查找路径 -name 文件名,如“find / -name test.txt”(在根目录下查找所有名为test.txt的文件),参数:-size(按大小)、-mtime(按修改时间)、-user(按所有者);② grep:在文件中查找指定关键词,语法:grep 关键词 文件名,如“grep root /etc/passwd”(在/etc/passwd文件中查找包含root的行),参数:-i(忽略大小写)、-v(反向查找,显示不包含关键词的行)、-n(显示行号)、-r(递归查找目录下所有文件)。
三、Linux进程管理类(高频进阶,考察系统理解)
1. 什么是进程?Linux中进程和线程的区别是什么?
答案:
进程(Process)是Linux中“正在运行的程序的实例”,是操作系统进行资源分配和调度的最小单位——当一个程序被执行时,系统会为其分配内存、CPU、文件描述符等资源,创建一个进程,程序执行完成后,进程终止,资源被释放。简单来说,“程序是静态的文件,进程是动态的运行实例”。
进程的核心属性:① PID(Process ID,进程ID):每个进程唯一的标识,由系统自动分配,PID从1开始,最大为65535(可通过/proc/sys/kernel/pid_max修改);② PPID(Parent PID,父进程ID):创建当前进程的进程ID(所有进程的父进程最终都是init进程或systemd进程,PID=1);③ 状态:进程的运行状态(如运行、睡眠、停止、僵尸等);④ 优先级:决定进程获取CPU资源的顺序。
进程和线程(Thread)的区别(面试重点,必须清晰区分):
| 对比维度 | 进程(Process) | 线程(Thread) |
|---|---|---|
| 资源分配 | 操作系统进行资源分配的最小单位,每个进程有独立的内存空间、文件描述符、PID等资源,资源占用多。 | 操作系统进行调度的最小单位,线程共享所属进程的资源(内存空间、文件描述符等),仅拥有独立的线程ID(TID)、程序计数器、栈,资源占用少。 |
| 切换成本 | 进程切换时,需要保存当前进程的所有资源状态,切换到新进程时需要加载其资源,切换成本高、速度慢。 | 线程切换时,只需保存线程的局部状态(程序计数器、栈),共享进程的资源,切换成本低、速度快。 |
| 独立性 | 独立性强,一个进程崩溃,不会影响其他进程(除非进程间有依赖)。 | 独立性弱,线程共享进程资源,一个线程崩溃,可能导致整个进程崩溃(如Java进程中的一个线程异常,可能导致整个JVM进程终止)。 |
| 通信方式 | 进程间通信(IPC)方式复杂,如管道、消息队列、共享内存、信号量、Socket等。 | 线程间通信简单,可直接共享进程的内存空间(如全局变量、局部变量),无需复杂的IPC机制。 |
| 适用场景 | 适合独立运行、资源隔离要求高的场景(如多个应用程序同时运行,如nginx、mysql、ssh)。 | 适合并发度高、资源共享要求高的场景(如一个应用程序的多个任务并发执行,如Java的多线程、nginx的工作线程)。 |
原理拓展:
Linux内核本身不区分进程和线程,线程在Linux中被称为“轻量级进程(LWP,Lightweight Process)”,每个线程都有自己的PID(在用户态看来是TID,在内核态是PID),线程的调度和进程的调度方式一致,都是通过内核的进程调度机制实现的;区别在于,线程共享所属进程的资源,而进程拥有独立的资源。
进程的创建:Linux中通过fork()系统调用创建进程,fork()会复制父进程的所有资源(内存空间、文件描述符等),创建一个新的子进程,子进程的PID与父进程不同,PPID为父进程的PID;线程的创建:通过clone()系统调用创建,clone()会共享父进程的资源,仅创建线程的局部状态,效率比fork()高。
延伸考点: 进程的状态有哪些?(面试高频)——Linux进程的核心状态(5种):① R(Running,运行态):进程正在占用CPU,或处于就绪状态(等待CPU调度);② S(Sleeping,睡眠态):进程等待某个事件发生(如等待IO、等待信号),可被唤醒(如收到信号);③ D(Uninterruptible Sleep,不可中断睡眠态):进程等待IO事件(如磁盘IO),无法被信号唤醒,只能等待IO完成;④ Z(Zombie,僵尸态):进程已终止,但父进程未回收其资源(PID、状态等),会占用PID资源,若大量僵尸进程存在,会导致PID耗尽;⑤ T(Stopped,停止态):进程被暂停(如收到SIGSTOP信号),可被唤醒(如收到SIGCONT信号)。
2. 常用的进程管理命令有哪些?(ps、top、kill)
答案:
进程管理命令用于查看、控制进程的运行状态,是Linux运维和故障排查的核心命令,以下是高频命令,重点掌握用法和参数:
-
ps(process status):查看当前运行的进程
-
核心参数(面试高频,必须掌握):
- -e:显示所有进程(等价于-A);
- -f:以全格式显示(显示PID、PPID、所有者、进程名称、启动时间等详细信息);
- -aux:最常用的组合,显示所有进程(a)、显示用户(u)、显示详细信息(x),包括没有终端的进程(如后台进程),适合查看所有进程的详细状态,如“ps aux | grep nginx”(查看nginx相关的所有进程);
- -ef:显示所有进程的全格式信息,适合查看进程的父进程(PPID),如“ps -ef | grep test”(查看test进程及其父进程)。
-
输出结果解读(以ps aux为例):
- USER:进程的所有者;
- PID:进程ID;
- %CPU:进程占用的CPU百分比;
- %MEM:进程占用的内存百分比;
- VSZ:进程占用的虚拟内存大小(单位:KB);
- RSS:进程占用的物理内存大小(单位:KB);
- TTY:进程所在的终端(?表示无终端,即后台进程);
- STAT:进程的状态(R、S、D、Z、T等);
- START:进程的启动时间;
- TIME:进程占用的CPU时间;
- COMMAND:进程的启动命令。
-
-
top:实时监控进程状态(动态刷新)
-
核心用法:直接执行top命令,进入实时监控界面,默认每3秒刷新一次,按以下按键操作:
- q:退出top监控;
- P:按CPU占用率排序(默认排序方式,从高到低);
- M:按内存占用率排序(从高到低);
- N:按PID排序(从大到小);
- k:终止指定进程(输入PID,按回车,再输入信号量,默认15,即正常终止);
- 1:显示所有CPU的详细占用情况(多CPU场景);
- s:修改刷新间隔(输入秒数,按回车)。
-
top界面顶部解读:
- 第一行:系统时间、运行时间、登录用户数、系统负载(load average:1分钟、5分钟、15分钟的负载值,负载值越小,系统越空闲,通常负载值不超过CPU核心数);
- 第二行:进程总数、运行态进程数、睡眠态进程数、停止态进程数、僵尸态进程数;
- 第三行:CPU占用情况(us:用户空间进程占用CPU百分比;sy:内核空间进程占用CPU百分比;id:空闲CPU百分比;wa:等待IO的CPU百分比,wa过高表示IO瓶颈);
- 第四行:物理内存使用情况(total:总内存;used:已使用内存;free:空闲内存;buff/cache:缓存和缓冲区内存);
- 第五行:虚拟内存(swap)使用情况(total:总swap;used:已使用swap;free:空闲swap;cached:缓存的swap内存,swap使用过高表示物理内存不足)。
-
拓展:top的替代命令——htop,功能比top更强大,支持鼠标操作、颜色显示,需手动安装(yum install htop -y)。
-
-
kill:终止进程(发送信号给进程)
-
核心语法:kill [信号量] PID,信号量是关键,常用信号量(面试必记):
- 1(SIGHUP):重新加载进程配置(不终止进程),如“kill -1 1234”(重新加载PID为1234的进程配置,适合nginx、mysql等服务);
- 9(SIGKILL):强制终止进程(无法被进程捕获,无论进程是否正常运行,都会强制杀死,慎用!),如“kill -9 1234”(强制终止PID为1234的进程);
- 15(SIGTERM):正常终止进程(默认信号量,进程会先释放资源,再终止,推荐使用),如“kill 1234”(等价于kill -15 1234);
- 2(SIGINT):中断进程(等价于按Ctrl+C,终止前台进程);
- 19(SIGSTOP):暂停进程(无法被进程捕获,进程进入停止态);
- 18(SIGCONT):唤醒被暂停的进程。
-
示例:
- kill -15 1234(正常终止PID为1234的进程,推荐);
- kill -9 1234(强制终止PID为1234的进程,仅当进程无法正常终止时使用);
- killall 进程名(终止所有同名进程,如“killall nginx”(终止所有nginx进程),慎用!)
-