推广 热搜: csgo  vue  angelababy  2023  gps  新车  htc  落地  app  p2p 

Linux进程详解(一)

   2023-08-12 网络整理佚名1600
核心提示:进程的代码结构进程打开的文件,文件描述符数组linux进程的三种数据结构linux进程扩展的6个状态linux进程状态的联系和区别:全局变量data对应数据段内存vir和phy都在数据段,权限为可读可写。4k内存拷贝给新的内存,同时将权限改为R+W,这样父子进程的同一个vir虚拟地址就分别对应2个独立的可读可写的物理地址。

1.流程的代码结构

1.1 过程控制块PCB和

进程是资源封装的单位,资源是指占用的内存、文件系统、信号和处理方法。 线程是调度执行的单位。 区分一个进程与另一个进程的标记是资源。 Linux操作系统可以实现进程之间的资源隔离。 流程的描述就是资源的描述。 PCB(BLOCK)用于描述不同操作系统中的进程,Linux中使用PCB来描述。 如图1-1所示,图中列出了主要对应资源的类型和功能。

mm内存资源:进程的内存

fs文件系统资源1:根路径和当前路径指针

files 文件系统资源2:进程打开的文件,文件描述符数组

信号资源:不同进程可以对同一个信号挂不同的处理方式

pid属性资源:描述进程的属性

1.2 属性特征

Linux 的 pid 和 tgid

一个进程fork出子进程后,从Linux内核的角度来看,对应的pid一定是不同的。 但是为了符合POSIX标准的要求,POSIX要求同一个父进程fork的子进程必须有相同的调用返回的pid号。 我们可以使用top命令查看进程,可以看到fork的子进程和父进程是一样的。 pid号是一样的。 linux实现的原理是添加一个tgid来达到父子进程调用时返回值相同的效果。

linux进程的三种数据结构

在linux代码中,会涉及到各种成对的引用关系。 例如在调度算法中,会采用链表的方式进行链接。 父进程和子进程之间的关系用树来描述。 哈希表的结构。对应的数据结构如图1-2所示

2. 流程的状态特征

2.1 进程状态切换

进程运行时的3种基本状态

操作系统相应的进程,包括实时系统,一般具有三种状态。 当进程有CPU时对应运行状态,无CPU时对应就绪状态和休眠状态。 就绪状态意味着所有资源都准备好了,只要有CPU就可以运行。 sleep是指有些资源还没有准备好,比如读取串口数据时,数据还没有发送出去。 这时候即使有CPU也无法运行。 它需要等到资源准备好才成为就绪状态,然后获得CPU才可以成为运行状态。 转换关系如图2-1所示。

2.2 linux进程扩展的六种状态

1、僵尸状态:子进程退出后,所有资源消失,只有父进程可以在wait函数中获取子进程的死亡原因。 wait之前子进程的状态就是僵尸状态。

2.深度睡眠:等待资源到达才唤醒

3.浅睡眠:等待资源到达或收到信号后唤醒

4.挂起:停止状态是由外部命令、作业控制等强制进程进入的状态。

5、就绪:CPU没有被占用,进程正在等待调度算法调度,进入运行状态

6.运行中:占用CPU,正在运行的线程。

挂起状态是进程在运行过程中被外部bash命令强制进入的状态。 这样就可以指定进程的CPU使用率。 后面我们平时实现的方法,这里只是为了理解。

进入停止状态的方法:

ctrl + z,前/背景

-l 20 -p 10111:限制pid为10111的程序的CPU使用率不超过20%

linux进程状态的联系与区别:

就绪VS运行linux的调度算法只管理就绪和运行状态的进程,只对应就绪和占用状态的进程。 这两种状态称为。

深度睡眠 VS 浅度睡眠 深度睡眠只有资源到位时才唤醒,收到信号时不唤醒,而浅度睡眠则资源到位或收到信号时唤醒

Sleep VS 睡眠是代码中不主动进入资源的状态,而挂起是进程从程序外部强制进入的状态。

2.3 进程内存泄漏

内存泄漏是指进程的内存使用量随着时间的增长而线性增加的情况。 表示进程一直在运行,运行过程中申请了内存,但使用后并没有释放。 运行过程中,每次都会申请内存,而不是释放的情况,导致系统内存越来越少。 这里我们要明白,内存泄漏的原因不可能是进程死了,内存没有释放。 因为进程死后就变成了僵尸,Linux会自动释放该进程申请的所有资源,只留下父进程等待检查状态。 已经不可能再占用内存了。

3.进程的诞生、运行和死亡

3.1 进程诞生时的资源处理

子进程fork后,直接从父进程的进程结构中复制子进程的资源,获取相同的信息,如图3-1所示。 进程P2刚创建后,其资源是完全一样的。 Linux内核的调度算法是根据该结构进行调度的。

所有资源结构都将被复制。 之后,随着流程的变化,按照谁修改、谁拆分的原则来处理资源变化。

3.2 逼真复制技术

p1创建p2时,会将p2描述的资源结构复制到p2中。

区分进程的标志是p2的资源不是p1的资源。 两个资源是相同的,因此不称为两个进程。

执行复制,但任何修改都会导致分裂,如:、open、write、

最难复制的部分是mm部分,因为需要写时复制。

Linux通过MMU将虚拟地址转换为物理地址。 当进程执行fork()时,会将页表中的权限设置为RD-ONLY。 当P1和P2写入页面时,CPU将收到页面错误。 请求新的内存。 然后Linux将页表中的virt1指向新的物理地址。

下面我们具体分析一下程序背后使用COW的原理和流程。

fork前第一阶段:全局变量data对应数据段内存vir和phy都在数据段中,权限可读可写。

fork后:vir和phy的权限全部变成只读,内存读正常,但写内存会进入缺页中断。

fork后写内存:写内存后,如果发生缺页,Linux会重新申请一块4k内存,并将新的物理内存指向改变内存地址的进程vir。 同时将旧的4k内存复制到新内存中,并将权限改为R+W,这样父子进程的同一个vir虚拟地址就对应了两个独立的可读写的物理地址。 简而言之,谁先写,谁就获得新的物理内存,而原来的内存将被保留给剩余的进程。

3.3 无法使用COW:VFORK

COW技术的实现必须借助MMU(内存管理单元)。 COW是通过改变虚拟内存和物理内存的映射关系来实现的。 没有MMU的系统无法实现虚拟内存和物理内存之间的映射。 也不可能调用fork函数。 没有MMU的系统相应地调用vfork函数。 与fork的资源变化对比如图3-3所示:

vfork的特点:vfork会阻塞父进程,只有子进程完全退出后才执行父进程。

1)退出

2)执行

CoW,严重依赖CPU的MMU。 Mmu-less Linux 没有写时复制,没有 fork,但使用 vfork。

3.4 强制共享资源——线程

当P1和P2都使用同一个资源时,资源结构不被复制,P2的资源指针直接指向P1,这体现了线程的特性:可以调度,共享相同的资源。 Linux也是通过这种方式实现线程的。 调用时会转入CLONE的API,这样P2的资源指针就会指向P1。 注:最终调用的API是CLONE,

3.5 第一个进程,进程0和进程1

进程0开机后创建进程1,进程0开机后退化为空闲进程,空闲进程优先级最低。 该进程运行的原理是,当所有其他进程都没有运行时,它就开始运行。 当空闲进程运行时,CPU被设置为低功耗模式。 (注:与电源按钮不同的是,空闲状态下只有CPU处于低功耗状态,其他设备如显示器电源也会进入低功耗状态)。 这个设计的精妙之处在于,如果不使用进程0,那么该进程进入低功耗模式的标准就变成了所有进程退出后,需要检查是否是最后一个进程,如果是最后一项,进入低功耗模式。 这样的设计将检查状态耦合到每个进程。 添加进程0设计的好处是简化设计,只需要判断是否为空闲进程即可。 实现解耦。

 
反对 0举报 0 收藏 0 打赏 0评论 0
 
更多>同类资讯
推荐图文
推荐资讯
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报
Powered By DESTOON