sched.c ( File view )

  • By 2010-08-31
  • View(s):24
  • Download(s):2
  • Point(s): 1
			/*
 * linux/kernel/sched.c
 *
 * (C) 1991 Linus Torvalds
 */

/*
 * 'sched.c' is the main kernel file. It contains scheduling primitives
 * (sleep_on, wakeup, schedule etc) as well as a number of simple system
 * call functions (type getpid(), which just extracts a field from
 * current-task
 */
/*
 * 'sched.c'ҪںļайصȵĻ(sleep_onwakeupschedule )Լ
 * һЩ򵥵ϵͳúgetpid()ӵǰлȡһֶΣ
 */
#include 	// ȳͷļṹtask_struct1 ʼ
// ݡһЩԺʽйúͻȡ
// Ƕʽຯ
#include 	// ںͷļһЩں˳úԭζ塣
#include 		// ϵͳͷļ72 ϵͳC ,'sys_'ͷ
#include 	// ͷļ̿һЩ塣
#include 		// ϵͳͷļû޸/жŵȵǶʽꡣ
#include 		// io ͷļӲ˿/䡣
#include 	// βͷļйضμĴǶʽຯ

#include 		// źͷļźŷųsigaction ṹԭ͡

#define _S(nr) (1<<((nr)-1))	// ȡźnr źλͼжӦλĶֵźű1-32
// ź5 λͼֵ = 1<<(5-1) = 16 = 00010000b
#define _BLOCKABLE (~(_S(SIGKILL) | _S(SIGSTOP)))	// SIGKILL SIGSTOP ź
// (10111111111011111111b)

// ʾnr Ľ̺š״̬ں˶ջֽԼ
void
show_task (int nr, struct task_struct *p)
{

  int i, j = 4096 - sizeof (struct task_struct);

  printk ("%d: pid=%d, state=%d, ", nr, p->pid, p->state);
  i = 0;
  while (i < j && !((char *) (p + 1))[i])	// ָݽṹԺ0 ֽ
    i++;
  printk ("%d (of %d) chars free in kernel stack\n\r", i, j);

}

// ʾš̺š״̬ں˶ջֽԼ
void
show_stat (void)
{

  int i;

  for (i = 0; i < NR_TASKS; i++)	// NR_TASKS ϵͳɵ̣64 
    if (task[i])		// include/kernel/sched.h 4 С
      show_task (i, task[i]);

}

// ÿʱƬĵδ?
#define LATCH (1193180/HZ)

extern void mem_use (void);	// [??]ûκεطøú

extern int timer_interrupt (void);	// ʱжϴ(kernel/system_call.s,176)
extern int system_call (void);	// ϵͳжϴ(kernel/system_call.s,80)

union task_union
{
				// (ṹԱstack ַԱ)
  struct task_struct task;	// ΪһݽṹջͬһڴҳУ
  char stack[PAGE_SIZE];	// ӶջμĴss Իݶѡ

};

static union task_union init_task = {
 INIT_TASK, 
};	// ʼ(sched.h )

long volatile jiffies = 0;	// ӿʼĵδʱֵ10ms/δ𣩡
// ǰ޶volatileӢĽױ䡢ȶ˼Ҫgcc ҪԸñŻ
// ҲҪŲλãΪҲij޸ֵ
long startup_time = 0;		// ʱ䡣1970:0:0:0 ʼʱ
struct task_struct *current = &(init_task.task);	// ǰָ루ʼΪʼ񣩡
struct task_struct *last_task_used_math = NULL;	// ʹùЭָ롣

struct task_struct *task[NR_TASKS] = {
 &(init_task.task), 
};	// ָ顣

long user_stack[PAGE_SIZE >> 2];	// ϵͳջָ룬4Kָָһ

// ýṹöջss:espݶѡָ룩head.s23 С
struct
{

  long *a;
  short b;

}
stack_start =
{

&user_stack[PAGE_SIZE >> 2], 0x10
};

/*
 * 'math_state_restore()' saves the current math information in the
 * old math state array, and gets the new ones from the current task
 */
/*
 * ǰЭݱ浽Э״̬УǰЭ
 * ݼؽЭ
 */
// 񱻵ȽԺ󣬸úԱԭЭ״̬ģָµȽ
// ǰЭִ״̬
void
math_state_restore ()
{

  if (last_task_used_math == current)	// û򷵻(һǵǰ)
    return;			// ָ"һ"Ǹձȥ
  __asm__ ("fwait");		// ڷЭ֮ǰҪȷWAIT ָ
  if (last_task_used_math)
    {
				// ϸʹЭ򱣴״̬
      __asm__ ("fnsave %0"::"m" (last_task_used_math->tss.i387));
    
}
  last_task_used_math = current;	// ڣlast_task_used_math ָǰ
  // Աǰ񱻽ȥʱʹá
  if (current->used_math)
    {
				// ǰùЭָ״̬
      __asm__ ("frstor %0"::"m" (current->tss.i387));
    
}
  else
    {
				// Ļ˵ǵһʹã
      __asm__ ("fninit"::);	// ǾЭʼ
      current->used_math = 1;	// ʹЭ־
    
}

}

/*
 * 'schedule()' is the scheduler function. This is GOOD CODE! There
 * probably won't be any reason to change this, as it should work well
 * in all circumstances (ie gives IO-bound processes good response etc).
 * The one thing you might take a look at is the signal-handler code here.
 *
 * NOTE!! Task 0 is the 'idle' task, which gets called when no other
 * tasks can run. It can not be killed, and it cannot sleep. The 'state'
 * information in task[0] is never used.
 */
/*
 * 'schedule()'ǵȺǸܺõĴ룡ûκɶ޸ģΪе
 * ¹ܹIO-߽紦ܺõӦȣֻһֵ⣬Ǿź
 * 롣
 * ע⣡0 Ǹ('idle')ֻеûʱŵܱɱ
 * Ҳ˯ߡ0 е״̬Ϣ'state'Ǵõġ
 */
void
schedule (void)
{

  int i, next, c;
  struct task_struct **p;	// ṹָָ롣

  /* check alarm, wake up any interruptible tasks that have got a signal */
  /* alarm̵ıʱֵκѵõźŵĿж */

  // һʼalarm
  for (p = &LAST_TASK; p > &FIRST_TASK; --p)
    if (*p)
      {

	// alarm ʱѾ(alarmalarm && (*p)->alarm < jiffies)
	  {

	    (*p)->signal |= (1 << (SIGALRM - 1));
	    (*p)->alarm = 0;
	  
}
	// źλͼгź⻹źţڿж״̬Ϊ״̬
	// '~(_BLOCKABLE & (*p)->blocked)'ںԱźţSIGKILL SIGSTOP ܱ
	if (((*p)->signal & ~(_BLOCKABLE & (*p)->blocked)) &&
	    (*p)->state == TASK_INTERRUPTIBLE)
	  (*p)->state = TASK_RUNNING;	//ΪִУ״̬
      
}

  /* this is the scheduler proper: */
  /* ǵȳҪ */

  while (1)
    {

      c = -1;
      next = 0;
      i = NR_TASKS;
      p = &task[NR_TASKS];
      // δҲǴһʼѭۡȽÿ
      // ״̬counterʱĵݼδֵһֵʱ仹next 
      // ָĸš
      while (--i)
	{

	  if (!*--p)
	    continue;
	  if ((*p)->state == TASK_RUNNING && (*p)->counter > c)
	    c = (*p)->counter, next = i;
	
}
      // Ƚϵócounter ֵ0 Ľ˳124 пʼѭִл141 У
      if (c)
	break;
      // ͸ÿȨֵÿһcounter ֵȻص125 ±Ƚϡ
      // counter ֵļ㷽ʽΪcounter = counter /2 + priority[ұcounter=0??]
      for (p = &LAST_TASK; p > &FIRST_TASK; --p)
	if (*p)
	  (*p)->counter = ((*p)->counter >> 1) + (*p)->priority;
    
}
  switch_to (next);		// лΪnext 񣬲֮

}

//// pause()ϵͳáתǰ״̬Ϊжϵĵȴ״̬µȡ
// ϵͳý½̽˯״ֱ̬յһźšźֹ̻ʹ̵
// һźŲֻеһźţźŲأpause()Ż᷵ء
// ʱpause()ֵӦ-1errno ΪEINTRﻹûȫʵֱ֣0.95 棩
int
sys_pause (void)
{

  current->state = TASK_INTERRUPTIBLE;
  schedule ();
  return 0;

}

// ѵǰΪжϵĵȴ״̬˯߶ͷָָǰ
// ֻȷػʱŻ᷵ءúṩ˽жϴ֮ͬơ
// *p ǷõȴĶͷָ롣μб˵
void
sleep_on (struct task_struct **p)
{

  struct task_struct *tmp;

  // ָЧ˳ָָĶNULLָ뱾Ϊ0)
  if (!p)
    return;
  if (current == &(init_task.task))	// ǰ0(impossible!)
    panic ("task[0] trying to sleep");
  tmp = *p;			// tmp ָѾڵȴϵ(еĻ)
  *p = current;			// ˯߶ͷĵȴָָǰ
  current->state = TASK_UNINTERRUPTIBLE;	// ǰΪжϵĵȴ״̬
  schedule ();			// µȡ
  // ֻеȴ񱻻ʱȳַصʾѱȷػѡ
  // ȻҶڵȴͬԴôԴʱбҪеȴԴĽ̡ú
  // Ƕ׵ãҲǶ׻еȴԴĽ̡ȻϵͳЩ̵µ
  // ӦĸʹԴҲЩ̾ϸڡ
  if (tmp)			// ڵȴҲΪ״̬ѣ
    tmp->state = 0;

}

// ǰΪжϵĵȴ״̬*p ָĵȴСμбsleep_on()˵
void
interruptible_sleep_on (struct task_struct **p)
{

  struct task_struct *tmp;

  if (!p)
    return;
  if (current == &(init_task.task))
    panic ("task[0] trying to sleep");
  tmp = *p;
  *p = current;
repeat:current->state = TASK_INTERRUPTIBLE;
  schedule ();
  // ȴлеȴ񣬲Ҷͷָָǵǰʱ򽫸õȴΪ
  // еľ״ִ̬еȳ򡣵ָ*p ָIJǵǰʱʾڵǰ񱻷
  // кµ񱻲ȴУˣȻǿжϵģӦִ
  // ĵȴ
  if (*p && *p != current)
    {

      (**p).state = 0;
      goto repeat;
    
}
  // һӦ*p = tmpöͷָָȴ񣬷ڵǰ֮ǰ
  // ȴеĨˡμͼ4.3
  *p = NULL;
  if (tmp)
    tmp->state = 0;

}

// ָ*p
void
wake_up (struct task_struct **p)
{

  if (p && *p)
    {

      (**p).state = 0;		// ΪУ״̬
      *p = NULL;
    
}

}

/*
 * OK, here are
...
...
(Not finished, please download and read the complete file)
			
...
Expand> <Close

Want complete source code? Download it here

Point(s): 1

Download
0 lines left, continue to read
Sponsored links

File list

Tips: You can preview the content of files by clicking file names^_^
Name Size Date
linux0.00 B0% 04-10-07
<boot>0.00 B04-10-07 15:01
bootsect.s12.49 kB08-01-04 21:38
head.s13.22 kB08-01-04 21:38
setup.s12.42 kB08-01-04 21:38
<fs>0.00 B04-10-07 15:01
bitmap.c8.46 kB02-09-04 13:12
block_dev.c3.95 kB02-09-04 13:12
buffer.c17.71 kB02-09-04 13:12
char_dev.c4.09 kB02-09-04 13:12
exec.c18.90 kB02-09-04 13:12
fcntl.c3.33 kB02-09-04 13:12
file_dev.c4.82 kB02-09-04 13:12
file_table.c209.00 B02-09-04 13:12
inode.c14.92 kB02-09-04 13:12
ioctl.c1.94 kB02-09-04 13:12
Makefile6.80 kB08-01-04 21:45
namei.c37.20 kB02-09-04 13:12
open.c10.00 kB02-09-04 13:12
pipe.c5.42 kB02-09-04 13:12
read_write.c5.86 kB02-09-04 13:12
stat.c2.69 kB02-09-04 13:12
super.c13.57 kB02-09-04 13:12
truncate.c2.46 kB02-09-04 13:12
<include>0.00 B04-10-07 15:01
a.out.h8.22 kB02-09-04 13:14
<asm>0.00 B04-10-07 15:01
io.h772.00 B02-09-04 13:14
memory.h1.03 kB08-01-04 22:13
segment.h2.50 kB02-09-04 13:14
system.h4.08 kB02-09-04 13:14
const.h589.00 B02-09-04 13:14
ctype.h1.68 kB02-09-04 13:14
errno.h2.30 kB02-09-04 13:14
fcntl.h3.30 kB02-09-04 13:14
<linux>0.00 B04-10-07 15:01
config.h2.16 kB02-09-04 13:14
fs.h9.72 kB02-09-04 13:14
hdreg.h2.94 kB02-09-04 13:14
head.h760.00 B02-09-04 13:14
kernel.h1.44 kB02-09-04 13:14
mm.h473.00 B02-09-04 13:14
sched.h13.25 kB02-09-04 13:14
sys.h5.41 kB02-09-04 13:14
tty.h3.93 kB02-09-04 13:14
signal.h4.01 kB02-09-04 13:14
stdarg.h1.77 kB02-09-04 13:14
stddef.h378.00 B02-09-04 13:14
string.h21.75 kB02-09-04 13:14
<sys>0.00 B04-10-07 15:01
stat.h2.37 kB02-09-04 13:14
times.h377.00 B02-09-04 13:14
types.h1.10 kB02-09-04 13:14
utsname.h423.00 B02-09-04 13:14
wait.h1.48 kB02-09-04 13:14
termios.h13.58 kB02-09-04 13:14
time.h1.81 kB02-09-04 13:14
unistd.h9.21 kB02-09-04 13:14
utime.h392.00 B02-09-04 13:14
<init>0.00 B04-10-07 15:01
main.c12.52 kB02-09-04 13:12
<kernel>0.00 B04-10-07 15:01
asm.s5.10 kB08-01-04 22:48
<blk_drv>0.00 B04-10-07 15:01
blk.h5.69 kB02-09-04 13:14
floppy.c23.49 kB02-09-04 13:12
hd.c17.14 kB02-09-04 13:12
ll_rw_blk.c7.59 kB02-09-04 13:12
Makefile4.25 kB08-01-04 22:53
ramdisk.c6.13 kB02-09-04 13:12
<chr_drv>0.00 B04-10-07 15:01
console.c30.91 kB02-09-04 13:12
keyboard.S21.04 kB08-01-04 22:59
Makefile4.81 kB08-01-04 22:59
rs_io.s5.75 kB08-01-04 22:59
serial.c2.91 kB02-09-04 13:12
tty_io.c18.40 kB02-09-04 13:12
tty_ioctl.c10.70 kB02-09-04 13:12
exit.c8.08 kB02-09-04 13:12
fork.c6.78 kB15-07-07 22:10
<math>0.00 B04-10-07 15:01
Makefile3.21 kB08-01-04 23:01
math_emulate.c2.08 kB02-09-04 13:12
mktime.c2.72 kB02-09-04 13:12
panic.c952.00 B02-09-04 13:12
printk.c1.75 kB02-09-04 13:12
sched.c18.57 kB16-07-07 21:23
signal.c5.61 kB02-09-04 13:12
sys.c7.62 kB02-09-04 13:12
system_call.s12.53 kB08-01-04 22:48
traps.c8.29 kB04-10-07 14:57
vsprintf.c9.96 kB02-09-04 13:12
<lib>0.00 B04-10-07 15:01
close.c397.00 B02-09-04 13:12
ctype.c1.72 kB02-09-04 13:12
dup.c401.00 B02-09-04 13:12
errno.c66.00 B02-09-04 13:12
execve.c607.00 B02-09-04 13:12
Makefile4.83 kB08-01-04 22:30
malloc.c13.50 kB02-09-04 13:12
open.c1.22 kB02-09-04 13:12
setsid.c382.00 B02-09-04 13:12
string.c199.00 B02-09-04 13:12
wait.c774.00 B02-09-04 13:12
write.c545.00 B02-09-04 13:12
_exit.c616.00 B02-09-04 13:12
Makefile8.58 kB08-01-04 22:21
<mm>0.00 B04-10-07 15:01
Makefile2.91 kB08-01-04 22:34
memory.c25.10 kB02-09-04 13:12
page.s842.00 B08-01-04 22:34
<tools>0.00 B04-10-07 15:01
build.c8.12 kB02-09-04 13:12
...
Sponsored links

sched.c (286.77 kB)

Need 1 point
Your Point(s)

Your Point isn't enough.

Get point immediately by PayPal

More(Debit card / Credit card / PayPal Credit / Online Banking)

Submit your source codes. Get more point

LOGIN

Don't have an account? Register now
Need any help?
Mail to: support@codeforge.com

切换到中文版?

CodeForge Chinese Version
CodeForge English Version

Where are you going?

^_^"Oops ...

Sorry!This guy is mysterious, its blog hasn't been opened, try another, please!
OK

Warm tip!

CodeForge to FavoriteFavorite by Ctrl+D