linux进程调度

转载 2016年09月10日 18:42:07

进程从非TASK_RUNNING状态变为TASK_RUNNING状态,是由别的进程(也可能是中断处理程序)执行唤醒操作来实现的。执行唤醒的进程设置被唤醒进程的状态为TASK_RUNNING,然后将其task_struct结构加入到某个CPU的可执行队列中。于是被唤醒的进程将有机会被调度执行。

   而进程从TASK_RUNNING状态变为非TASK_RUNNING状态,则有两种途径:

  1、响应信号而进入TASK_STOPED状态、或TASK_DEAD状态;
  2、执行系统调用主动进入TASK_INTERRUPTIBLE状态(如nanosleep系统调用)、或TASK_DEAD状态(如exit系统调用);或由于执行系统调用需要的资源得不到满足,而进入TASK_INTERRUPTIBLE状态或TASK_UNINTERRUPTIBLE状态(如select系统调用)。
  显然,这两种情况都只能发生在进程正在CPU上执行的情况下。


僵死状态(TASK_DEAD)状态:进程在退出的过程中,处于TASK_DEAD状态。

在这个退出过程中,进程占有的所有资源将被回收,除了task_struct结构(以及少数资源)以外。于是进程就只剩下task_struct这么个空壳,故称为僵尸。
之所以保留task_struct,是因为task_struct里面保存了进程的退出码、以及一些统计信息。而其父进程很可能会关心这些信息。父进程可以通过wait系列的系统调用(如wait4、waitid)来等待某个或某些子进程的退出,并获取它的退出信息。然后wait系列的系统调用会顺便将子进程的尸体(task_struct)也释放掉。
子进程在退出的过程中,内核会给其父进程发送一个信号,通知父进程来“收尸”。这个信号默认是SIGCHLD,但是在通过clone系统调用创建子进程时,可以设置这个信号


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

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

Linux内核之进程调度

一些概念  调度程序负责决定哪个进程投入运行,何时运行及运行多长时间。进程调度程序就是在可运行态进程之间分配有限的处理器时间资源的内核子系统。 多任务系统可分为两类:非抢占式多任务和抢占式多任务。L...
  • lyc_stronger
  • lyc_stronger
  • 2016年07月25日 16:30
  • 1351

Linux 进程调度浅析

概述 操作系统要实现多进程,进程调度必不可少。有人说,进程调度是操作系统中最为重要的一个部分。我觉得这种说法说得太绝对了一点,就像很多人动辄就说“某某函数比某某函数效率高XX倍”一样,脱离了实际环境,...
  • tennysonsky
  • tennysonsky
  • 2015年04月09日 20:30
  • 2726

linux 常见进程状态的调度及算法

一、进程的状态: 1、操作系统中: 进程是一个动态的实体,所以他是有生命的。从创建到消亡,是一个进程的整个生命周期。在这个周期中,进程可能会经历各种不同的状态。一般来说,所有进程都要经历以下的3个状态...
  • magoyang
  • magoyang
  • 2016年06月10日 09:55
  • 3015

进程线程调度

本文讲述的是linux和windows中的线程-进程调度基本原理。
  • gaoyazhao
  • gaoyazhao
  • 2016年06月15日 16:16
  • 2647

Linux进程调度机制(1)

进程调度负责决定哪个进程投入运行,何时运行以及运行多长时间。  进程调度:非抢占式和抢占式   Linux这么酷的系统当然是抢占式的喽。  进程在被抢占之前可以运行的时间是预先设定好的,叫做时间片。...
  • kzq_qmi
  • kzq_qmi
  • 2015年08月03日 17:08
  • 994

Linux进程调度器的设计--Linux进程的管理与调度(十七)

日期 内核版本 架构 作者 GitHub CSDN 2016-06-14 Linux-4.6 X86 & arm gatieme LinuxDeviceDrive...
  • gatieme
  • gatieme
  • 2016年06月17日 21:22
  • 11176

linux 进程调度类型 总结

进程按照调度类型可以分为: SCHED_FIFO:先进先出的实时进程,如果没有其它更高优先级的可运行实时进程,就可以一直使用cpu运行。对于这种进程,时间片长度是没有意义的。 SC...
  • chen1540524015
  • chen1540524015
  • 2017年06月25日 17:59
  • 257

Linux进程管理与调度-之-目录导航

日期 内核版本 架构 作者 GitHub CSDN 2016-05-19 Linux-4.5 X86 & arm gatieme LinuxDeviceDrive...
  • gatieme
  • gatieme
  • 2016年05月19日 19:57
  • 6349

Linux进程调度策略的发展和演变--Linux进程的管理与调度(十六)

日期 内核版本 架构 作者 GitHub CSDN 2016-06-14 Linux-4.6 X86 & arm gatieme LinuxDeviceDrive...
  • gatieme
  • gatieme
  • 2016年06月17日 16:45
  • 8967

Linux进程调度分析

Linux进程调度分析
  • Li_Ning_
  • Li_Ning_
  • 2016年06月12日 15:50
  • 1441
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux进程调度
举报原因:
原因补充:

(最多只允许输入30个字)