Linux内核之进程1:进程的概念

本文援用ppipp笔记,略做修改。
1.什么是进程?
进程:资源的封装单位;

linux用一个PCB来描述进程,即task_struct, 其包含mm,fs,files,signal…
在这里插入图片描述

root目录,是一个进程概念,不是系统概念;每一个进程都可以用chroot命令设定属于自己的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就不能再创建新的。可以通过cat /proc/sys/kernel/pid_max节点来查看当前系统最大值。

cat /proc/sys/kernel/pid_max

32768
进程炸弹:

: ( ) { : ∣ : & } ; : 😦){😐:&};: 😦){:∣:&};:

每个用户的PID也是有限的

ulimit -u //最大进程数
ulimit –a

在这里插入图片描述
案例:android2.2漏洞

Android提权漏洞分析——rageagainstthecage:
https://blog.csdn.net/feglass/article/details/46403501

在这里插入图片描述

Setuid(shell):rootshell用户 PID用完时,降权失败,依然具有root权限

解决办法,检查返回值

软件工程符合墨菲定律,解决办法,代码写出闭环。

2 linux进程的组织方式
linux里的多个进程,其实就是管理多个task_struct,那他们是怎么组织联系的呢?

组织task_struct的数据结构:

在这里插入图片描述

a.链表,遍历进程

b.树:方便查找父子相关进程

c.哈希表:用于快速查找

用三种数据结构来管理task_struct,以空间换时间。

父进程监控子进程,linux总是白发人送黑发人。父进程通过wait,读取task_struct的退出码,得知进程死亡原因。并且清理子进程尸体。

Android/或者服务器,都会用由父进程监控子进程状态,适时重启等;

在这里插入图片描述

3.进程的生命周期
有六个状态:就绪,运行,睡眠(深度/浅度睡眠),暂停,僵尸.
浅度睡眠可以通过信号唤醒,深度睡眠只能等待资源再唤醒(磁盘IO)。
僵死:进程死亡,其task结构体未被父进程回收。
暂停:暂停和继续是通过stop和continue信号来控制,相当于强制调出执行队列。
在这里插入图片描述

3.1.什么是僵尸进程:
子进程死掉,父进程还没清理尸体,没火化。

在这里插入图片描述

子进程死亡后,首先变成僵尸,
mm,fs等所有资源已经释放,只剩task_struct躯壳还没被父进程清理,父进程通过wait_pid获得,wait结束,僵尸所有资源(task_struct)被释放。

在这里插入图片描述

父进程用waitpid()查看task_struct退出码,检测子进程退出状态;

Waitpid()调用完成,则子进程彻底消失。

僵尸进程状态:子进程死亡,还没被父进程清理,资源已经被释放,只剩下task_struct。

清理办法:kill父进程。

僵尸进程被杀死的假象:

当一个进程里有多个子线程,主线程退出其他线程仍然运行;

top是以进程视角看线程,所以造成僵尸进程亦然可以被杀的假象;此时可以通过杀死父进程来处理。

3.2 stop状态:
其他进程控制其停止

Ctrl+z:让进程暂停;发信号19

Fg:Ctrl+z之后进程进程停止,可以通过Fg或Bg从之前的暂停处继续跑;

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标识符

在这里插入图片描述

4.fork
创建进程,子进程拷贝父进程的task_struct资源。

在这里插入图片描述

5.什么是内存泄漏?
进程没死,运行越久,耗费内存越多,叫内存泄漏(程序死亡时,所占内存会全部释放);

在这里插入图片描述

判断内存泄漏方法:连续多点采样(6,7,8,9每小时采样,统计剩余内存是否收敛),正常的程序,内存震荡收敛。随时间增加,内存消耗不断增多,且不收敛,则一定是内存泄漏;

发散
在这里插入图片描述
重点命令:
cat /proc/sys/kernel/pid_max
apropos chroot
man chroot 2
ctrl+z fg/bg
cpulimit -l 20 -p 3637

————————————————
版权声明:本文为CSDN博主「科学边界」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/luteresa/article/details/108243411

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值