进程相关

回忆线索:
进程的生命周期、进程的数据结构、进程的调度策略、进程的调度流程

1、进程的生命周期

首先是文本文件通过编译,产生可重定位目标文件.o,经过链接,生成可执行文件ELF。
其中可重定位目标文件的结构是需要掌握的,它和可执行文件的区别也是需要理解的。

ELF中的Segment Header Table中记录了这个段加载到内存的虚拟地址。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

当需要引用动态链接库时,程序文件中只包含动态库的名称,不包括路径。会在一个默认的地方中找动态库。需要调用动态库的ELF文件中有两个section,一个是.plt的过程链接表,另一个是.got.plt的全局偏移量表。
动态库中的函数会在过程连接表中有对应的槽位,PLT[x]类似于一个代理。PLT[x]被调用的时候就回去GOT[y]中找,GOT[y]同样是动态库函数的一个代理。在没调用之前,GOT[y]啥都不知道,里面存的统一是PLT[0],然后PLT[0]存的是GOT[2],就是当GOT[y]啥都不知道的时候,会绕一圈调用到GOT[2],里面存的是ld-linux.so的入口函数,也就是会让它启动链接,去内存里找到动态库里的对应函数,将函数地址写到GOT[y]中,下次来问就知道了。

ELF的构建讲完了就说怎么将其加载到内存,是通过sys_execve——>do_execve最终调用load_elf_binary将其加载到内存中的。

2、进程之间的关系

进程树:
linux启动的时候,1号进程是/sbin/init,它是用户态进程的祖先。2号进程是kthread,它是内核态的祖先。

3、进程的数据结构

在这里插入图片描述

任务ID:
pid是进程id,tgid是thread group ID,表示属于那个组。如果pid等于tgid说明是进程,否则是线程。tgid的作用是如果我给子线程传递了信号,可以通过tgid来通知组里所有的线程。

信号处理:
定义哪些信号被阻塞暂不处理,哪些信号尚等待处理,哪些信号正在处理等。

任务状态:
state通过位设置来表示当前处于就绪、运行、阻塞态等的那种。

调度:
on_rq是否在运行队列上;prio优先级(数字越小优先级越高);sched_class调度器类(封装了调度策略的执行逻辑,分别是stop、dl、rt、fair、idle,调度类中有指针可以指向下一个调度类);se调度实体;policy调度策略(数字选择哪个策略,有6种,FIFO之类的)

运行统计:
utime用户态消耗的cpu事件;stime核心态消耗的cpu时间;nvcsw和nivcsw自愿及非自愿上下文切换的次数;start_time进程启动

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值