日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux每隔多久调度y,Linux 进程调度+Linux系统一般执行过程 笔记

發布時間:2025/3/11 linux 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux每隔多久调度y,Linux 进程调度+Linux系统一般执行过程 笔记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

進程的調度時機與進程的切換

操作系統原理中介紹了大量進程調度算法,這些算法從實現的角度看僅僅是從運行隊列中選擇一個新進程,選擇的過程中運用了不同的策略而已。

對于理解操作系統的工作機制,反而是進程的調度時機與進程的切換機制更為關鍵。

調度時機 背景

不同類型的進程有不同的調度需求

第一種分類:

I/O-bound

頻繁的進行I/O

通常會花費很多時間等待I/O操作的完成

CPU-bound

計算密集型

需要大量的CPU時間進行運算

第二種分類

批處理進程(batch process)

不必與用戶交互,通常在后臺運行

不必很快響應

典型的批處理程序:編譯程序、科學計算

實時進程(real-time process)

有實時需求,不應被低優先級的進程阻塞

響應時間要短、要穩定

典型的實時進程:視頻/音頻、機械控制等

交互式進程(interactive process)

需要經常與用戶交互,因此要花很多時間等待用戶輸入操作

響應時間要快,平均延遲要低于50~150ms

典型的交互式程序:shell、文本編輯程序、圖形應用程序等

Linux中的進程調度

Linux既支持普通的分時進程,也支持實時進程

Linux中的調度是多種調度策略和調度算法的混合。

什么是調度策略?

是一組規則,它們決定什么時候以怎樣的方式選擇一個新進程運行

Linux的調度基于分時和優先級

隨著版本的變化,分時技術在不斷變化

Linux的進程根據優先級排隊

根據特定的算法計算出進程的優先級,用一個值表示

這個值表示把進程如何適當的分配給CPU

Linux中進程的優先級是動態的

調度程序會根據進程的行為周期性的調整進程的優先級

較長時間未分配到CPU的進程,通常↑

已經在CPU上運行了較長時間的進程,通常↓

相關的系統調用

nice

getpriority/setpriority

sched_getscheduler/sched_setscheduler

sched_getparam/sched_setparam

sched_yield

sched_get_priority_min/sched_get_priority_max

sched_rr_get_interval

scheudle 函數

schedule函數實現調度

目的:在運行隊列中找到一個進程,把CPU分配給它

調用方法:

直接調用,如sleep_on

松散調用,根據need_resched標記

進程調度的時機(重點)

中斷處理過程(包括時鐘中斷、I/O中斷、系統調用和異常)中,直接調用schedule(),或者返回用戶態時根據 need_resched 標記調用schedule();

內核線程可以直接調用schedule()進行進程切換,也可以在中斷處理過程中進行調度,也就是說內核線程作為一類的特殊的進程可以主動調度,也可以被動調度;

用戶態進程無法實現主動調度,僅能通過陷入內核態后的某個時機點進行調度,即在中斷處理過程中進行調度。

用戶態被動調度

內核線程只有內核態沒有用戶態的特殊進程,無需系統調用。

插曲:張銀奎說程序進入內核態猶如人睡覺啦。這個笑話很有意思

進程的切換

為了控制進程的執行,內核必須有能力掛起正在CPU上執行的進程,并恢復以前掛起的某個進程的執行,這叫做進程切換、任務切換、上下文切換;

掛起正在CPU上執行的進程,與中斷時保存現場是不同的,中斷前后是在同一個進程上下文中,只是由用戶態轉向內核態執行;

區別是否是同一個進程

進程上下文包含了進程執行需要的所有信息

用戶地址空間:包括程序代碼,數據,用戶堆棧等

控制信息:進程描述符,內核堆棧等

硬件上下文(注意中斷也要保存硬件上下文只是保存的方法不同)

還有硬件上下文

schedule()函數選擇一個新的進程來運行,并調用context_switch進行上下文的切換,這個宏調用switch_to來進行關鍵上下文切換

next = pick_next_task(rq, prev);//進程調度算法都封裝這個函數內部

context_switch(rq, prev, next);//進程上下文切換

switch_to利用了prev和next兩個參數:prev指向當前進程,next指向被調度的進程

進程代碼切換代碼分析(重點)

第一節第二堂課

位置:kernel/sched/core.c

如果想看到這里面詳細的值,可以使用gcc -O0試試

待補充

esp eip 切換 ,

esp 先切換

eip 再切換

利用push eip +call 起到了類似的call 作用,但是靈活修改了eip 。/這點很牛/

Linux系統的一般執行過程

位置:教程第二節第一講

最一般的情況:正在運行的用戶態進程X切換到運行用戶態進程Y的過程

在運行的用戶態進程X 發生中斷,硬件完成以下:

save cs:eip/esp/eflags(current) to kernel stack

load cs:eip(entry of a specific ISR) and ss:esp(point to kernel stack).

SAVE_ALL //保存現場

中斷處理過程中或中斷返回前調用了schedule(),其中的switch_to做了關鍵的進程上下文切換

標號1之后開始運行用戶態進程Y(這里Y曾經通過以上步驟被切換出去過因此可以從標號1繼續執行)

已經變成Y進程上下文,真是 莊周做夢

restore_all //恢復現場

iret - pop cs:eip/ss:esp/eflags from kernel stack

繼續運行用戶態進程Y

進程間的 幾種特殊情況

先普通 再特殊

通過中斷處理過程中的調度時機,用戶態進程與內核線程之間互相切換和內核線程之間互相切換,與最一般的情況非常類似,只是內核線程運行過程中發生中斷沒有進程用戶態和內核態的轉換;

2個內核線程之間切換,cs段沒有改變我

用戶進程和內核線程間切換

內核線程主動調用schedule(),只有進程上下文的切換,沒有發生中斷上下文的切換,與最一般的情況略簡略;

沒有發生中斷,也就是沒有int 指令和iret指令喔,

創建子進程的系統調用在子進程中的執行起點及返回用戶態,如fork;

pre :parent next: child so next_ip=ret_from_fork ,不是switch_to中的標號1喔

加載一個新的可執行程序后返回到用戶態的情況,如execve;

pre:parent

next:execve產生的進程(記住,execve也是系統調用)

聯想start_thread(execve內部),里面有修改進程上下文的內容喔,所以以新的中斷上下文返回

開眼界 內核 舞女

dancing girls vs Taxi girl

0-3g

3g-4g 內核態

如果每個進程都有自己的內核棧,如何切換?

原因是:內核態下(3G以上空間),各進程的代碼段/堆棧段是可以統一訪問的

借用老師的話:內核是taxi

內核是什么?

內核是各種中斷處理過程和內核線程的集合! 精煉啊 大道至簡 道法自然

Linux操作系統架構和系統執行過程概覽

操作系統的基本概念

? 任何計算機系統都包含一個基本的程序集 合,稱為操作系統。

– 內核(進程管理,進程調度,進程間通訊機 制,內存管理,中斷異常處理,文件系統,I/O 系統,網絡部分)

– 其他程序(例如函數庫、shell程序、系統程序 等等)

? 操作系統的目的

– 與硬件交互,管理所有的硬件資源

– 為用戶程序(應用程序)提供一個良好的執行 環境

典型的Linux操作系統的結構

圍繞系統架構圖

最簡單也是最復雜的操作

ls 命令 就是 一講! 不簡單

有時間的話 可以看看strace

換個角度 cpu執行指令 +內存角度看

某種程度上說,

cpu執行指令的演示很精彩

后者就是在說進程地址空間

本章要求 理解進程調度時機跟蹤分析進程調度與進程切換的過程

理解Linux系統中進程調度的時機,可以在內核代碼中搜索schedule()函數,看都是哪里調用了schedule(),判斷我們課程內容中的總結是否準確;

驗證

使用gdb跟蹤分析一個schedule()函數 ,驗證您對Linux系統進程調度與進程切換過程的理解;推薦在實驗樓Linux虛擬機環境下完成實驗。

特別關注并仔細分析switch_to中的匯編代碼,理解進程上下文的切換機制,以及與中斷上下文切換的關系;

根據本周所學知識分析并理解Linux中進程調度與進程切換過程,撰寫一篇署名博客,并在博客文章中注明“真實姓名(與最后申請證書的姓名務必一致) + 原創作品轉載請注明出處 + 《Linux內核分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000 ”,博客內容的具體要求如下:

題目自擬,內容圍繞對進程調度的時機和進程切換進行;

可以結合關鍵代碼、實驗截圖、堆棧狀態、CPU寄存器狀態等;

博客內容中需要仔細分析進程的調度時機、switch_to及對應的堆棧狀態等。

總結部分需要闡明自己對“Linux系統一般執行過程”的理解

其他

可以找到一個ppt 講 switch_to ,看寄存器變化嗎?

mykernel其實就是一個簡化版本的switch

總結

以上是生活随笔為你收集整理的linux每隔多久调度y,Linux 进程调度+Linux系统一般执行过程 笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。