執行緒的排程方式——搶佔式、非搶佔式
在一個程序裡,執行緒的排程有搶佔式或者非搶佔的模式。
在搶佔模式下,作業系統負責分配CPU時間給各個程序,一旦當前的程序使用完分配給自己的CPU時間,作業系統將決定下一個佔用CPU時間的是哪一個執行緒。因此作業系統將定期的中斷當前正在執行的執行緒,將CPU分配給在等待佇列的下一個執行緒。所以任何一個執行緒都不能獨佔CPU。每個執行緒佔用CPU的時間取決於程序和作業系統。程序分配給每個執行緒的時間很短,以至於我們感覺所有的執行緒是同時執行的。實際上,系統執行每個程序的時間有2毫秒,然後排程其他的執行緒。它同時他維持著所有的執行緒和迴圈,分配很少量的CPU時間給執行緒。執行緒的的切換和排程是如此之快,以至於感覺是所有的執行緒是同步執行的。
排程是什麼意思?排程意味著處理器儲存著將要執行完CPU時間的程序的狀態和將來某個時間裝載這個程序的狀態而恢復其執行。然而這種方式也有不足之處,一個執行緒可以在任何給定的時間中斷另外一個執行緒的執行。假設一個執行緒正在向一個檔案做寫操作,而另外一個執行緒中斷其執行,也向同一個檔案做寫操作。 Windows 95/NT, UNIX使用的就是這種執行緒排程方式。
在非搶佔的排程模式下,每個執行緒可以需要CPU多少時間就佔用CPU多少時間。在這種排程方式下,可能一個執行時間很長的執行緒使得其他所有需要CPU的執行緒”餓死”。在處理機空閒,即該程序沒有使用CPU時,系統可以允許其他的程序暫時使用CPU。佔用CPU的執行緒擁有對CPU的控制權,只有它自己主動釋放CPU時,其他的執行緒才可以使用CPU。一些I/O和Windows 3。x就是使用這種排程策略。
在有些作業系統裡面,這兩種排程策略都會用到。非搶佔的排程策略線上程執行優先順序一般時用到,而對於高優先順序的執行緒排程則多采用搶佔式的排程策略。如果你不確定系統採用的是那種排程策略,假設搶佔的排程策略不可用是比較安全的。在設計應用程式的時候,我們認為那些佔用CPU時間比較多的執行緒在一定的間隔是會釋放CPU的控制權的,這時候系統會檢視那些在等待佇列裡面的與當前執行的執行緒同一優先順序或者更高的優先順序的執行緒,而讓這些執行緒得以使用CPU。如果系統找到一個這樣的執行緒,就立即暫停當前執行的執行緒和啟用滿足條件的執行緒。如果沒有找到同一優先順序或更高階的執行緒,當前執行緒還繼續佔有CPU。當正在執行的執行緒想釋放CPU的控制權給一個低優先順序的執行緒,當前執行緒就轉入睡眠狀態而讓低優先順序的執行緒佔有CPU。
相關推薦
執行緒的排程方式——搶佔式、非搶佔式
在一個程序裡,執行緒的排程有搶佔式或者非搶佔的模式。 在搶佔模式下,作業系統負責分配CPU時間給各個程序,一旦當前的程序使用完分配給自己的CPU時間,作業系統將決定下一個佔用CPU時間的是哪一個執行緒。因此作業系統將定期的中斷當前正在執行的執行緒,將CPU分配給在等待佇
linux執行緒排程方式測試總結
總結:對三種執行緒排程方式進行測試。 1.SCHED_OTHER:分時排程策略,為預設方式,凡是採用本模式的執行緒,執行緒優先順序會強制為0,通俗點將,工作在本模式下的執行緒,都在同一優先順序下。所謂的“分時排程策略”,可以理解為執行緒執行一次後主動放棄CPU,執行緒排程一次,執行下一個執行緒。
如何實現XA式、非XA式Spring分散式事務
原文連結:https://www.javaworld.com/article/2077963/open-source-tools/distributed-transactions-in-spring--with-and-without-xa.html 譯文連結: http:
wait()、notify()、notifyAll()與執行緒通訊方式總結
1、通過wait()、notify()、notifyAll()進行執行緒通訊 執行緒通訊的目標是使執行緒間能夠互相傳送訊號。另一方面,執行緒通訊使執行緒能夠等待其他執行緒的訊號。例如,執行緒B可以等待執行緒A的一個訊號,這個訊號會通知執行緒B資料已經準備好了。 Java有一個內建的等待機制來允許執行
RxJava2原始碼解析——基本流程、執行緒排程
本篇文章的目的: ①瞭解RxJava的基本流程 ②瞭解RxJava中執行緒排程的實現 ③瞭解了上面那些,其他的操作符對你來說就不是問題了 RxJava基本流程 我們從基本的使用作為入口: Observable.create(new ObservableOnSubsc
程序與執行緒的區別與聯絡、程序與執行緒的通訊方式.md
一、為什麼引入程序? 程序是為了提高CPU的執行效率,減少因為程式等待帶來的CPU空轉以及其他計算機軟硬體資源的浪費而提出來的。 二、為什麼引入執行緒? 為了減少程序切換和建立的開銷,提高執行效率和節省
執行緒(十一)兩種傳統傳統方式建立:(thread、Runnable), 執行緒池方式ExcutorServicePool
傳統方式建立執行緒: 1、繼承Thread類,重寫run方法 2、實現Runnable介面,覆蓋介面中的run方法,然後將介面實現扔給Thread run方法探祕: Thread原始碼中的run方法,如下: @Override public void run
2、建立執行緒的方式
目錄 方式一、繼承Thread類 方式二、實現Runnable介面 方式三、通過Callable和Future建立執行緒 建立執行緒的三種方式的對比 方式一、繼承Thread類 public class MyThread extends Thread
多執行緒中的方法、兩種實現方式、匿名內部類建立多執行緒,執行緒安全問題的解決、
多執行緒兩種實現方式: 方式一: 繼承Thread類的方式 方式二: 實現Runnable介面的方式。 方式一: 步驟: // 1. 定義一個類,然後繼承Thread //
三十七、Linux 執行緒——執行緒清理和控制函式、程序和執行緒啟動方式比較、執行緒的狀態轉換
37.1 執行緒清理和控制函式 1 #include <pthread.h> 2 3 void pthread_cleanup_push(void (* rtn)(void *), void *arg); 4 void pthread_cleanup_pop(int execute);
搶佔式和非搶佔式的程序排程
非搶佔式(Nonpreemptive) 讓程序執行直到結束或阻塞的排程方式 容易實現 適合專用系統,不適合通用系統 搶佔式(Preemptive) 允許將邏輯上可繼續執行的在執行過程暫停的
【併發程式設計】 圖文深入解析Java顯式鎖底層原始碼 —— condition 實現執行緒排程
一、回顧 AQS 資源的鎖定與釋放 上篇文章(文章中有詳細的原始碼解讀) 說到,AQS 在 tryRelease 失敗後,資源的鎖
二、java實現多執行緒的方式?
一、同步?非同步? 下面兩幅圖解釋了同步非同步。 二、實現多執行緒的方式 1.繼承Thread  
如何實現一個執行緒排程框架
一、前言 執行緒是程式執行流的最小單元,很基礎,也很重要。為了提高流暢性,耗時任務放後臺執行緒執行,這是APP開發的常識了。隨著APP複雜度的提升,越來越多工需要開執行緒執行,同時,遇到如下挑戰: 任務場景多樣化,常規的API無法滿足; 隨著元件化,模組化等演進,可能使得執行緒管理不統一(比如多
python學習第34天之udp的套接字、套接字的多執行緒socketserver模組的使用、作業系統理論
一、udp的套接字 Udp協議又叫資料報協議, 特點:每次傳送資料自帶報頭,即使傳送為0也會自帶報頭,所以不會報錯;一端發一次資料。另一端也只能收一次資料 服務端: import socket server=socket.socket(socket.AF_INET,socket.SOCK_DG
多執行緒實現UDP協議傳送、接收資料
放碼過來吧! public class ChatRoom { public static void main(String[] args) throws SocketException { DatagramSocket sendSocket =
Qt 筆記:另一種建立執行緒的方式
class QThread :public Qt { // ....... // ....... protected: virtual void run() = 0; // ....... // ....... }; ps:面向物件程式設計實踐的早起,
關於執行緒的run()、start()、join()方法
一、run()和start() run:run()方法只是類的一個普通方法而已,如果直接呼叫Run方法,程式中依然只有主執行緒這一個執行緒,其程式執行路徑還是隻有一條,還是要順序執行,還是要等待run方法體執行完畢後才可繼續執行下面的程式碼,這樣就沒有達到寫執行緒的目的。 start:用st
Python學習筆記:threading.Condition多執行緒排程
#!/usr/bin/python #coding:utf-8 #引入執行緒和時間模組 import threading,time #引入執行緒條件變數 cond = threading.Condition() def run():
Java併發程式設計(5)-Executor執行緒排程框架解讀
文章目錄 一、Executor執行緒排程框架 1.1、什麼是執行緒排程框架 1.2、Executors 1.3、Executor 1.4、ExecutorService 1