Linux进程管理子系统

《进程要素》

<进程与程序的区别>

程序:

存放在硬盘上一些列代码和数据的可执行映像,是一个静止的实体

进程:

是一个执行中的程序,是动态的实体

 

<进程4要素>

1)有一段程序供其执行,这段程序不一定是某个进程所专有,可以与其他进程所共用。

2)有进程所专用的内核空间堆栈

3)在内核中有task_struct()数据结构,即通常所说的进程控制模块(PCB)。有了这个数据结构,进程才能称为一个基本的单位接收内核的调度。

4)有独立的用户空间

 

有独立的用户空间:改程序就是一个进程

有共享的用户空间:用户线程

没有共享的用户空间:内核线程

 

 

<linux进程状态>

经典的进程状态

就绪:当进程被创建时一定处于就绪态

阻塞:当获取信息量不满足时,就会处于阻塞态

执行:当所有条件满足时就处于执行

 

linux进程状态:

 

TASK_RUNNING:

进程正在被CPU执行,或者已经准备就绪。随时可以执行,当一个进程被创建时,就处于该状态。

 

TASK_INTERRUPTIBLE:

处于等待中的进程,等待条件为真时被唤醒,也可以被信号或中断唤醒

 

TASK_UNINTERRUPTIBLE:

处于等待中的进程,待资源有效时被唤醒,但是不能由其他进程通过信号,或中断唤醒。

 

TASK_KILLABLE:

LINUX 2.6.25 中引入的进程睡眠状态,原理类似于TASK_UNINTERRUPTIBLE,但是可以被致命信号(SIGKILL)唤醒。

 

TASK_TRACED:

正处于被调试状态的进程

 

TASK_DEAD:

进程退出时(调用 do_exit()),所处的状态

 

 

<进程描述结构>

在linux内核代码中,进程和线程都使用结构体数组来表示,task_struct(sched.h),其中含有大量进程和线程的信息,其中比较重要的有:

pid_t pid;进程号

long state;进程状态

int prio;进程优先级

《linux进程调度》

从多个就绪状态的进程,选出一个进程来占有CPU来执行,称为进程调度

<调度策略>

SCHED_NORMAL(SCHED_OTHER):普通分时进程

SCHED_FIFO:先入先出的实时进程

SCHED_RR:时间片轮转的实时进程

SCHED_BATCH:批处理进程

SCHED_IDLE:只在系统空闲时才被调度的进程

 

注意:实时进程优先级最高,若果都是实时进程,则使用FIFO

 

<调度时机>

即shedule()函数什么时候被调用。

主动式:

在内核中直接调用函数schedule(),当进程需要等待资源而暂时停止运行时,会把自己的状体挂起(睡眠),并主动请求调度,并让出CPU.

例:

current -> state = TASK_INTERRUPTTBLE

Schedule()

 

用户态抢占:

发生时间:

1)从系统调用返回用户空间

比如,A进程中使用函数read(),则系统需要从用户态转换到内核态执行read()函数,在执行完read()后,返回用户空间时,这是来了一个B进程,且优先级比A进程高,这是就会把A进程踢开,占用CPU.

2)从用户中断处理程序返回用户空间

原理同上

 

详情:

内核将返回用户空间时,如果need_resched ,标志被设置,导致schedule()被调用,即发生抢占。

3)当一个进程的时间片被用完时,会设置need_resched

4)当一个优先级更高是进程进入可执行状态时,会设置need_resched

 

内核态抢占:


用户态枪战的缺陷:
进程或线程一旦进入内核态,就可以一直执行,知道他主动放弃,或时间片耗尽为止,这会导致紧急的进程线程长时间得不到运行,降低了整个系统的实时性。

 

改进方式:

允许系统在内核态也支持抢占,更高优先级的进程或线程可以抢占正在运行的低优先级的进程或线程。

 

1)中断处理程序完成,返回内核空间之前

2)当内核代码再一次具有可抢占性的时候如解锁或使能软中断

注意:不能抢占的情况

1)内核正在运行中断程序

2)内核正在进行上下文的Bottom half(中断的底半部)处理,硬件中断返回前会执行软中断,此时任处于中断上下文

3)进程正持有spinlock自旋锁,writelock/readlock读写功能锁。当持有这些锁时,不应该被抢占,否则抢占会导致其他进程长时间得不到锁,让进程成处于死锁状态。

4)内核正在执行调度程序scheduler,抢占的原因就是为了进行新的调度,没有理由将调度程序抢占再执行调度程序。

 

注意:

为了保证内核在以上几种状态下不被抢占,抢占式内核使用了一个变量preempt_count,称为内核抢占数。这一个变量被设置在进程的thread_info结构中,每当内核要进入以上几种状态时,变量preemt_count 就会加1,指示内核不允许抢占,每当内核从以上几种状态退出时,变量preempt_count 就会减1,同时进行可抢占的判断和调度。

 

<调度步骤>

清理当前正在运行的进程

选择下一个将要运行的进程(根据调度策略)

设置新进程 的运行环境

进程上下文切换

 

 

 

<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">

 
 
 
 

转载于:https://www.cnblogs.com/big-devil/p/8589890.html

  • 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、付费专栏及课程。

余额充值