0

0

Linux系统核心概念如何掌握_基础原理与实践路径解析【教程】

舞姬之光

舞姬之光

发布时间:2026-01-05 09:40:41

|

741人浏览过

|

来源于php中文网

原创

Linux系统需实操掌握:通过/proc、strace、ps等工具观察进程线程本质(均为task_struct)、文件描述符分配逻辑、SIGKILL对D状态进程无效、swappiness实际调控页面回收倾向,而非swap启用开关。

linux系统核心概念如何掌握_基础原理与实践路径解析【教程】

Linux 系统不是靠“背概念”掌握的,而是靠在 /proc 里看、在 strace 里跟、在 pslsof 里验证出来的。死记硬背 fork()exec()区别,不如亲手 strace -f /bin/sh -c 'sleep 1' 看一遍系统调用序列。

进程和线程在内核里到底怎么存的?

Linux 不区分“进程”和“线程”的内核实现——它们都是 task_struct 结构体实例,区别只在共享哪些资源:mm_struct(内存)、fs_struct(文件系统上下文)、files_struct(打开文件表)等。一个 pthread_create() 创建的线程,和 fork() 出的子进程,内核眼里只是共享程度不同的 task_struct

实操建议:

  • cat /proc//status | grep -E 'Tgid|Pid|PPid|Threads' 对比父子进程与线程组的字段差异
  • readlink /proc//task//exe 能看到线程是否共享主程序映像
  • 不要依赖 ps -T 显示的 “LWP” 列判断“是不是线程”——它只反映调度实体,不反映资源共享关系

文件描述符为什么总从 0/1/2 开始?

因为 C 标准库启动时会显式调用 dup2() 把标准输入、输出、错误绑定到 fd 0/1/2;而内核分配 fd 的策略是“找最小未用整数”,所以只要没关闭过 0/1/2,新打开的文件就必然从 3 开始。

常见错误现象:

  • 程序启动前用 close(1) 关闭 stdout,再 execve(),结果日志全丢进黑洞——因为后续 open()pipe() 会把 fd 1 分配出去
  • system("ls > /tmp/out") 失败,实际是 shell 进程的 fd 1 被意外复用,重定向失败

验证方式:

bash -c 'exec 3>/dev/null; ls -l /proc/self/fd'
观察 fd 分配顺序。

为什么 kill -9 有时也不管用?

SIGKILL(信号 9)确实不能被忽略、不能被阻塞、也不能被自定义处理,但它只对处于 TASK_RUNNINGTASK_INTERRUPTIBLE 状态的进程生效。如果进程卡在不可中断睡眠(TASK_UNINTERRUPTIBLE,即 D 状态),比如等待坏磁盘响应或内核锁竞争,kill -9 就完全无效。

Transor
Transor

专业的AI翻译工具,支持网页、字幕、PDF、图片实时翻译

下载

使用场景:

  • ps aux | awk '$8 ~ /^D$/ {print $2}' 找出 D 状态进程 PID
  • cat /proc//stack 查看它卡在哪一行内核代码(需开启 CONFIG_STACKTRACE
  • 这类进程唯一出路通常是重启对应硬件或整个系统——没有用户态补救手段

/proc/sys/vm/swappiness 调高真的能“多用 Swap”吗?

不能。该值控制的是内核在内存压力下“倾向回收 file-backed 页面(如文件缓存)还是 anon 页面(如堆内存)”的权重,不是“是否启用 swap”。即使设为 0,只要物理内存彻底耗尽且有匿名页,swap 仍会被触发;设为 100 也不会让空闲内存主动写入 swap。

性能影响关键点:

  • 数据库类应用通常设为 1:避免重要 anon 页被换出,宁可清空 page cache
  • 桌面环境设为 6080:平衡响应速度与后台程序驻留
  • 改完必须 sysctl -p 或写入 /proc/sys/vm/swappiness 生效,仅改配置文件不生效

真正决定 swap 使用频率的是 vm.vfs_cache_pressure 和实际内存分配行为,不是这个数字本身。

最常被忽略的其实是 /proc//maps —— 它不只显示 mmap 区域,还暴露了每个段的权限(rw-p)、是否共享(shmem)、是否脏页(dirty)。看懂它,比背十遍虚拟内存原理都管用。

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

184

2023.09.27

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

194

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

186

2025.07.04

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

379

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

566

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

475

2023.08.10

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

340

2023.06.29

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

2070

2023.08.14

python设置中文版教程合集
python设置中文版教程合集

本专题整合了python改成中文版相关教程,阅读专题下面的文章了解更多详细内容。

1

2026.01.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 6.6万人学习

Git 教程
Git 教程

共21课时 | 2.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号