百度2015簡答題

2021-07-05 04:29:15 字數 3605 閱讀 7358

1.當前計算機系統一般會採用層次結構來儲存資料,請介紹下典型的計算機儲存系統一般分為哪幾個層次,為什麼採用分層儲存資料能有效提高程式的執行效率?

計算機系統中儲存層次可分為高速緩衝儲存器(cache)、主儲存器、輔助儲存器**。

高速緩衝儲存器用來改善主儲存器與**處理器的速度匹配問題。

輔助儲存器用於擴大儲存空,即硬碟,光碟等,容量大,但訪問資料慢,計算機都是先把輔存中要讀的東西放到主存後處理,然後在依據情況是否寫回。

主存即為記憶體,斷電資訊丟失,但訪問資料塊,它的容量大小直接影響計算機執行速度。

可把主存一輔存層次作為乙個儲存整體,形成的可定址儲存空間比主儲存器空間大得多。由於輔存容量大,**低,使得儲存系統的整體平均**降低。

由於cache的訪問速度可以和cpu的工作速度相媲美,故cache一主存層次可以縮小主存和cpu之間的速度差距,從整體上提高儲存器系統的訪問速度。儘管cache成本高,但由於容量較小,故不會使儲存系統的整體**增加很多

其中快取記憶體解決了儲存系統的速度問題,輔助儲存器則解決了儲存系統的容量問題。

採用多級層次結構的儲存器系統可以有效的解決儲存器的速度、容量和**之間的矛盾。

2.unix/linux系統中殭屍程序是如何產生的?有什麼危害?為何避免?

孤兒程序:乙個父程序退出,而它的乙個或多個子程序還在執行,那麼那些子程序將成為孤兒程序。孤兒程序將被init程序(程序號為1)所收養,並由init程序對它們完成狀態收集工作。

殭屍程序:乙個程序使用fork建立子程序,如果子程序退出,而父程序並沒有呼叫wait或waitpid獲取子程序的狀態資訊,那麼子程序的程序描述符仍然儲存在系統中。這種程序稱之為僵死程序。

如果程序不呼叫wait / waitpid的話, 那麼保留的那段資訊就不會釋放,其程序號就會一直被占用,但是系統所能使用的程序號是有限的,如果大量的產生僵死程序,將因為沒有可用的程序號而導致系統不能產生新的程序. 此即為殭屍程序的危害,應當避免。

孤兒程序是沒有父程序的程序,孤兒程序這個重任就落到了init程序身上,因此孤兒程序並不會有什麼危害。

任何乙個子程序(init除外)在exit()之後,並非馬上就消失掉,而是留下乙個稱為殭屍程序(zombie)的資料結構,等待父程序處理

3.請簡述tcp-ip的3次握手以及4次揮手過程?並解釋為何關閉連線需要4次揮手

三次揮手

(1)伺服器必須準備好接受外來的連線。這通常通過呼叫socket,bind和listen這三個函式來完成。我們稱之為被動開啟

(2)客戶端通過呼叫connect發起主動開啟。這導致客戶tcp傳送乙個syn(同步)分節,他告訴伺服器客戶在連線中傳送的資料的初始序列號。通常syn分節不攜帶資料,其所在ip資料報只含有乙個ip首部,乙個tcp首部及可能有的tcp選項

(3)伺服器必須確認ack客戶的syn,同時自己也得傳送乙個syn分節,它含有伺服器在同一連線中傳送的資料的初始序列號。伺服器在單個分節中傳送syn和對客戶syn的ack確認

(4)客戶必須確認伺服器的syn

注:客戶的初始序列號為j,伺服器的初始序列號為k,ack中的確認號是傳送這個ack的一端所期待的下乙個序列號

4次揮手

(1)某個應用程序首先呼叫close,我們稱該端執行主動關閉。該端的tcp於是傳送乙個fin分節,表示資料傳送完畢

(2)接受到這個fin的對端執行被動關閉。這個fin由tcp確認。他的接收也作為乙個檔案描述符傳遞給接收端應用程式。

(3)一段時間後,接收到這個檔案描述符的應用程序將呼叫close關閉它的套接字。這導致它的tcp也傳送乙個fin

(4)接受這個最終fin的原傳送端tcp,確認這個fin

這是因為服務端在listen狀態下,收到建立連線請求的syn報文後,把ack和syn放在乙個報文裡傳送給客戶端。而關閉連線時,當收到對方的fin報文時,僅僅表示對方不再傳送資料了但是還能接收資料,己方也未必全部資料都傳送給對方了,所以己方可以立即close,也可以傳送一些資料給對方後,再傳送fin報文給對方來表示同意現在關閉連線,因此,己方ack和fin一般都會分開傳送。

如果採用二次握手,主機a向主機b傳送連線請求,b接到a的請求後並應答,如果b的應答由於網路原因未到達a,主機b認為鏈結已經建立,而a則認為連線沒有建立,此時b向a發資料,a在收到b的應答前不予理會,b卻等待a傳送資料造成資源浪費

4.作業系統的記憶體管理淘汰演算法有哪些,請列出並簡要說明?

最佳(opt)置換演算法是理論演算法,它將不再使用的頁面換出,而實際中不能預知哪個頁面不再使用,但是這個演算法是最優演算法,可以作為評測其他演算法的效能。

先進先出(fifo)置換演算法

最近最少(lru)使用置換演算法:發生缺頁時計算距離上次使用的時間差,找最大值,替換該頁

最近最不經常(nru)使用演算法:最近未被修改r =0&&m=0

該演算法與程序實際執行的規律不相適應,因為在程序中,有些頁面經常被訪問,比如,含有全域性變數、常用函式、例程等的頁面,fifo 演算法並不能保證這些頁面不被淘汰。fifo 置換演算法效能之所以較差,是因為它所依據的條件是各個頁面調入記憶體的時間,而頁面調入的先後並不能反映頁面的使用情況。lru 演算法是較好的一種演算法,但由於它要求有較多的硬體支援,故在實際應用中,大多採用lru的近似演算法。clock(nru)演算法就是用得較多的一種lru近似演算法。fifo會出現belady異常,即當所分配的物理塊(頁框)增大而頁故障數不減反增的現象,lru是堆疊類演算法需要暫存器和棧的支援不會出現異常

5.動態鏈結庫和靜態鏈結庫的優缺點

靜態庫是目標檔案.a的歸檔檔案(格式為libname.a)。如果在編譯某個程式時鏈結靜態庫,則鏈結器將會搜尋靜態庫並直接拷貝到該程式的可執行二進位制檔案到當前檔案中

建立靜態庫

$ gcc  -c  add.c    //編譯add.c原始檔生成add.o目標檔案

$ ar  crsv  libadd.a  add.o

動態庫(格式為libname.so)在程式編譯時並不會被鏈結到目標**中,而是在程式執行時才被載入。

建立動態庫

$ gcc  -fpic  -wall  -c  add.c

$ gcc  -shared  -o  libadd.so  add.o

靜態庫與動態庫的比較:

動態庫只在執行時才被鏈結使用,不是直接編譯為可執行檔案,並且乙個動態庫可以被多個程式使用故可稱為共享庫。

靜態庫將會整合到程式中,在程式執行時不用載入靜態庫。 因此,靜態庫會使你的程式臃腫並且難以公升級,但比較容易部署。而動態庫會使你的程式輕便易於公升級但難以部署。 

6.輪詢任務排程和可搶占式排程有什麼區別?

(1)輪詢排程的原理是每一次把來自使用者的請求輪流分配給內部中的伺服器,從1開始,直到n(內部伺服器個數),然後重新開始迴圈。只有在當前任務主動放棄cpu控制權的情況下(比如任務掛起),才允許其他任務(包括高優先順序的任務)控制cpu。其優點是其簡潔性,它無需記錄當前所有連線的狀態,所以它是一種無狀態排程。但不利於後面的請求及時得到響應。

(2)搶占式排程允許高優先順序的任務打斷當前執行的任務,搶占cpu的控制權。這有利於後面的高優先順序的任務也能及時得到響應。但實現相對較複雜且可能出現低優先順序的任務長期得不到排程。

c 簡答題題庫 C 簡答題集錦

c 簡答題集錦 問題1 什麼是演算法?演算法應包括哪兩部分?答 所謂演算法,是指為解決乙個問題而採取的方法和步驟,或者說是解題步驟的精確描述。演算法應包括設計演算法和執行演算法兩部分。問題2 結構化程式設計的特徵是什麼?答 結構化程式設計方法從程式設計思想上要求自頂向下,逐步求精 從程式的具體結構上...

還是幾道簡答題

今天和昨天一樣,又找了幾道簡答題,鞏固一下前一段時間學習的成果,也對一些名詞有了更深入的了解 1.makefile的作用 makefile檔案儲存了編譯器和聯結器的引數選項,還表述了所有原始檔之間的關係。建立程式 make程式 首先讀取makefile檔案,然後再啟用編譯器,彙編器,資源編譯器 和聯...

Python題庫 簡答題

1.命名空間和作用域的關係 命名空間定義了在某個作用域內變數名和繫結值之間的對應關係,命名空間是鍵值對的集合,變數名與值是一一對應關係。作用域定義了命名空間中的變數能夠在多大範圍內起作用。2.裝飾器函式的作用?寫乙個裝飾器程式 在不修改原函式及其呼叫方式的情況下對原函式功能進行擴充套件。def ou...