1、为了对进程从产生到消亡的整个过程进行跟踪和描述,就需要定义各种进程的各种状态并制定相应的状态转换策略,以此来控制进程的运行。
      不同的操作系统对进程的状态解释不同,但是最基本的状态都是一样的。包括以下三种:
       运行态:进程占用CPU,并在CPU上运行;
       就绪态:进程已经具备运行条件,但是CPU还没有分配过来;
       阻塞态:进程因等待某件事发生而暂时不能运行;
     进程在一生中,都处于上述3中状态之一。
       下面是3种状态转换图
              
        当然理论上上述三种状态之间转换分为六种情况;
        运行---》就绪:这是有调度引起的,主要是进程占用CPU的时间过长
        就绪---》运行:运行的进程的时间片用完,调度就转到就绪队列中选择合适的进程分配CPU
       运行---》阻塞:发生了I/O请求或等待某件事的发生
       阻塞---》就绪:进程所等待的事件发生,就进入就绪队列
       以上4种情况可以相互正常转换,不是还有两种情况吗?
         阻塞--》运行:即使给阻塞进程分配CPU,也无法执行,操作系统載进行调度时不会載阻塞队列进行挑选,其调度的选择对象为就绪队列:
        就绪--》阻塞:因为就绪态根本就没有执行,何来进入阻塞态?

2、现在知道了进程的三种基本状态,但是載操作系统具体现实中,设计者可以根据实际情况设置不同的状态,这样以来,就出现了以下几种状态:
      可运行态:他是运行态和就绪态的合并,表示进程正在运行或准备运行,Linux 中使用TASK_RUNNING 宏表示此状态。
       浅度睡眠态:进程正在睡眠(被阻塞),等待资源到来是唤醒,也可以通过其他进程信号或时钟中断唤醒,进入运行队列。Linux 使用TASK_INTERRUPTIBLE 宏表示此状态。
       深度睡眠态:其和浅度睡眠基本类似,但有一点就是不可其他进程信号或时钟中断唤醒。Linux 使用TASK_UNINTERRUPTIBLE 宏表示此状态。
       暂停状态:进程暂停执行接受某种处理。如正在接受调试的进程处于这种状态,Linux 使用TASK_STOPPED 宏表示此状态。
       僵死状态:进程已经结束但未释放PCB,Linux 使用TASK_ZOMBIE 宏表示此状态。
我们可以来看下以上宏在内核中的定义:
        #define TASK_RUNNING            0
 183 #define TASK_INTERRUPTIBLE      1
 184 #define TASK_UNINTERRUPTIBLE    2
 185 #define __TASK_STOPPED          4
 186 #define __TASK_TRACED           8
 187 /* in tsk->exit_state */进程的退出状态
 188 #define EXIT_ZOMBIE             16
 189 #define EXIT_DEAD               32
 190 /* in tsk->state again */我理解为进程的唤醒状态
 191 #define TASK_DEAD               64
 192 #define TASK_WAKEKILL           128
 193 #define TASK_WAKING             256
 194 #define TASK_STATE_MAX          512
 195 
 196 #define TASK_STATE_TO_CHAR_STR "RSDTtZXxKW"

以下是LINUX进程间状态转换和内核调用图解

3、进程调度触发的时机
调度的触发主要有如下几种情况:
1、当前进程(正在CPU上运行的进程)状态变为非可执行状态。
进程执行系统调用主动变为非可执行状态。比如执行nanosleep进入睡眠、执行exit退出、等等;
进程请求的资源得不到满足而被迫进入睡眠状态。比如执行read系统调用时,磁盘高速缓存里没有所需要的数据,从而睡眠等待磁盘IO;
进程响应信号而变为非可执行状态。比如响应SIGSTOP进入暂停状态、响应SIGKILL退出、等等;

2、抢占。进程运行时,非预期地被剥夺CPU的使用权。这又分两种情况:进程用完了时间片、或出现了优先级更高的进程。
优先级更高的进程受正在CPU上运行的进程的影响而被唤醒。如发送信号主动唤醒,或因为释放互斥对象(如释放锁)而被唤醒;
内核在响应时钟中断的过程中,发现当前进程的时间片用完;
内核在响应中断的过程中,发现优先级更高的进程所等待的外部资源的变为可用,从而将其唤醒。比如CPU收到网卡中断,内核处理该中断,发现某个 socket可读,于是唤醒正在等待读这个socket的进程;再比如内核在处理时钟中断的过程中,触发了定时器,从而唤醒对应的正在nanosleep 系统调用中睡眠的进程;

4、进程调度算法

1.时间片轮转调度算法

 

时间片(Time Slice) 就是分配给进程运行的一段时间。

在分时系统中,为了保证人机交互的及时性,系统使每个进程依次地按时间片轮流的方 式执行,此时即应采用时间片轮转法进行调度。在通常的轮转法中,系统将所有的可运行(即 就绪)进程按先来先服务的原则,排成一个队列,每次调度时把CPU 分配给队首进程,并令 其执行一个时间片。时间片的大小从几ms 到几百ms 不等。当执行的时间片用完时,系统发 出信号,通知调度程序,调度程序便据此信号来停止该进程的执行,并将它送到运行队列的 末尾,等待下一次执行。然后,把处理机分配给就绪队列中新的队首进程,同时也让它执行 一个时间片。这样就可以保证运行队列中的所有进程,在一个给定的时间(人所能接受的等 待时间)内,均能获得一时间片的处理机执行时间。

 

2.优先权调度算法

 

为了照顾到紧迫型进程在进入系统后便能获得优先处理,引入了最高优先权调度算法。 当将该算法用于进程调度时,系统将把处理机分配给运行队列中优先权最高的进程,这时, 又可进一步把该算法分成两种方式。

 

(1)非抢占式优先权算法(又称不可剥夺调度, Nonpreemptive Scheduling )

在这种方式下,系统一旦将处理机(CPU)分配给运行队列中优先权最高的进程后,该 进程便一直执行下去,直至完成;或因发生某事件使该进程放弃处理机时,系统方可将处理 机分配给另一个优先权高的进程。这种调度算法主要用于批处理系统中,也可用于某些对实 时性要求不严的实时系统中。

 

(2)抢占式优先权调度算法(又称可剥夺调度, Preemptive Scheduling )

该算法的本质就是系统中当前运行的进程永远是可运行进程中优先权最高的那个。 在这种方式下,系统同样是把处理机分配给优先权(weight,goodness()函数求出 ) 最高的进程,使之执行。但是只要一 出现了另一个优先权更高的进程时,调度程序就暂停原最高优先权进程的执行,而将处理机 分配给新出现的优先权最高的进程,即剥夺当前进程的运行。因此,在采用这种调度算法时, 每当出现一新的可运行进程,就将它和当前运行进程进行优先权比较,如果高于当前进程, 将触发进程调度。 这种方式的优先权调度算法,能更好的满足紧迫进程的要求,故而常用于要求比较严格 的实时系统中,以及对性能要求较高的批处理和分时系统中。 Linux 也采用这种调度算法 。

 

3.多级反馈队列调度

 

这是时下最时髦的一种调度算法。其本质是:综合了时间片轮转调度和抢占式优先权调 度的优点,即:优先权高的进程先运行给定的时间片,相同优先权的进程轮流运行给定的时 间片。

 
4.实时调度 
 

最后我们来看一下实时系统中的调度。什么叫实时系统,就是系统对外部事件有求必应、 尽快响应。在实时系统中存在有若干个实时进程或任务,它们用来反应或控制某个(些)外 部事件,往往带有某种程度的紧迫性,因而对实时系统中的进程调度有某些特殊要求。 在实时系统中,广泛采用抢占调度方式,特别是对于那些要求严格的实时系统。因为这 种调度方式既具有较大的灵活性,又能获得很小的调度延迟;但是这种调度方式也比较复杂。

linux 系统进程理解的更多相关文章

  1. linux系统进程的查看与控制

    原文:linux系统进程的查看与控制 一.什么是进程? 进程就是系统未完成并且正在进行的工作. 二.查看系统进程 1.图形方式查看 gnome-system-monitor 2.进程查看命令 ps - ...

  2. Linux系统进程管理

    Linux系统进程管理 什么是进程 进程是已启动的可执行程序的运行实例,进程有以下组成部分: 分配内存, 已分配内存的地址空间 安全属性, 进程的运行身份和权限 进程代码, 运行一个或多个的线程 进程 ...

  3. [转帖]Linux系统进程的知识总结,进程与线程之间的纠葛...

    Linux系统进程的知识总结,进程与线程之间的纠葛... https://cloud.tencent.com/developer/article/1500509 当一个程序开始执行后,在开始执行到执行 ...

  4. [Linux]系统调用理解(3)

    本文介绍了Linux下的进程的一些概念,并着重讲解了与Linux进程管理相关的重要系统调用wait,waitpid和exec函数族,辅助一些例程说明了它们的特点和使用方法. 1.7 背景 在前面的文章 ...

  5. [Linux]系统调用理解(2)

    本文介绍了Linux下的进程概念,并着重讲解了与Linux进程管理相关的4个重要系统调用getpid,fork,exit和_exit,辅助一些例程说明了它们的特点和使用方法. 关于进程的一些必要知识 ...

  6. 轻松学习Linux之理解Shell的硬链接与软连接

     大家在学习linux的过程中常常遇到一些模糊且容易混淆的概念比如什么是硬链接和软链接,他们有什么区别?  软连接有点象windows中的快捷方式,连接和目标文件具有相同的节点,而硬连接就好象重新复制 ...

  7. 【Linux】理解setuid()、setgid()和sticky位

    详见: http://blog.csdn.net/m13666368773/article/details/7615125 Linux SETUID机制 (1)进程运行时能够访问哪些资源或文件,不取决 ...

  8. (转)linux service理解

    能够使用service命令进行操作的,就是已经注册成为linux的系统服务了.window中也可以注册成为系统服务的办法. service命令用的次数真不少,就是比较多的关联点,用了很多次了,还是有些 ...

  9. Linux命令 理解

    RPM常用命令参数列表 1.安装一个包 # rpm -ivh 2.升级一个包 # rpm -Uvh  [注意U一定要大写] -i   安装 -U  升线安装 -h  以#显示安装进度 -v  显示附加 ...

随机推荐

  1. PHP7 网络编程(四)signal信号【待】

    https://blog.csdn.net/summy_j/article/details/73199069

  2. 转 -- Vim 常用快捷键

    ``` 全选(高亮显示):按esc后,然后ggvG或者ggVG 全部复制:按esc后,然后ggyG 全部删除:按esc后,然后dG 解析: gg:是让光标移到首行,在vim才有效,vi中无效 v :  ...

  3. sql注入问题-视图-事物-以及存储过程(可视化工具)

    可视化工具(了解) 可视化工具 workbench 视图 视图 是一张虚拟的表 语法: create view 视图表名 as select * from t1; 作用: .他是执行as 后面的sql ...

  4. Elasticsearch入门之从零开始安装ik分词器

    起因 需要在ES中使用聚合进行统计分析,但是聚合字段值为中文,ES的默认分词器对于中文支持非常不友好:会把完整的中文词语拆分为一系列独立的汉字进行聚合,显然这并不是我的初衷.我们来看个实例: POST ...

  5. 十二、文件和目录——Linux文件系统结构

    12.1 Linux文件系统结构 12.1.1 文件操作基本元素 文件操作相关的最基本元素是:目录结构,索引节点和文件的数据本身 目录结构(目录项) 索引节点(i 节点) 文件的数据 12.1.2 文 ...

  6. CSRF与SSRF区别

    CSRF 攻击者盗用了你的身份,以你的名义发送恶意请求.CSRF能够做的事情包括:以你的名义发送邮件,发消息,盗用你的账号,甚至于购买商品,虚拟货币转账... 发生条件: 1.登录受信任网站A,并在本 ...

  7. luogu 2569 股票交易 单调队列dp

    注意转移方程 分1.凭空买 2.不买不卖 3.在原来基础上买 4.在原来基础上卖 四种情况 head=1,tail=0;再判断一下head<=tail也可以 #include<bits/s ...

  8. springboot12-zuul

    Zuul 相当于是设备和 Netflix 流应用的 Web 网站后端所有请求的前门,提供动态路由,监控,弹性,安全等的边缘服务 所有请求都经过网关(API Gateway)zuul,然后转发到各个子服 ...

  9. javascript文档

    DOM Document <html> Document 对象 每个载入浏览器的 HTML 文档都会成为 Document 对象. Document 对象使我们可以从脚本中对 HTML 页 ...

  10. sqlserver字符串分割

    create function sp_split( @c nvarchar(4000), @splitchar nvarchar(1) ) returns @table table (word nva ...