当前位置: 首页 > news >正文

NJU OS 程序和进程;fork, execve, exit

目录
  • 程序与进程
  • 虚拟化与 CrazyOS
  • 进程状态与可观测性
  • /proc 与 procfs
  • fork / execve / exit
  • UNIX 设计哲学

程序与进程

  • 程序是状态机的静态描述:代码规定了状态转移规则,但自己不会运行。
  • 进程是运行中的状态机实例:有当前 PC/寄存器、地址空间、打开文件、信号状态、凭据、工作目录、环境变量等上下文。
  • 因而“程序”更像模板,“进程”更像带现场的执行对象。
  • 不是所有进程的父进程都是 systemd;只有孤儿进程才会被 PID 1 接管。
  • 子进程退出时发 SIGCHLD 给它的父进程,不是直接通知 systemd
  • 僵尸进程的本质是“已经退出,但父进程还没 wait”;PID 1 接管孤儿后会负责回收。

虚拟化与 CrazyOS

  • 操作系统对 CPU 的核心虚拟化可以抽象成:
while (1) {p = pick_next();run_one_step(p);
}
  • CrazyOS 用用户态模拟器把这个想法落地:每个 proc 维护自己的寄存器和内存,主循环每次只执行当前进程的一条 guest instruction。
  • 于是“并发”首先是交错执行,不是同时执行;哪个进程更快看到输出,取决于它完成同一可观察动作需要多少条指令。
  • 这也是 ./crazy-os p2.bin p1.bin | lessp2 看起来更快的原因:p2 打印 1,2,3...p1 打印 10,20,30...,后者每行通常多一位数字,也就多一次 ecall 和更多模拟指令。

进程状态与可观测性

  • 进程的最小可执行核心是:寄存器现场 + 虚拟地址空间。
  • 但一个 Unix 进程的完整状态远不止这些,还包括:
    pid/ppid、调度状态、页表与映射、文件描述符表、cwd、umask、信号处理器与 mask、session/process group、uid/gid、资源限制、环境变量等。
  • 用户态可以直接读自己地址空间中的数据,也天然在使用当前寄存器;但内核代管的那部分状态不能直接 load,只能通过内核接口观测。
  • 这些接口既可以是系统调用,也可以是内核导出的伪文件系统,如 /proc

/proc 与 procfs

  • procfs 是文件系统类型,/proc 是它通常的挂载点;前者是机制,后者是位置。
  • /proc 中的项在接口层面确实是“文件/目录/链接”,可以 open/read/write/stat
  • 但它们通常不是磁盘上长期存在的普通文件,内容多半由内核在读取时按当前状态动态生成。
  • 因而 /proc/<pid>/maps/proc/<pid>/status/proc/<pid>/fd 本质上是“进程状态的文件化视图”。

fork / execve / exit

  • fork() 复制当前进程,返回两次:父进程得到子进程 PID,子进程得到 0;失败返回 -1
  • 语义上 fork 复制的是整个执行上下文,实现上通常依赖 Copy-on-Write:先共享物理页,写时再真正复制。
  • fork 不是“从初始模板创建新进程”,而是“把当前计算过程分叉成两条执行线”;这使共享预处理结果、zygote、checkpoint、fork-based DFS 变得自然,避免了对公共子问题的重复计算。
  • fork bomb :() { : | : & }; : 的危险在于进程数指数增长;系统可能通过 RLIMIT_NPROC、cgroup、PID/内存限制、OOM 等机制缓解
  • execve(path, argv, envp) 用新程序替换当前进程的代码/数据/堆/栈;PID 通常不变,默认文件描述符保留,成功后不返回。
  • 环境变量就是 execveenvp:一组传给新进程的 key=value 字符串,如 PATH/HOME/LANG
  • _exit(status) 终止当前进程,释放资源,并向父进程发送 SIGCHLD;父进程通过 wait/waitpid 回收退出状态。

UNIX 设计哲学

  • fork + execve 的分离体现了“小原语 + 可组合”的哲学。
  • fork 只负责复制当前上下文,execve 只负责替换程序映像;两步之间用户态可以自由做重定向、改环境变量、改工作目录、设置信号处理。
  • 因而 shell 能用 fork + dup2 + execve + wait 组合出管道、重定向、后台任务,而不需要一个臃肿的“万能创建进程”系统调用。
http://www.jsqmd.com/news/938218/

相关文章:

  • 数学建模国赛论文如何写出高分“模型的评价与推广”?避开这三个常见误区就能加分
  • 智能小车PCB实战:用AD24完成从原理图绘制到DRC检查的全过程解析
  • 扩散模型太随机?BBDM不够用?试试DDBM:一个模型搞定确定性与多样性
  • 内网开发福音:手把手教你在无外网服务器离线部署1Panel Docker管理面板
  • 【错误记录】flutter attach 附加设备 执行报错 ( 附加设备注意事项 )
  • 福宝清朝姓氏历史整 理记录随笔2000年
  • 音乐解锁终极指南:3分钟学会解密各大平台加密音乐文件
  • Android TV搞多路Miracast投屏?小心这个‘单通道’陷阱让你的优化前功尽弃
  • 2026贵阳靠谱装企深度解析|福旺居装饰 高转介绍率背后硬实力 - 资讯纵览
  • 告别双击无响应!CentOS 7 Gnome桌面下为Chrome/Firefox创建稳定快捷方式的正确姿势
  • 从SfM点云到可交互3D场景:手把手教你用Gaussian Splatting重建你的房间
  • 鸣潮终极自动化指南:5分钟掌握后台战斗与声骸刷取技巧
  • 天业数智物联中台,助力车间数字化转型升级 - 资讯焦点
  • 2026 北京靠谱装修公司深度测评:从资质、施工、付款、售后多维筛选,避坑不踩雷 - 资讯纵览
  • 别再死记硬背了!用Librosa和Python实战,5分钟搞懂梅尔频谱(Mel Spectrogram)到底是个啥
  • 终极Dify工作流实战指南:7天从零构建企业级AI应用的完整方案
  • 北京万腾老酒回收“老酒文化月”开幕,公益鉴定进社区,普及真伪鉴别知识 - 资讯焦点
  • Perseus终极指南:3步快速解锁碧蓝航线全皮肤功能
  • 5分钟快速上手!用YUM在CentOS/RHEL 8一键部署PostgreSQL 16并配置远程访问
  • 闲鱼爬虫实战:模拟手机端破解反爬策略,爬取指定商品搜索数据,爬取闲鱼搜索指定商品(需手机端模拟)o 技术点:抓包分析、cookie与token
  • Delft3D FM结果可视化避坑指南:手把手教你用Matlab读取map.nc并处理三角/四边形混合网格
  • 别再手动调参了!Halcon拟合直线/圆实战:用edges_sub_pix和fit_line_contour_xld搞定工业零件测量
  • 3分钟掌握Maya动画资源管理神器:Studio Library快速上手指南
  • 2026 年 6 月教资免费题库避坑:真免费才是备考刚需 - 讲清楚了
  • 如何彻底解决macOS菜单栏混乱问题:Ice菜单栏管理工具完整指南
  • AI英语教学系统的开发费用
  • 咸阳黄金回收实地测评分享:深耕20年的本地老店真的更靠谱 - 铭汇黄金回收
  • 贵阳福旺居装饰全维度测评|资质、工艺、报价、售后一站式看懂 - 资讯纵览
  • 界面干净/使用丝滑,哔哩哔哩 V3.20.4 谷歌国际版(下架前珍藏)
  • Gio实战:手把手教你用Go为树莓派开发一个嵌入式图形界面