藍橋杯--貨物擺放【2021第十二屆藍橋杯C/C++省賽B組】
作業系統
什麼是作業系統?
簡單理解:作業系統是使用者與計算機硬體中的中介。
百度百科定義:英文名Operating System,簡稱OS,是計算機系統中必不可少的基礎系統軟體,它應該用程式執行以及使用者操作必備的基礎環境支撐,是計算機系統的核心。是處於使用者與計算機系統硬體之間用於傳遞資訊的系統程式軟體。
作業系統提供了哪些功能
-
程序管理(處理器管理): 其主要任務是對處理器的時間進行合理分配、對處理器的執行實施有效的管理。
-
儲存器管理:由於多道程式共享記憶體資源,所以儲存器管理的主要任務是對儲存器進行分配、保護和擴充。
-
裝置管理:根據確定的裝置分配原則對裝置進行分配,是裝置與主機能夠並行工作,為使用者提供良好的裝置使用介面。
-
檔案管理。有效地管理檔案的儲存空間,合理地組織和管理檔案系統,為檔案訪問和檔案保護提供有效的方法手段。
-
使用者介面:使用者操作計算機介面稱為使用者介面,通過使用者介面,使用者只需進行簡單操作,就能實現複雜的應用處理
單核CPU對多執行緒有影響麼
單核CPU上執行的多執行緒程式,同一時間只能一個執行緒在執行,系統互幫我們切換執行緒,系統給每個執行緒分配時間來執行,看起來像是同時在執行,但是實際上是每個執行緒執行一會兒就換到另一個執行緒,切換執行緒增加了開銷效率降低了。
HTTP與TCP的區別
TCP協議
TCP協議屬於傳輸層協議(UDP也屬於傳輸層協議,但是UDP協議是無狀態的,TCP協議和UDP協議都工作在傳輸層,在程式之間傳輸資料)。建立一個TCP連線需要三次握手
三次握手:
ACK(確認字元):TCP協議規定,只有ACK=1時有效,也規定連線建立後所有傳送的報文的ACK必須為1。
SYN(同步序列編號 SYNchronization):在連線建立時用來同步序號。當SYN=1而ACK=0時,表明這是一個連線請求報文。對方若同意建立連線,則應在響應報文中使SYN=1和ACK=1因此,SYN置為1就表示這是一個連線請求或連線接收報文。
過程:客戶端向服務端發起連線,會先將連線請求資料(SYN包)傳送到服務端,詢問能否建立連線,若同意建立連線服務端會想客戶端回覆(SYN+ACK),客戶端收到回覆ACK包,建立連線。因為這整個過程一共傳送了三次資料所以稱為三次握手。
1.為什麼是三次握手呢?為什麼在收到服務端傳送過來的SYN和ACK就建立連線呢?
防止已失效的請求報文突然又傳到伺服器引起錯誤,兩次連線可能造成客戶端和服務端狀態不一致的問題。三次握手是為了解決網路通道不可靠的問題。
四次揮手:
第一次揮手:若客戶端主動發起關閉連線請求,客戶端向伺服器發起一包FIN包,表示關閉連線,客戶端進入終止等待1狀態。
第二次揮手:服務端向客戶端傳送ACK包表示進入關閉等待狀態,客戶端進入終止等待2狀態。(服務端還可以傳送未傳送的資料,客戶端也可以接收資料)
第三次揮手:等伺服器傳送完資料之後會發送FIN包,進入最終確認狀態。
第四次揮手:客戶端收到FIN包之後護符ACK包,進入超時等待狀態,經過超時時間後關閉連線,伺服器立即關閉連線。
為什麼客戶端要等待超時時間呢?
若客戶端傳送完ACK包後就直接關閉連線,若在傳送中ACK包 丟失伺服器將一直停留在最後確認狀態。
HTTP協議
什麼是HTTP協議?
HTTP是一種超文字傳輸協議:超文字、傳輸、協議之間的關係:
按照範圍大小協議>傳輸>超文字
超文字:是一種使用者介面正規化,用以顯示文字及與文字之間相關的內容。
傳輸: 兩臺計算機之間進行通訊,會將超文字解析為二進位制資料包,有傳輸載體如光纖、電話線等將資料包傳輸到另一個終端的過程。
協議:計算機之間相互通訊需要共同遵守的一些規則。
工作原理
HTTP協議定義Web客戶端如何從Web伺服器請求Web頁面,以及伺服器如何把Web頁面傳送給客戶端。HTTP協議採用了請求/響應模型。客戶端向伺服器傳送一個請求報文,請求報文包含請求的方法、URL、協議版本、請求頭部和請求資料。伺服器以一個狀態行作為響應,響應的內容包括協議的版本、成功或者錯誤程式碼、伺服器資訊、響應頭部和響應資料。
-
客戶端連線到Web伺服器
-
傳送HTTP請求
-
伺服器接受請求並返回HTTP響應
-
釋放TCP連線
-
客戶端瀏覽器解析HTML內容
http協議是基於TCP/IP協議之上的應用層協議。
TCP與HTTP的區別
- TCP對應於傳輸層,HTTP對應於應用層,本質來說,二者沒有什麼可比性。
- HTTP協議是建立在TCP協議基礎之上的,當瀏覽器需要從伺服器獲取網頁資料的時候,會發出一次HTTP請求。HTTP會通過TCP建立起一個到伺服器的連線通道,當本次請求需要的資料完畢後,HTTP會立即將TCP連線斷開,這個過程是很短的。所以HTTP連線是一種短連線,是一種無狀態的連線。
- HTTP連線:HTTP協議即超文字傳送協議,是web聯網的基礎,也是手機聯網常用的協議之一,HTTP協議是建立在TCP協議之上的一種應用。
Cookie與Session的聯絡
Cookies是屬於Session物件的一種,但是略有不同,Cookie儲存在客戶端記憶體或者一個cookie的文字檔案中,而Session會佔用伺服器資源。
Cookie和Session都可以用來儲存使用者資訊,Session的使用必須要使用者的瀏覽器支援Cookie,如果瀏覽器不支援Cookie,或者設定為禁用Cookie,那麼將不能使用Session。使用者在進行訪問時,伺服器會通過查詢session,將使用者的session ID傳給瀏覽器,而瀏覽器則將這個ID以cookie的形式儲存在瀏覽器記憶體中。也就是說cookie是session在瀏覽器中的標識。
HTTP請求頭中包括了哪些常見內容
-
Host: 請求的地址域名和埠,不包括協議
-
Connection:瀏覽器與伺服器之間連線的型別
-
Upgrade-Insecure-Requests: http 自動升級到https,防止跨域問題但是域名埠都不同的不會提升
-
User-Agent: 瀏覽器的使用者代理資訊
-
Accept: 瀏覽器支援的請求型別
-
Accept-Encoding: 瀏覽器能處理的壓縮程式碼
-
Accept-Language: 瀏覽器當前設定語言
-
Referer:發出請求的頁面的URL
Tomcat為什麼能執行MVC專案
Sringmvc框架遵守了Servlet規範,其中一條規範規定,在程式碼的根目錄中,必須有一個META-INF/services的目錄且裡面有一個全類路徑的檔案(就是一個自定義的啟動類的全類名),這個類中必須有一個方法:onStartup,
tomcat啟動,其實就是去尋找onStartup方法,然後程式碼就開始一層層的往下執行。
MVC執行的流程
1、向伺服器傳送 HTTP 請求,請求被前端控制器 DispatcherServlet 捕獲。
2、 DispatcherServlet 根據 -servlet.xml 中的配置對請求的 URL 進行解 析,得到請求資源識別符號(URI)。然後根據該 URI,呼叫 HandlerMapping 獲得該 Handler 配置的所有相關的物件(包括 Handler 物件以及 Handler 對 象對應的攔截器),最後以 HandlerExecutionChain 物件的形式返回。
3、 DispatcherServlet 根據獲得的 Handler,選擇一個合適的 HandlerAdapter。(附註:如果成功獲得 HandlerAdapter 後,此時將開始 執行攔截器的 preHandler(...)方法)。
4、提取 Request 中的模型資料,填充 Handler 入參,開始執行 Handler ( Controller)。在填充 Handler 的入參過程中,根據你的配置,Spring 將 幫你做一些額外的工作:
HttpMessageConveter:將請求訊息(如 Json、xml 等資料)轉換 成一個物件,將物件轉換為指定的響應資訊。
資料轉換:對請求訊息進行資料轉換。如 String轉換成 Integer、 Double等。 資料根式化:對請求訊息進行資料格式化。如將字串轉換成格式化數字 或格式化日期等。
資料驗證:驗證資料的有效性(長度、格式等),驗證結果儲存到 BindingResult或 Error中。
5、Handler(Controller)執行完成後,向 DispatcherServlet 返回一個 ModelAndView 物件;
6、根據返回的 ModelAndView,選擇一個適合的 ViewResolver(必須是已 經註冊到 Spring 容器中的 ViewResolver)返回給 DispatcherServlet。
7、 ViewResolver 結合 Model 和 View,來渲染檢視。
8、檢視負責將渲染結果返回給客戶端。
JVM能執行其他語言的程式碼麼
JVM支援的語言:Kotlin、Groovy、Scala、Jython、JRuby、Fantom、Clojure、Rhino、Ceylon、Java
JVM本地語言:java位元組碼。可以將任何語言編譯為JVM可以理解的位元組碼。
HashSet的底層實現
HashSet底層使用了雜湊表來支援,其操作底層都是通過呼叫HashMap方法實現的
HashSet會將元素儲存在HashMap的key集合中,然後為value賦一個static空物件PRESENT
往Haset新增元素的時候,HashSet會先呼叫元素的hashCode方法得到元素的雜湊值 ,然後通過元素 的雜湊值經過移位等運算,就可以算出該元素在雜湊表中 的儲存位置。
- 如果算出的元素儲存的位置目前沒有任何元素儲存,那麼該元素可以直接儲存在該位置上
- 如果算出的元素的儲存位置目前已經存在有其他的元素了,那麼還會呼叫該元素的equals方法與該位置的元素再比較一次,如果equals方法返回的是true,那麼該位置上的元素視為重複元素,不允許新增,如果返回的是false,則允許新增。