瀑布模型核心思想是按工序將問題化簡,將功能的實現與設計分開,便於分工協做,即採用結構化的分析與設計方法將邏輯實現與物理實現分開。將軟件生命週期劃分爲可行性分析、需求分析、軟件設計、程序編寫、軟件測試和運行維護等六個基本活動,而且規定了它們自上而下、相互銜接的固定次序,如同瀑布流水,逐級下落。html
對於常常變化的項目而言,瀑布模型毫無價值nginx
優勢:階段劃分清晰,各階段人員的職責明確,便於先後活動的銜接,有利於活動的重用和管理程序員
缺點:缺少靈活性,沒法解決需求常常變化的問題算法
用其餘彌補不足:shell
原型化模型:用於解決需求不明確的狀況數據庫
螺旋模型:強調風險分析,特別適合龐大而複雜的、高風險的系統緩存
1.對進程和線程的描述,一下()是正確的安全
A 父進程的全部線程共享相同的地址空間,父進程的全部子進程共享相同的地址空間服務器
B 改變進程裏面主線程的狀態會影響其餘線程的行爲,改變父進程的狀態不會影響其餘子進程網絡
C 多線程會引發死鎖,而多進程則不會
D 以上都不對
D 進程擁有獨立的地址空間,A錯;多進程中父進程與子進程互不會影響,B錯;多線程和多進程都會引發死鎖,通常提及死鎖指的都是進程間的死鎖,C錯。
進程(Process)是應用程序的一次運行活動。從操做系統核心角度來講,進程是操做系統分配和調度系統內存資源、cpu時間片等資源的基本單位,爲正在運行的應用程序提供
運行環境。
線程(Thread)是程序內部有併發性的順序代碼流。是cpu調度資源的最小單元。
單位大小
進程是操做系統分配和調度系統內存資源、cpu時間片 等資源的基本單位;一個進程至少包括一個線程。進程是操做系統資源管理的實體。
線程是cpu調度資源的最小單元。線程是進程的實體。
系統資源分配上
每一個進程都有本身的內存地址空間。
線程沒有本身獨立的內存資源,它只有本身的執行堆棧和局部變量。可是在同屬一個進程的多個線程中他們能夠共享進程的內存
執行過程當中
執行過程當中,進程有內存單元的初始入口點,在存活階段裏擁有獨立的地址空間。
進程是應用程序的一次運行活動,獨立地執行;因此某一個進程崩潰之後,在保護模式下不會影響其餘的進程,健壯性好。
每一個已建立的進程均可以建立進程,建立進程的進程稱爲父進程,被建立的新進程爲子進程,這樣便造成一個進程樹。
父進程與子進程可並行執行;父進程等 待子進程終止執行。父進程終止後,全部的子進程也都必需要終止。
而線程不能獨立地執行,它必須依附在一個運行中的應用程序上。
可是,同一個進程中的多個線程能夠併發地執行,併發性高,系統在數據交換上花費的資源少,運行效率高。
每一個進程裏都會有一個主線程,由它建立其餘線程。
(
在程序設計時,某一個具體的功能模塊能夠經過函數或是線程等不一樣的形式來實現。對於同一進程而言,這些函數、線程都是存在於同一個地址空間下的,並且在執行時,大多隻對與其相關的一些數據進行處理。若是算法存在某種錯誤,將有可能破壞與其同處一個地址空間的其餘一些重要內容,這將形成比較嚴重的後果。爲保護地址空間中的內容能夠考慮將那些須要對地址空間中的數據進行訪問的操做部分放到另一個進程的地址空間中運行,而且只容許其訪問原進程地址空間中的相關數據。
)
共同點
Process和Thread都有生命週期:
create 建立,ready就緒,running運行,waitSleepJoin阻塞,suspend掛起,stoped死亡
解答:
進程間通信的方式: 管道通信,消息隊列,信號量,共享內存,信號,套接字
解答:主要有如下6種:
幾種方式的比較:
線程同步指多個線程同時訪問某資源時,採用一系列的機制以保證同時最多隻能一個線程訪問該資源。線程同步是多線程中必須考慮和解決的問題,由於極可能發生多個線程同時訪問(主要是寫操做)同一資源,若是不進行線程同步,極可能會引發數據混亂,形成線程死鎖等問題;
線程同步的方式:臨界區,互斥對象機制,信號量對象,事件信號
總結比較:
進程間同步的主要方法有原子操做、信號量機制、自旋鎖、管程、會合、分佈式系統等。
若是你的代碼所在的進程中有多個線程在同時運行,而這些線程可能會同時運行這段代碼。若是每次運行結果和單線程運行的結果是同樣的,並且其餘的變量的值也和預期的是同樣的,就是線程安全的。或者說:一個類或者程序所提供的接口對於線程來講是原子操做或者多個線程之間的切換不會致使該接口的執行結果存在二義性,也就是說咱們不用考慮同步的問題。
首先回答死鎖的定義,所謂死鎖就是一個進程集合中的多個進程由於競爭資源,而形成的互相等待現象。
死鎖的緣由:系統資源不足;多個進程的推動順序不合理
死鎖的必要條件:
處理死鎖的策略:
解除死鎖,銀行家算法:http://blog.csdn.net/abigale1011/article/details/6450845/
銀行家算法( banker's algorithm )由 Dijkstra(1065)提出。他將死鎖的問題演示爲一個銀行家貸款的模型。
一個銀行家向一羣客戶發放信用卡,每一個客戶有不一樣的信用額度。每一個客戶能夠提出信用額度內的任意額度的請求,直到額度用完後再一次性還款。銀行家承諾每一個客戶最終都能得到本身須要的額度。
所謂「最終」,是說銀行家能夠先掛起某個額度請求較大的客戶的請求,優先知足小額度的請求,等小額度的請求還款後,再處理掛起的請求。這樣,資金可以永遠流通。
銀行家算法其核心是:保證本身的限額至少不小於一個客戶的限額。
咱們能夠用填表法來快速解決銀行家算法。
創建一個二維表格:每列數據表示每次交易各個參與者的限額。這個表格第一列數據是銀行家是客戶的交易限額,每發生一次交易,增長一列,同時將銀行家和發生交易的客戶的限額減少。直到銀行家的限額小於某個客戶的限額時,交易不能繼續進行。不然便發生死鎖。
例題:
一、操做系統分配資源時的一個重要考慮是避免死鎖的發生.若系統中有同類資源 16 個,由四個進程 P一、P二、P3 和 P4 共享該資源。已知 P一、P二、P三、P4 所需的資源總數分別爲 八、五、九、6。各進程請求資源的次序以下表,若系統採用銀行家算法爲它們分配資源,那麼_(1)__依次申請分配會使系統進入不安全狀態。
進程申請資源的狀況
序號 進程 申請量
1 P1 6
2 P2 4
3 P3 5
4 P4 1
5 P1 1
6 P2 1
A.三、4 B.三、5 C.四、5 D.五、6
答案是c
咱們初始化一個二維表格
到完成第三個請求到達的時候,資源只有一個了。此時只能知足p2的請求。因此,第四個和第五個請求會被系統掛起。第六個請求p2到達後會被處理。等p2事務結束釋放資源後,系統會再處理掛起的請求,這樣就不會發生死鎖。一旦在第三步後將剩下的惟一的一個資源分配給其它的進程,(如請求4或請求5),則請求4和5可能會因須要不止一個資源而繼續等待,則發生了死鎖。(經過表格能夠看出,依次申請到C組時,銀行家的剩餘額度已經不能知足全部的客戶的需求了)
在特定時間內完成特定的任務,實時性與可靠性。
所謂「實時操做系統」,其實是指操做系統工做時,其各類資源能夠根據須要隨時進行動態分配。因爲各類資源能夠進行動態分配,所以,其處理事務的能力較強、速度較快。
對I/O設備的程序輪詢的方式,是早期的計算機系統對I/O設備的一種管理方式。它定時對各類設備輪流詢問一遍有無處理要求。輪流詢問以後,有要求的,則加以處理。在處理I/O設備的要求以後,處理機返回繼續工做。儘管輪詢須要時間,但輪詢要比I/O設備的速度要快得多,因此通常不會發生不能及時處理的問題。固然,再快的處理機,能處理的輸入輸出設備的數量也是有必定限度的。並且,程序輪詢畢竟佔據了CPU至關一部分處理時間,所以,程序輪詢是一種效率較低的方式,在現代計算機系統中已不多應用。
中斷是指在計算機執行期間,系統內發生任何非尋常的或非預期的急需處理事件,使得CPU暫時中斷當前正在執行的程序而轉去執行相應的事件處理程序。待處理完畢後又返回原來被中斷處繼續執行或調度新的進程執行的過程。
輪詢——效率低,等待時間很長,CPU利用率不高。
中斷——容易遺漏一些問題,CPU利用率高。
每一個進程中訪問臨界資源的那段程序稱爲臨界區,每次只准許一個進程進入臨界區,進入後不容許其餘進程進入。
(1)若是有若干進程要求進入空閒的臨界區,一次僅容許一個進程進入;
(2)任什麼時候候,處於臨界區內的進程不可多於一個。如已有進程進入本身的臨界區,則其它全部試圖進入臨界區的進程必須等待;
(3)進入臨界區的進程要在有限時間內退出,以便其它進程能及時進入本身的臨界區;
(4)若是進程不能進入本身的臨界區,則應讓出CPU,避免進程出現「忙等」現象。
操做系統的主要組成部分:進程和線程的管理,存儲管理,設備管理,文件管理。虛擬內存是一些系統頁文件,存放在磁盤上,每一個系統頁文件大小爲4K,物理內存也被分頁,每一個頁大小也爲4K,這樣虛擬頁文件和物理內存頁就能夠對應,實際上虛擬內存就是用於物理內存的臨時存放的磁盤空間。頁文件就是內存頁,物理內存中每頁叫物理頁,磁盤上的頁文件叫虛擬頁,物理頁+虛擬頁就是系統全部使用的頁文件的總和。
頁是信息的物理單位,分頁是爲實現離散分配方式,以消減內存的外零頭,提升內存的利用率;或者說,分頁僅僅是因爲系統管理的須要,而不是用戶的須要。
段是信息的邏輯單位,它含有一組其意義相對完整的信息。分段的目的是爲了能更好的知足用戶的須要。
頁的大小固定且由系統肯定,把邏輯地址劃分爲頁號和頁內地址兩部分,是由機器硬件實現的,於是一個系統只能有一種大小的頁面。段的長度卻不固定,決定於用戶所編寫的程序,一般由編輯程序在對源程序進行編輯時,根據信息的性質來劃分。
分頁的做業地址空間是一維的,即單一的線性空間,程序員只須利用一個記憶符,便可表示一地址。分段的做業地址空間是二維的,程序員在標識一個地址時,既需給出段名,又需給出段內地址。
顯示文件目錄命令ls 如ls
改變當前目錄命令cd 如cd /home
創建子目錄mkdir 如mkdir xiong
刪除子目錄命令rmdir 如rmdir /mnt/cdrom
刪除文件命令rm 如rm /ucdos.bat
文件複製命令cp 如cp /ucdos /fox
獲取幫助信息命令man 如man ls
顯示文件的內容less 如less mwm.lx
重定向與管道type 如type readme>>direct,將文件readme的內容追加到文direct中
-rw-r--r--那個是權限符號,總共是- --- --- ---這幾個位。
第一個短橫處是文件類型識別符:-表示普通文件;c表示字符設備(character);b表示塊設備(block);d表示目錄(directory);l表示連接文件(link);後面第一個三個連續的短橫是用戶權限位(User),第二個三個連續短橫是組權限位(Group),第三個三個連續短橫是其餘權限位(Other)。每一個權限位有三個權限,r(讀權限),w(寫權限),x(執行權限)。若是每一個權限位都有權限存在,那麼滿權限的狀況就是:-rwxrwxrwx;權限爲空的狀況就是- --- --- ---。
權限的設定能夠用chmod命令,其格式位:chmod ugoa+/-/=rwx filename/directory。例如:
一個文件aaa具備徹底空的權限- --- --- ---。
chmod u+rw aaa(給用戶權限位設置讀寫權限,其權限表示爲:- rw- --- ---)
chmod g+r aaa(給組設置權限爲可讀,其權限表示爲:- --- r-- ---)
chmod ugo+rw aaa(給用戶,組,其它用戶或組設置權限爲讀寫,權限表示爲:- rw- rw- rw-)
若是aaa具備滿權限- rwx rwx rwx。
chmod u-x aaa(去掉用戶可執行權限,權限表示爲:- rw- rwx rwx)
若是要給aaa賦予制定權限- rwx r-x r-x,命令爲:
chmod u=rwx,go=rx aaa
一個工程中的源文件不可勝數,其按類型、功能、模塊分別放在若干個目錄中。makefile定義了一系列的規則來指定哪些文件須要先編譯,哪些文件須要後編譯,哪些文件須要從新編譯,甚至於進行更復雜的功能操做。由於makefile就像一個Shell腳本同樣,其中也能夠執行操做系統的命令。makefile帶來的好處就是——「自動化編譯」。一旦寫好,只須要一個make命令,整個工程徹底自動編譯,極大地提升了軟件開發的效率。make是一個命令工具,是一個解釋makefile中指令的命令工具。通常來講,大多數的IDE都有這個命令,好比:Delphi的make,Visual C++的nmake,Linux下GNU的make。可見,makefile都成爲了一種在工程方面的編譯方法。
緩衝區溢出是指當計算機向緩衝區內填充數據時超過了緩衝區自己的容量,溢出的數據覆蓋在合法數據上。
危害:在當前網絡與分佈式系統安全中,被普遍利用的50%以上都是緩衝區溢出,其中最著名的例子是1988年利用fingerd漏洞的蠕蟲。而緩衝區溢出中,最爲危險的是堆棧溢出,由於入侵者能夠利用堆棧溢出,在函數返回時改變返回程序的地址,讓其跳轉到任意地址,帶來的危害一種是程序崩潰致使拒絕服務,另一種就是跳轉而且執行一段惡意代碼,好比獲得shell,而後隨心所欲。經過往程序的緩衝區寫超出其長度的內容,形成緩衝區的溢出,從而破壞程序的堆棧,使程序轉而執行其它指令,以達到攻擊的目的。
形成緩衝區溢出的主緣由是程序中沒有仔細檢查用戶輸入的參數。
http://blog.csdn.net/luyafei_89430/article/details/12971171
1、先來先服務和短做業(進程)優先調度算法
1.先來先服務調度算法
2.短做業(進程)優先調度算法
2、高優先權優先調度算法
1.優先權調度算法,包括非搶佔式優先權算法、搶佔式優先權調度算法(強調系統的實時性,實時比較優先級)
2.高響應比優先調度算法,優先權=(等待時間+要求服務時間)/要求服務時間
(1) 若是做業的等待時間相同,則要求服務的時間愈短,其優先權愈高,於是該算法有利於短做業。
(2) 當要求服務的時間相同時,做業的優先權決定於其等待時間,等待時間愈長,其優先權愈高,於是它實現的是先來先服務。
(3) 對於長做業,做業的優先級能夠隨等待時間的增長而提升,當其等待時間足夠長時,其優先級即可升到很高,從而也可得到處理機。簡言之,該算法既照顧了短做業,又考慮了做業到達的前後次序,不會使長做業長期得不到服務。所以,該算法實現了一種較好的折衷。固然,在利用該算法時,每要進行調度以前,都須先作響應比的計算,這會增長系統開銷。
3、基於時間片的輪轉調度算法
1.時間片輪轉法
2.多級反饋隊列調度算法,
多級反饋隊列調度算法則沒必要事先知道各類進程所需的執行時間,並且還能夠知足各類類型進程的須要,於是它是目前被公認的一種較好的進程調度算法。
(1) 應設置多個就緒隊列,併爲各個隊列賦予不一樣的優先級。第一個隊列的優先級最高,第二個隊列次之,其他各隊列的優先權逐個下降。該算法賦予各個隊列中進程執行時間片的大小也各不相同,在優先權愈高的隊列中,爲每一個進程所規定的執行時間片就愈小。例如,第二個隊列的時間片要比第一個隊列的時間片長一倍,……,第i+1個隊列的時間片要比第i個隊列的時間片長一倍。
(2) 當一個新進程進入內存後,首先將它放入第一隊列的末尾,按FCFS原則排隊等待調度。當輪到該進程執行時,如它能在該時間片內完成,即可準備撤離系統;若是它在一個時間片結束時還沒有完成,調度程序便將該進程轉入第二隊列的末尾,再一樣地按FCFS原則等待調度執行;若是它在第二隊列中運行一個時間片後仍未完成,再依次將它放入第三隊列,……,如此下去,當一個長做業(進程)從第一隊列依次降到第n隊列後,在第n 隊列便採起按時間片輪轉的方式運行。
(3) 僅當第一隊列空閒時,調度程序才調度第二隊列中的進程運行;僅當第1~(i-1)隊列均空時,纔會調度第i隊列中的進程運行。若是處理機正在第i隊列中爲某進程服務時,又有新進程進入優先權較高的隊列(第1~(i-1)中的任何一個隊列),則此時新進程將搶佔正在運行進程的處理機,即由調度程序把正在運行的進程放回到第i隊列的末尾,把處理機分配給新到的高優先權進程。
線程是輕量級的,它本身不擁有系統資源,可是咱們知道線程執行時候是能夠操做硬盤的文件,也能夠操做內存的數據,那麼這些被線程操做的資源從哪裏來的呢?
答案:線程用的進程的資源
線程的特色:
線程的運做流程: 線程建立 線程執行 線程銷燬
咱們就會發現線程的建立過程和線程的銷燬過程實際上是和處理請求的邏輯無關,可是一個線程又必須經歷這三個階段,所以線程建立的時間和線程銷燬的時間也會被統計到請求處理時間裏,那麼咱們就會想有沒有辦法能夠消除線程建立和銷燬所花的時間對請求處理的影響呢?目標就是減小線程建立和銷燬的時間
咱們但願請求處理流程只是做用在線程執行這塊,那麼在實際的生產實踐裏咱們又是如何來解決這個問題了?解決方案就是使用線程池技術,線程池技術就是基於線程建立和銷燬操做影響性能的角度來設計的,不過線程池技術並不是簡單的事先建立好一批線程,而後統一銷燬一批線程那麼簡單.
舉例分析JDK的線程池
JDK的線程池對線程池的大小設定了兩個參數,一個是核心線程個數,一個是最大線程個數
(線程數量根據實際請求狀況,這樣充分利用了計算機資源, 又避免了資源浪費)
(使得線程池裏線程的數量在一個合理的範圍內)
5 隊列機制。對處理不過來的請求排隊等待,當某個線程處理完畢時,該線程會從這個隊列裏面取出一個請求進行處理
(避免請求的丟失)
6 拒絕策略。若是隊列容量超出了計算機的處理能力,隊列會拋棄沒法處理的請求。
7….JDK還有不少隊列策略
由上面對JDK自帶線程池的介紹,咱們發現使用線程池咱們要考慮以下的問題,具體以下:
問題三的我在介紹JDK裏線程池的設計方案時候已經提到了,解決方法就是當業務方要求超出臨界值時候,具體就是超出線程池最大線程數的時候,咱們用一個隊列先緩存這些請求,等線程池裏的線程空閒出來後,再去從隊列裏取出業務請求交付給線程進行處理。
至於問題一和問題二,這個就和多線程的技術相關了,爲了更好的解答它,我這裏先來介紹下多線程技術。
計算機多線程的時間片問題:
有一個線程被分配到的時間片長度是10毫秒,若是這個線程沒有其餘干擾,它執行完畢須要花費50毫秒,那就等於要執行5次時間片,假如咱們再新增了一個線程,該線程時間片也是10毫秒,也要執行50毫秒才能執行完畢,那麼其中一個線程執行完一次時間片,按照輪詢機制另一個線程也要被執行,最後咱們就會發現第一個線程執行時間就變成了100毫秒,若是咱們再加上CPU的調度所花的時間,該線程的執行時間就會遠遠大於100毫秒,雖然100多毫秒人的感官是很難覺察到,可是這個作法畢竟讓單個線程的執行效率大幅度下降了,若是咱們線程開啓的更多,那麼單個線程執行效率也就會變得更低。
有了這個結論咱們再去看看線程池問題一和問題二,若是咱們一開始建立了太多線程,並且這些線程大部分都會被閒置,那麼這些閒置的線程就會讓有效線程的執行效率大大下降,同時閒置的線程還會消耗系統資源,而這些被消耗的系統資源都沒有用到業務處理上,因此成熟的線程池方案就會設計核心線程和最大線程的概念,它們可讓線程池根據實際業務需求和系統負載能力作到動態調節,這樣就能夠減小開啓更多線程影響線程執行效率的問題,也可讓計算機的系統資源獲得更加有效的利用。
C10K的目標
業界有一個C10K的目標,所謂c10k問題,指的是服務器同時支持成千上萬個客戶端的問題,也就是concurrent 10 000 connection(這也是c10k這個名字的由來)。
通常Apache最多支持5000個客戶端的併發請求,並且不會隨着服務器硬件配置的提高有質的改變,並且單個請求的處理能力會降低
而ngnix能夠作到3萬個併發,並且能夠隨服務器配置提高而提高
ngnix的設計
Nginx開發從入門到精通http://tengine.taobao.org/book/#nginx
nginx源碼分析--master和worker進程模型
http://blog.csdn.net/yusiguyuan/article/details/40924415?utm_source=tuicool
《深刻理解Nginx》-陶輝
http://blog.csdn.net/lengzijian/article/details/7349673
nginx模塊的開發門檻還挺高,須要開發者對於服務器的非阻塞調用、事件模型有較深的理解,而若是請求處理時須要有全局化視角時,麻煩的多進程通訊又來了,開發者不能使用簡單的堆分配對象,而要使用nginx_slab管理內存。