java實習–每天打卡十道面試題!
1、什麼是ARQ協議
自動重傳請求(Automatic Repeat-reQuest,ARQ)是OSI模型中數據鏈路層和傳輸層的錯誤糾正協議之一。它通過使用確認和超時這兩個機制,在不可靠服務的基礎上實現可靠的信息傳輸。如果發送方在發送後一段時間之內沒有收到確認幀,它通常會重新發送。ARQ包括停止等待ARQ協議和連續ARQ協議。
停止等待ARQ協議
停止等待協議是為瞭實現可靠傳輸的,它的基本原理就是每發完一個分組就停止發送,等待對方確認(回復ACK)。如果過瞭一段時間(超時時間後),還是沒有收到 ACK 確認,說明沒有發送成功,需要重新發送,直到收到確認後再發下一個分組。
在停止等待協議中,若接收方收到重復分組,就丟棄該分組,但同時還要發送確認。
優缺點:
- 優點: 簡單
- 缺點: 信道利用率低,等待時間長
1) 無差錯情況:
發送方發送分組,接收方在規定時間內收到,並且回復確認.發送方再次發送。
2) 出現差錯情況(超時重傳):
停止等待協議中超時重傳是指隻要超過一段時間仍然沒有收到確認,就重傳前面發送過的分組(認為剛才發送過的分組丟失瞭)。因此每發送完一個分組需要設置一個超時計時器,其重傳時間應比數據在分組傳輸的平均往返時間更長一些。這種自動重傳方式常稱為 自動重傳請求 ARQ 。另外在停止等待協議中若收到重復分組,就丟棄該分組,但同時還要發送確認。連續 ARQ 協議 可提高信道利用率。發送維持一個發送窗口,凡位於發送窗口內的分組可連續發送出去,而不需要等待對方確認。接收方一般采用累積確認,對按序到達的最後一個分組發送確認,表明到這個分組位置的所有分組都已經正確收到瞭。
3) 確認丟失和確認遲到
- 確認丟失 :確認消息在傳輸過程丟失。當A發送M1消息,B收到後,B向A發送瞭一個M1確認消息,但卻在傳輸過程中丟失。而A並不知道,在超時計時過後,A重傳M1消息,B再次收到該消息後采取以下兩點措施:1. 丟棄這個重復的M1消息,不向上層交付。 2. 向A發送確認消息。(不會認為已經發送過瞭,就不再發送。A能重傳,就證明B的確認消息丟失)。
- 確認遲到 :確認消息在傳輸過程中遲到。A發送M1消息,B收到並發送確認。在超時時間內沒有收到確認消息,A重傳M1消息,B仍然收到並繼續發送確認消息(B收到瞭2份M1)。此時A收到瞭B第二次發送的確認消息。接著發送其他數據。過瞭一會,A收到瞭B第一次發送的對M1的確認消息(A也收到瞭2份確認消息)。處理如下:1. A收到重復的確認後,直接丟棄。2. B收到重復的M1後,也直接丟棄重復的M1。 連續ARQ協議
連續 ARQ 協議
可提高信道利用率。發送方維持一個發送窗口,凡位於發送窗口內的分組可以連續發送出去,而不需要等待對方確認。接收方一般采用累計確認,對按序到達的最後一個分組發送確認,表明到這個分組為止的所有分組都已經正確收到瞭。
優缺點:
- 優點: 信道利用率高,容易實現,即使確認丟失,也不必重傳。
- 缺點: 不能向發送方反映出接收方已經正確收到的所有分組的信息。 比如:發送方發送瞭 5條 消息,中間第三條丟失(3號),這時接收方隻能對前兩個發送確認。發送方無法知道後三個分組的下落,而隻好把後三個全部重傳一次。這也叫 Go-Back-N(回退 N),表示需要退回來重傳已經發送過的 N 個消息。
2、HTTPS的加密、解密的過程
我們都知道HTTPS能夠加密信息,以免敏感信息被第三方獲取。所以很多銀行網站或電子郵箱等等安全級別較高的服務都會采用HTTPS 協議。HTTPS其實是有兩部分組成:HTTP + SSL / TLS,也就是在HTTP上又加瞭一層處理加密信息的模塊。服務端和客戶端的信息傳輸都會通過TLS進行加密,所以傳輸的數據都是加密後的數據。
1. 客戶端發起HTTPS請求
這個沒什麼好說的,就是用戶在瀏覽器裡輸入一個https網址,然後連接到server的443端口。
2. 服務端的配置
采用HTTPS協議的服務器必須要有一套數字證書,可以自己制作,也可以向組織申請。區別就是自己頒發的證書需要客戶端驗證通過,才可以繼續訪問,而使用受信任的公司申請的證書則不會彈出提示頁面(startssl就是個不錯的選擇,有1年的免費服務)。這套證書其實就是一對公鑰和私鑰。如果對公鑰和私鑰不太理解,可以想象成一把鑰匙和一個鎖頭,隻是全世界隻有你一個人有這把鑰匙,你可以把鎖頭給別人,別人可以用這個鎖把重要的東西鎖起來,然後發給你,因為隻有你一個人有這把鑰匙,所以隻有你才能看到被這把鎖鎖起來的東西。
3. 傳送證書
這個證書其實就是公鑰,隻是包含瞭很多信息,如證書的頒發機構,過期時間等等。
4. 客戶端解析證書
這部分工作是有客戶端的TLS來完成的,首先會驗證公鑰是否有效,比如頒發機構,過期時間等等,如果發現異常,則會彈出一個警告框,提示證書存在問題。如果證書沒有問題,那麼就生成一個隨即值。然後用證書對該隨機值進行加密。就好像上面說的,把隨機值用鎖頭鎖起來,這樣除非有鑰匙,不然看不到被鎖住的內容。
5. 傳送加密信息
這部分傳送的是用證書加密後的隨機值,目的就是讓服務端得到這個隨機值,以後客戶端和服務端的通信就可以通過這個隨機值來進行加密解密瞭。
6. 服務段解密信息
服務端用私鑰解密後,得到瞭客戶端傳過來的隨機值(私鑰),然後把內容通過該值進行對稱加密。所謂對稱加密就是,將信息和私鑰通過某種算法混合在一起,這樣除非知道私鑰,不然無法獲取內容,而正好客戶端和服務端都知道這個私鑰,所以隻要加密算法夠彪悍,私鑰夠復雜,數據就夠安全。
7. 傳輸加密後的信息
這部分信息是服務段用私鑰加密後的信息,可以在客戶端被還原
8. 客戶端解密信息
客戶端用之前生成的私鑰解密服務段傳過來的信息,於是獲取瞭解密後的內容。整個過程第三方即使監聽到瞭數據,也束手無策。
總結:
HTTPS 之所以保證數據可以安全保密傳輸,就是在建立 TCP 三次握手之後,還需要進行一次 SSL/TCL 加解密流程:(包含對稱加密和非對稱加密)
- 客戶使用 https 的URL訪問Web服務器,要求與Web服務器建立SSL連接。
- 首先服務器端需要向 CA 申請證書(其實就是一對公鑰和私鑰),然後服務端將私鑰保留,將公鑰發送給客戶端。
- 客戶端收到公鑰後,先對公鑰進行驗證(判斷是否過期,頒發機構是否存在等)。如果公鑰驗證合法,則客戶端生成一個 隨機值(作為對稱加密的密鑰),並將其通過公鑰加密後傳遞給服務器端。
- 服務器端收到這個 被公鑰加密的隨機值 後,使用私鑰對其進行解密,獲取這一隨機值。之後,客戶端和服務器端進行數據通信時,就可以通過這一隨機值作為密鑰,對稱加密解密要傳輸的數據!(所謂對稱加密就是,將信息和密鑰通過某種算法混合在一起,這樣除非知道密鑰,不然無法獲取傳輸的內容)
什麼是數字證書?
作用:解決身份認證問題。
過程:借助第三方權威機構 CA(數字證書認證機構),將服務器公鑰放在數字證書(由數字證書認證機構辦法)中,隻要證書是可信的,公鑰就是可信的。
3、深入理解三次握手、四次揮手流程
兩張動圖–帶你搞懂TCP的三次握手與四次揮手
4、Spring AOP 如何實現(實現原理)
Sprign AOP 本質是通過動態代理來實現的(JDK動態代理、CGLIB動態代理),利用截取消息的方式,對該消息進行裝飾,以取代原有對象。主要有以下幾個步驟。
1、獲取增強器,(例如被 Aspect 註解修飾的類)。
2、在創建每一個 bean 時,會檢查是否有增強器能應用於這個 bean,簡單理解就是該 bean 是否在該增強器指定的 execution 表達式中。如果是,則將增強器作為攔截器參數,使用動態代理創建 bean 的代理對象實例。
3、當我們調用被增強過的 bean 時,就會走到代理類中,從而可以觸發增強器,本質跟攔截器類似。
Spring 的 AOP 有哪幾種創建代理的方式?
Spring 中的 AOP 目前支持 JDK 動態代理和 Cglib 代理。
通常來說:如果被代理對象實現瞭接口,則使用 JDK 動態代理,否則使用 Cglib 代理。另外,也可以通過指定 proxyTargetClass=true
來實現強制走 Cglib 代理。
JDK 動態代理和 Cglib 代理的區別?
1、JDK 動態代理本質上是實現瞭被代理對象的接口,而 Cglib 本質上是繼承瞭被代理對象,覆蓋其中的方法。
2、JDK 動態代理隻能對實現瞭接口的類生成代理,Cglib 則沒有這個限制。但是 Cglib 因為使用繼承實現,所以 Cglib 無法代理被 final 修飾的方法或類。
3、在調用代理方法上,JDK 是通過反射機制調用,Cglib是通過FastClass 機制直接調用。FastClass 簡單的理解,就是使用 index 作為入參,可以直接定位到要調用的方法直接進行調用。
4、在性能上,JDK1.7 之前,由於使用瞭 FastClass 機制,Cglib 在執行效率上比 JDK 快,但是隨著 JDK 動態代理的不斷優化,從 JDK 1.7 開始,JDK 動態代理已經明顯比 Cglib 更快瞭。
5、摘要算法:HTTPS如何方式數據發生瞭篡改?
作用:防止數據被篡改。
摘要算法:實現數據完整性,能夠為數據生成獨一無二的指紋,指紋用於校驗數據的完整性,解決瞭被篡改的風險。
過程
1、客戶端發送明文前,會通過摘要算法算出明文的指紋,發送時明文和指紋一同加密,發送給服務器。
2、服務器解密後,用相同的摘要算法算出發送過來的明文,通過比較客戶端攜帶的指紋和當前指紋做比較,若相同,則說明數據是完整的。
6、介紹一下JVM運行時數據區:堆與棧
JVM棧:
JVM棧是線程私有的,每個線程創建的同時都會創建JVM棧,JVM棧中存放的為當前線程中局部基本類型的變量(java中定義的八種基本類型:boolean、char、byte、short、int、long、float、double
), 非基本類型的對象在JVM棧上僅存放一個指向堆上的引用地址,JVM棧的空間是在物理內存上分配的,而不是從堆上分配。 由於JVM棧是線程私有的,因此其在內存分配上非常高效,並且當線程運行完畢後,這些內存也就被自動回收。 當JVM棧的空間不足時,會拋出 StackOverflowError 的錯誤,可以通過 -Xss
來指定棧的大小
堆(Heap) :
Heap是大傢最為熟悉的區域,它是JVM用來存儲對象實例以及數組值的區域,可以認為Java中所有通過 new 創建的對象的內存都在此分配, Heap中的對象的內存需要等待GC進行回收,Heap在 32 位的操作系統上最大為 2G
,在 64 位的操作系統上則沒有限制, 其大小通過 -Xms
和 -Xmx
來控制,-Xms
為JVM啟動時申請的最小Heap內存,默認為物理內存的 1/64
但小於 1G
,-Xmx
為JVM可申請的最大Heap內存,默認為物理內存的 1/4
,默認當空餘堆內存小於 40%
時,JVM會增大Heap的大小到 -Xmx
指定的大小 ,可通過 -XX:MinHeapFreeRatio=
來指定這個比例,當空餘堆內存大於 70%
時,JVM會將Heap的大小往 -Xms
指定的大小調整,可通過 -XX:MaxHeapFreeRatio=
來指定這個比例, 但對於運行系統而言,為瞭避免頻繁的Heap Size的大小,通常都會將 -Xms
和 -Xmx
的值設成一樣,因此這兩個用於調整比例的參數通常是沒用的。其實jvm中對於堆內存的分配、使用、管理、收集等有更為精巧的設計,具體可以在JVM堆內存分析中進行詳細介紹。 當堆中需要使用的內存超過其允許的大小時,會拋出 OutOfMemory 的錯誤信息。
7、強引用,軟引用和弱引用的區別?
在JDK 1.2之後,Java對引用的概念進行瞭擴充,將引用分為強引用(Strong Reference)、軟引用(Soft Reference)、弱引用(Weak Reference)、虛引用(Phantom Reference)四種,這四種引用強度依次逐漸減弱。
- 強引用就是指在程序代碼之中普遍存在的,類似
Object obj = new Object()
這類的引用,隻要強引用還存在,垃圾收集器永遠不會回收掉被引用的對象。 - 軟引用用來描述一些還有用,但並非必需的對象。對於軟引用關聯著的對象,在系統將要發生內存溢出異常之前,將會把這些對象列進回收范圍之中並進行第二次回收。如果這次回收還是沒有足夠的內存,才會拋出內存溢出異常。 在JDK 1.2之後,提供瞭 SoftReference 類來實現軟引用。
- 弱引用也是用來描述非必需對象的,但是它的強度比軟引用更弱一些,被弱引用關聯的對象隻能生存到下一次垃圾收集發生之前。當垃圾收集器工作時,無論當前內存是否足夠,都會回收掉隻被弱引用關聯的對象。 在JDK 1.2之後,提供瞭 WeakReference 類來實現弱引用。
- 虛引用也稱為幽靈引用或者幻影引用,它是最弱的一種引用關系。一個對象是否有虛引用的存在,完全不會對其生存時間構成影響,也無法通過虛引用來取得一個對象實例。 為一個對象設置虛引用關聯的唯一目的就是希望能在這個對象被收集器回收時收到一個系統通知。在JDK 1.2之後,提供瞭 PhantomReference 類來實現虛引用
8、如何減少線程的上下文切換?
多線程競爭時,會引起上下文切換。
- 無鎖並發編程:用一些辦法來避免使用鎖,如將數據的ID按照Hash取模分段,不同線程處理不同段數據。
- CAS算法:Java的Atomic包使用CAS算法來更新數據,而不需加鎖。
- 使用最少線程:避免創建不需要的線程。
- 協程:在單線程裡實現多任務的調度,維持多任務間的切換。
9、操作系統進程的調度策略
為瞭確定首先執行哪個進程以及最後執行哪個進程以實現最大 CPU 利用率,計算機科學傢已經定義瞭一些算法,它們是:
- 先到先服務(FCFS)調度算法 : 從就緒隊列中選擇一個最先進入該隊列的進程為之分配資源,使它立即執行並一直執行到完成或發生某事件而被阻塞放棄占用 CPU 時再重新調度。
- 短作業優先(SJF)的調度算法 : 從就緒隊列中選出一個運行時間最短的進程為之分配資源,使它立即執行並一直執行到完成或發生某事件而被阻塞放棄占用 CPU 時再重新調度。
- 缺點:僅照顧瞭短進程而忽略瞭長進程。
- 時間片輪轉調度算法 : 時間片輪轉調度是一種最古老,最簡單,最公平且使用最廣的算法,又稱 RR(Round robin)調度。每個進程被分配一個時間片,時間片用盡則退出對CPU資源的使用。
- 優先級調度 : 為每個進程分配優先級,首先執行具有最高優先級的進程**,依此類推。**具有相同優先級的進程以 FCFS 方式執行。可以根據內存要求,時間要求或任何其他資源要求來確定優先級。
- 存在的主要問題是:低優先級進程無窮等待CPU。
- 多級隊列調度算法:將就緒隊列分成多個獨立的隊列,每個隊列都有自己的調度算法,隊列之間采用固定優先級搶占調度。其中,一個進程根據自身屬性被永久、固定地分配到一個隊列中。
- 多級反饋隊列調度算法 :目前被公認的一種較好的進程調度算法,UNIX 操作系統采取的便是這種調度算法。與多級隊列調度算法相比,其允許進程在隊列之間移動:若進程使用過多CPU時間,那麼它會被轉移到優先級更低的隊列;在較低優先級隊列等待時間過長的進程會被轉移到更高優先級隊列,以防止饑餓發生。
10、什麼是虛擬內存?
虛擬內存允許執行任務的進程不必完全在內存中。很多時候我們使用點開瞭很多占內存的軟件,這些軟件占用的內存可能已經遠遠超出瞭我們電腦本身具有的物理內存。 正是因為 虛擬內存 的存在,通過 虛擬內存 可以讓程序可以擁有超過系統物理內存大小的可用內存空間(把內存擴展到硬盤空間)。
虛擬內存的基本思想:
- 每個進程擁有獨立的地址空間,這個空間被分為大小相等的多個塊,稱為頁(Page),每個頁都是一段連續的地址。
- 這些頁被映射到物理內存,但並不是所有的頁都必須在內存中才能運行程序。
- 當程序引用到一部分在物理內存中的地址空間時,由硬件立刻進行必要的映射。
- 當程序引用到一部分不在物理內存中的地址空間時,由操作系統負責將缺失的部分裝入物理內存並重新執行失敗的命令。
- 這樣,對於進程而言,邏輯上似乎有很大的內存空間,實際上其中一部分對應物理內存上的一塊(稱為幀,通常頁和幀大小相等),還有一些沒加載在內存中的對應在硬盤上
註意:
1、請求分頁系統、請求分段系統和請求段頁式系統都是針對虛擬內存的,通過請求實現內存與外存的信息置換。
2、如果虛擬內存的頁並不存在於物理內存中,會產生缺頁中斷,從磁盤中取得缺的頁放入內存,如果內存已滿,還會根據某種算法將磁盤中的頁換出。
頁面置換算法:
當發生缺頁中斷時,如果當前內存中並沒有空閑的頁面,操作系統就必須在內存選擇一個頁面將其移出內存,以便為即將調入的頁面讓出空間。用來選擇淘汰哪一頁的規則叫做頁面置換算法,我們可以把頁面置換算法看成是淘汰頁面的規則。
- OPT 頁面置換算法(最佳頁面置換算法) :最佳(Optimal, OPT)置換算法所選擇的被淘汰頁面將是以後永不使用的,或者是在最長時間內不再被訪問的頁面,這樣可以保證獲得最低的缺頁率。但由於人們目前無法預知進程在內存下的若千頁面中哪個是未來最長時間內不再被訪問的,因而該算法無法實現。一般作為衡量其他置換算法的方法。
- FIFO(First In First Out) 頁面置換算法(先進先出頁面置換算法) : 總是淘汰最先進入內存的頁面,即選擇在內存中駐留時間最久的頁面進行淘汰。
- LRU (Least Currently Used)頁面置換算法(最近最久未使用頁面置換算法) :LRU算法賦予每個頁面一個訪問字段,用來記錄一個頁面自上次被訪問以來所經歷的時間 T,當須淘汰一個頁面時,選擇現有頁面中其 T 值最大的,即最近最久未使用的頁面予以淘汰。
- LFU (Least Frequently Used)頁面置換算法(最少使用頁面置換算法) : 該置換算法選擇在之前時期使用次數最少的頁面作為淘汰頁。
虛擬內存的應用與優點:
適合多道程序設計系統,許多程序的片段同時保存在內存中。
當一個程序等待它的一部分讀入內存時,可以把CPU交給另一個進程使用。
優點:
1、在內存中可以保留多個進程,系統並發度提高。 2、解除瞭用戶與內存之間的緊密約束,進程可以比內存的全部空間還大。
局部性原理:
(1) 時間上的局部性:最近被訪問的頁在不久的將來還會被訪問。
(2) 空間上的局部性:內存中被訪問的頁周圍的頁也很可能被訪問。
總結
本篇文章就到這裡瞭,希望可以給你帶來一些幫助,也希望您能夠多多關註WalkonNet的更多內容!