亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? sched.c

?? 帶中文注釋的linux 0.11源碼 很好
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* * 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_on、wakeup、schedule 等)以及 * 一些簡單的系統調用函數(比如getpid(),僅從當前任務中獲取一個字段)。 */#include <linux/sched.h>	// 調度程序頭文件。定義了任務結構task_struct、第1 個初始任務// 的數據。還有一些以宏的形式定義的有關描述符參數設置和獲取的// 嵌入式匯編函數程序。#include <linux/kernel.h>	// 內核頭文件。含有一些內核常用函數的原形定義。#include <linux/sys.h>		// 系統調用頭文件。含有72 個系統調用C 函數處理程序,以'sys_'開頭。#include <linux/fdreg.h>	// 軟驅頭文件。含有軟盤控制器參數的一些定義。#include <asm/system.h>		// 系統頭文件。定義了設置或修改描述符/中斷門等的嵌入式匯編宏。#include <asm/io.h>		// io 頭文件。定義硬件端口輸入/輸出宏匯編語句。#include <asm/segment.h>	// 段操作頭文件。定義了有關段寄存器操作的嵌入式匯編函數。#include <signal.h>		// 信號頭文件。定義信號符號常量,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 的進程號、進程狀態和內核堆棧空閑字節數(大約)。voidshow_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);}// 顯示所有任務的任務號、進程號、進程狀態和內核堆棧空閑字節數(大約)。voidshow_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 不要對該變量進行優化// 處理,也不要挪動位置,因為也許別的程序會來修改它的值。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.s,第23 行。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 *//* * 將當前協處理器內容保存到老協處理器狀態數組中,并將當前任務的協處理器 * 內容加載進協處理器。 */// 當任務被調度交換過以后,該函數用以保存原任務的協處理器狀態(上下文)并恢復新調度進來的// 當前任務的協處理器執行狀態。voidmath_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'是從來不用的。 */voidschedule (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 時間已經過期(alarm<jiffies),則在信號位圖中置SIGALRM 信號,然后清alarm。	// jiffies 是系統從開機開始算起的滴答數(10ms/滴答)。定義在sched.h 第139 行。	if ((*p)->alarm && (*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()返回值應該是-1,并且errno 被置為EINTR。這里還沒有完全實現(直到0.95 版)。intsys_pause (void){  current->state = TASK_INTERRUPTIBLE;  schedule ();  return 0;}// 把當前任務置為不可中斷的等待狀態,并讓睡眠隊列頭的指針指向當前任務。// 只有明確地喚醒時才會返回。該函數提供了進程與中斷處理程序之間的同步機制。// 函數參數*p 是放置等待任務的隊列頭指針。(參見列表后的說明)。voidsleep_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()的說明。voidinterruptible_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 所指向的不是當前任務時,表示在當前任務被放  // 入隊列后,又有新的任務被插入等待隊列中,因此,既然本任務是可中斷的,就應該首先執行所有  // 其它的等待任務。  if (*p && *p != current)    {      (**p).state = 0;      goto repeat;    }  // 下面一句代碼有誤,應該是*p = tmp,讓隊列頭指針指向其余等待任務,否則在當前任務之前插入  // 等待隊列的任務均被抹掉了。參見圖4.3。  *p = NULL;  if (tmp)    tmp->state = 0;}// 喚醒指定任務*p。voidwake_up (struct task_struct **p){  if (p && *p)    {      (**p).state = 0;		// 置為就緒(可運行)狀態。      *p = NULL;    }}/* * OK, here are some floppy things that shouldn't be in the kernel * proper. They are here because the floppy needs a timer, and this * was the easiest way of doing it. *//* * 好了,從這里開始是一些有關軟盤的子程序,本不應該放在內核的主要部分中的。將它們放在這里 * 是因為軟驅需要一個時鐘,而放在這里是最方便的辦法。 */static struct task_struct *wait_motor[4] = { NULL, NULL, NULL, NULL };static int mon_timer[4] = { 0, 0, 0, 0 };static int moff_timer[4] = { 0, 0, 0, 0 };unsigned char current_DOR = 0x0C;	// 數字輸出寄存器(初值:允許DMA 和請求中斷、啟動FDC)。

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品国偷自产国产一区| 日本久久电影网| 欧美经典一区二区| 国产乱码一区二区三区| 欧美一卡二卡三卡四卡| 一区二区三区鲁丝不卡| 99re成人在线| 玉足女爽爽91| 欧美色精品在线视频| 视频一区免费在线观看| 日韩一区二区在线看片| 国产一区欧美一区| 国产精品美女一区二区三区| 91小视频免费观看| 亚洲成人动漫在线免费观看| av电影在线不卡| 欧美一区二区啪啪| 日韩国产精品大片| 成人av免费在线观看| 精品国产免费人成电影在线观看四季| 亚洲精品少妇30p| 在线成人av网站| 国产一区二区女| 国产精品美女久久久久av爽李琼| 国产精品中文字幕欧美| 国产亚洲综合av| 99久久亚洲一区二区三区青草| 精品国产精品一区二区夜夜嗨| 91老师片黄在线观看| 亚洲福利视频导航| 日韩一区二区免费在线观看| 国产一区欧美日韩| 亚洲一级在线观看| 久久久久国产精品人| 99久久99久久精品国产片果冻| 日韩avvvv在线播放| 国产精品视频yy9299一区| 欧美在线视频日韩| 盗摄精品av一区二区三区| 亚洲最新视频在线观看| 26uuu另类欧美亚洲曰本| 欧美色视频在线观看| 福利一区二区在线| 亚洲狠狠丁香婷婷综合久久久| 国产三级欧美三级| 日韩一级免费一区| 欧美最猛黑人xxxxx猛交| 国产白丝精品91爽爽久久| 亚洲午夜一二三区视频| 亚洲色图在线视频| 国产精品蜜臀av| 国产精品天天摸av网| 26uuu成人网一区二区三区| 欧美精品少妇一区二区三区| 91九色最新地址| 在线看国产一区二区| 91久久线看在观草草青青| 国产99久久精品| 成人一级视频在线观看| 久久9热精品视频| 精品一区二区三区不卡| 亚洲午夜日本在线观看| 一区二区三区四区乱视频| 亚洲精品大片www| 国产精品久久久久久久久动漫 | 亚洲线精品一区二区三区八戒| 欧美日本在线一区| 欧美一区二区三区免费大片| 欧美日韩在线直播| 欧美丰满一区二区免费视频| 欧美精品v国产精品v日韩精品| 国产成人午夜99999| av午夜精品一区二区三区| 97se亚洲国产综合在线| 精品视频1区2区| 精品88久久久久88久久久| 欧美国产激情一区二区三区蜜月| 国产精品久久久久永久免费观看| 国产欧美一区二区在线观看| 国产亚洲人成网站| 亚洲裸体在线观看| 国产精品日产欧美久久久久| 一区二区三区日韩在线观看| 精品一区二区在线视频| 色综合天天综合| 91精品国产色综合久久ai换脸 | 国产婷婷色一区二区三区四区| 欧美国产精品一区二区三区| 一区二区久久久| 国产风韵犹存在线视精品| 色就色 综合激情| 欧美一级二级三级乱码| 亚洲视频免费看| 精品无码三级在线观看视频| 国产精品伊人色| 777午夜精品视频在线播放| 精品国产青草久久久久福利| 蜜臀av性久久久久蜜臀aⅴ四虎| 欧美一区二区三区在线视频| 亚洲成人一二三| 欧美色视频一区| 日韩电影在线免费| 成人涩涩免费视频| 久久免费电影网| 国产伦精品一区二区三区免费| 欧美日韩欧美一区二区| 亚洲va国产va欧美va观看| 欧美在线不卡视频| 亚洲婷婷综合色高清在线| 国产精品白丝jk黑袜喷水| 久久久久9999亚洲精品| 久久99九九99精品| 69堂成人精品免费视频| 国产精品青草久久| 丁香五精品蜜臀久久久久99网站| 日韩美一区二区三区| 日本vs亚洲vs韩国一区三区二区| 欧美日韩亚洲国产综合| 亚洲乱码国产乱码精品精可以看 | 国产精品成人网| 欧美另类变人与禽xxxxx| 奇米精品一区二区三区在线观看 | 首页综合国产亚洲丝袜| 日韩精品一区二区三区视频 | 国产麻豆一精品一av一免费| 亚洲一区二区综合| 亚洲国产精品成人综合| 717成人午夜免费福利电影| 蜜桃免费网站一区二区三区| 国产欧美一区二区三区在线看蜜臀| 粉嫩av一区二区三区在线播放 | 亚洲另类春色国产| 日韩欧美国产综合| 色婷婷精品大在线视频 | 欧美一区二区三区色| 狠狠色综合播放一区二区| 欧美sm极限捆绑bd| 欧洲人成人精品| 国产毛片精品视频| 蜜桃av噜噜一区| 综合分类小说区另类春色亚洲小说欧美| 成人黄色av电影| 精品一区二区三区香蕉蜜桃| 国产精品女主播av| 精品免费日韩av| 欧美午夜精品久久久久久孕妇| 激情欧美一区二区三区在线观看| 日韩理论片在线| 最新国产の精品合集bt伙计| 欧美一区二区三区不卡| 欧美色网一区二区| 色婷婷综合中文久久一本| 久久99九九99精品| 亚洲福利视频一区| 悠悠色在线精品| 日韩黄色一级片| 婷婷久久综合九色国产成人 | 国产色一区二区| 2021国产精品久久精品| 久久久久综合网| 国产婷婷色一区二区三区| 国产喂奶挤奶一区二区三区| 亚洲欧洲av在线| 天天色 色综合| 久久精品国产一区二区三区免费看 | 日韩成人免费电影| 蜜臀av性久久久久蜜臀aⅴ| 亚洲成人av福利| 国产在线不卡一区| 成人禁用看黄a在线| 日本精品免费观看高清观看| 欧美喷潮久久久xxxxx| 国产亚洲精品bt天堂精选| 亚洲另类春色国产| 精品一区二区在线看| 91免费版在线| 日本一区二区三区在线不卡| 日本成人中文字幕在线视频| 国产成人福利片| 欧美一级淫片007| 亚洲男人的天堂在线观看| 美女任你摸久久| 99久久99久久精品免费看蜜桃| caoporen国产精品视频| 成人av网站大全| 欧美精品三级在线观看| 日韩亚洲欧美高清| 1区2区3区欧美| 精品一区二区三区久久| 国产精品69毛片高清亚洲| 在线精品观看国产| ●精品国产综合乱码久久久久| 经典三级一区二区| 精品成人a区在线观看| 亚洲va国产天堂va久久en| 国产一区在线看| 精品国产乱码久久久久久闺蜜| 五月综合激情网| 555www色欧美视频| 中文字幕欧美日韩一区|