进程调试、进程管理

来源:互联网 发布:淘宝发货物流单号修改 编辑:程序博客网 时间:2024/05/28 17:04
进程调度
(1)进程调度有4 种方法
SCHED_OTHER: 普通分时策略; SCHED_BATCH: 普通批处理策略
SCHED_FIFO: 实时FIFO 策略; CHED_RR: 实时时间片策略;
这些策略都是基于优先级算法的。
Linux 优先级有两种:
   1、nice 值:描述普通进程范围:-20 到+19 nice 值越大,优先级越低; 
   2、实时优先级默认范围:0~99;绝对优先级是从41~139;值越高优先级也越高。绝对优先级是实时优先级加上40。
任何实时进程的优先级都高于普通进程;
优先级有两种指定方法:静态指定,内核动态调整。
普通进程的调度要复杂的多。可分为交互式进程和批处理进程。
   1、交互式:空闲,平时睡眠等待。
   2、批处理:编译程序。
公平调度:
   1、分配时间片,时间片用完,执行下一个进程;
   2、动态调整优先级,使执行的进程优先级降低,给低优先级进程机会。
(1)chrt 命令:可以指定进程的调度方法
  -f 是fifo 策略,-r 是时间片策略; 
  -b (batch) 是批处理或空闲策略;
  -o (other)是普通的分时进程;
  -p 可打印出进程的调度策略及优先级;
  Chrt -r 50 ./chewer & 时间片策略,优先级为50;
  普通进程优先级0~39,实时进程41~139;
进程管理
(1)存放进程的列表:任务队列。
  进程描述符task_stuct: 1.7K 左右,进程除了可执行程序代码外,还包括打开的文件,进程地址空间,进程状态,挂起的信号等信息。
  每个线程都拥有一个独立的程序计数器、进程栈和一组进程寄存器。
  Task_struct 由slab 分配器动态生成,内核常用结构体要维护的都是用slab 分配器。
  进程有五种状态:TASK_RUNNING,TASK_INTERRUPTIBLE,TASK_UNINTERRUPIBLE,TASK_TRACED,TASK_STOPPED
  进程终结:exit(),与进程相关联的所有资源被释放掉,处于EXIT_ZOMBIE状态,它占用的内存就是内核栈,thread_info结构和task_struct 结构。存在的唯一目的就是向父进程提供信息。
   进程上下文:当一个程序执行了系统调用或触发了某个异常,就陷入了内核空间。它“代表进程执行”并处于进程上下文中。内核退出时,程序恢复在用户空间继续执行。当一个进程在执行时,CPU 的所有寄存器中的值、进程的状态以及堆栈中的内容被称为该进程的上下文。
   中断上下文:硬件通过触发信号,导致内核调用中断处理程序,进入内核空间。这个过程中,硬件的一些变量和参数也要传递给内核,内核通过这些参数进行中断处理。所谓的“中断上下文”。

(2)等待队列
 休眠有两种状态:
    TASK_INTERRUPTILBE:接收到信号,会提前唤醒。
    TASK_UNINTERRUPTIBLE:忽略信号,条件满足时才被唤醒。
   休眠通过等待队列进行处理。内核用wake_queue_head_t来表示等待队列。等待队列可通过DECLARE_WAITQUEUE()静态创建,也可init_waitqueue_head()动态创建。
步骤:
    1)调用宏DEFINE_WAIT()创建一个等待队列的项。
    2)调用add_wait_queue()把自己加入到等待队列中。
    3)调用prepare_to_wait()方法将进程状态变为TASK_INTERRUPTILBE 或TASK_UNINTERRUPTIBLE。
    4)进程被唤醒时,检查条件是否为真,是则退出循环;否则再次调用schedule()并重复这步操作。
    5)条件满足后,进程将自己设置为TASK_RUNNING 并调用finish_wait()移出等待队列。
   唤醒:通过wake_up()进行,它会唤醒指定的等待队列上的所有进程。它会调用try_to_wake_up()将进程设置为TASK_RUNNING状态,将此进程放入红黑树中。
0 0
原创粉丝点击