跳转到内容

上下文交換:修订间差异

维基百科,自由的百科全书
删除的内容 添加的内容
Fc500110留言 | 贡献
消歧义
 
(未显示15个用户的26个中间版本)
第1行: 第1行:
{{noteTA
{{主條目消歧義|'''交換'''重定向至此,关于“交換”的其它含义参见'''[[交換 (消歧義)]]'''。}}
|G1=IT
'''上下文交換'''({{lang-en|context switch}}),又稱'''環境切換''',電腦術語,是一個儲存和重建[[中央處理器|CPU]]的[[狀態 (電腦科學)|狀態]] ([[文 (電腦科學)|文]]),因此令多個[[進程|进程]](process)可以分享單一CPU資源的計算過程。要交換[[中央處理器|CPU]]上的[[進程|进程]]時,必先行儲存目前[[進程|进程]]的狀態,再將欲執行的[[進程|进程]]之狀態讀回[[中央處理器|CPU]]中。<ref>{{cite book |last= Silberschatz |first= Abraham |coauthors= Peter Baer Galvin, Greg Gagne |title=''Operating System Principles'' |publisher= John Wiley & Sons (Asia) Pte Ltd |isbn= 0-4717-2595-1 |edition= 7}}</ref>
|T=zh-cn:上下文切换; zh-tw:上下文交換;
|1=zh-cn:上下文切换; zh-tw:上下文交換;
|2=zh-cn:切换; zh-tw:交換;
}}
{{copyedit|time=2018-01-06T14:55:11+00:00}}
{{主條目消歧義|'''-{zh-cn:交换;zh-tw:交換;}-'''重定向至此,关于“-{zh-cn:交换;zh-tw:交換;}-”的其它含义参见'''[[交换|-{zh-cn:交换 (消歧义);zh-tw:交換 (消歧義);}-]]'''。}}
'''上下文交換'''{{lang-en|context switch}}),又稱'''環境切換''',電腦術語,是一個儲存和重建[[中央處理器|CPU]]的[[狀態 (電腦科學)|狀態]][[上下文 (计算机)|上下文]]),因此令多個[[進程|进程]](process)可以分享單一CPU資源的計算過程。要交換[[中央處理器|CPU]]上的[[進程|进程]]時,必先行儲存目前[[進程|进程]]的狀態,再將欲執行的[[進程|进程]]之狀態讀回[[中央處理器|CPU]]中。 <ref>{{cite book |last= Silberschatz |first= Abraham |coauthors= Peter Baer Galvin, Greg Gagne |title=''Operating System Principles'' |publisher= John Wiley & Sons (Asia) Pte Ltd |isbn= 0-4717-2595-1 |edition= 7}}</ref>


== 何時交換? ==
== 开销 ==

上下文切换通常是计算密集型的,[[操作系统]]中的许多设计都是针对上下文切换的优化。在[[进程]]间切换需要消耗一定的时间进行相关的管理工作——包括[[寄存器]]和[[内存映射]]的保存与读取、更新各种内部的表等等。处理器或者操作系统不同,上下文切换时所涉及的内容也不尽相同。比如在[[Linux内核]]中,上下文切换需要涉及寄存器(register)、[[呼叫堆疊|栈指针]](stack pointer)、程序[[计数器]](program counter)的切换,但和[[地址空间]]的切换无关(虽然[[行程|进程]]在进行上下文切换时也需要做地址空间的切换)<ref>''IA-64 Linux Kernel: Design and Implementation'', [http://www.informit.com/articles/article.aspx?p=29961&seqNum=7 4.7 Switching Address Spaces] {{Wayback|url=http://www.informit.com/articles/article.aspx?p=29961&seqNum=7 |date=20180727120551 }}</ref><ref>''Operating Systems'', 5.6 The Context Switch, [https://books.google.com/books?id=orZ0CLxEMXEC&pg=PA118 p. 118] {{Wayback|url=https://books.google.com/books?id=orZ0CLxEMXEC&pg=PA118 |date=20190509231720 }}</ref>。[[纤程|用户态线程]]之间也会发生类似的上下文切换,但这样的切换非常[[轻量级进程|轻量]]。

== 交換时机 ==
有三種可能的情況會發生上下文交換,分別為:
有三種可能的情況會發生上下文交換,分別為:


=== 多工 ===
=== 多工 ===
最常見的,在一些[[排程]](scheduling)[[算法]]內,其中[[進程|行程]]有時候需要暫時離開CPU,讓另一個[[進程|行程]]進來CPU運作。在先佔式多工系統中,每一個行程都將輪流執行不定長度的時間,這些時間段落稱為time slice。如果[[進程|行程]]並非自願讓出CPU(例如執行I/O操作時,[[進程|行程]]就需放棄CPU使用權),當時限到時,系統將產生一個定時中斷,[[操作系統|作業系統]]將排定由其它的[[進程|行程]]來執行。此機制用以確保CPU不致被較依賴處理器運算的行程壟斷。若無定時中斷,除非[[進程|行程]]自願讓出CPU,否則該[[進程|行程]]將持續執行。對於擁有較多I/O指令的[[進程|行程]],往往執行不了多久,便需要讓出CPU;而較依賴處理器的[[進程|行程]]相對而言I/O操作較少,反而能一直持續使用CPU,便形成了壟斷現象。此即Convoy效應
最常見的,在一些[[排程]](scheduling)[[算法]]內,其中行程有時候需要暫時離開CPU,讓另一個行程進來CPU運作。在先佔式多工系統中,每一個行程都將輪流執行不定長度的時間,這些時間段落稱為[[时间片]]。如果行程並非自願讓出CPU(例如執行[[I/O]]操作時,行程就需放棄CPU使用權),當時限到時,系統將產生一個定時中斷,[[操作系統|作業系統]]將排定由其它的行程來執行。此機制用以確保CPU不致被較依賴處理器[[运算|運算]]的行程壟斷。若無定時中斷,除非行程自願讓出CPU,否則該行程將持續執行。對於擁有較多I/O[[指令]]的行程,往往執行不了多久,便需要讓出CPU;而較依賴處理器的行程相對而言I/O操作較少,反而能一直持續使用CPU,便形成了[[独占|壟斷]]現象。


=== 中斷處理 ===
=== 中斷處理 ===
在接受到[[中斷]](Interrupt)的時候,[[中央處理器|CPU]]必須要進行上下文交換。
在接受到[[中斷]](Interrupt)的時候,[[中央處理器|CPU]]必須要進行上下文交換。


=== 用戶狀態或者kernel狀態的交換 ===
=== 用戶或者内核态的交換 ===
[[用戶態]][[kernel mode]]交換發生的時候,並不需要進行上下文交換;並且用戶態和kernel mode的交換本身並不是一個上下文交換。不過,根據作業系統的不同,有時候會在此時進行一次上下文交換的步驟。
當用戶態和内核态交換發生的時候,並不需要進行上下文交換;並且用戶態和[[内核|kernel]] mode的交換本身並不是一個上下文交換。不過,根據作業系統的不同,有時候會在此時進行一次上下文交換的步驟。


== 上下文交換:具體步驟 ==
== 上下文交換:具體步驟 ==


在一次交換中,第一個行程的狀態要被紀錄在某個地方,這樣當排程器(scheduler)要回到這個行程時,才可以重建這個行程並且繼續運算。
在一次交換中,第一個行程的狀態要被紀錄在某個地方,這樣當排程器(scheduler)要回到這個行程時,才可以重建這個行程並且繼續運算。


這裡所謂「行程的狀態」,包含了這個行程使用的所有暫存器(register),特別是[[程式計數器]];加上所有作業系統可能需要的特定資料。這些資料一般以名為[[行程控制表]](process control block,PCB)的資料結構儲存起來。
這裡所謂「行程的狀態」,包含了這個行程使用的所有暫存器(register),特別是[[程式計數器]];加上所有作業系統可能需要的特定資料。這些資料一般以名為[[行程控制表]](process control block,PCB)的資料結構儲存起來。


== 上下文交換:由軟體或硬體實現 ==
== 上下文交換:由軟體或硬體實現 ==
上下文交換可分為主要由軟體實現或由硬體實現。部分中央處理器,比如[[Intel 80386]]<ref>http://www.linfo.org/context_switch.html</ref>或同系列更高階的處理器,就具備支持上下文交換的硬體設計。
上下文交換主要由軟體實現或由硬體實現。部分中央處理器,比如[[Intel 80386]]<ref>{{Cite web |url=http://www.linfo.org/context_switch.html |title=存档副本 |access-date=2010-02-05 |archive-url=https://web.archive.org/web/20100218115342/http://www.linfo.org/context_switch.html |archive-date=2010-02-18 |dead-url=yes }}</ref>或同系列更高階的處理器,就具備支持上下文交換的硬體設計。


== 參考資料 ==
== 參考資料 ==
第27行: 第38行:


== 外部連結 ==
== 外部連結 ==
* [http://wiki.osdev.org/Context_Switching Context Switching] - at OSDev.org
* [http://wiki.osdev.org/Context_Switching Context Switching]{{Wayback|url=http://wiki.osdev.org/Context_Switching |date=20091217135818 }} - at OSDev.org
* [http://www.linfo.org/context_switch.html Context Switch Definition] - by The Linux Information Project (LINFO)
* [https://web.archive.org/web/20100218115342/http://www.linfo.org/context_switch.html Context Switch Definition] - by The Linux Information Project (LINFO)
* [http://msdn.microsoft.com/en-us/library/ms682105(VS.85).aspx Context Switches] - from the Microsoft Developer Network (MSDN)
* [https://web.archive.org/web/20091207203649/http://msdn.microsoft.com/en-us/library/ms682105(VS.85).aspx Context Switches] - from the Microsoft Developer Network (MSDN)


{{操作系统}}
{{操作系统}}


[[Category:Process (computing)]]
[[Category:进程]]

2023年11月23日 (四) 02:33的最新版本

上下文交換(英語:context switch),又稱環境切換,電腦術語,是一個儲存和重建CPU狀態上下文),因此令多個进程(process)可以分享單一CPU資源的計算過程。要交換CPU上的进程時,必須先行儲存目前进程的狀態,再將欲執行的进程之狀態讀回CPU中。 [1]

开销[编辑]

上下文切换通常是计算密集型的,操作系统中的许多设计都是针对上下文切换的优化。在进程间切换需要消耗一定的时间进行相关的管理工作——包括寄存器内存映射的保存与读取、更新各种内部的表等等。处理器或者操作系统不同,上下文切换时所涉及的内容也不尽相同。比如在Linux内核中,上下文切换需要涉及寄存器(register)、栈指针(stack pointer)、程序计数器(program counter)的切换,但和地址空间的切换无关(虽然进程在进行上下文切换时也需要做地址空间的切换)[2][3]用户态线程之间也会发生类似的上下文切换,但这样的切换非常轻量

交換时机[编辑]

有三種可能的情況會發生上下文交換,分別為:

多工[编辑]

最常見的,在一些排程(scheduling)算法內,其中行程有時候需要暫時離開CPU,讓另一個行程進來CPU運作。在先佔式多工系統中,每一個行程都將輪流執行不定長度的時間,這些時間段落稱為时间片。如果行程並非自願讓出CPU(例如執行I/O操作時,行程就需放棄CPU使用權),當時限到時,系統將產生一個定時中斷,作業系統將排定由其它的行程來執行。此機制用以確保CPU不致被較依賴處理器運算的行程壟斷。若無定時中斷,除非行程自願讓出CPU,否則該行程將持續執行。對於擁有較多I/O指令的行程,往往執行不了多久,便需要讓出CPU;而較依賴處理器的行程相對而言I/O操作較少,反而能一直持續使用CPU,便形成了壟斷現象。

中斷處理[编辑]

在接受到中斷(Interrupt)的時候,CPU必須要進行上下文交換。

用戶态或者内核态的交換[编辑]

當用戶態和内核态交換發生的時候,並不需要進行上下文交換;並且用戶態和kernel mode的交換本身並不是一個上下文交換。不過,根據作業系統的不同,有時候會在此時進行一次上下文交換的步驟。

上下文交換:具體步驟[编辑]

在一次交換中,第一個行程的狀態要被紀錄在某個地方,這樣當排程器(scheduler)要回到這個行程時,才可以重建這個行程並且繼續運算。

這裡所謂「行程的狀態」,包含了這個行程使用的所有暫存器(register),特別是程式計數器;加上所有作業系統可能需要的特定資料。這些資料一般以名為行程控制表(process control block,PCB)的資料結構儲存起來。

上下文交換:由軟體或硬體實現[编辑]

上下文交換主要由軟體實現或由硬體實現。部分中央處理器,比如Intel 80386[4]或同系列更高階的處理器,就具備支持上下文交換的硬體設計。

參考資料[编辑]

  1. ^ Silberschatz, Abraham; Peter Baer Galvin, Greg Gagne. Operating System Principles 7. John Wiley & Sons (Asia) Pte Ltd. ISBN 0-4717-2595-1. 
  2. ^ IA-64 Linux Kernel: Design and Implementation, 4.7 Switching Address Spaces页面存档备份,存于互联网档案馆
  3. ^ Operating Systems, 5.6 The Context Switch, p. 118页面存档备份,存于互联网档案馆
  4. ^ 存档副本. [2010-02-05]. (原始内容存档于2010-02-18). 

外部連結[编辑]