20250118面试鸭特训营第26天
更多特训营笔记详见个人主页【面试鸭特训营】专栏
1.说下你常用的 Linux 命令?
文件与目录操作
命令 | 描述 |
---|---|
ls | 列出当前目录和文件和子目录 |
ls -l | 列出当前目录和文件和子目录,包括详细信息 |
ls -a | 列出当前目录和文件和子目录,包括隐藏文件 |
cd | 切换目录,用于在文件系统中导航 |
pwd | 显示当前工作目录路径 |
cp | 复制文件或目录 |
cp -r | 递归复制目录 |
mv | 移动或重命名文件 / 目录 |
rm -f | 删除文件 |
rm -r | 删除目录 |
touch | 创建空文件或更新文件的时间戳 |
mkdir | 创建新目录 |
rmdir | 删除空目录 |
文件查找与文本操作
命令 | 描述 |
---|---|
find | 查找文件或目录 |
grep | 查找文件中包含指定文本的行 |
cat | 显示文件内容,常用于查看小型文本文件 |
more 或 less | 分页查看文件内容,less 支持向上翻页,适合查看大文件。 |
head | 查看文件的前几行 |
tail | 查看文件的后几行 |
tail -f | 实时监控文件内容变化,如日志文件 |
系统管理
命令 | 描述 |
---|---|
ps | 显示当前运行的进程列表 |
ps aux | 查看所有用户的进程 |
top 或 htop | 实时查看系统中的进程状态和资源使用情况 |
kill | 终止进程,后跟进程 ID |
killall | 终止进程,后跟进程名 |
df | 查看文件系统的磁盘空间使用情况 |
du | 查看文件或目录所占用的的磁盘空间 |
du -h | 以可读格式显示文件或目录所占用的磁盘空间 |
free | 查看内存使用情况 |
uname | 显示系统信息 |
网络操作
命令 | 描述 |
---|---|
ping | 测试与目标主机的连通性 |
ifconfig 或 ip | 查看和配置网络接口,ipconfig 已逐渐被 ip 命令替代 |
netstat 或 ss | 查看网络连接和端口使用情况,ss 是 netstat 的替代品,提供更详细的信息 |
curl 或 wget | 发送 HTTP 请求或下载文件,curl 更适合进行 API 调试,wget 则用于下载文件 |
ssh | 远程登录到另一条机器 |
scp | 通过 SSH 复制文件 |
文件权限与用户管理
命令 | 描述 |
---|---|
chmod | 修改文件或目录的权限,常用模式如 chmod 755 |
chown | 修改文件或目录的所有者 |
useradd | 添加用户 |
userdel | 删除用户 |
passwd | 修改用户密码 |
包管理
命令 | 描述 |
---|---|
apt-get (Debian / Ubuntu) | 安装、更新、删除软件包 |
yum (CentOS / RHEL) | 安装、更新、删除软件包 |
2. 什么是分段、什么是分页?
- 分段(Segmentation)和分页(Paging)是操作系统中用于内存管理的两种方式,目的是提高内存利用率并简化程序的管理。
分段(Segmentation)
特点
- 是一种根据程序逻辑结构划分内存的方式,例如将程序分为若干个段(如代码段、数据段、堆栈段等),每个段在逻辑上是一个独立的部分,有独立的段号和段内偏移量。
- 每个段可以有不同的大小,段的长度取决于程序的实际需求,段与段之间可能不连续。
- 分段管理提供了一种更贴近程序结构的内存管理方式,有助于提高程序的可读性和维护性。
- 操作系统维护一个段表,记录每个段的基地址和段的长度。
- 逻辑地址由段号和段内偏移量组成,程序使用逻辑地址来访问内存。
段表
- 分段使用段表来记录每个段的基址和长度,段表的每个条目对应一个段,存储段的起始地址(基址)和段的大小。
- 在地址转换时,CPU 通过段号在段表中查询段基址,并加上段内偏移量,得到实际的物理地址。
优点
- 与程序的逻辑结构一致,便于编译器和程序员理解。
- 每个段可以独立增长,不会影响其他段的大小。
- 支持动态分配内存,例如数据段可以在运行时增大。
- 分段支持程序的模块化,能够更好地反应程序的结构,有利于保护和共享。
缺点
- 由于段的大小不固定,段之间可能会出现未使用的小块内存空能见,导致外部碎片的产生。
- 由于段不一定连续分配,内存管理复杂,尤其在段数量较多时。
分页(Paging)
特点
- 是一种将物理内存和逻辑地址划分为固定大小的页(Page)和页框(Frame)的方式,每个页和页框的大小相同,通过为 4KB 或 2MB。
- 逻辑地址空间被划分为若干个固定大小的页,物理内存则被划分为相同大小的页框,页通过页表映射到页框。
- 操作系统维护一个页表,记录页和页框之间的映射关系。程序访问内存时,通过页表查找页对应的物理页框。
- 由于页的大小固定,解决了内存碎片的问题,但程序的逻辑结构和内存的物理结构不再一致。
页表
- 页表是分页机制中用于记录逻辑页到物理页框映射关系的数据结构。
- 没每个页表条目存储一个逻辑页在物理内存中的位置。
- 页表的结构可以是单级页表、二级页表或多级页表,较大的地址空间通常使用多级页表以节省内存。
优点
- 由于页和页框大小固定,可以有效避免分段方式中段间未使用内存造成的外部碎片的问题。
- 页表支持页的按需加载和交换(如虚拟内存机制),可以将不常用的页交换到磁盘上,从而扩大进程的可用内存空间。
缺点
- 如果程序使用的内存量不足一个页的大小,会造成业内未使用部分的浪费,即内部碎片问题。
- 每个进程都需要维护自己的页表,页表的大小与逻辑地址空间成正比。多级页表虽然节省了内存,但增加了地址转换的复杂性。
表格对比
特性 | 分段 | 分页 |
---|---|---|
管理单位 | 段,段大小不固定,且与程序的逻辑结构相关 | 页,页大小固定,与程序的逻辑结构无关 |
地址空间 | 逻辑地址由短号和段内偏移量组成 | 逻辑地址由页号和页内偏移量组成 |
映射方式 | 使用段表来映射段的基址和长度 | 使用页表来映射虚拟页和物理页的关系 |
碎片问题 | 存在外部碎片(段间空隙造成) | 存在内部碎片(页内空隙造成) |
优点 | 更适合程序的逻辑结构 有助于程序模块化 | 无外部碎片 内存管理简单,易于实现虚拟内存 |
缺点 | 可能产生外部碎片 管理较为复杂 | 可能产生内部碎片 需要额外的页表来管理地址映射 |
适用情况 | 适合按模块组织的程序 | 适合简单的内存分配和管理 |
3. 什么是硬中断、什么是软中断?
硬中断
特点
- 是由硬件设备(如键盘、网络卡、定时器等)触发的中断信号。
- 当硬件设备需要与 CPU 交互(如数据传输完成、定时中断等),会通过硬中断通知 CPU。
- 每个硬中断否有一个对应的中断向量,【中断向量表】存储了各个中断处理程序的入口地址。CPU 接收到硬中断信号后,通过中断向量表找到对应的中断处理程序。
- 处理过程
- 当硬中断发生时,CPU 会保存当前执行的上下文,并跳转到中断处理程序 。
- 中断处理程序处理完成后,会恢复被中断的程序的上下文,并继续执行。
- 优先级 / 实时性
- 相较于软中断,硬中断具有【高优先级】,通常会立即打断当前执行的程序,进行中断处理,具有【高实时性】。
- 不同的硬中断有不同的优先级,中断控制器负责管理和调度这些中断,优先处理高优先级的中断信号。
- 例如:定时器中断通常优先级较高,用于维持徐彤的时间片调度。
优点
- 能够实时响应外部硬件事件,提高系统的响应速度。
- 操作系统能够处理硬件异常、错误和设备状态变化。、
缺点
- 如果硬中断处理程序很长,可能会导致系统的响应延迟,影响其他任务的执行。
- 硬件中断处理需要考虑中断嵌套和优先级,增加了系统设计的复杂性。
软中断
特点
- 是由软件程序触发的中断,通常是由程序员在代码中显式调用通过特定指令(如
int
指令)或通过系统调用产生的。 - 软中断的和优先级一般低于硬中断。
- 程序运行中请求操作系统执行特定服务(如文件读写、进程调度等)时,会触发软中断进入内核态,执行对应的系统调用。
- 或者当程序运行中出现除零错误、非法内存访问等情况时,也会触发软中断进入异常处理程序。
- 操作系统也可以通过软中断来进行任务切换和进程调度。
- 如:在时间片轮转调度中,操作系统可能会使用定时器产生硬中断,然后通过软中断来触发进程的切换。
优点
- 灵活,程序可以在合适的时机显式触发软中断,通常用于实现操作系统的内核功能。
- 可以处理操作系统层面的异常和错误。
缺点
- 性能开销较大,因为软中断通过需要在程序的上下文种切换到内核模式进行处理。
表格对比
特性 | 软中断(Software Interrupt) | 硬中断(Hardware Interrupt) |
---|---|---|
触发方式 | 由程序或操作系统显式触发(例如系统调用) | 由硬件设备触发(如外部设备、定时器等) |
用途 | 实现操作系统功能、系统调用、异常处理等 | 响应外部事件(如设备输入、定时器中断、硬件故障等) |
中断源 | 由软件(程序)发出 | 由硬件设备(外部设备或内部硬件)发出 |
中断控制 | 操作系统通过中断向量表管理软中断 | 中断控制器(如 PIC 或 APIC)负责管理硬中断 |
优先级 | 优先级较低,通常用于内核模式的处理 | 优先级较高,必须及时响应硬件事件 |
应用场景 | 用于程序与操作系统之间的交互,如系统调用 | 用于处理硬件事件和外部设备交互,如输入输出操作、定时器等 |
例子 | int 0x80 (Linux 系统调用) | 键盘中断、定时器中断、硬盘驱动器中断等 |