linux进程管理分析

更新时间:2023-09-12 14:04:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

Linux

作者:陈颖

邮箱:chxxxyg@163.com

博客: http://chxxxyg.blog.163.com/

目录

一 进程管理原理分析概述 ...................................................................................................... 1

二 进程创建 .............................................................................................................................. 2

1 进程管理相关结构 ......................................................................................................... 2 2 进程与线程之间的关系 ................................................................................................. 4 3 进程创建 ......................................................................................................................... 5

三 进程调度 ............................................................................................................................ 14

1进程调度相关结构 ........................................................................................................ 14 2 优先级与负荷权重 ....................................................................................................... 16

2.1优先级的计算 ........................................................................................................... 16 2.2 负荷权重的计算 ...................................................................................................... 17

3核心调度器 .................................................................................................................... 18

3.1 周期性调度器 .......................................................................................................... 18 3.2 主调度器 ................................................................................................................. 19

4 完全公平调度类 ........................................................................................................... 22

4.1 数据结构 ................................................................................................................. 22 4.2 完全公平调度类操作方法 ........................................................................................ 22

4.2.1 虚拟时间计算 ................................................................................................ 22

4.2.2 延迟计算...................................................................................................... 23 4.2.3 完全公平调度类操作方法实现 ...................................................................... 25

4.2.3.1 时间更新.............................................................................................. 26 4.2.3.2 创建新进程时的处理 ............................................................................ 28 4.2.3.3 将进程插入就绪队列 ............................................................................ 29

5 实时调度类 ................................................................................................................... 31

5.1 数据结构 ................................................................................................................. 31 5.2 实时调度类 ............................................................................................................. 32

6 负载均衡 ....................................................................................................................... 34

四 程序的运行 ........................................................................................................................ 37

1 可执行文件 ................................................................................................................... 37 2 程序的运行 ................................................................................................................... 38

linux进程管理分析 陈颖

一 进程管理原理分析概述

进程创建之后将被插入就绪队列接受调度投入运行,新进程运行之初,它的地址空间与其父进程相同,为运行新的程序它需要调用exec函数将新的可执行程序加载到进程空间,从而运行不同于父进程的程序。

进程创建:

用户空间的进程创建是通过调用系统调用fork、clone、vfork来实现 的,对于这些系统调用内核都是通过函数do_fork来处理的,它们的不同在 于它们传入的参数clone_flags不一样,它决定了新进程与父进程共享那些资 源。在函数do_fork中,为新进程分配了一个进程描述结构task_struct,并且为新进程分配了两页的栈空间,在栈空间的底部存放着一个thread_info结构, 该结构保存了特定于CPU的一些信息。然后再clone_flags中标志的位共享或是重 新分配一些资源,初始化一些调度相关的信息。最后将新进程插入就绪队列 等到调度。

进程调度:

进程可能处于以下几种状态:运行,等待,睡眠。运行状态即是此刻正在执行;等待状态就是正出于就绪队列中等待调度;睡眠状态不在就绪队列中,在没被唤醒之前不能得到调度。就绪队列是管理等待调度进程的结构。

一个CPU只有一个就绪队列rq,然而这个就绪队列并不直接管理进程,它又包含子就绪队列,例如完全公平就绪队列、实时就绪队列。进程的调度主要基于两个调度器:周期性调度器和主调度器。周期性调度器是在内核频率HZ中断中统计一些进程时间信息,并判断进程是否需要调度,如果需要就发起调度请求;主调度器是进程主动放弃CPU控制权,切换到其他进程运行,在住调度器中做了很多进程上下文切换的工作。

上层调度器并不直接对进程进行操作,而是通过进程所属调度类对进城进行操作。调度类主要有两种:完全公平调度类、实时调度类。内核中用0到139来表示进程优先级,0到99供实时进程使用,100到139供普通进程使用,在用户空间对应-20到19的nice值。完全公平调度类提供类一些方法,这些方法对完全公平队列上的进程进行插入、移除、时间统计等操作。在完全公平队列上进程是按虚拟时间大小通过红黑树排序的,虚拟时间越小的进程排在红黑树越靠左边,得到运行的可能就越大。虚拟时间跟进程权重紧密相关,而权重又跟进程优先级相对应。随着时间的推移,权重越大的进程虚拟时间增加越慢,向右移动的速度就越慢,得到调度的机会就越多,所以优先级越高的进程得到运行的机会就越大。实时进程类与完全公平调度类大体相同,不同的是在实时就绪队列上,有100个链表头,分别挂接100个不同优先级的实时进程。选择下一个进程运行时,从小到大扫描链表找出第一个进程运行。实时进程包含SCHED_RR和SCHED_FIFO,它们在同优先级队列中都是先进先出,不过SCHED_RR有时间片,时间片用完后重新分配时间片将进程放入优先级队列尾,然后就调度其他进程运行。SCHED_FIFO进程一旦调度运行就可以一直运行下去,除非主动放弃CPU控制权。

在SMP多处理器系统中还要实现负载均衡,将忙碌CPU队列上的进程移动到空闲CPU上。 运行新程序:

第 1 页 共 40 页

linux进程管理分析 陈颖

新进程运行之初,它的地址空间与其父进程相同,为运行新的程序它需要调用exec函数将新的可执行程序加载到进程空间,从而运行不同于父进程的程序。

二 进程创建

1 进程管理相关结构

task_struct是一个庞大的结构体,它包含了进程管理的全部信息。这些信息主要包含以下几个方面: ※状态和执行信息,(如带决信号、使用的二进制格式、进程ID、指向父进程以及其他有关 进程的指针、优先级和程序执行有关的时间信息); ※虚拟内存信息;

※用户ID、组ID以及权限;

※进程处理的文件和对应的文件系统信息; ※线程相关的信息; ※进程间通信相关信息; ※进程所用的信号处理程序;

struct task_struct {

volatile long state; 进程状态 void *stack; 指向thread_info结构 atomic_t usage;

unsigned int flags;

unsigned int ptrace; 进程跟踪相关

......

int on_rq; 被插入进程调度队列中时置1

int prio, static_prio, normal_prio; 进程优先级、静态优先级、普通优先级 unsigned int rt_priority; 事实进程优先级

const struct sched_class *sched_class; 指向调度类指针

struct sched_entity se; 每个普通进程或是调度组都抽象成一个调度实体se struct sched_rt_entity rt; 实时进程调度实体

......

unsigned int policy; 调度策略SCHED_NORMAL、SCHED_RR和SCHED_FIFO等 int nr_cpus_allowed;

cpumask_t cpus_allowed;在多处理器上,用于限制进程可以在哪些CPU上运行 ......

struct mm_struct *mm, *active_mm; 进程虚拟存储空间 ......

int exit_state; 进程退出状态

int exit_code, exit_signal; 进程退出时发送的信号 int pdeath_signal; 父进程终止时发送的信号

......

pid_t pid; 进程全局ID(对应的有PID命名空间中的局部ID)

第 2 页 共 40 页

linux进程管理分析 陈颖

pid_t tgid; 线程组ID

......

struct task_struct __rcu *real_parent; 指向真实的父进程(如果父进程终止了,该进程被寄养到其他进程,它的当前父进程由parent指向)

struct task_struct __rcu *parent;进程退出时信号SIGCHLD所发送的进程。 下面几个字段都成了进程的关系图

struct list_head children; 本进程的所有子进程 struct list_head sibling; 兄弟进程

struct task_struct *group_leader; 指向进程组的组长进程

......

这个 task_struct可能是一个普通进程,也可能是个组长进程或是会话首进程。 struct pid_link pids[PIDTYPE_MAX];

struct list_head thread_group;

struct completion *vfork_done; 在有vfork创建进程时该完成量保证了子进程先运行 ......

unsigned long nvcsw, nivcsw; 自愿/非自愿上下文切换计数 struct timespec start_time; 进程创建时间 struct timespec real_start_time; /* boot based time */ ......

const struct cred __rcu *real_cred; 进程权能相关 const struct cred __rcu *cred;

char comm[TASK_COMM_LEN]; 可执行文件名 ......

struct thread_struct thread; 处理器特有数据 struct fs_struct *fs; 文件系统信息

struct files_struct *files; 打开的文件信息 struct nsproxy *nsproxy; 命名空间

struct signal_struct *signal; 进程信号描述符

struct sighand_struct *sighand; 进程信号处理函数

sigset_t blocked, real_blocked; 被阻塞信号的掩码,real_blocked表示临时掩码 sigset_t saved_sigmask; /* restored if set_restore_sigmask() was used */ struct sigpending pending; 存放挂起信号

......

};

无论是进程还是线程它们都有一个task_struct结构和1页或2页的栈空间,在栈空间的底部有一个结构体thread_info,叫做线程描述符,其各成员含义说明如下: struct thread_info {

unsigned long flags;

int preempt_count; 为0的时候内核可执行抢占否则不能 mm_segment_t addr_limit; 指定了进程可以使用的虚拟地址的上限 struct task_struct *task; 指向进程的task_struct结构

第 3 页 共 40 页

本文来源:https://www.bwwdw.com/article/dnjh.html

Top