当前位置:首页 > 天道酬勤 > 正文内容

linux进程命令(linux mount命令详解)

张世龙2021年12月21日 05:41天道酬勤1080

1 .进程的代码结构

1.1过程控制块PCB和TASK_STRUCT

过程是资源封装的单位,资源是指占有的内存、文件系统、信号和处理方法。 线程是计划执行的单元。 区分一个进程和另一个进程的标志就是资源。 linux操作系统允许进程之间的资源隔离。 流程说明是资源的说明。 过程控制块(PCB )用于在不同的操作系统中描述过程,而Linux的PCB则用task_struct描述。 如图1-1所示,主要显示了对应所包含的资源的种类和作用。

mm存储器资源:工艺的存储器

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

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

signal信号资源:的不同过程可以对同一信号采取不同的处理方法

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

1.2任务结构的属性特征

linux的pid和tgid

一个进程fork提出子进程后,从linux内核的角度来看,对应的pid一定不同。 但是,为了满足POSIX的标准要求,POSIX需要规定同一父进程fork发出的子进程。 调用getpid返回的pid的编号必须相同。 使用top命令查看进程,可以发现fork发出的子进程和父进程的pid编号相同。 linux实现的原理是,通过添加tgid,父子进程调用getpid时的返回值相同。

linux进程task_struct的三种数据结构

在linux代码中,与对task_struct的各种引用关系有关。 例如,调度算法将task_struct挂在链表上,父子进程的关系用树绘制,CFS调度算法使用红色-黑色树,用pid查找进程使用混列表的结构对应的数据结构如图1-2所示

2 .工艺的状态特性

2.1工艺状态的切换

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

包括实时系统支持进程在内,操作系统一般有三种状态,进程在有CPU的情况下对应于运行状态,在没有CPU的情况下对应于准备状态和睡眠状态。 就绪意味着所有资源都已就绪,只要有CPU就可以运行。 睡眠意味着资源还没有准备好。 例如,在读取串行数据时,数据还没有发送。 在这种情况下,即使有CPU也无法执行。 资源准备完毕后,必须进入准备完毕状态,得到CPU后,才能进入执行状态。 其转换关系如图2-1所示。

2.2 linux进程扩展的6种状态

1 .僵尸状态:子进程结束后,所有资源消失,只剩下task_struct,父进程可以通过wait函数得到子进程的死亡原因。 wait之前的子进程的状态为僵尸状态。

2 .深度睡眠:在等待资源到达后才醒来

3 .浅睡:等待资源到达或接收信号时会醒来

4 .暂停:停止状态是从外部进入作业控制等强制进程的状态。

5 .未占用准备完毕:CPU。 等待调度算法被调度到运行状态

运行:以占用CPU,并且正在运行的线程。

暂停状态是进程正在运行时,通过外部bash命令强制进入进程的状态。 此方法允许您指定进程的CPU利用率。 后面通常用cgroup的方法实现,但是在这里请理解。

进入停止状态的方法:

中央陆军,足球俱乐部

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

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

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

深度睡眠VS浅睡眠深度睡眠只有在资源齐备后才能醒来。 即使受到信号也不会醒来。 浅睡眠的资源不管整齐还是接收到信号都会醒来

暂停休眠VS休眠是指在代码中没有积极的资源的状态下,暂停是指从程序外部强制进入进程的状态。

2.3进程内存泄漏

内存泄漏意味着随着时间的推移,进程的内存使用量将直线增加

情况,指的是进程一直在运行,运行中申请了内存,但使用完后并没有释放,运行期间每次都申请内存而不释放导致系统内存越来越少的情况。这里要理解内存泄露的 原因不可能是进程死了,内存没释放。因为进程死了之后就变成僵尸,Linux 会自动将进程中申请的资源全部释放,只留下task_struct让父进程wait来查看状态。不可能再占用内存。

3. 进程的出生、运行、死亡

3.1 进程出生时资源处理

fork 出子进程后,子进程的资源就直接从父进程的进程结构task_struct拷贝出同样的信息,如图3-1所示。进程P2刚创建后,其资源是一模一样的。Linux 内核的调度算法,是根据task_struct结构体来进行调度的。

所有资源的结构体都会被copy。之后随着进程变化,本着谁修改谁分裂的原则进行资源变化的处理。

3.2 写实拷贝技术

当p1把p2创建出来时,会把task_struct里描述的资源结构体对拷给p2。

区分进程的标志,就是 p2的资源不是p1的资源。两个task_struct 的资源都相同,那就不叫两个进程了。

执行一个copy,但是任何修改都造成分裂,如:chroot,open,写memory,

最难copy的是 mm 这个部分,因为要做写时拷贝。

Linux通过MMU进行虚拟地址到物理地址的转换,当进程执行fork()后,会把页表中的权限设置为RD-ONLY,当P1,P2去写该页时,CPU会收到page fault,申请新的内存。Linux再将页表中的virt1指向新的物理地址。

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

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

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

fork后写内存: 写内存后,发生缺页中断,Linux会重新申请一个4k内存,将新物理内存指向更改了内存地址的进程vir。同时将老的 4k内存拷贝给新的内存,同时将权限改为R+W,这样父子进程的同一个vir虚拟地址就分别对应2个独立的可读可写的物理地址。总之谁先写谁拿到新的物理内存,原内存留给剩下的进程。

3.3 无法用COW的情况:VFORK

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

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

1) exit

2) exec

CoW,严重依赖CPU的MMU。Mmu-less Linux 无copy-on-write, 没有fork,而使用vfork。

3.4强制共享资源–线程

当P1和P2都用同一个资源,资源结构体不进行拷贝,P2的资源指针直接指向P1,这样就体现出线程的特征:可以调度又共享一样的资源。Linux中也是这样来实现线程的,调用pthread_create时,会调到CLONE的API,这样就会让P2的资源指针指向P1。注:最终调用的API为CLONE,pthread_create

3.5第1个进程,进程0与进程1

开机后进程0创建出进程1,开机后进程0会退化成idle进程,idle进程的优先级最低。此进程运行的原则是所有其他的进程不运行时它就开始运行,当运行idle进程时,cpu就设置成低功耗模式。(注:与开机键中的suspend的区别是idle状态时只有cpu是低耗,suspend时显示器电源等其他设备也会进入 低功耗)。此设计的精妙之处在于,如果不用进程0,进程进入低功耗模式的判断标准就变成了所有进程退出后要检查一下是否是最后一个进程,如果是最后 一个就进入低功耗模式。这样的设计就会把检查状态耦合到了每个进程之中。 增加进程0设计的好处在于,设计就简化只要判断是否在idle进程就可以了。实现了去耦合。

扫描二维码推送至手机访问。

版权声明:本文由花开半夏のブログ发布,如需转载请注明出处。

本文链接:https://www.zhangshilong.cn/work/26124.html

分享给朋友:

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。