1.什么是进程?
进程:资源的封装单位;
linux用一个PCB来描述进程,即task_struct, 其包含mm,fs,files,signal…

- root目录,是一个进程概念,不是系统概念;
 apropos chroot
 man chroot 2
如下图,将分区/dev/sda5挂载到/mnt/a,调用chroot,改变root目录,当前进程下的文件b.txt即位于当前进程的根目录。

(2)fd也是进程级概念;
(base) leon@leon-Laptop:/proc/29171$ ls fd -l
总用量 0
lrwx------ 1 leon leon 64 5月 16 10:26 0 -> /dev/pts/19
lrwx------ 1 leon leon 64 5月 16 10:26 1 -> /dev/pts/19
lrwx------ 1 leon leon 64 5月 16 10:26 2 -> /dev/pts/19
(3)pid,系统全局概念
Linux总的PID是有限的,用完PID
每个用户的PID也是有限的
ulimit -u 最大进程数
ulimit –a
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uXGnv2g8-1598431532855)(media/3eef1348e4b3cf1d805464d6058730e5.png)] Linux内核之进程1:进程的概念_内存泄漏_04](http://img.558idc.com/uploadfile/allimg/20230829/14103503_63213dd7313262910.jpg)
(base) leon@leon-Laptop:/proc/29171$ cat /proc/sys/kernel/pid_max
32768
案例:android2.2漏洞
Android提权漏洞分析——rageagainstthecage:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eYtXrQey-1598431532856)(media/c145a74a9d99f9f1875d00612440edad.png)] Linux内核之进程1:进程的概念_子进程_05](http://img.558idc.com/uploadfile/allimg/20230829/14103503_63213dd7540d451697.jpg)
Setuid(shell):rootshell用户 PID用完时,降权失败,依然具有root权限
解决办法,检查返回值
软件工程符合墨菲定律,解决办法,代码写出闭环。
2 linux进程的组织方式
linux里的多个进程,其实就是管理多个task_struct,那他们是怎么组织联系的呢?
组织task_struct的数据结构:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zFFYrR44-1598431532857)(media/81ff93c53a48d4049233509472f848b7.png)] Linux内核之进程1:进程的概念_子进程_06](http://img.558idc.com/uploadfile/allimg/20230829/14103503_63213dd78cbfa17264.jpg)
a.链表,遍历进程
b.树:方便查找父子相关进程
c.哈希表:用于快速查找
用三种数据结构来管理task_struct,以空间换时间。
父进程监控子进程,linux总是白发人送黑发人。父进程通过wait,读取task_struct的退出码,得知进程死亡原因。并且清理子进程尸体。
Android/或者服务器,都会用由父进程监控子进程状态,适时重启等;
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wnAjtGFM-1598431532858)(media/711f6e57ae9853dd7f45bed9ae50a9f7.png)] Linux内核之进程1:进程的概念_进程调度_07](http://img.558idc.com/uploadfile/allimg/20230829/14103503_63213dd7eef5691351.jpg)
3.进程的生命周期
有六个状态:就绪,运行,睡眠(深度/浅度睡眠),暂停,僵尸
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aK6hZyIX-1598431532859)(media/55bf75e8d00d96c9d263f8bb83212ab6.png)] Linux内核之进程1:进程的概念_僵死进程_08](http://img.558idc.com/uploadfile/allimg/20230829/14103504_63213dd8249bc39810.jpg)
3.1.什么是僵尸进程:
子进程死掉,父进程还没清理尸体,没火化。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GnfBqFEF-1598431532860)(media/ccd6fb0fe0b4296fb1a4f73ecedbeb08.png)] Linux内核之进程1:进程的概念_父进程_09](http://img.558idc.com/uploadfile/allimg/20230829/14103504_63213dd859ff564113.jpg)
子进程死亡后,首先变成僵尸,
 mm,fs等所有资源已经释放,只剩task_struct躯壳还没被父进程清理,父进程通过wait_pid获得,wait结束,僵尸所有资源(task_struct)被释放。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p9OdrFv2-1598431532861)(media/9fbe2ef605f3ec0a85162b7a3eb13b73.png)] Linux内核之进程1:进程的概念_内存泄漏_10](http://img.558idc.com/uploadfile/allimg/20230829/14103504_63213dd880ccf7027.jpg)
父进程用waitpid()查看task_struct退出码,检测子进程退出状态;
Waitpid()调用完成,则子进程彻底消失。
僵尸进程状态:子进程死亡,还没被父进程清理,资源已经被释放,只剩下task_struct。
清理办法:kill父进程。
僵尸进程被杀死的假象:
当一个进程里有多个子线程,主线程退出其他线程仍然运行;
top是以进程视角看线程,所以造成僵尸进程亦然可以被杀的假象;
3.2 stop状态:
其他进程控制其停止
Ctrl+z:让进程暂停;发信号19
Fg:进程在前台继续跑;
Bg:让进程在后台继续跑
Fg/bg实际上是发continue信号18
用于作业控制。
Kill –l
cpulimit -l 20 -p 3637
限制CPU占用率为20,实际用ctrl+z fg/bg实现的。
cpulimit是暴力的方法,更好的用CGROUP
3.3 睡眠
进程本身主动睡眠,等待资源,深度睡眠/浅度睡眠。
3.4调度:
只管在就绪态和运行态进程的切换,一个运行态,多个就绪态。
调度进程只等CPU,其他资源全部就绪。Linux就绪和占用都是用task_running标识符
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AtU0kAxf-1598431532861)(media/2f7c4d06d703bcf94a2cae6dd558d21d.png)] Linux内核之进程1:进程的概念_内存泄漏_11](http://img.558idc.com/uploadfile/allimg/20230829/14103504_63213dd8c677f81180.jpg)
4.fork
创建进程,子进程拷贝父进程的task_struct资源。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Eon4o3aB-1598431532862)(media/74f8955b7bd06415932010259ccd4c45.png)] Linux内核之进程1:进程的概念_父进程_12](http://img.558idc.com/uploadfile/allimg/20230829/14103505_63213dd9470cd43538.jpg)
5.什么是内存泄漏?
进程没死,运行越久,耗费内存越多,叫内存泄漏(程序死亡时,所占内存会全部释放);
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zop0cg45-1598431532863)(media/901890d4d2292a3dd4cfb09dec02c904.png)] Linux内核之进程1:进程的概念_父进程_13](http://img.558idc.com/uploadfile/allimg/20230829/14103505_63213dd994fba94234.jpg)
判断内存泄漏方法:连续多点采样(6,7,8,9每小时采样,统计剩余内存是否收敛),正常的程序,内存震荡收敛。随时间增加,内存消耗不断增多,且不收敛,则一定是内存泄漏;
发散
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YKKNK3Lv-1598431532864)(media/6ab83d23f89927071d30a92cec2cb2ff.png)] Linux内核之进程1:进程的概念_僵死进程_14](http://img.558idc.com/uploadfile/allimg/20230829/14103505_63213dd9cd95290476.jpg)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qRK4qFsE-1598431532864)(media/239e7971148acbc5a0b14ee0c76a768f.png)] Linux内核之进程1:进程的概念_进程调度_15](http://img.558idc.com/uploadfile/allimg/20230829/14103506_63213dda04bca92041.jpg)
                
