必備的理論基礎:python
#一 操做系統的做用: 1:隱藏醜陋複雜的硬件接口,提供良好的抽象接口 2:管理、調度進程,而且將多個進程對硬件的競爭變得有序 #二 多道技術: 1.產生背景:針對單核,實現併發 ps: 如今的主機通常是多核,那麼每一個核都會利用多道技術 有4個cpu,運行於cpu1的某個程序遇到io阻塞,會等到io結束再從新調度,會被調度到4個 cpu中的任意一個,具體由操做系統調度算法決定。 2.空間上的複用:如內存中同時有多道程序 3.時間上的複用:複用一個cpu的時間片 強調:遇到io切,佔用cpu時間過長也切,核心在於切以前將進程的狀態保存下來,這樣 才能保證下次切換回來時,能基於上次切走的位置繼續運行
進程:正在進行的一個過程或者說一個任務。而負責執行任務則是cpu。程序員
舉例(單核+多道,實現多個進程的併發執行):算法
egon在一個時間段內有不少任務要作:python備課的任務,寫書的任務,交女友的任務,王者榮耀上分的任務, 多線程
但egon同一時刻只能作一個任務(cpu同一時間只能幹一個活),如何才能玩出多個任務併發執行的效果?併發
egon備一會課,再去跟李傑的女友聊聊天,再去打一會王者榮耀....這就保證了每一個任務都在進行中.spa
程序僅僅只是一堆代碼而已,而進程指的是程序的運行過程。操作系統
舉例:線程
想象一位有一手好廚藝的計算機科學家egon正在爲他的女兒元昊烘製生日蛋糕。設計
他有作生日蛋糕的食譜,code
廚房裏有所需的原料:麪粉、雞蛋、韭菜,蒜泥等。
在這個比喻中:
作蛋糕的食譜就是程序(即用適當形式描述的算法)
計算機科學家就是處理器(cpu)
而作蛋糕的各類原料就是輸入數據。
進程就是廚師閱讀食譜、取來各類原料以及烘製蛋糕等一系列動做的總和。
如今假設計算機科學家egon的兒子alex哭着跑了進來,說:XXXXXXXXXXXXXX。
科學家egon想了想,處理兒子alex蟄傷的任務比給女兒元昊作蛋糕的任務更重要,因而
計算機科學家就記錄下他照着食譜作到哪兒了(保存進程的當前狀態),而後拿出一本急救手冊,按照其中的指示處理蟄傷。這裏,咱們看處處理機從一個進程(作蛋糕)切換到另外一個高優先級的進程(實施醫療救治),每一個進程擁有各自的程序(食譜和急救手冊)。當蜜蜂蟄傷處理完以後,這位計算機科學家又回來作蛋糕,從他
離開時的那一步繼續作下去。
須要強調的是:同一個程序執行兩次,那也是兩個進程
在傳統操做系統中,每一個進程有一個地址空間,並且默認就有一個控制線程
線程顧名思義,就是一條流水線工做的過程,一條流水線必須屬於一個車間,一個車間的工做過程是一個進程
車間負責把資源整合到一塊兒,是一個資源單位,而一個車間內至少有一個流水線
流水線的工做須要電源,電源就至關於cpu
因此,進程只是用來把資源集中到一塊兒(進程只是一個資源單位,或者說資源集合),而線程纔是cpu上的執行單位。
多線程(即多個控制線程)的概念是,在一個進程中存在多個控制線程,多個控制線程共享該進程的地址空間,至關於一個車間內有多條流水線,都共用一個車間的資源。
例如,北京地鐵與上海地鐵是不一樣的進程,而北京地鐵裏的13號線是一個線程,北京地鐵全部的線路共享北京地鐵全部的資源,好比全部的乘客能夠被全部線路拉。
建立進程的開銷要遠大於線程?
若是咱們的軟件是一個工廠,該工廠有多條流水線,流水線工做須要電源,電源只有一個即cpu(單核cpu)
一個車間就是一個進程,一個車間至少一條流水線(一個進程至少一個線程)
建立一個進程,就是建立一個車間(申請空間,在該空間內建至少一條流水線)
而建線程,就只是在一個車間內造一條流水線,無需申請空間,因此建立開銷小
進程之間是競爭關係,線程之間是協做關係?
車間直接是競爭/搶電源的關係,競爭(不一樣的進程直接是競爭關係,是不一樣的程序員寫的程序運行的,迅雷搶佔其餘進程的網速,360把其餘進程當作病毒乾死)一個車間的不一樣流水線式協同工做的關係(同一個進程的線程之間是合做關係,是同一個程序寫的程序內開啓動,迅雷內的線程是合做關係,不會本身幹本身)