精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

如果讓你來設計進程調度,你會怎么辦?

開發(fā) 前端
內存還有可能設計成相互錯開的,互不干擾,比如進程 1 你就用 0~1K 的內存空間,進程 2 就用 1K~2K 的內存空間,咱誰也別影響誰。

書接上回,上回書咱們說到,操作系統(tǒng)通過move_to_user_mode 方法,通過偽造一個中斷和中斷返回,巧妙地從內核態(tài)切換到了用戶態(tài)。

void main(void) {
...
move_to_user_mode();
if (!fork()) {
init();
}
for(;;) pause();
}

今天,本來應該再往下講 fork。

但這個是創(chuàng)建新進程的過程,是一個很能體現操作系統(tǒng)設計的地方。

所以我們先別急著看代碼,我們今天就頭腦風暴一下,就是如果讓你來設計整個進程調度,你會怎么搞? 別告訴我你先設計鎖、設計 volatile 啥的,這都不是進程調度本身需要關心的最根本問題。

進程調度本質是什么?很簡單,假如有三段代碼被加載到內存中。

進程調度就是讓 CPU 一會去程序 1 的位置處運行一段時間,一會去程序 2 的位置處運行一段時間。

嗯,就這么簡單,別反駁我,接著往下看。

整體流程設計

如何做到剛剛說的,一會去這運行,一會去那運行?

第一種辦法就是,程序 1 的代碼里,每隔幾行就寫一段代碼,主動放棄自己的執(zhí)行權,跳轉到程序 2 的地方運行。然后程序 2 也是如此。

但這種依靠程序自己的辦法肯定不靠譜。 所以第二種辦法就是,由一個不受任何程序控制的,第三方的不可抗力,每隔一段時間就中斷一下 CPU 的運行,然后跳轉到一個特殊的程序那里,這個程序通過某種方式獲取到 CPU 下一個要運行的程序的地址,然后跳轉過去。 這個每隔一段時間就中斷 CPU 的不可抗力,就是由定時器觸發(fā)的時鐘中斷。

不知道你是否還記得,這個定時器和時鐘中斷,早在 第18回 | 大名鼎鼎的進程調度就是從這里開始的 里講的 sched_init 函數里就搞定了。

而那個特殊的程序,就是具體的進程調度函數了。 好了,整個流程就這樣處理完了,那么應該設計什么樣的數據結構,來支持這個流程呢?不妨假設這個結構叫 tast_struct。

struct task_struct {
?
}

換句話說,你總得有一個結構來記錄各個進程的信息,比如它上一次執(zhí)行到哪里了,要不 CPU 就算決定好了要跳轉到你這個進程上運行,具體跳到哪一行運行,總得有個地方存吧?

我們一個個問題拋開來看。

上下文環(huán)境

每個程序最終的本質就是執(zhí)行指令。這個過程會涉及寄存器,內存和外設端口。 內存還有可能設計成相互錯開的,互不干擾,比如進程 1 你就用 0~1K 的內存空間,進程 2 就用 1K~2K 的內存空間,咱誰也別影響誰。

雖然有點浪費空間,而且對程序員十分不友好,但起碼還是能實現的。

不過寄存器一共就那么點,肯定做不到互不干擾,可能一個進程就把寄存器全用上了,那其他進程咋整。

比如程序 1 剛剛往 eax 寫入一個值,準備用,這時切換到進程 2 了,又往 eax 里寫入了一個值。那么之后再切回進程 1 的時候,就出錯了。 所以最穩(wěn)妥的做法就是,每次切換進程時,都把當前這些寄存器的值存到一個地方,以便之后切換回來的時候恢復。 Linux 0.11 就是這樣做的,每個進程的結構 task_struct 里面,有一個叫 tss 的結構,存儲的就是 CPU 這些寄存器的信息。

struct task_struct {
...
struct tss_struct tss;
}

struct tss_struct {
long back_link; /* 16 high bits zero */
long esp0;
long ss0; /* 16 high bits zero */
long esp1;
long ss1; /* 16 high bits zero */
long esp2;
long ss2; /* 16 high bits zero */
long cr3;
long eip;
long eflags;
long eax,ecx,edx,ebx;
long esp;
long ebp;
long esi;
long edi;
long es; /* 16 high bits zero */
long cs; /* 16 high bits zero */
long ss; /* 16 high bits zero */
long ds; /* 16 high bits zero */
long fs; /* 16 high bits zero */
long gs; /* 16 high bits zero */
long ldt; /* 16 high bits zero */
long trace_bitmap; /* bits: trace 0, bitmap 16-31 */
struct i387_struct i387;
};

這里提個細節(jié)。

你發(fā)現 tss 結構里還有個 cr3 不?它表示 cr3 寄存器里存的值,而 cr3 寄存器是指向頁目錄表首地址的。

那么指向不同的頁目錄表,整個頁表結構就是完全不同的一套,那么邏輯地址到線性地址的映射關系就有能力做到不同。 也就是說,在我們剛剛假設的理想情況下,不同程序用不同的內存地址可以做到內存互不干擾。

但是有了這個 cr3 字段,就完全可以無需由各個進程自己保證不和其他進程使用的內存沖突,因為只要建立不同的映射關系即可,由操作系統(tǒng)來建立不同的頁目錄表并替換 cr3 寄存器即可。

這也可以理解為,保存了內存映射的上下文信息。

當然 Linux 0.11 并不是通過替換 cr3 寄存器來實現內存互不干擾的,它的實現更為簡單,這是后話了。

運行時間信息

如何判斷一個進程該讓出 CPU 了,切換到下一個進程呢? 總不能是每次時鐘中斷時都切換一次吧?一來這樣不靈活,二來這完全依賴時鐘中斷的頻率,有點危險。 所以一個好的辦法就是,給進程一個屬性,叫剩余時間片,每次時鐘中斷來了之后都 -1,如果減到 0 了,就觸發(fā)切換進程的操作。 在 Linux 0.11 里,這個屬性就是 counter。

struct task_struct {
...
long counter;
...
struct tss_struct tss;
}

而他的用法也非常簡單,就是每次中斷都判斷一下是否到 0 了。

void do_timer(long cpl) {
...
// 當前線程還有剩余時間片,直接返回
if ((--current->counter)>0) return;
// 若沒有剩余時間片,調度
schedule();
}

如果還沒到 0,就直接返回,相當于這次時鐘中斷什么也沒做,僅僅是給當前進程的時間片屬性做了 -1 操作。

如果已經到 0 了,就觸發(fā)進程調度,選擇下一個進程并使 CPU 跳轉到那里運行。

進程調度的邏輯就是在 schedule 函數里,怎么調,我們先不管。

優(yōu)先級

上面那個 counter 一開始的時候該是多少呢?而且隨著 counter 不斷遞減,減到 0 時,下一輪回中這個 counter 應該賦予什么值呢? 其實這倆問題都是一個問題,就是 counter 的初始化問題,也需要有一個屬性來記錄這個值。 往宏觀想一下,這個值越大,那么 counter 就越大,那么每次輪到這個進程時,它在 CPU 中運行的時間就越長,也就是這個進程比其他進程得到了更多 CPU 運行的時間。 那我們可以把這個值稱為優(yōu)先級,是不是很形象。

struct task_struct {
...
long counter;
long priority;
...
struct tss_struct tss;
}

每次一個進程初始化時,都把 counter 賦值為這個 priority,而且當 counter 減為 0 時,下一次分配時間片,也賦值為這個。

其實叫啥都行,反正就是這么用的,就叫優(yōu)先級吧。

進程狀態(tài)

其實我們有了上面那三個信息,就已經可以完成進程的調度了。 甚至如果你的操作系統(tǒng)讓所有進程都得到同樣的運行時間,連 counter 和 priority 都不用記錄,就操作系統(tǒng)自己定一個固定值一直遞減,減到 0 了就隨機切一個新進程。

這樣就僅僅維護好寄存器的上下文信息 tss 就好了。 但我們總要不斷優(yōu)化以適應不同場景的用戶需求的,那我們再優(yōu)化一個細節(jié)。 很簡單的一個場景,一個進程中有一個讀取硬盤的操作,發(fā)起讀請求后,要等好久才能得到硬盤的中斷信號。 那這個時間其實該進程再占用著 CPU 也沒用,此時就可以選擇主動放棄 CPU 執(zhí)行權,然后再把自己的狀態(tài)標記為等待中。

意思是告訴進程調度的代碼,先別調度我,因為我還在等硬盤的中斷,現在輪到我了也沒用,把機會給別人吧。 那這個狀態(tài)可以記錄一個屬性了,叫 state,記錄了此時進程的狀態(tài)。

struct task_struct {
long state;
long counter;
long priority;
...
struct tss_struct tss;
}

而這個進程的狀態(tài)在 Linux 0.11 里有這么五種。

#define TASK_RUNNING          0
#define TASK_INTERRUPTIBLE 1
#define TASK_UNINTERRUPTIBLE 2
#define TASK_ZOMBIE 3
#define TASK_STOPPED 4

好了,目前我們這幾個字段,就已經可以完成簡單的進程調度任務了。

有表示狀態(tài)的 state,表示剩余時間片的counter,表示優(yōu)先級的 priority,和表示上下文信息的 tss。

其他字段我們需要用到的時候再說,今天只是頭腦風暴一下進程調度設計的思路。 我們看一下 Linux 0.11 中進程結構的全部,心里先有個數,具體干嘛的先別管,就記住我們剛剛頭腦風暴的那四個字段就行了。

struct task_struct {
/* these are hardcoded - don't touch */
long state; /* -1 unrunnable, 0 runnable, >0 stopped */
long counter;
long priority;
long signal;
struct sigaction sigaction[32];
long blocked; /* bitmap of masked signals */
/* various fields */
int exit_code;
unsigned long start_code,end_code,end_data,brk,start_stack;
long pid,father,pgrp,session,leader;
unsigned short uid,euid,suid;
unsigned short gid,egid,sgid;
long alarm;
long utime,stime,cutime,cstime,start_time;
unsigned short used_math;
/* file system info */
int tty; /* -1 if no tty, so it must be signed */
unsigned short umask;
struct m_inode * pwd;
struct m_inode * root;
struct m_inode * executable;
unsigned long close_on_exec;
struct file * filp[NR_OPEN];
/* ldt for this task 0 - zero 1 - cs 2 - ds&ss */
struct desc_struct ldt[3];
/* tss for this task */
struct tss_struct tss;
};

看吧,其實也沒多少咯~

好了,今天我們完全由自己從零到有設計出了進程調度的大體流程,以及它需要的數據結構。

我們知道了進程調度的開始,要從一次定時器滴答來觸發(fā),通過時鐘中斷處理函數走到進程調度函數,然后去進程的結構 task_struct 中取出所需的數據,進行策略計算,并挑選出下一個可以得到 CPU 運行的進程,跳轉過去。 那么下一講,我們從一次時鐘中斷出發(fā),看看一次 Linux 0.11 的進程調度的全過程。有了這兩回做鋪墊,之后再看主流程中的 fork 代碼,將會非常清晰! 欲知后事如何,且聽下回分解。

本文轉載自微信公眾號「低并發(fā)編程」,可以通過以下二維碼關注。轉載本文請聯(lián)系低并發(fā)編程公眾號。

責任編輯:武曉燕 來源: 低并發(fā)編程
相關推薦

2023-12-22 09:03:31

2021-11-16 07:02:05

函數Python返回值

2024-08-28 08:38:51

2010-12-22 14:40:51

3Q大戰(zhàn)

2025-06-10 01:00:00

分布式日志系統(tǒng)

2015-10-22 09:09:59

BAT投資VC

2015-10-28 17:09:13

技術創(chuàng)業(yè)

2013-02-28 11:00:51

IE10瀏覽器

2025-05-26 01:55:00

HashMap擴容Redis

2023-09-02 21:22:36

Airbnb系統(tǒng)

2022-03-05 18:25:51

SSLTLS協(xié)議

2009-11-30 13:27:21

2016-10-09 23:12:59

2024-07-31 08:21:53

2010-05-04 09:53:33

云計算

2020-05-26 10:38:51

安全 黑客Windows

2010-11-17 11:06:34

跳槽

2015-08-05 10:39:54

知乎整理騰訊

2021-01-14 05:23:32

高并發(fā)消息中間件

2025-04-08 09:00:00

數據庫緩存架構
點贊
收藏

51CTO技術棧公眾號

中文一区在线播放| 日韩激情一二三区| 亚洲国产精品一区二区久| 精品欧美一区免费观看α√| 水莓100国产免费av在线播放| 久久av一区二区三区| 丝袜亚洲另类欧美重口| 古装做爰无遮挡三级聊斋艳谭| 操喷在线视频| 国产欧美精品日韩区二区麻豆天美| 国产日韩精品入口| 国产成人一区二区三区影院在线| 国产一区二区三区91| 欧美一区二区三区在线看| 9久久9毛片又大又硬又粗| 成人免费在线电影| 成人白浆超碰人人人人| 国产精品成久久久久三级| 日韩一级片av| 成人婷婷网色偷偷亚洲男人的天堂| 欧美一区二区三区播放老司机| 国产精品秘入口18禁麻豆免会员| av在线电影免费观看| 国产黄色91视频| 国产精品久久久久久久久久久久久久| 久久久久亚洲av片无码下载蜜桃| 日韩av久操| 亚洲精品永久免费| 亚洲av无码久久精品色欲| 99只有精品| 欧美日韩在线视频观看| 欧美一区二区三区综合| 成人好色电影| 久久久噜噜噜久久中文字幕色伊伊| 亚洲综合日韩在线| 一区二区国产欧美| 日韩高清中文字幕一区| 91精品国产99| 国产在线视频卡一卡二| 久久久久久久久久久久久久久久久久| 亚洲欧美综合v| 国产精品第七页| 国产精品香蕉| 精品免费国产一区二区三区四区| www.久久久久久久久久久| 日韩在线观看不卡| 色婷婷综合久久久久中文一区二区| 欧日韩免费视频| a视频在线观看免费| 一区在线观看视频| 亚洲人成网站在线观看播放| yiren22综合网成人| 久久日韩粉嫩一区二区三区| 久久精品日韩| 深夜福利在线视频| 久久夜色精品一区| 久久五月天婷婷| 免费一级毛片在线观看| 久久蜜桃一区二区| 日韩av在线电影观看| 韩国福利在线| 国产欧美日本一区视频| 色综合久久久久久久久五月| 波多野结衣在线网站| 国产欧美精品一区二区三区四区| 亚洲欧洲国产日韩精品| 日本三级在线播放完整版| 国产精品成人在线观看| 国产精品h视频| 丝袜在线观看| 亚洲成a天堂v人片| 日本精品一区在线观看| 午夜精品久久久久久久久久蜜桃| 色婷婷激情综合| 黑森林精品导航| crdy在线观看欧美| 精品福利一二区| www国产视频| 要久久爱电视剧全集完整观看 | 99视频在线观看免费| 国产成人精品一区二| 国产精品国产三级国产专区53| 手机看片国产1024| 欧美国产日韩亚洲一区| 26uuu成人| 乱馆动漫1~6集在线观看| 一本到高清视频免费精品| 国产高潮免费视频| 亚洲综合色婷婷在线观看| 日韩精品在线私人| 国精品人伦一区二区三区蜜桃| 欧美日韩亚洲国产精品| 日韩av电影在线播放| 亚洲综合五月天婷婷丁香| 国产91在线观看丝袜| 欧美一区二区三区四区五区六区| 中文字幕日本在线| 亚洲成人精品在线观看| 亚洲人辣妹窥探嘘嘘| 午夜日韩影院| 中文字幕不卡在线视频极品| 国产一级片播放| 久久最新视频| 国产欧美日本在线| 日韩美女一级视频| 亚洲激情一二三区| 最新中文字幕2018| 免费看久久久| 麻豆国产精品va在线观看不卡 | 欧美日韩在线播放三区| 在线免费看黄色片| 欧美国产美女| 欧美一级大胆视频| www黄色网址| 国产精品麻豆视频| 精品一区二区中文字幕| 日本99精品| 最近免费中文字幕视频2019| 欧美福利视频一区二区| 国产成人av一区| 亚洲不卡一卡2卡三卡4卡5卡精品| av电影免费在线观看| 欧美在线不卡视频| 一级性生活毛片| 狠色狠色综合久久| 91九色综合久久| 国产黄在线看| 色呦呦国产精品| 精品一区二区视频在线观看| 欧美日本免费| 91精品啪aⅴ在线观看国产| 国产高清在线观看| 91精品福利视频| 亚洲精品乱码久久久久久不卡| 欧美精品国产一区二区| 91老司机在线| 欧美jizz18hd性欧美| 欧美日韩高清一区二区三区| 国产成人精品无码免费看夜聊软件| 最新日韩欧美| 国产富婆一区二区三区| jizz性欧美10| 日韩精品一区二区在线| 亚洲欧美一区二区三区四区五区| 久久精品国产精品青草| 亚洲图片欧洲图片日韩av| 91av一区| 日韩三级影视基地| 一级片在线观看视频| 国产精品国模大尺度视频| 欧美特级aaa| 欧美gay男男猛男无套| 国产精品视频区| 无遮挡动作视频在线观看免费入口| 在线观看日韩高清av| 性欧美精品中出| 日本午夜一本久久久综合| 麻豆一区区三区四区产品精品蜜桃| www.51av欧美视频| 亚洲精品久久久久| 国产一级免费视频| 日本一区二区视频在线观看| 久久久国产欧美| 欧美3p视频| 99久久精品免费看国产四区| 免费看电影在线| 精品处破学生在线二十三| 在线看成人av| 久久久久久一级片| 91视频这里只有精品| 久久精品免费一区二区三区| 99久久精品免费看国产一区二区三区| av在线不卡免费| 亚洲女人初尝黑人巨大| 自拍偷拍精品视频| 亚洲男人的天堂在线aⅴ视频| 被黑人猛躁10次高潮视频| 亚洲激情不卡| 天堂精品一区二区三区| 成人短视频软件网站大全app| 欧美丰满少妇xxxxx做受| 色窝窝无码一区二区三区成人网站 | 无遮挡亚洲一区| 国产精品视频首页| 97精品久久久中文字幕免费| a视频网址在线观看| 7777精品伊人久久久大香线蕉最新版| 久久亚洲成人av| 久久精品无码一区二区三区| 91丝袜超薄交口足| 一本久道综合久久精品| 亚洲第一导航| 加勒比色综合久久久久久久久| 国产99在线|中文| 曰本三级在线| 亚洲日本成人网| 国产a级免费视频| 欧美视频在线观看免费| 免费在线观看a级片| 成人性生交大合| www.99av.com| 在线日本高清免费不卡| 中文字幕色一区二区| 亚洲免费观看高清完整版在线观| 91精品久久久久久久| 国产精品迅雷| 欧美国产日韩在线| av亚洲在线| 日韩极品精品视频免费观看| 国产草草影院ccyycom| 在线观看日韩av先锋影音电影院| 久久精品无码人妻| 亚洲素人一区二区| 成人在线一级片| 成人免费视频播放| www,av在线| 免费欧美日韩国产三级电影| 自拍日韩亚洲一区在线| 欧美一区二区三区另类| 婷婷四房综合激情五月| 超碰一区二区三区| 91久久精品美女| abab456成人免费网址| 国产91ⅴ在线精品免费观看| 美女航空一级毛片在线播放| www日韩欧美| 成人jjav| 亚洲香蕉av在线一区二区三区| 姝姝窝人体www聚色窝| 日韩免费电影一区| 国产情侣一区二区| 欧美老人xxxx18| 亚洲视屏在线观看| 日韩欧美中文字幕在线播放| 日韩精品人妻中文字幕| 亚洲一区二区三区美女| 久久久美女视频| 一区二区三区在线视频播放 | 午夜精品久久久久久| 青青草国产在线观看| 亚洲欧洲99久久| 肉色超薄丝袜脚交69xx图片| 国产精品久久夜| 国产无遮挡在线观看| 亚洲国产精品传媒在线观看| 性の欲びの女javhd| 国产色综合一区| 91视频免费在观看| 欧美国产日韩亚洲一区| 久久久国产一级片| 国产精品第13页| 永久免费看mv网站入口| 日韩理论片在线| 黄色一级免费视频| 洋洋成人永久网站入口| 国产精久久久久久| 午夜av一区二区三区| 亚洲精品中文字幕乱码三区91| 欧美日韩激情美女| 国产午夜麻豆影院在线观看| 色屁屁一区二区| 在线观看免费中文字幕| 91麻豆精品国产| 丰满大乳国产精品| 亚洲精品久久久久国产| 国产主播福利在线| 精品国产欧美一区二区三区成人| а天堂中文在线官网| 国内外成人免费激情在线视频| 成人bbav| 国产精品白嫩初高中害羞小美女| 日韩av懂色| 高清视频一区| 免费欧美激情| eeuss中文| 亚洲第一伊人| 蜜臀av免费观看| 国产美女精品人人做人人爽 | 狼人天天伊人久久| 日本不卡一区二区三区视频| 久久香蕉国产| 可以看毛片的网址| 三级精品在线观看| 国产高清999| 97成人超碰视| 欧美色视频一区二区三区在线观看| 亚洲美女淫视频| 久久久久女人精品毛片九一| 717成人午夜免费福利电影| 黄色一级大片在线免费看国产| 亚洲视频在线看| 伊人电影在线观看| 国产精品久久久久久久久久小说| 婷婷综合国产| 先锋在线资源一区二区三区| 亚洲午夜一级| 午夜在线观看av| 不卡av免费在线观看| 四虎地址8848| 日韩欧美亚洲成人| 国产成人三级在线播放| 亚洲网在线观看| 黄色美女视频在线观看| 国产在线98福利播放视频| 欧美a级网站| 2021国产视频| 日本不卡高清视频| yy1111111| 一级特黄大欧美久久久| 中文字幕视频一区二区| 亚洲精品久久视频| 怡红院在线观看| 国产欧美韩国高清| 一区二区三区韩国免费中文网站| 免费人成自慰网站| 九九在线精品视频| 一色道久久88加勒比一| 岛国av午夜精品| 亚洲女人18毛片水真多| 久久精品国产成人| 国产一区高清| 日本一区视频在线播放| 国产日韩欧美一区在线 | 久久porn| 草草草视频在线观看| 久久国产三级精品| 久久中文字幕精品| 欧美视频免费在线| 无码精品黑人一区二区三区| 久久久久久久久久av| 一区二区三区欧洲区| 老汉色影院首页| 国产一区二区美女诱惑| 国产精品夜夜夜爽阿娇| 欧美三级欧美一级| 番号在线播放| 国产精品成人免费电影| 少妇一区二区视频| 国产乱子夫妻xx黑人xyx真爽| 99久久国产免费看| 日本一级片免费看| 亚洲精品98久久久久久中文字幕| free性欧美| 加勒比在线一区二区三区观看| 亚洲激情国产| 搡老熟女老女人一区二区| 都市激情亚洲色图| 欧美日韩国产中文字幕在线| 欧洲亚洲女同hd| 国产探花一区二区| xxxx一级片| 国产精品久久久久久久久免费丝袜| 337p粉嫩色噜噜噜大肥臀| 中文字幕日韩专区| 热久久久久久| 老司机午夜免费福利视频| 国产成人亚洲综合色影视| 久久视频免费在线观看| 亚洲福利在线看| 亚洲伊人av| 婷婷精品国产一区二区三区日韩| 韩国精品在线观看| 欧美人妻一区二区| 亚洲精品xxxx| 国产成人精品亚洲日本在线观看| 亚洲一二区在线| 国产精品18久久久久| 国产一级黄色av| 国产午夜精品麻豆| 四虎国产精品永久在线国在线 | 久久av色综合| 久久99久久精品国产| 日本中文字幕不卡| 成熟的女同志hd| 日韩精品高清在线观看| 国产亚洲一区二区手机在线观看 | 精品久久久久久最新网址| 僵尸再翻生在线观看| 视频一区二区三| 国产大陆a不卡| www.日本精品| 日日狠狠久久偷偷四色综合免费| 视频免费一区二区| 99精品视频在线看| 中文字幕在线一区二区三区| 亚洲爱情岛论坛永久| 国产99久久精品一区二区永久免费 | 国产精品一线| 亚洲国产成人va在线观看麻豆| 夜夜爽夜夜爽精品视频| 国产毛片在线| 97视频资源在线观看| 全国精品久久少妇| 久久久久久久久久91| 国产一区二区三区免费视频| 视频在线一区| 亚洲综合色在线观看| 午夜精品一区二区三区三上悠亚 | 五月国产精品| 永久免费黄色片|