Linux 0.11版 进程调度文本解说
0.11核中进程的调度主要由四个部分数组成:调度初始化、调度、睡眠、唤醒。
一、调度初始化:sched_init()
我们知道在内核初始化(main)过程中,要将任务0转换到用户态下执行,也就是建立Linux中的第一个用户程序。既然任务0之前是在内核态下执行的,所以用的是系统的ldt、和tss,要在用户态下执行,就要使用用户态下的ldt、tss,那么,调度初始化的其中一个任务就是建立任务0的ldt和gdt。下面说一下sched_init()的具体工作过程:
1)在gdt中设置ldt、gdt:ldt和gdt的定义在sched.h中。
2)将eflags中的NT置位:记得在前面关于任务切换的说明中,我提到在main的中sched_init()之后,要调用move_to_user_mode()实现核心态到用户态的转换,而在move_to_user_mode()中,最后调用了iret,如果将NT为0,就不会引起进程的切换了。
3)加载tss和ldt:手动加载仅这一次,以后都是通过任务的切换CPU自动加载的。在这里,因为是第一个用户任务,所以需要手动设置。
4)初始化8253定时器。
5)在IDT中设置时钟的中断门和系统调用的中断门。
二、调度:schedule()
这个函数的主要工作就是从所有处在就绪状态的进程中选择下一个要运行的进程。具体工作过程是这样的:它首先检查在处在可中断睡眠状态下的进程是否除了阻塞信号以外别的信号,如果存在,则将它置成就绪状态。然后循环检查任务数组中的所有处在就绪状态的任务,挑选出剩余执行时间值最大的一个任务,利用switch_to()函数切换到该任务。如果发现所有就绪进程的时间片都是0,则根据任务的优先级,重新计算每个任务的时间片,在重新执行循环检查所有就绪任务的执行剩余时间。
其中,这个函数的核心之一就是switch_to()函数,它能实现任务的切换,它的定义在sched.h中,主要原理就是利用如果ljmp的操作数是任务门描述符就会引起任务的切换。
三、睡眠sleep_on()、interruptible_sleep_on()
在接收这个函数的工作原理之前,先了解一个数据结构:等待队列。等待队列其
其实就是一个进程指针链表,所有由于等待同一个资源的睡眠进程组成一个等待队列。这个链表的连接并不是通常意义上
相关文档:
Linux + Apache2.0 + Mysql + PHP + phpBB3.0
1.安包:
Apache2.0
#tar -zxf httpd-***.tar.gz -C /usr/local/src/
#cd /usr/local/src/httpd-***
  ......
VPS使用手记-Linux命令行基础
Written by shine
on 2009, April 21, 4:09 PM. Linux
这里我将列出使用linux
vps
过程中的常用命令,面向的对象是懂一点命令行
的朋友,如果你没有任何命令行基础,建议找本Linux的基础教程来看看。
在讲具体的命令之前,先介绍一下Linux命令行的一些常识:
一条命令一般的格式是这 ......
linux的mount(挂载)命令详解
来源:互联网 作者:佚名 时间:09-08 17:02:27
点评:linux下挂载(mount)光盘镜像文件、移动硬盘、U盘、Windows和NFS网络共享 linux是一个优秀的开放源码的操作系统,可以运行在大到巨型小到掌上型各类计算机系统上,随着 linux系统的日渐成熟和稳定以及它开放源代码特有的优越性,li ......
上午做了axis的部署,看来分布式还真不简单,单是部署就搞的晕头转向。最后得到的解决方案更是匪夷所思。
大家都知道在linux设置环境变量的三种方法。
值得建议的是在 .bashrc,中修尬,因为这样更加的安全!
其中,tomcat,maven,jdk在我设置的时候,都是常规的,唯一,axis的部署有点诡异。不过还是成功了!
现面就是 ......
头文件:
#ifndef _LED_CONFIG_H
#define _LED_CONFIG_H
#define LED_CON 0
#define LED_ON 1
#define LED_OFF 2
#endif
内核下面的驱动模块:
#include <linux/module.h>
#include <linux/init.h>
#include <linux/io.h>
#include <linux/cdev.h>
#include <linux/fs.h>
......