linux进程和调度
一、进程的状态
就绪,运行,睡眠(深度,浅度),停止(手动停止程序,如ctrl+z,gdb 调试,fg/bg实现停止和就绪的切换),僵尸(子进程退出,父进程没有wait)
二、进程的创建
1.进程资源分配单位,包括mm fs signal,pid等资源
2.fork,就是把描述进程资源的task struct拷贝一份。同时linux利用了copy-on-write机制(需要mmu的支持),拷贝task struct时候,把mm权限设置为只读,这样在写的时候,出现缺页,实现内存拷贝,
vfork,也是拷贝一份task struct,但是mm资源是共享的,执行exec,替换自己
clone,拷贝一份task struct,但是可以指定需要共享什么资源,如mm,fs,等,有选择性的拷贝父资源的。
pthead_create,拷贝一份task struct,但是资源和父进程完全一样的。
3.每个进程都有一个pid,但是linux这边真实的pid,其实是tgid,对应多个进程,getpid(),返回的是自己的pid,但是对应一个进程,多个线程,这getpid()返回的是tgid.
top -H 线程视角看 ,看到线程真实的pid
top 进程视角,看进程的pid
托孤,父进程退出了,但是子进程没有退出,就会托孤, 通过pstree,找到上一级的init的进程。
当用户态通过prctl(PR_SET_CHILD_SUBREAPER,1)的时候就是让当前进程像init进程一样来收养孤儿进程
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· .NET Core 中如何实现缓存的预热?
· 三行代码完成国际化适配,妙~啊~
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?