該系列為併發程式設計,在幾乎所有的程式語言中,併發始終是繞不開的坎,可以說學習一門程式語言,學好了併發就說明這門語言你學的還可以.所以接下來就讓我們好好看看 python 的併發是怎麼實現的吧.
在學習併發之前,有必要學習一下計算機作業系統發展史,因為可以實現併發可作業系統的發展是分不開的.
作業系統的發展史在某種意義上來說也是計算機的發展史.作業系統提供對硬體控制的呼叫和應用程式所必需的功能.
早期的計算機沒有作業系統.只有單獨的機器,操作者會帶著記錄有程式和資料的卡片或較後期的打孔紙帶去操作機器.程式讀入機器後,機器就開始工作直到程式停止.由於程式難免有誤,所以機器通常都會中途崩潰.程式一般通過控制板的開關和狀態燈來除錯.
後來,機器引入幫助程式輸入輸出等工作的**庫.這是現代作業系統的起源.然而,機器每次只能執行乙個任務.在英國劍橋大學,這些任務的磁從前是排成一排掛在衣鉤上的,衣鉤的顏色代表任務的優先順序.
概念意義上的作業系統和通俗意義上的作業系統差距越來越大.通俗意義上的作業系統為了方便而把最普通的包和應用程式的集合包括在作業系統內.隨著作業系統的發展,一些功能更強的'第二類'作業系統軟體也被包括進去.在今天,沒有圖形介面和各種檔案瀏覽器已經不能稱之為乙個真正的通俗意義上的作業系統,但事實上,執行在資料中心和伺服器等領域的作業系統往往是沒有圖形介面的.
第一代之前人類是想用機械取代人力,第一代計算機的產生是計算機由機械時代進入電子時代的標誌,從babbage失敗之後一直到第二次世界大戰,數字計算機的建造幾乎沒有什麼進展,第二次世界大戰刺激了有關計算機研究的**性進展。
lowa州立大學的john atanasoff教授和他的學生clifford berry建造了據認為是第一台可工作的數字計算機。該機器使用300個真空管。大約在同時,konrad zuse在柏林用繼電器構建了z3計算機,英格蘭布萊切利園的乙個小組在2023年構建了colossus,howard aiken在哈佛大學建造了mark 1,賓夕法尼亞大學的william mauchley和他的學生j.presper eckert建造了eniac。這些機器有的是二進位制的,有的使用真空管,有的是可程式設計的,但都非常原始,設定需要花費數秒鐘時間才能完成最簡單的運算。
在這個時期,同乙個小組裡的工程師們,設計、建造、程式設計、操作及維護同一臺機器,所有的程式設計是用純粹的機器語言編寫的,甚至更糟糕,需要通過成千上萬根電纜接到外掛程式板上連成電路來控制機器的基本功能。沒有程式語言(彙編也沒有),作業系統則是從來都沒聽說過。
由於當時的計算機非常昂貴,自認很自然的想辦法減少計算機執行時間的浪費.通常採用的就是批處理系統.
特點:設計人員、生產人員、操作人員、程式人員和維護人員直接有了明確的分工,計算機被鎖在專用空調房間中,由專業操作人員執行,這便是『大型機』,有了作業系統的概念.
有了程式語言:fortran語言或組合語言,寫到紙上,然後穿孔打成卡片,再講卡片盒帶到輸入室,交給操作員,然後喝著咖啡等待輸出介面.
工作過程:
第二代計算機解決了第一代計算機的一些問題:
把乙個人的輸入改為批量輸入;
然後順序計算(這個仍然有問題);
把乙個人的輸出改為批量輸出.
優點:因為是批處理系統,節省了計算機的使用時間,增加的計算機的使用效率;
缺點:整個流程需要人參與控制,將磁帶搬來搬去;
計算的過程仍然是順序計算->序列;
程式設計師原來獨享一段時間的計算機,現在必須被統一規劃到一批作業中,等待結果和重新除錯的過程都需要等同批次的其他程式都執行完才可以接著使用.
在第三道計算機的作業系統廣泛的應用了第二代計算機的作業系統沒有的關鍵技術:多道技術.
多道程式設計技術就是指允許多個程式同時進入記憶體並執行.即同時把多個程式放入記憶體,並允許他們交替在 cpu 中執行,它們共享系統中的各種硬,軟體資源.當一道程式因 i/o 請求而暫停執行時, cpu 便立即轉去執行另一道程式.
多道技術:
多道技術中的多道指的是多個程式,多道技術的實現是為了解決多個程式競爭或者說共享同乙個資源(比如 cpu)的有序排程問題,解決方式即多路復用,多路復用分為時間和空間的復用.
空間復用:
將記憶體分為幾部分,每個部分放入乙個程式,這樣,同一時間內記憶體中就有了多道程式.
時間復用:
當乙個程式在等待 i/o 時,另乙個程式可以使用 cpu, 如果記憶體中可以同時存放足夠多的任務,則 cpu 的利用率可以接近100%.作業系統採用了多道技術後,可以控制程序的切換,或者說程序之間去爭搶cpu 的執行許可權.這種切換不僅會在乙個程序遇到 i/o 時進行,乙個程序占用 cpu 時間過長也會切換,或者說被作業系統奪走 cpu 的執行許可權.
詳解:
現代計算機或者網路都是支援多使用者登入的,多個使用者不僅共享硬體,而且共享檔案,資料庫等資訊,共享意味著會發生衝突和執行無序.
作業系統的主要作用為:
記錄哪個程式使用什麼資源;
對資源請求進行分配;
為不同的程式和使用者調解互相衝突的資源請求.
我們將上述作業系統的功能總結為:處理來自多個程式發起的多個(多個即多路)共享(共享即復用)資源的請求,簡稱多路復用.
在空間復用上的問題為:程式之間的記憶體必須隔離,這種隔離需要在硬體層面上實現,由作業系統控制.如果記憶體彼此不分割,則乙個程式可以訪問另外乙個程式的記憶體,這樣一來就會產生應用程式的資料不安全,比如你的 qq 程式可以訪問作業系統的記憶體,這意味著 qq 可以拿到作業系統的所有許可權.其次喪失的是穩定性,某個程式崩潰時有可能把其他的程式的記憶體一起**了,比如說把作業系統的記憶體**,則作業系統崩潰.
隨著顯示裝置和處理器成本的降低,很多作業系統都開始提供圖形使用者介面。如:許多unix提供的x window一類的系統、微軟的windows系統、蘋果公司的mac os和ibm公司的os/2等。最初的圖形使用者介面是由xerox palo alto研究中心70年代初期研發出來的,之後被許多公司模仿,繼承發展。
隱藏了複雜的硬體呼叫介面,為應用程式設計師呼叫硬體資源提供更好,更簡單,更清晰的模型.應用程式設計師有了這些介面後,就可以不用考慮操作硬體的細節,專心寫**即可;
將應用程式對硬體資源的競爭請求變得有序.
在之前第三代計算機的時候產生了多道技術,可以更高效率的使用計算機的資源.產生背景為:那時候的計算機都是單核,為了能夠同一時間執行多個程式產生了多道技術.
多道技術的產生直接影響了計算機的發展方向,多道技術出現後,單核可以實現併發工作了.
併發程式設計一
概念 正在進行的乙個任務 程式只是 而程序是指程式的執行狀態,乙個程式執行兩次,也是兩個程序 程序是計算機中最小的資源分配單位 程序是負責圈資源 執行緒是計算機中能被cpu排程的最小單位 執行緒是負責執行具體 的 執行緒 後面的爬蟲階段經常用 程序 資料分析或者是高計算的程式 協程 非同步的框架 非...
併發程式設計筆記(一)
1.執行緒安全 執行緒安全是指當多個執行緒同時訪問乙個物件 方法 類 的時候,該物件 方法 類 都能表現出正確的行為,那麼就表示是執行緒安全的。2.synchronized關鍵字 synchronized可以加在任意的物件或方法上,我們稱之為互斥區。當多個執行緒訪問互斥區的時候,是按照排隊的形式訪問...
Java併發程式設計一
不要用run 來開啟執行緒,它只會在當前執行緒中,序列執行run 方法中的 建立執行緒時,推薦傳入runnable介面的例項,因為預設的thread.run 就是直接呼叫內部的runnable介面,這樣避免了過載thread.run 因此使用runnable介面來告訴執行緒該做什麼更為合理。publ...