1. 程式人生 > 其它 >藍橋杯--貨物擺放【2021第十二屆藍橋杯C/C++省賽B組】

藍橋杯--貨物擺放【2021第十二屆藍橋杯C/C++省賽B組】

作業系統

什麼是作業系統?

簡單理解:作業系統是使用者與計算機硬體中的中介。

百度百科定義:英文名Operating System,簡稱OS,是計算機系統中必不可少的基礎系統軟體,它應該用程式執行以及使用者操作必備的基礎環境支撐,是計算機系統的核心。是處於使用者與計算機系統硬體之間用於傳遞資訊的系統程式軟體。

作業系統提供了哪些功能

  1. 程序管理(處理器管理): 其主要任務是對處理器的時間進行合理分配、對處理器的執行實施有效的管理。

  2. 儲存器管理:由於多道程式共享記憶體資源,所以儲存器管理的主要任務是對儲存器進行分配、保護和擴充。

  3. 裝置管理:根據確定的裝置分配原則對裝置進行分配,是裝置與主機能夠並行工作,為使用者提供良好的裝置使用介面。

  4. 檔案管理。有效地管理檔案的儲存空間,合理地組織和管理檔案系統,為檔案訪問和檔案保護提供有效的方法手段。

  5. 使用者介面:使用者操作計算機介面稱為使用者介面,通過使用者介面,使用者只需進行簡單操作,就能實現複雜的應用處理

單核CPU對多執行緒有影響麼

單核CPU上執行的多執行緒程式,同一時間只能一個執行緒在執行,系統互幫我們切換執行緒,系統給每個執行緒分配時間來執行,看起來像是同時在執行,但是實際上是每個執行緒執行一會兒就換到另一個執行緒,切換執行緒增加了開銷效率降低了。

HTTP與TCP的區別

TCP協議

TCP協議屬於傳輸層協議(UDP也屬於傳輸層協議,但是UDP協議是無狀態的,TCP協議和UDP協議都工作在傳輸層,在程式之間傳輸資料)。建立一個TCP連線需要三次握手

,斷開一個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、協議版本、請求頭部和請求資料。伺服器以一個狀態行作為響應,響應的內容包括協議的版本、成功或者錯誤程式碼、伺服器資訊、響應頭部和響應資料。

  1. 客戶端連線到Web伺服器

  2. 傳送HTTP請求

  3. 伺服器接受請求並返回HTTP響應

  4. 釋放TCP連線

  5. 客戶端瀏覽器解析HTML內容

    http協議是基於TCP/IP協議之上的應用層協議。

TCP與HTTP的區別

  1. TCP對應於傳輸層,HTTP對應於應用層,本質來說,二者沒有什麼可比性。
  2. HTTP協議是建立在TCP協議基礎之上的,當瀏覽器需要從伺服器獲取網頁資料的時候,會發出一次HTTP請求。HTTP會通過TCP建立起一個到伺服器的連線通道,當本次請求需要的資料完畢後,HTTP會立即將TCP連線斷開,這個過程是很短的。所以HTTP連線是一種短連線,是一種無狀態的連線。
  3. 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請求頭中包括了哪些常見內容

  1. Host: 請求的地址域名和埠,不包括協議

  2. Connection:瀏覽器與伺服器之間連線的型別

  3. Upgrade-Insecure-Requests: http 自動升級到https,防止跨域問題但是域名埠都不同的不會提升

  4. User-Agent: 瀏覽器的使用者代理資訊

  5. Accept: 瀏覽器支援的請求型別

  6. Accept-Encoding: 瀏覽器能處理的壓縮程式碼

  7. Accept-Language: 瀏覽器當前設定語言

  8. 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方法得到元素的雜湊值 ,然後通過元素 的雜湊值經過移位等運算,就可以算出該元素在雜湊表中 的儲存位置。

  1. 如果算出的元素儲存的位置目前沒有任何元素儲存,那麼該元素可以直接儲存在該位置上
  2. 如果算出的元素的儲存位置目前已經存在有其他的元素了,那麼還會呼叫該元素的equals方法與該位置的元素再比較一次,如果equals方法返回的是true,那麼該位置上的元素視為重複元素,不允許新增,如果返回的是false,則允許新增。