更新時間:2020-05-28 16:46:52 來源:動力節點 瀏覽2062次
基礎概念
進程:進程是程序運行資源(包括CPU,內存、IO等)分配的最小單位,有自己的獨立地址空間,是一個具有一定獨立功能的程序在操作系統中的一次執行過程。同一進程中的多個線程共享該進程中的全部系統資源,而進程和進程之間是相互獨立的。
線程:線程是程序執行的最小單位,是CPU調度和分派的基本單位,線程本身基本上不擁有系統資源,只擁有一點在運行中必不可少的資源(如程序計數器,寄存器和棧),線程必須依賴于進程而存在。
CPU時間片輪轉調度:百度百科解釋,時間片輪轉調度是一種最古老,最簡單,最公平且使用最廣的算法。每個進程被分配一個時間段,稱作它的時間片,即該進程允許運行的時間。如果在時間片結束時進程還在運行,則CPU將被剝奪并分配給另一個進程。如果進程在時間片結束前阻塞或結束,則CPU當即進行切換。調度程序所要做的就是維護一張就緒進程列表,當進程用完它的時間片后,它被移到隊列的末尾。
時間片輪轉調度中唯一有趣的一點是時間片的長度。從一個進程切換到另一個進程是需要一定時間的--保存和裝入寄存器值及內存映像,更新各種表格和隊列等。假如進程切換(process switch)-有時稱為上下文切換(context switch),需要5毫秒,再假設時間片設為20毫秒,則在做完20毫秒有用的工作之后,CPU將花費5毫秒來進行進程切換。CPU時間的20%被浪費在了管理開銷上。
為了提高CPU效率,我們可以將時間片設為500毫秒。這時浪費的時間只有1%。但考慮在一個分時系統中,如果有十個交互用戶幾乎同時按下回車鍵,將發生什么情況?假設所有其他進程都用足它們的時間片的話,最后一個不幸的進程不得不等待5秒鐘才獲得運行機會。多數用戶無法忍受一條簡短命令要5秒鐘才能做出響應。同樣的問題在一臺支持多道程序的個人計算機上也會發生。
結論可以歸結如下:時間片設得太短會導致過多的進程切換,降低了CPU效率;而設得太長又可能引起對短的交互請求的響應變差。將時間片設為100毫秒通常是一個比較合理的折中。
并發:假如一個CPU只能分配給一個進程,并發就是指在同一時刻只能有一條指令執行,但多個進程指令被快速的輪換執行,使得在宏觀上具有多個進程同時執行的效果,但在微觀上并不是同時執行的,只是把時間分成若干段,使多個進程快速交替的執行。
并行:并行是指在同一時刻,有多條指令在多個處理器上同時執行。所以無論從微觀還是從宏觀來看,二者都是一起執行的。舉個例子:銀行柜臺辦理業務,假如只有3個窗口,那么同一時刻辦理業務時最多允許的并行人數就為3,其他人就必須的排隊等候,假設每一個窗口10分鐘能辦理一個人,那么可以認為該銀行每10分鐘能并發處理3個人。
并發編程的優勢:由于多核多線程的CPU的誕生,多線程、高并發的編程已經成為程序員的必備技能。并發編程的好處,首先,最直接的體現就是縮短了用戶的響應時間,比如自己系統要同時調用A,B,C三個系統,數據之間沒有依賴,用單線程的方式如下:
多線程調用方式如下:
其次,并發編程更加充分的利用了CPU的資源,減少了CPU的空閑時間,發揮它的運算能力,比如一個4核8線程的CPU,如果只有一個單線程程序在運行,那么意味著有7/8的CPU性能被浪費;最后,可以使代碼模塊化,異步化,避免因為某個環節阻塞導致整個程序阻塞。
并發編程注意事項:
(1)線程之間的安全性,在同一個進程里面的多線程是資源共享的,對共享變量的讀寫,一般都需要考慮線程同步,否則可能影響線程安全;
(2)線程之間的死鎖,所謂死鎖是指兩個或兩個以上的線程在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。比如有一個保險柜和一把鑰匙,甲,乙分別獲得保險柜和鑰匙,這時候甲要打開保險柜就要乙的鑰匙,乙要打開保險柜就要甲的保險柜,2人互相不信任,保險柜就沒法打開,阻塞住了;
(3)線程數太多有可能造成系統創建大量線程而導致消耗完系統內存以及CPU的“過渡切換”,造成系統的死機。
以上就是動力節點java培訓機構的小編針對“編程基礎教程,Java并發編程入門”的內容進行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業老師隨時為你服務。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習