10linux011子进程创建和多进程调度开销分析(代码片段)

资质平庸的程序员 资质平庸的程序员     2022-12-05     747

关键词:

1 子进程创建的主要过程

(1) 执行int 80h指令进入系统调用fork()

(2) fork()

[1] 为子进程搜索唯一进程号(PID)和空闲的进程管理结构体(PCB,包含TSS);

[2] 继承父进程管理结构体部分属性,共享父进程下的全局数据(如文件),初始化子进程的TSS;计算子进程的逻辑内存空间,以设置子进程的LDT,并在GDT中设置子进程TSS和LDT的描述符;

[3] 为子进程分配页机制相关数据结构体(如页表目录项、页表和页表项)——映射为父进程的物理内存页(写时拷贝共享的物理内存页),刷新页机制数据结构体内存段在CPU中的快表(类似刷新cache);

(3) 系统调用返回

2 进程调度主要过程

(1) CPU自动完成部分(比较复杂)

CPU在进行用户进程切换时大体会涉及以下过程。

[1] 根据欲切换进程的TSS选择符(如由跳转指令加载在CS中)在GDT中索引到目标TSS描述符,并进行一系列有效和权限检查;

[2] 保存当前进程的运行状态到其TSS(当前进程TSS地址保存在TR高32位中);

[3] 将欲切换进程TSS描述符中的 地址和限长字段加载到TR高48位,将欲切换进程的TSS选择符加载到TR低16位;

[4] 根据欲切换进程TSS恢复欲切换进程的运行状态(各寄存器,如LDTR/CS/DS…);

[5] 根据TSS恢复欲切进程运行状态后,CS/DS中的段选择符为LDT描述符选择符,该LDT的选择符在第[4]步中被加载到了LDTR中。CPU从GDT[LDTR]处获取到LDT在内存中的基址,进行一系列有效和权限检查后,CPU根据CS/DS在LDT中选择到对应的LDT描述符,并将其中基址和限长字段分别加载到CS/DS高的48位(同进程后续就不用再访问内存中的LDT了)。最后,根据CS/DS中的基址和EIP/ESI中的偏移地址 即可得到页转换之前的逻辑内存地址。

           GDT
           +--------------+
  TSS   [1]|      ..      |
selector-->+--------------+
in CSS     |TSS descriptor| [2] backup current TSS
           +--------------| [3] load incoming TSS
           |      ..      |
  LDT   [4]+--------------+[5]
selector-->|LDT descriptor|--> LDT
in LDTR    +--------------+    +-----+
                            [6]|-----|
instr segment selector in CS-->+-----+[7]          [8]
                            [6]|     |--> CS + EIP --> logic mm addr
data  segment selector in DS-->+-----+[7]          [8]
                               |     |--> DS + ESI --> logic mm addr
                               +-----+

(2) 软件调度算法
8 进程调度中的调度策略

3 子进程创建和多进程调度开销分析

(1) 子进程创建开销分析

[1] 系统调用开销(见9 系统调用开销,但该版本不涉及对共享内核资源的等待);

[2] PCB、页机制相关数据结构体(包括刷新快表)的读写操作。性能主要消耗在页表数据结构体的相关操作上。

(2) 多进程调度开销分析

[1] CPU自动完成部分主要包括对TSS的备份/恢复、CPU流水线刷新以及GDT/LDT的访问(GDT多次);

[2] 多进程调度算法。

随着硬件性能增强和调度算法的演化,子进程创建和多进程调度开销都很小。像线程池这类编程方法并不是为了提升某次几十次的响应效率,而是为了总体(并发/积累)的时间性能。

08linux011进程调度(代码片段)

1linux0.11用户进程调度时机[1]主动请求调度(如调用pause);[2]进入系统调用时内核资源不够,则主动睡眠当前进程并调度其他进程运行,当内核资源可用时被唤醒,从而再次进入能被调度的状态;[3]在... 查看详情

08linux011进程调度(代码片段)

1linux0.11用户进程调度时机[1]主动请求调度(如调用pause);[2]进入系统调用时内核资源不够,则主动睡眠当前进程并调度其他进程运行,当内核资源可用时被唤醒,从而再次进入能被调度的状态;[3]在... 查看详情

多线程和多进程的区别

...www.cnblogs.com/huangweiyang/p/6473256.htmlLinux内核实际上是不区分进程和线程的,它们都是用的task_struct结构体,Linux上的线程是LWP,即轻量级进程。创建进程的fork()函数和创建线程的clone()函数内核底层都调用了do_fork()函数。对于线程来... 查看详情

2-3多线程和多进程的区别(代码片段)

一谁的开启速度快?1、在主进程下开启线程fromthreadingimportThreaddefwork():print('hello')if__name__=='__main__':t=Thread(target=work)t.start()print('主线程/主进程')执行结果如下,几乎是t.start()的同时就将线程开启了,然后先打印... 查看详情

c10k问题和多进程模型(代码片段)

内核空间的相关程序在调度用户空间里的进程的时候,也占用了cpu资源......nginx可以作为两种类型的反向代理http和smtp(mail)C10K问题,当一个主机的连接数过多的时候,单独一片网卡,响应在一个套接字上的请求,如何通过一个进... 查看详情

linux应用编程

Linux应用编程复习多进程:多进程的实现和多进程之间的数据通信进程是linux系统进行资源调度的基本单位从程序实现中来说,实际上就是根据fork函数的不同返回值来实现的(实际上就是依赖于该接口在不同的环境有两个不同的... 查看详情

day10多线程理论开启线程

多线程:多线程和多进程的不同是他们占用的资源不一样,一个进程里边可以包含一个或多个进程,进程的开销大,线程的开销小。打个比方来说:创建一个进程,就是创建一个车间。创建一个线程,就是在一个车间创建一个流... 查看详情

linux进程控制:创建终止等待(代码片段)

进程控制:创建终止等待一、进程的创建再谈fork()函数写实拷贝二、进程的终止1、进程的退出码2、进程常见退出方法三、进程的等待1、进程等待必要性2、什么是等待3、进程等待的方法一、进程的创建再谈fork()函数在Linux中... 查看详情

11linux011用于进程共享资源的睡眠与唤醒(代码片段)

用进程调度状态、进程调度和一个指向上一个睡眠进程PCB的指针实现了进程在共享资源时的睡眠等待与唤醒机制,分别包装成睡眠和唤醒两个函数。此机制的实现非常简单,但不太容易被理解。1进程等待资源的睡眠[1]初... 查看详情

linux操作系统原理—进程管理—numa架构中的多线程调度开销与性能优化

目录文章目录目录前言NUMA体系结构基本对象概念查看Host的NUMATopologyBash脚本DPDK脚步NUMA架构中的多线程性能开销1、跨Node的Memory访问开销2、跨Core的多线程Cache同步开销3、多线程上下文切换开销4、CPU运行模式切换开销5、中断处理... 查看详情

在 Linux 上创建线程与进程的开销

】在Linux上创建线程与进程的开销【英文标题】:OverheadincreatingathreadvsprocessonLinux【发布时间】:2019-02-1000:33:40【问题描述】:我试图回答在python中创建线程与进程相比有多少开销的问题。我修改了一个类似问题的代码,该问题... 查看详情

fork 产生的唯一开销是页表复制和进程 ID 创建

】fork产生的唯一开销是页表复制和进程ID创建【英文标题】:theonlyoverheadincurredbyforkispagetableduplicationandprocessidcreation【发布时间】:2013-05-1910:41:17【问题描述】:fork()产生的唯一开销是父页表的复制并为子进程创建一个唯一的进... 查看详情

linux-进程控制(创建和终止)

1.进程创建fork函数初识在linux中fork函数时非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。返回值:子进程返回0,父进程返回子进程id,出错返回-1getpid()获取子进程i... 查看详情

多线程和多进程模式有啥区别

多线程和多进程模式有什么区别多进程模式,各进程之间资源独享,相互并不影响,一个进程的崩溃不会造成其他进程的崩溃。但进程创建的的开销比较大,且进程间通信需要专门的机制,从而降低了性能。多线程之间共享同一... 查看详情

linux进程控制(代码片段)

目录进程创建fork函数初识fork函数返回值写时拷贝fork常规用法fork调用失败的原因进程终止进程退出的情况分类退出码进程常见退出方法_exit函数exit函数_exit和exit的区别进程等待进程等待必要性进程等待的方法wait方法waitpid方法获... 查看详情

超详细的linux进程控制精讲(代码片段)

一、进程创建fork函数初识在Linux中,fork函数是非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。返回值:在子进程中返回0,父进程中返回子进程的PID,子进程创... 查看详情

linux-进程控制(代码片段)

作为操作系统对于其中的进程控制,对于一个多进程少CPU的情况,操作系统要有一个组织调度进程的算法来合理分配资源。进程调度队列NICE与PRI运行队列-runqueue优先级过期队列和活跃队列active指针与expired指针进程创建for... 查看详情

多进程多线程和相关同步机制(代码片段)

多进程和多线程原理fork后子进程会复制父进程的task_struct结构,并为子进程的堆栈分配物理页。理论上来说,子进程应该完整的复制父进程的堆栈以及数据空间,但是2者共享正文段。由于一般fork后面都结着exec,所以现在的fork... 查看详情