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安装JDK步骤1. 先从网上下载jdk(jdk-1_5_0_02-linux-i586.rpm)
,推荐SUN的官方网站www.sun.com,下载后放在/home目录中,当然其它地方也行。
进入安装目录
#cd /home
#cp
jdk-1_5_0_02-linux-i586.rpm /usr/local
#cd /usr/local
给所有用户添加可执行的
权限
#chmod +x jdk-1_5_0_02-linux-i586.rpm.bin
......
linux网络连接配置通过命令ifconfig来完成,也就是interface configuration。
!!友情提醒:下面用的命令有些需要root权限
查看网络连接
ifconfig
eth0 Link encap:以太网 硬件地址 00:e0:61:02:af:ba
&n ......
2007 年 4 月 17 日
Linux® 系统调用 ——
我们每天都在使用它们。不过您清楚系统调用是如何在用户空间和内核之间执行的吗?本文将探究 Linux
系统调用接口(SCI),学习如何添加新的系统调用(以及实现这种功能的其他方法),并介绍与 SCI 有关的一些工具。
系统调用
就是用户空间 ......
VPS使用手记-Linux命令行基础
Written by shine
on 2009, April 21, 4:09 PM. Linux
这里我将列出使用linux
vps
过程中的常用命令,面向的对象是懂一点命令行
的朋友,如果你没有任何命令行基础,建议找本Linux的基础教程来看看。
在讲具体的命令之前,先介绍一下Linux命令行的一些常识:
一条命令一般的格式是这 ......
头文件:
#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>
......