进程与程序

1.程序:存放在磁盘上的一系列代码和数据的可执行映像,是一个静止的实体。

2.进程:是一个执行中的程序,它是一个动态的实体。

进程四要素

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

2.有进程专用的内核空间堆栈。

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

4.有独立的用户空间。

如果有独立的用户空间,那么是进程;如果没独立的用户空间,有共享的用户空间,那么是用户线性;如果没有独立的用户空间和共享的用户空间,那么是内核线程。

Linux进程状态

1.TASK_RUNNING

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

2.TASK_INTERRUPTIBLE

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

3.TASK_UNINTERRUPTIBLE

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

4.TASK_KILLABLE

Linux2.6.25新引入的进程睡眠状态,原理与TASK_UNINTERRUPTIBLE类似,但是可以被致命信号(SIGKILL)唤醒。

5.TASK_TRACED

正在被调试状态的进程。

6.TASK_DEAD

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

Linux进程描述

在Linux内核代码中,进程、线程都是使用task_struct(sched.h)结构来表示的,它包含了大量描述进程/线程的信息,其中比较重要的有进程号(pid_t pid)、进程状态(long state)、进程优先级(int prio)。

调度策略:

1.SCHED_NORMAL(SCHED_OTHER):普通的分时进程

2.SCHED_FIFO:先进先出的实时进程

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

4.SCHED_BATCH:批处理进程

5.SCHED_IDLE:只在系统空闲时才能够被调度执行的进程

调度时机

1.主动式调度

在内核中调用schedule()。当进程需要等待资源等原因而暂时停止运行时,会把自己的状态置于挂起(睡眠),并主动请求调度,让出CPU。

示例:

current->state = TASK_INTERRUPTIBLE;

schedule();

2.被动式调度

被动式调度又名抢占式调度。分为用户态抢占(linux2.4以上)和内核态抢占(linux2.6以上)。

用户态抢占

用户抢占发生在:

从系统调用返回用户空间。

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

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

当某个进程耗尽它的时间片时,会设置need_resched标志

当一个优先级更高的进程进入可执行状态的时候,也会设置need_resched标志。

内核态抢占

1.用户态抢占的缺陷

进程/线程一旦运行到内核态,就可以一直执行,直到它主动放弃或时间片耗尽为止。这样会导致一些非常紧急的进程或线程将长时间得不到运行,降低整个系统的实时性。

2.改进方式

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

3.内核抢占可能发生的时机

当中断处理程序完成,返回内核空间前。

当内核代码再一次具有可抢占性的时候,如解锁及使能软中断等。

4.不允许内核抢占的时机

内核正在运行中断程序。

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

进程正持有spinlock自旋锁、writelock/readlock读写锁等,当持有这些锁时,不应被抢占,否则由于抢占可能导致其他进程长期得不到解锁,而让系统处于死锁状态。

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

抢占计数

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

调度步骤

schedule函数工作流程

1.清理当前运行中的进程。

2.选择下一个要运行的进程。

3.设置新进程的运行环境。

4.进程上下文切换。

[国嵌攻略][107][Linux进程管理子系统]的更多相关文章

  1. [国嵌攻略][106][Linux内存管理子系统]

    内存管理子系统 1.虚拟地址与物理地址的映射 2.物理内存的分配 Linux虚拟地址空间分布 设备最后访问的一定是物理地址,但Linux系统中使用的都是虚拟地址.虚拟地址简单的来说就是程序中使用的地址 ...

  2. [国嵌攻略][098][Linux内核简介]

    Linux系统架构 1.用户空间:应用程序.C函数库 2.内核空间:系统调用接口.内核.体系结构相关代码 Linux系统利用处理器不同的工作模式,使用其中的两个级别分别来运行Linux内核与应用程序, ...

  3. [国嵌攻略][119][Linux中断处理程序设计]

    裸机中断: 1.中断统一入口. 2.注册中断处理程序. 3.根据中断源编号,调用中断处理程序. Linux中断 1.在entry-armv.S中的_irq_svc是中断统一入口. 2.获取产生中断源的 ...

  4. [国嵌攻略][070-095][Linux编程函数手册]

    第1类 时间编程类 1.1 获取日历时间 1.1.1 函数名 time 1.1.2 函数原形 time_t time(time_t *t) 1.1.3 函数功能 返回日历时间 1.1.4 所属头文件 ...

  5. [国嵌攻略][072][Linux应用程序地址布局]

    程序构成 代码段.数据段.BSS段(Block Started by Symbol,又叫:未初始化数据段).堆(heap)和栈(stack).这些部分构成了Linux应用程序的重要组成部分. 内存布局 ...

  6. [国嵌攻略][108][Linux内核链表]

    链表简介 链表是一种常见的数据结构,它通过指针将一系列数据节点连接成一条数据链.相对于数组,链表具有更好的动态性,建立链表时无需预先知道数据总量,可以随机分配空间,可以高效地在链表中的任意位置实时插入 ...

  7. [国嵌攻略][104][Linux内核模块设计]

    内核模块示例 #inlcude <linux/init.h> #inlcude <linux/module.h> static int hello_init(){ printk ...

  8. [国嵌攻略][103][Linux内核模块基础]

    什么是内核模块 Linux内核的整体结构非常庞大,其中包含的组件也非常多,如何使用这些组件.一种方式是把所有的组件都编译进内核文件,即zImage或bzImage,但这样会导致一个问题,占用内存过多. ...

  9. [国嵌攻略][099][Linux内核配置与编译]

    为什么要配置内核 基于硬件和软件的需求选出需要的功能,去掉不要的功能. 内核配置的方法 make config:基于文本交互的配置. make menuconfig:基于图形菜单的配置. make m ...

随机推荐

  1. bzoj 1996: [Hnoi2010]chorus 合唱队

    Description Input Output Sample Input 4 1701 1702 1703 1704 Sample Output 8 HINT Source 因为只会在区间的两端进行 ...

  2. PHP-无限级分类(迭代法创建)

    $area = array( array('id'=>1,'name'=>'安徽','parent'=>0), array('id'=>2,'name'=>'海淀','p ...

  3. 与apk签名有关的那些概念与命令

    一.概念篇 1.消息摘要-Message Digest 消息摘要:在消息数据上,执行一个单向的hash函数,生成一个固定长度的hash值,这个Hash值就是消息摘要,也成为数字指纹. 消息摘要特点: ...

  4. Python列表操作

    自带帮助文档: >>> help(list) Help on class list in module builtins: class list(object) | list() - ...

  5. Git详解之四:服务器上的Git

    服务器上的 Git 到目前为止,你应该已经学会了使用 Git 来完成日常工作.然而,如果想与他人合作,还需要一个远程的 Git 仓库.尽管技术上可以从个人的仓库里推送和拉取修改内容,但我们不鼓励这样做 ...

  6. win10使用u盘装回win7

    背景:一朋友要我帮忙把系统从win10装回到win7,因为做IT的嘛,想想也难不倒我,况且以前也经常重装系统,硬盘里就有win7的系统,于是很爽快的答应了.电脑拿过来一试才知道原来有这么多坑,原来的系 ...

  7. 微信小程序开发教程目录

    本系列教程是自己在工作中使用到而记录的,没有顺序之分 如有错误之处,请给与指正,也不希望误导了别人 微信小程序开发教程目录 微信小程序之注册和入门 微信小程序之HTTPS请求 微信小程序开发之选项卡 ...

  8. Tomcat 快速入门

    Tomcat 快速入门 版本说明 本文使用 Tomcat 版本为 Tomcat 8.5.24. Tomcat 8.5 要求 JDK 版本为 1.7 以上. 简介 Tomcat 是什么 Tomcat 是 ...

  9. ZZ_INEERNAL每个栏位的含义

    ZZ_INEERNAL包含10列,每列之间用,隔开 第一列:exception class,有KE/NE/JE/EE等 第二列:pid 第三列:tid 第四列:固定是99 第五列:固定是/data/c ...

  10. 使用Three.js 基本组件以及流程

    1. 创建场景 var scene = new THREE.Scene(); 2. 创建相机,设置可视范围 var camera = new THREE.PerspectiveCamera(45,  ...