1.進程與線程的概念涂滴,以及為什么要有進程線程,其中有什么區(qū)別评甜,他們各自又是怎么同步的
基本概念:
進程是對運行時程序的封裝旁瘫,是系統(tǒng)進行資源調(diào)度和分配的的基本單位祖凫,實現(xiàn)了操作系統(tǒng)的并發(fā);
線程是進程的子任務(wù)酬凳,是CPU調(diào)度和分派的基本單位惠况,用于保證程序的實時性,實現(xiàn)進程內(nèi)部的并發(fā)宁仔;線程是操作系統(tǒng)可識別的最小執(zhí)行和調(diào)度單位稠屠。每個線程都獨自占用一個虛擬處理器:獨自的寄存器組,指令計數(shù)器和處理器狀態(tài)。每個線程完成不同的任務(wù)权埠,但是共享同一地址空間(也就是同樣的動態(tài)內(nèi)存榨了,映射文件,目標代碼等等)攘蔽,打開的文件隊列和其他內(nèi)核資源龙屉。
區(qū)別:
1.一個線程只能屬于一個進程,而一個進程可以有多個線程满俗,但至少有一個線程转捕。線程依賴于進程而存在。
2.進程在執(zhí)行過程中擁有獨立的內(nèi)存單元唆垃,而多個線程共享進程的內(nèi)存五芝。(資源分配給進程,同一進程的所有線程共享該進程的所有資源辕万。同一進程中的多個線程共享代碼段(代碼和常量)枢步,數(shù)據(jù)段(全局變量和靜態(tài)變量),擴展段(堆存儲)渐尿。但是每個線程擁有自己的棧段醉途,棧段又叫運行時段,用來存放所有局部變量和臨時變量砖茸。)
3.進程是資源分配的最小單位结蟋,線程是CPU調(diào)度的最小單位;
4.系統(tǒng)開銷: 由于在創(chuàng)建或撤消進程時渔彰,系統(tǒng)都要為之分配或回收資源,如內(nèi)存空間推正、I/o設(shè)備等恍涂。因此,操作系統(tǒng)所付出的開銷將顯著地大于在創(chuàng)建或撤消線程時的開銷植榕。類似地再沧,在進行進程切換時,涉及到整個當前進程CPU環(huán)境的保存以及新被調(diào)度運行的進程的CPU環(huán)境的設(shè)置尊残。而線程切換只須保存和設(shè)置少量寄存器的內(nèi)容炒瘸,并不涉及存儲器管理方面的操作∏奚溃可見顷扩,進程切換的開銷也遠大于線程切換的開銷。
5.通信:由于同一進程中的多個線程具有相同的地址空間慰毅,致使它們之間的同步和通信的實現(xiàn)隘截,也變得比較容易。進程間通信IPC,線程間可以直接讀寫進程數(shù)據(jù)段(如全局變量)來進行通信——需要進程同步和互斥手段的輔助婶芭,以保證數(shù)據(jù)的一致性东臀。在有的系統(tǒng)中,線程的切換犀农、同步和通信都無須操作系統(tǒng)內(nèi)核的干預(yù)
6.進程編程調(diào)試簡單可靠性高惰赋,但是創(chuàng)建銷毀開銷大;線程正相反呵哨,開銷小赁濒,切換速度快,但是編程調(diào)試相對復(fù)雜仇穗。
7.進程間不會相互影響 流部;線程一個線程掛掉將導(dǎo)致整個進程掛掉
8.進程適應(yīng)于多核、多機分布纹坐;線程適用于多核
進程間通信的方式:
進程間通信主要包括管道枝冀、系統(tǒng)IPC(包括消息隊列、信號量耘子、信號果漾、共享內(nèi)存等)、以及套接字socket谷誓。
1.管道:
管道主要包括無名管道和命名管道:管道可用于具有親緣關(guān)系的父子進程間的通信绒障,有名管道除了具有管道所具有的功能外,它還允許無親緣關(guān)系進程間的通信
1.1 普通管道PIPE:
1)它是半雙工的(即數(shù)據(jù)只能在一個方向上流動),具有固定的讀端和寫端
2)它只能用于具有親緣關(guān)系的進程之間的通信(也是父子進程或者兄弟進程之間)
3)它可以看成是一種特殊的文件,對于它的讀寫也可以使用普通的read穷蛹、write等函數(shù)玷或。但是它不是普通的文件,并不屬于其他任何文件系統(tǒng),并且只存在于內(nèi)存中。
1.2 命名管道FIFO:
1)FIFO可以在無關(guān)的進程之間交換數(shù)據(jù)
2)FIFO有路徑名與之相關(guān)聯(lián),它以一種特殊設(shè)備文件形式存在于文件系統(tǒng)中
- 系統(tǒng)IPC:
2.1 消息隊列
消息隊列必逆,是消息的鏈接表,存放在內(nèi)核中揽乱。一個消息隊列由一個標識符(即隊列ID)來標記名眉。 (消息隊列克服了信號傳遞信息少,管道只能承載無格式字節(jié)流以及緩沖區(qū)大小受限等特點)具有寫權(quán)限得進程可以按照一定得規(guī)則向消息隊列中添加新信息凰棉;對消息隊列有讀權(quán)限得進程則可以從消息隊列中讀取信息损拢;
特點:
1)消息隊列是面向記錄的,其中的消息具有特定的格式以及特定的優(yōu)先級撒犀。
2)消息隊列獨立于發(fā)送與接收進程探橱。進程終止時申屹,消息隊列及其內(nèi)容并不會被刪除。
3)消息隊列可以實現(xiàn)消息的隨機查詢,消息不一定要以先進先出的次序讀取,也可以按消息的類型讀取隧膏。
2.2 信號量semaphore
信號量(semaphore)與已經(jīng)介紹過的 IPC 結(jié)構(gòu)不同哗讥,它是一個計數(shù)器,可以用來控制多個進程對共享資源的訪問胞枕。信號量用于實現(xiàn)進程間的互斥與同步杆煞,而不是用于存儲進程間通信數(shù)據(jù)。
特點:
1)信號量用于進程間同步腐泻,若要在進程間傳遞數(shù)據(jù)需要結(jié)合共享內(nèi)存决乎。
2)信號量基于操作系統(tǒng)的 PV 操作,程序?qū)π盘柫康牟僮鞫际窃硬僮鳌?br> 3)每次對信號量的 PV 操作不僅限于對信號量值加 1 或減 1派桩,而且可以加減任意正整數(shù)构诚。
4)支持信號量組。
2.3 信號signal
信號是一種比較復(fù)雜的通信方式铆惑,用于通知接收進程某個事件已經(jīng)發(fā)生范嘱。
2.4 共享內(nèi)存(Shared Memory)
它使得多個進程可以訪問同一塊內(nèi)存空間,不同進程可以及時看到對方進程中對共享內(nèi)存中數(shù)據(jù)得更新员魏。這種方式需要依靠某種同步操作丑蛤,如互斥鎖和信號量等
特點:
1)共享內(nèi)存是最快的一種IPC,因為進程是直接對內(nèi)存進行存取
2)因為多個進程可以同時操作撕阎,所以需要進行同步
3)信號量+共享內(nèi)存通常結(jié)合在一起使用受裹,信號量用來同步對共享內(nèi)存的訪問
3.套接字SOCKET:
socket也是一種進程間通信機制,與其他通信機制不同的是虏束,它可用于不同主機之間的進程通信棉饶。
線程間通信的方式:
臨界區(qū):通過多線程的串行化來訪問公共資源或一段代碼,速度快镇匀,適合控制數(shù)據(jù)訪問砰盐;
互斥量Synchronized/Lock:采用互斥對象機制,只有擁有互斥對象的線程才有訪問公共資源的權(quán)限坑律。因為互斥對象只有一個,所以可以保證公共資源不會被多個線程同時訪問
信號量Semphare:為控制具有有限數(shù)量的用戶資源而設(shè)計的囊骤,它允許多個線程在同一時刻去訪問同一個資源晃择,但一般需要限制同一時刻訪問此資源的最大線程數(shù)目。
事件(信號)也物,Wait/Notify:通過通知操作的方式來保持多線程同步宫屠,還可以方便的實現(xiàn)多線程優(yōu)先級的比較操作
2.Linux虛擬地址空間
為了防止不同進程同一時刻在物理內(nèi)存中運行而對物理內(nèi)存的爭奪和踐踏,采用了虛擬內(nèi)存滑蚯。
虛擬內(nèi)存技術(shù)使得不同進程在運行過程中浪蹂,它所看到的是自己獨自占有了當前系統(tǒng)的4G內(nèi)存抵栈。所有進程共享同一物理內(nèi)存,每個進程只把自己目前需要的虛擬內(nèi)存空間映射并存儲到物理內(nèi)存上坤次。 事實上古劲,在每個進程創(chuàng)建加載時,內(nèi)核只是為進程“創(chuàng)建”了虛擬內(nèi)存的布局缰猴,具體就是初始化進程控制表中內(nèi)存相關(guān)的鏈表产艾,實際上并不立即就把虛擬內(nèi)存對應(yīng)位置的程序數(shù)據(jù)和代碼(比如.text .data段)拷貝到物理內(nèi)存中,只是建立好虛擬內(nèi)存和磁盤文件之間的映射就好(叫做存儲器映射)滑绒,等到運行到對應(yīng)的程序時闷堡,才會通過缺頁異常,來拷貝數(shù)據(jù)疑故。還有進程運行過程中杠览,要動態(tài)分配內(nèi)存,比如malloc時纵势,也只是分配了虛擬內(nèi)存踱阿,即為這塊虛擬內(nèi)存對應(yīng)的頁表項做相應(yīng)設(shè)置,當進程真正訪問到此數(shù)據(jù)時吨悍,才引發(fā)缺頁異常扫茅。
請求分頁系統(tǒng)、請求分段系統(tǒng)和請求段頁式系統(tǒng)都是針對虛擬內(nèi)存的育瓜,通過請求實現(xiàn)內(nèi)存與外存的信息置換葫隙。
虛擬內(nèi)存的好處:
1.擴大地址空間;
2.內(nèi)存保護:每個進程運行在各自的虛擬內(nèi)存地址空間躏仇,互相不能干擾對方恋脚。虛存還對特定的內(nèi)存地址提供寫保護,可以防止代碼或數(shù)據(jù)被惡意篡改焰手。
3.公平內(nèi)存分配糟描。采用了虛存之后,每個進程都相當于有同樣大小的虛存空間书妻。
4.當進程通信時船响,可采用虛存共享的方式實現(xiàn)。
5.當不同的進程使用同樣的代碼時躲履,比如庫文件中的代碼见间,物理內(nèi)存中可以只存儲一份這樣的代碼,不同的進程只需要把自己的虛擬內(nèi)存映射過去就可以了工猜,節(jié)省內(nèi)存
6.虛擬內(nèi)存很適合在多道程序設(shè)計系統(tǒng)中使用米诉,許多程序的片段同時保存在內(nèi)存中。當一個程序等待它的一部分讀入內(nèi)存時篷帅,可以把CPU交給另一個進程使用史侣。在內(nèi)存中可以保留多個進程拴泌,系統(tǒng)并發(fā)度提高
7.在程序需要分配連續(xù)的內(nèi)存空間的時候,只需要在虛擬內(nèi)存空間分配連續(xù)空間惊橱,而不需要實際物理內(nèi)存的連續(xù)空間蚪腐,可以利用碎片
虛擬內(nèi)存的代價:
1.虛存的管理需要建立很多數(shù)據(jù)結(jié)構(gòu),這些數(shù)據(jù)結(jié)構(gòu)要占用額外的內(nèi)存
2.虛擬地址到物理地址的轉(zhuǎn)換李皇,增加了指令的執(zhí)行時間削茁。
3.頁面的換入換出需要磁盤I/O,這是很耗時的
4.如果一頁中只有一部分數(shù)據(jù)掉房,會浪費內(nèi)存茧跋。
3.缺頁中斷
malloc()和mmap()等內(nèi)存分配函數(shù),在分配時只是建立了進程虛擬地址空間卓囚,并沒有分配虛擬內(nèi)存對應(yīng)的物理內(nèi)存瘾杭。當進程訪問這些沒有建立映射關(guān)系的虛擬內(nèi)存時,處理器自動觸發(fā)一個缺頁異常哪亿。
缺頁中斷:在請求分頁系統(tǒng)中粥烁,可以通過查詢頁表中的狀態(tài)位來確定所要訪問的頁面是否存在于內(nèi)存中。每當所要訪問的頁面不在內(nèi)存是蝇棉,會產(chǎn)生一次缺頁中斷讨阻,此時操作系統(tǒng)會根據(jù)頁表中的外存地址在外存中找到所缺的一頁,將其調(diào)入內(nèi)存篡殷。
缺頁本身是一種中斷钝吮,與一般的中斷一樣,需要經(jīng)過4個處理步驟:
1板辽、保護CPU現(xiàn)場
2奇瘦、分析中斷原因
3、轉(zhuǎn)入缺頁中斷處理程序進行處理
4劲弦、恢復(fù)CPU現(xiàn)場耳标,繼續(xù)執(zhí)行
但是缺頁中斷是由于所要訪問的頁面不存在于內(nèi)存時,由硬件所產(chǎn)生的一種特殊的中斷邑跪,因此次坡,與一般的中斷存在區(qū)別:
1、在指令執(zhí)行期間產(chǎn)生和處理缺頁中斷信號
2画畅、一條指令在執(zhí)行期間砸琅,可能產(chǎn)生多次缺頁中斷
3、缺頁中斷返回是執(zhí)行產(chǎn)生中斷的一條指令夜赵,而一般的中斷返回是執(zhí)行下一條指令。
4.fork和vfork的區(qū)別
fork的基礎(chǔ)知識:
fork:創(chuàng)建一個和當前進程映像一樣的進程可以通過fork( )系統(tǒng)調(diào)用:
#include <sys/types.h>
#include <unistd.h>
pid_t fork(void);
成功調(diào)用fork( )會創(chuàng)建一個新的進程乡革,它幾乎與調(diào)用fork( )的進程一模一樣寇僧,這兩個進程都會繼續(xù)運行摊腋。在子進程中,成功的fork( )調(diào)用會返回0嘁傀。在父進程中fork( )返回子進程的pid兴蒸。如果出現(xiàn)錯誤,fork( )返回一個負值细办。
最常見的fork( )用法是創(chuàng)建一個新的進程橙凳,然后使用exec( )載入二進制映像,替換當前進程的映像笑撞。這種情況下岛啸,派生(fork)了新的進程,而這個子進程會執(zhí)行一個新的二進制可執(zhí)行文件的映像茴肥。這種“派生加執(zhí)行”的方式是很常見的坚踩。
在早期的Unix系統(tǒng)中,創(chuàng)建進程比較原始瓤狐。當調(diào)用fork時瞬铸,內(nèi)核會把所有的內(nèi)部數(shù)據(jù)結(jié)構(gòu)復(fù)制一份,復(fù)制進程的頁表項础锐,然后把父進程的地址空間中的內(nèi)容逐頁的復(fù)制到子進程的地址空間中嗓节。但從內(nèi)核角度來說,逐頁的復(fù)制方式是十分耗時的〗跃現(xiàn)代的Unix系統(tǒng)采取了更多的優(yōu)化拦宣,例如Linux,采用了寫時復(fù)制的方法耀怜,而不是對父進程空間進程整體復(fù)制恢着。
vfork的基礎(chǔ)知識:
在實現(xiàn)寫時復(fù)制之前,Unix的設(shè)計者們就一直很關(guān)注在fork后立刻執(zhí)行exec所造成的地址空間的浪費财破。BSD的開發(fā)者們在3.0的BSD系統(tǒng)中引入了vfork( )系統(tǒng)調(diào)用掰派。
#include <sys/types.h>
#include <unistd.h>
pid_t vfork(void);
除了子進程必須要立刻執(zhí)行一次對exec的系統(tǒng)調(diào)用,或者調(diào)用_exit( )退出左痢,對vfork( )的成功調(diào)用所產(chǎn)生的結(jié)果和fork( )是一樣的靡羡。vfork( )會掛起父進程直到子進程終止或者運行了一個新的可執(zhí)行文件的映像。通過這樣的方式俊性,vfork( )避免了地址空間的按頁復(fù)制略步。在這個過程中,父進程和子進程共享相同的地址空間和頁表項定页。實際上vfork( )只完成了一件事:復(fù)制內(nèi)部的內(nèi)核數(shù)據(jù)結(jié)構(gòu)趟薄。因此,子進程也就不能修改地址空間中的任何內(nèi)存典徊。
vfork( )是一個歷史遺留產(chǎn)物杭煎,Linux本不應(yīng)該實現(xiàn)它恩够。需要注意的是,即使增加了寫時復(fù)制羡铲,vfork( )也要比fork( )快蜂桶,因為它沒有進行頁表項的復(fù)制。然而也切,寫時復(fù)制的出現(xiàn)減少了對于替換fork( )爭論扑媚。實際上,直到2.2.0內(nèi)核雷恃,vfork( )只是一個封裝過的fork( )疆股。因為對vfork( )的需求要小于fork( ),所以vfork( )的這種實現(xiàn)方式是可行的褂萧。
補充知識點:寫時復(fù)制
Linux采用了寫時復(fù)制的方法押桃,以減少fork時對父進程空間進程整體復(fù)制帶來的開銷。
寫時復(fù)制是一種采取了惰性優(yōu)化方法來避免復(fù)制時的系統(tǒng)開銷导犹。它的前提很簡單:如果有多個進程要讀取它們自己的那部門資源的副本唱凯,那么復(fù)制是不必要的。每個進程只要保存一個指向這個資源的指針就可以了谎痢。只要沒有進程要去修改自己的“副本”磕昼,就存在著這樣的幻覺:每個進程好像獨占那個資源。從而就避免了復(fù)制帶來的負擔节猿。如果一個進程要修改自己的那份資源“副本”票从,那么就會復(fù)制那份資源,并把復(fù)制的那份提供給進程滨嘱。不過其中的復(fù)制對進程來說是透明的峰鄙。這個進程就可以修改復(fù)制后的資源了,同時其他的進程仍然共享那份沒有修改過的資源太雨。所以這就是名稱的由來:在寫入時進行復(fù)制吟榴。
寫時復(fù)制的主要好處在于:如果進程從來就不需要修改資源,則不需要進行復(fù)制囊扳。惰性算法的好處就在于它們盡量推遲代價高昂的操作吩翻,直到必要的時刻才會去執(zhí)行。
在使用虛擬內(nèi)存的情況下锥咸,寫時復(fù)制(Copy-On-Write)是以頁為基礎(chǔ)進行的狭瞎。所以,只要進程不修改它全部的地址空間搏予,那么就不必復(fù)制整個地址空間熊锭。在fork( )調(diào)用結(jié)束后,父進程和子進程都相信它們有一個自己的地址空間,但實際上它們共享父進程的原始頁碗殷,接下來這些頁又可以被其他的父進程或子進程共享劣针。
寫時復(fù)制在內(nèi)核中的實現(xiàn)非常簡單。與內(nèi)核頁相關(guān)的數(shù)據(jù)結(jié)構(gòu)可以被標記為只讀和寫時復(fù)制亿扁。如果有進程試圖修改一個頁,就會產(chǎn)生一個缺頁中斷鸟廓。內(nèi)核處理缺頁中斷的方式就是對該頁進行一次透明復(fù)制从祝。這時會清除頁面的COW屬性,表示著它不再被共享引谜。
現(xiàn)代的計算機系統(tǒng)結(jié)構(gòu)中都在內(nèi)存管理單元(MMU)提供了硬件級別的寫時復(fù)制支持牍陌,所以實現(xiàn)是很容易的。
在調(diào)用fork( )時员咽,寫時復(fù)制是有很大優(yōu)勢的毒涧。因為大量的fork之后都會跟著執(zhí)行exec,那么復(fù)制整個父進程地址空間中的內(nèi)容到子進程的地址空間完全是在浪費時間:如果子進程立刻執(zhí)行一個新的二進制可執(zhí)行文件的映像贝室,它先前的地址空間就會被交換出去契讲。寫時復(fù)制可以對這種情況進行優(yōu)化。
fork和vfork的區(qū)別:
fork( )的子進程拷貝父進程的數(shù)據(jù)段和代碼段滑频;vfork( )的子進程與父進程共享數(shù)據(jù)段
fork( )的父子進程的執(zhí)行次序不確定捡偏;vfork( )保證子進程先運行,在調(diào)用exec或exit之前與父進程數(shù)據(jù)是共享的峡迷,在它調(diào)用exec或exit之后父進程才可能被調(diào)度運行银伟。
vfork( )保證子進程先運行,在它調(diào)用exec或exit之后父進程才可能被調(diào)度運行绘搞。如果在調(diào)用這兩個函數(shù)之前子進程依賴于父進程的進一步動作彤避,則會導(dǎo)致死鎖。
4.當需要改變共享數(shù)據(jù)段中變量的值夯辖,則拷貝父進程琉预。
5.并發(fā)(concurrency)和并行(parallelism)
并發(fā)(concurrency):指宏觀上看起來兩個程序在同時運行,比如說在單核cpu上的多任務(wù)楼雹。但是從微觀上看兩個程序的指令是交織著運行的模孩,你的指令之間穿插著我的指令,我的指令之間穿插著你的贮缅,在單個周期內(nèi)只運行了一個指令榨咐。這種并發(fā)并不能提高計算機的性能,只能提高效率谴供。
并行(parallelism):指嚴格物理意義上的同時運行块茁,比如多核cpu,兩個程序分別運行在兩個核上,兩者之間互不影響数焊,單個周期內(nèi)每個程序都運行了自己的指令永淌,也就是運行了兩條指令。這樣說來并行的確提高了計算機的效率佩耳。所以現(xiàn)在的cpu都是往多核方面發(fā)展遂蛀。
6.有了進程,為什么還要有線程干厚?
線程產(chǎn)生的原因:
進程可以使多個程序能并發(fā)執(zhí)行李滴,以提高資源的利用率和系統(tǒng)的吞吐量;但是其具有一些缺點:
進程在同一時間只能干一件事
進程在執(zhí)行的過程中如果阻塞蛮瞄,整個進程就會掛起所坯,即使進程中有些工作不依賴于等待的資源,仍然不會執(zhí)行挂捅。
因此芹助,操作系統(tǒng)引入了比進程粒度更小的線程,作為并發(fā)執(zhí)行的基本單位闲先,從而減少程序在并發(fā)執(zhí)行時所付出的時空開銷状土,提高并發(fā)性。和進程相比伺糠,線程的優(yōu)勢如下:
從資源上來講声诸,線程是一種非常"節(jié)儉"的多任務(wù)操作方式。在linux系統(tǒng)下退盯,啟動一個新的進程必須分配給它獨立的地址空間彼乌,建立眾多的數(shù)據(jù)表來維護它的代碼段、堆棧段和數(shù)據(jù)段渊迁,這是一種"昂貴"的多任務(wù)工作方式慰照。
從切換效率上來講,運行于一個進程中的多個線程琉朽,它們之間使用相同的地址空間毒租,而且線程間彼此切換所需時間也遠遠小于進程間切換所需要的時間。據(jù)統(tǒng)計箱叁,一個進程的開銷大約是一個線程開銷的30倍左右墅垮。
從通信機制上來講,線程間方便的通信機制耕漱。對不同進程來說算色,它們具有獨立的數(shù)據(jù)空間,要進行數(shù)據(jù)的傳遞只能通過進程間通信的方式進行螟够,這種方式不僅費時灾梦,而且很不方便峡钓。線程則不然,由于同一進城下的線程之間貢獻數(shù)據(jù)空間若河,所以一個線程的數(shù)據(jù)可以直接為其他線程所用能岩,這不僅快捷,而且方便萧福。
除以上優(yōu)點外拉鹃,多線程程序作為一種多任務(wù)、并發(fā)的工作方式鲫忍,還有如下優(yōu)點:
1毛俏、使多CPU系統(tǒng)更加有效。操作系統(tǒng)會保證當線程數(shù)不大于CPU數(shù)目時饲窿,不同的線程運行于不同的CPU上。
2焕蹄、改善程序結(jié)構(gòu)逾雄。一個既長又復(fù)雜的進程可以考慮分為多個線程,成為幾個獨立或半獨立的運行部分腻脏,這樣的程序才會利于理解和修改鸦泳。
7.搜索baidu,會用到計算機網(wǎng)絡(luò)中的什么層永品?每層是干什么的
瀏覽器中輸入URL
瀏覽器要將URL解析為IP地址做鹰,解析域名就要用到DNS協(xié)議,首先主機會查詢DNS的緩存鼎姐,如果沒有就給本地DNS發(fā)送查詢請求钾麸。DNS查詢分為兩種方式,一種是遞歸查詢炕桨,一種是迭代查詢饭尝。如果是迭代查詢,本地的DNS服務(wù)器献宫,向根域名服務(wù)器發(fā)送查詢請求钥平,根域名服務(wù)器告知該域名的一級域名服務(wù)器,然后本地服務(wù)器給該一級域名服務(wù)器發(fā)送查詢請求姊途,然后依次類推直到查詢到該域名的IP地址涉瘾。DNS服務(wù)器是基于UDP的,因此會用到UDP協(xié)議捷兰。
得到IP地址后立叛,瀏覽器就要與服務(wù)器建立一個http連接。因此要用到http協(xié)議贡茅,http協(xié)議報文格式上面已經(jīng)提到囚巴。http生成一個get請求報文,將該報文傳給TCP層處理,所以還會用到TCP協(xié)議彤叉。如果采用https還會使用https協(xié)議先對http數(shù)據(jù)進行加密庶柿。TCP層如果有需要先將HTTP數(shù)據(jù)包分片,分片依據(jù)路徑MTU和MSS秽浇。TCP的數(shù)據(jù)包然后會發(fā)送給IP層浮庐,用到IP協(xié)議。IP層通過路由選路柬焕,一跳一跳發(fā)送到目的地址审残。當然在一個網(wǎng)段內(nèi)的尋址是通過以太網(wǎng)協(xié)議實現(xiàn)(也可以是其他物理層協(xié)議,比如PPP斑举,SLIP)搅轿,以太網(wǎng)協(xié)議需要直到目的IP地址的物理地址,有需要ARP協(xié)議富玷。
其中:
1璧坟、DNS協(xié)議,http協(xié)議赎懦,https協(xié)議屬于應(yīng)用層
應(yīng)用層是體系結(jié)構(gòu)中的最高層雀鹃。應(yīng)用層確定進程之間通信的性質(zhì)以滿足用戶的需要。這里的進程就是指正在運行的程序励两。應(yīng)用層不僅要提供應(yīng)用進程所需要的信息交換和遠地操作黎茎,而且還要作為互相作用的應(yīng)用進程的用戶代理,來完成一些為進行語義上有意義的信息交換所必須的功能当悔。應(yīng)用層直接為用戶的應(yīng)用進程提供服務(wù)傅瞻。
2、TCP/UDP屬于傳輸層
8.常用線程模型
1盲憎、Future模型
該模型通常在使用的時候需要結(jié)合Callable接口配合使用俭正。
Future是把結(jié)果放在將來獲取,當前主線程并不急于獲取處理結(jié)果焙畔。允許子線程先進行處理一段時間掸读,處理結(jié)束之后就把結(jié)果保存下來,當主線程需要使用的時候再向子線程索取宏多。
Callable是類似于Runnable的接口儿惫,其中call方法類似于run方法,所不同的是run方法不能拋出受檢異常沒有返回值伸但,而call方法則可以拋出受檢異常并可設(shè)置返回值肾请。兩者的方法體都是線程執(zhí)行體。
2更胖、fork&join模型
該模型包含遞歸思想和回溯思想铛铁,遞歸用來拆分任務(wù)隔显,回溯用合并結(jié)果《穑可以用來處理一些可以進行拆分的大任務(wù)括眠。其主要是把一個大任務(wù)逐級拆分為多個子任務(wù),然后分別在子線程中執(zhí)行倍权,當每個子線程執(zhí)行結(jié)束之后逐級回溯掷豺,返回結(jié)果進行匯總合并,最終得出想要的結(jié)果薄声。
這里模擬一個摘蘋果的場景:有100棵蘋果樹当船,每棵蘋果樹有10個蘋果,現(xiàn)在要把他們摘下來默辨。為了節(jié)約時間德频,規(guī)定每個線程最多只能摘10棵蘋樹以便于節(jié)約時間。各個線程摘完之后匯總計算總蘋果樹缩幸。
3壹置、actor模型
actor模型屬于一種基于消息傳遞機制并行任務(wù)處理思想,它以消息的形式來進行線程間數(shù)據(jù)傳輸桌粉,避免了全局變量的使用,進而避免了數(shù)據(jù)同步錯誤的隱患衙四。actor在接受到消息之后可以自己進行處理铃肯,也可以繼續(xù)傳遞(分發(fā))給其它actor進行處理。在使用actor模型的時候需要使用第三方Akka提供的框架传蹈。
4押逼、生產(chǎn)者消費者模型
生產(chǎn)者消費者模型都比較熟悉,其核心是使用一個緩存來保存任務(wù)惦界。開啟一個/多個線程來生產(chǎn)任務(wù)挑格,然后再開啟一個/多個來從緩存中取出任務(wù)進行處理。這樣的好處是任務(wù)的生成和處理分隔開沾歪,生產(chǎn)者不需要處理任務(wù)漂彤,只負責向生成任務(wù)然后保存到緩存。而消費者只需要從緩存中取出任務(wù)進行處理灾搏。使用的時候可以根據(jù)任務(wù)的生成情況和處理情況開啟不同的線程來處理挫望。比如,生成的任務(wù)速度較快狂窑,那么就可以靈活的多開啟幾個消費者線程進行處理媳板,這樣就可以避免任務(wù)的處理響應(yīng)緩慢的問題。
5泉哈、master-worker模型
master-worker模型類似于任務(wù)分發(fā)策略蛉幸,開啟一個master線程接收任務(wù)破讨,然后在master中根據(jù)任務(wù)的具體情況進行分發(fā)給其它worker子線程,然后由子線程處理任務(wù)奕纫。如需返回結(jié)果提陶,則worker處理結(jié)束之后把處理結(jié)果返回給master。
傳輸層的任務(wù)就是負責主機中兩個進程之間的通信若锁。因特網(wǎng)的傳輸層可使用兩種不同協(xié)議:即面向連接的傳輸控制協(xié)議TCP搁骑,和無連接的用戶數(shù)據(jù)報協(xié)議UDP。面向連接的服務(wù)能夠提供可靠的交付又固,但無連接服務(wù)則不保證提供可靠的交付仲器,它只是“盡最大努力交付”。這兩種服務(wù)方式都很有用仰冠,備有其優(yōu)缺點乏冀。在分組交換網(wǎng)內(nèi)的各個交換結(jié)點機都沒有傳輸層。
3洋只、IP協(xié)議辆沦,ARP協(xié)議屬于網(wǎng)絡(luò)層
網(wǎng)絡(luò)層負責為分組交換網(wǎng)上的不同主機提供通信。在發(fā)送數(shù)據(jù)時识虚,網(wǎng)絡(luò)層將運輸層產(chǎn)生的報文段或用戶數(shù)據(jù)報封裝成分組或包進行傳送肢扯。在TCP/IP體系中,分組也叫作IP數(shù)據(jù)報担锤,或簡稱為數(shù)據(jù)報蔚晨。網(wǎng)絡(luò)層的另一個任務(wù)就是要選擇合適的路由,使源主機運輸層所傳下來的分組能夠交付到目的主機肛循。
4铭腕、數(shù)據(jù)鏈路層
當發(fā)送數(shù)據(jù)時,數(shù)據(jù)鏈路層的任務(wù)是將在網(wǎng)絡(luò)層交下來的IP數(shù)據(jù)報組裝成幀多糠,在兩個相鄰結(jié)點間的鏈路上傳送以幀為單位的數(shù)據(jù)累舷。每一幀包括數(shù)據(jù)和必要的控制信息(如同步信息、地址信息夹孔、差錯控制被盈、以及流量控制信息等)〈钌耍控制信息使接收端能夠知道—個幀從哪個比特開始和到哪個比特結(jié)束害捕。控制信息還使接收端能夠檢測到所收到的幀中有無差錯闷畸。
5尝盼、物理層
物理層的任務(wù)就是透明地傳送比特流。在物理層上所傳數(shù)據(jù)的單位是比特佑菩。傳遞信息所利用的一些物理媒體盾沫,如雙絞線裁赠、同軸電纜、光纜等赴精,并不在物理層之內(nèi)而是在物理層的下面佩捞。因此也有人把物理媒體當做第0層。