Linux进程管理与调度

Linux下的进程管理


进程与线程概念

进程:可执行代码、数据、地址空间、信号,打开的文件


进程描述符与task_struct循环队列

描述进程的数据结构task_struct和thread_info

task_struct可以表征一个进程,称其为进程描述符,内核中用它来组成循环队列实现进程的调度与管理


task_struct的分配、存储与查找

task_struct由slab分配,一般通过一个指针来存储task_struct的地址,不同架构的CPU处理方式不同,PPC结构用一个寄存器来存储,X86存储在thread_info结构中,所以task_struct的查找也与体系结构有关


进程状态与状态修改

状态

TASK_RUNNING(正在运行、就绪可以运行)

TASK_INTERRUPTIBLE

TASK_UNINTERRUPTIBLE

TASK_ZOMBLE

TASK_STOPPED

设置状态

set_task_state(task, state)’

进程状态机与状态切换


进程间的关系(进程家族树)

由task_struct维护

task_struct task_struct

{

.......

task_struct *parent;//父进程

list * child_list;//子进程列表

......

}


进程创建与写时拷贝(fork)

进程创建过程

fork()

创建内核栈、thread_info、task_struct,此时这三个数据结构和父进程完全相同

        通过修改task_struct以区分父进程

        设置标志保证子进程处于非运行态

        get_pid()得到有效PID

        与父进程共享剩余时间片

        do_fork()返回子进程的指针

如果do_fork()成功返回,子进程被唤醒执行

进程与子进程的区别(PID/PPID/资源统计量)

写时拷贝fork()

新创建的进程和父进程共享资源,都以只读方式访问,只有在需要写入的时候才会copy,这样会避免资源占用

具体通过clone系统调用实现

Linux线程的实现

线程与进程

Linux的线程进而进程差不多,进程和线程最终创建都是通过clone()系统调用实现的,区别只是创建进程和线程时给clone传递的标志不同

内核线程的创建

进程退出do_exit()

do_exit()完成以下任务

设置task_struct的标志变量为PF_EXTTING

删除del_time/exit_mm/exit_sem、files/fs的引用计数

exit_notify通知父进程同时将自己设置成TASK_ZOMBLE

调用shedule()切换到其他进程执行

do_exit完成后,线程所占用的资源大多被释放,但仍然占有内核栈、thread_info和task_struct


进程描述符task_struct的删除

wait函数

挂起调用wait的进程,知道有一个子进程退出,退出时候返回子进程的PID

release_task函数

进程退出时,保留task_struct的原因:在进程退出后仍然可以让父进程获取他的信息,所以进程的终结是的清理工作和和删除进程描述符分开进行,task_struct删除具体步骤

减少进程用户的的进程数

回收PID

删除进程

在ptrace上删除对该进程的跟踪

删除内核栈和thread_info所占的的页,删除task_struct所占的slab高速缓存


孤儿进程

产生

父进程在子进程结束之前退出,造成子进程的资源没人回收,一直处于TASK_ZOMBLE状态,占用资源

Linux解决措施

为兄弟进程重新寻找父进程,找不到则以init进程昨晚所有兄弟进程的父进程,父进程调用wait函数回收资源,清楚TASK_ZOMNLE进程


Linux进程调度

调度概念

从一组就绪态(TASK_RUNNING)的进程中根据某种算法选择一个,并计算出执行时间让其执行,就是调度程序的任务

抢占式OS与非抢占式OS

抢占式:进程用完时间片之后,让出资源,调度程序调度另一个任务执行,该过程称之为抢占,相当于另一个任务抢占了当前任务的执行,当前多数OS都是抢占式OS

非抢占式:除非进程自己主动让出资源,否则进程将一直执行下去直到结束,造成的影响是一个任务占用资源时间过长,导致其他任务无法执行,最糟糕的情况是一个绝不让步的悬挂进程可能造成整个系统的崩溃

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目录 1 进程的组织 5 1.1 进程相关数据结构 5 1.1.1 进程的基本信息 6 1.1.2 进程状态 10 1.1.3 TASK_RUNNING状态的进程链表 11 1.1.4 进程间关系 12 1.2 Linux的线程——轻量级进程 15 1.3 进程的创建——do_fork()函数详解 19 1.4 执行进程间切换 33 1.4.1 进程切换之前的工作 33 1.4.2 进程切换实务 —— switch_to宏 37 1.4.3 __switch_to函数 39 1.5 fork与vfock系统调用的区别 42 1.6 内核线程 46 1.7 挂起状态进程的组织 49 1.7.1 等待队列头 49 1.7.2 等待队列的操作 50 1.7.3 进程资源限制 55 1.8 系统调用execve() 56 1.8.1 拷贝用户态参数 57 1.8.2 重要的数据结构 61 1.8.3 search_binary_handler函数 66 1.8.4 目标文件的装载和投入运行 69 1.8.5 库函数 92 2 中断控制 94 2.1 中断的分类 94 2.2 中断的硬件环境 95 2.2.1 外部中断请求IRQ 95 2.2.2 中断描述符表 96 2.2.3 中断和异常的硬件处理 97 2.3 中断描述符表 99 2.3.1 中断门、陷阱门及系统门 99 2.3.2 IDT的初步初始化 100 2.4 异常处理 101 2.5 中断处理 106 2.5.1 中断向量 107 2.5.2 IRQ数据结构 108 2.5.3 do_IRQ()函数 113 2.5.4 中断服务例程 115 2.5.5 IRQ线的动态分配 116 2.6 下半部分 117 2.6.1 软中断 118 2.6.2 tasklet 121 2.6.3 工作队列 122 2.7定时器中断 124 2.7.1 时钟与定时器 124 2.7.2 定时器中断相关的数据结构 127 2.7.3 定时器中断的上半部分 129 3 进程调度 138 3.1 进程调度的概念 138 3.2 进程调度的数据结构和优先级 141 3.2.1 进程的优先级 141 3.2.2 数据结构 145 3.3 调度程序所使用的函数 151 3.3.1 scheduler_tick函数 151 3.3.2 try_to_wake_up函数 156 3.3.3 recalc_task_prio函数 160 3.4 schedule()函数 163 3.4.1 直接调用 163 3.4.2 延迟调用 164 3.4.3 进程切换之前所做的工作 168 3.4.4 完成进程切换时所执行的操作 171 3.4.5 进程切换后所执行的操作 173 3.5 多处理器运行队列的平衡 175 3.5.1 调度域 176 3.5.2 rebalance_tick()函数 178 3.5.3 load_balance()函数 180 3.5.4 move_tasks()函数 183 3.6 进程退出 187 3.6.1 进程终止 187 3.6.2 进程删除 189 4 进程的并发性体现 191 4.1 内核抢占 193 4.1.1 内核抢占概念 193 4.1.2 同步技术总揽 196 4.2 每CPU变量 197 4.3 原子操作 199 4.4 优化屏障和内存壁垒 203 4.4.1 优化屏障 204 4.4.2 内存壁垒 204 4.5 自旋锁 206 4.6 读写自旋锁 211 4.6.1 为读获取和释放一个锁 213 4.6.2 为写获取或释放一个锁 214 4.7 顺序锁 215 4.8 RCU机制 217 4.9 信号量 219 4.9.1 获取和释放信号量 221 4.9.2 读/写信号量 224 4.9.3 补充信号量 225 4.10 禁止本地中断 226 4.10.1 禁止本地中断 227 4.10.2 禁止下半部(可延迟函数) 229 4.11 一些避免竞争条件的实例 231 4.11.1 引用计数器 231 4.11.2 大内核锁 231 4.11.3 内存描述符读/写信号量 232 4.11.4 slab高速缓存链表的信号量 233 4.11.5 索引节点的信号量 233 4.12 内核同步与互斥的总结 233

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值