2017-2018-1 20155313 《資訊安全系統設計基礎》第十三周學習總結
本周學習任務
找出全書你認為最重要的一章,深入重新學習一下,要求(期末占10分):
- 完成這一章所有習題
- 詳細總結本章要點
- 給你的結對學習搭檔講解你的總結并擷取回報
- 參考上面的學習總結模闆,把學習過程通過部落格(随筆)發表,部落格标題“學号 《資訊安全系統設計基礎》第十三周學習總結”,部落格(随筆)要通過作業送出,截至時間本周日 23:59。
-
我認為本書最重要的是第九章——虛拟存儲器。
-
虛拟存儲器通過軟體設計參與到了計算機的硬體運作上,有效地增加了計算機的運作效率且合理地配置設定了計算機的硬體任務,是現代計算機體系中十分重要的内容。
-
本章的核心内容是了解虛拟存儲器其運作的原理。
任務1:
-
重點學習例題:
練習題9.1
虛拟位址位數(n) | 虛拟位址數 (N) | 最大可能的虛拟位址 |
---|---|---|
8 | 28 = 256 | 28-1 = 255 |
16 | 216 = 64K | 216-1 = 64K-1 |
32 | 232 = 4G | 232-1 = 4G-1 |
48 | 248 = 256T | 248-1 = 256T-1 |
64 | 264 = 16384P | 264-1 = 16384P-1 |
練習題9.2
n | P =2p | PTE的數量 |
---|---|---|
4K | ||
8K | ||
1M | ||
512K |
練習題9.3
P | VPN位數 | VPO位數 | PPN位數 | PPO位數 |
---|---|---|---|---|
1KB | 22 | 10 | 14 | |
2KB | 21 | 11 | 13 | |
4KB | 20 | 12 | ||
19 |
練習題9.4
虛拟位址:0x03d7
A.虛拟位址格式
- 00 0011 1101 0111
B.位址翻譯
參數 | 值 |
---|---|
VPN | 0xf |
TLB索引 | 0x3 |
TLB标記 | |
TLB命中?(是/否) | 是 |
缺頁?(是/否) | 否 |
PPN | 0xd |
C.實體位址格式
- 0011 0101 0111
D.實體記憶體引用
CO | |
CI | 0x5 |
CT | |
高度緩存命中?(是/否) | |
告訴緩存位元組傳回 | 0x1d |
練習題9.6
請求 | 塊大小(十進制位元組) | 塊頭部(十六進制) |
---|---|---|
malloc(1) | 0x9 | |
malloc(5) | 0x11 | |
malloc(12) | ||
malloc(13) | 24 | 0x19 |
練習題9.7
對其要求 | 已配置設定塊 | 空閑塊 | 最小塊大小(位元組) |
---|---|---|---|
單字 | 頭部和腳部 | ||
頭部,沒有腳部 | |||
雙字 | |||
任務2:
全章内容綱要
- 虛拟存儲器(virtual memory, VM)是計算機系統一種對主存的抽象概念。本章首先講解虛拟存儲器是如何工作的,之後講解應用程式如何使用和管理虛拟存儲器。
-
1.實體尋址和虛拟尋址:實體尋址是CPU直接生成實體位址傳回實體記憶體,虛拟尋址是CPU生成虛拟位址經位址翻譯後轉化為實體位址對其進行尋址。
-
2.虛拟存儲器作為緩存的工具:
- 1)虛拟存儲器被組織為存放在磁盤上的N個連續的位元組大小的數組。VM系統通過将虛拟存儲器分割為稱為虛拟頁的大小固定的塊來處理。任意時刻,虛拟頁面的集合分為三種:未配置設定的、緩存的、未緩存的。
- 2)虛拟頁與實體頁(記憶體/主存)的緩存關系由頁表來維持,頁表就是一個頁表條目(Pagetable entry,PTE),将虛拟頁映射到實體頁。
- 3)簡單的講解了虛拟存儲器頁命中、缺頁、頁面配置設定的基本處理流程,以及因為程式局部性而保證虛拟存儲器系統能高效工作的原理。
-
3.虛拟存儲器作為存儲器管理的工具:實際上,作業系統為每個程序提供了一個獨立的頁表,因為也就是一個獨立的虛拟位址空間。
- 1)簡化連結:獨立的位址空間允許每個程序的存儲器映像使用相同的基本格式,而不管代碼的資料實際存放在實體存儲器的何處。
- 2)簡化加載:簡單的來說exec類函數可以友善的執行,作業系統隻需要更改适當修改頁表條目。同時,還為存儲器映射(将一個虛拟頁映射到任意一個檔案中的任意位置)提供可能:mmap。
- 3)簡化共享。
- 4)簡化存儲器的配置設定:malloc類函數
-
4.虛拟存儲器作為存儲器保護的工具:通過在PTE(頁表條目)上添加一些額外的許可位可控制程式對相關虛拟頁的通路權限。
-
5.位址翻譯。
-
6.Linux存儲器系統,也就是linux記憶體管理。
-
7.動态存儲器配置設定。講解了linux系統malloc/free類函數的實作原理,并配有小的實踐代碼。
-
8.垃圾回收:C語言不存在垃圾回收,malloc配置設定的存儲空間需要程式員顯式釋放。主要講解了垃圾回收的原理。
-
9.C程式中常見的與存儲器有關的錯誤:空指針、野指針、越界、洩漏等。
-
程序提供給應用程式的關鍵抽象:
- 一個獨立的邏輯控制流,它提供一個假象,好像我們的程式獨占地使用處理器。
- 一個私有的位址空間,它提供一個假象,好像我們的程式獨占地使用存儲器系統。
虛拟存儲器
- 硬體位址翻譯、主存、磁盤檔案和核心軟體的完美互動,它為每個程序提供了一個大的、一緻的和私有的位址空間。通過一個很清晰的機制,虛拟存儲器提供了三個重要的能力:
- (1)它将主存看成是一個存儲在磁盤上的位址空間的高速緩存,在主存中隻儲存活動區域,并根據需要在磁盤和主存之間來回傳送資料, 通過這種方式,它高效地使用了主存。
- (2)它為每個程序提供了一緻的位址空間, 進而簡化了存儲器管理。
- (3)它保護了每個程序的位址空間不被其他程序破壞。
實體和虛拟尋址
實體尋址
- 計算機系統的主存被組織成一個由M個連續的位元組大小的單元組成的數組。每位元組都有一個唯一的實體位址(Physical Address,PA)。第一個位元組的位址為0,接下來的位元組的位址為1,再下一個為2,依此類推。給定這種簡單的結構,CPU通路存儲器的最自然的方式就是使用實體位址,我們把這種方式稱為實體尋址。
虛拟尋址
- 使用虛拟尋址時,CPU通過生成一個虛拟位址(Virtual Address,VA)來通路主存,這個虛拟位址在被送到存儲器之前先轉換成适當的實體位址。将一個虛拟位址轉換為實體位址的任務叫做位址翻譯(address translation)。就像異常處理一樣,位址翻譯需要CPU硬體和作業系統之間的緊密合作。CPU晶片上叫做存儲器管理單元(Memory Management Unit,MMU)的專用硬體,利用存放在主存中的查詢表來動态翻譯虛拟位址,該表的内容是由作業系統管理。

位址空間
- 位址空間(adress space)是一個非整數位址的有序集合:{0,1,2,...}
- 如果位址空間中的整數是連續的,那麼我們說它是一個線性位址空間(linear address space)。在一個帶虛拟存儲器的系統中,CPU從一個有N = 2n個位址空間中生成虛拟位址,這個位址空間稱為虛拟位址空間(virtual address space):{0,1,2,3,...,N-1}
- 一個位址空間的大小是由表示最大位址所需要的倍數來描述的。例如,一個包含N=2n個位址的虛拟位址空間叫做一個n位位址空間。現在系統典型地支援32位或者64位虛拟位址空間是。
- 一個系統還有一個實體位址空間(physical addresss space),它與系統中實體存儲器的M位元組相對應:{0,1,2,...M-1}
- M不要求是2的幂,但是為了簡化讨論,我們假設M = 2m。
- 位址空間的概念是很重要的,因為它清楚地區分了資料對象(位元組)和它們的屬性(位址)。一旦認識到了這種差別,那麼我們就可以将其推廣,允許每個資料對象有多個獨立的位址,其中每個位址都選自一個不同的位址空間。這就是虛拟存儲器的基本思想。 主存中每個位元組都有一個選自虛拟位址空間的虛拟位址和一個選自實體位址空間的實體位址。
位址翻譯
- 位址翻譯将虛拟位址翻譯為實體位址。虛拟位址被劃分為虛拟頁号和虛拟頁内偏移,虛拟頁号用來定位頁表中的頁表項,頁表項中儲存着實體頁号,也就得到了實體頁号。虛拟頁偏移和實體頁偏移相同。有了實體頁号和實體頁偏移,就得到了實體位址。
虛拟存儲器作為緩存的工具
- 概念上而言,虛拟存儲器(VM)被組織為一個由存放在磁盤上N個連續的位元組大小的單元組成的數組。每個位元組都有一個唯一的虛拟位址,這個唯一的虛拟位址是作為到數組的索引的。磁盤上的數組的内容被緩存在主存中。和存儲器層次結構中其他緩存一樣,磁盤(較低層)上的資料被分割成塊,這些塊作為磁盤和主存(較高層)之間的傳輸單元。VM系統通過将虛拟存儲器分割稱為虛拟頁(Vitual Page,VP)的大小固定的塊來處理這個問題。每個虛拟頁的大小為P = 2n位元組。類似地,實體存儲器被分割為實體頁(Physical Page,PP),大小也為P位元組(實體頁也稱為頁幀(page frame))。
- 在任意時刻,虛拟頁面的集合都分為三個不相交的子集:
- 未配置設定的:VM系統還未配置設定(或者建立)的頁。未配置設定的塊沒有任何資料和它們相關聯,是以也就不占用任何磁盤空間。(沒有調用malloc或者mmap的)
- 緩存的:目前緩存在實體存儲中的已配置設定頁。(已經調用malloc和mmap的,在程式中正在引用的)
- 未緩存的:沒有緩存在實體存儲器中的已配置設定頁。(已經調用malloc和mmap的,在程式中還沒有被引用的)
頁表
- 同任何緩存一樣,虛拟存儲器系統必須有某種方法來判定一個虛拟頁是否存放在DRAM中的某個地方。如果是,系統還必須确定這個虛拟頁存放在哪個實體頁中。如果不命中,系統必須判斷這個虛拟頁存放在磁盤的哪個位置,在實體存儲器中選擇一個犧牲頁,并将虛拟頁從磁盤拷貝到DRAM中,替換這個犧牲頁。
- 這些功能是由許多軟硬體聯合提供的,包括作業系統軟體,MMU(存儲器管理單元)中位址翻譯硬體和一個存放在實體存儲器中叫做頁表(page table)的資料結構,頁表将虛拟頁映射到實體頁。頁表就是一個頁表條目(Page Table Entry,PTE)的數組。
Linux虛拟存儲器系統
- Linux為每個程序維持了一個單獨的虛拟位址空間。
- 核心虛拟存儲器包含核心中的代碼和資料結構。核心虛拟存儲器的某些區域被映射到所有程序共享的實體頁面。例如,每個程序共享核心的代碼和全局資料結構。
Linux虛拟存儲器區域(Windows下也有區域的概念)
- Linux将虛拟存儲器組織成一些區域(也叫做段)的集合。一個區域(area)就是已經存在着的(已配置設定的)虛拟存儲器的連續片(chunk),這些頁是以某種方式相關聯的。例如,代碼段、資料段、堆、共享庫段,以及使用者棧都不同的區域。每個存在的虛拟頁面儲存在某個區域中,而不屬于某個區域的虛拟頁是不存在的,并且不能被程序引用。區域的概念很重要,因為它允許虛拟位址空間有間隙。核心不用記錄那些不存在的虛拟頁,而這樣的頁也不占用存儲器。磁盤或者核心本身的任何額外資源。
- 核心為系統中的每個程序維護一個單獨的任務結構(源代碼中的task_struct)。任務結構中的元素包含或者指向核心運作該程序所需要的所有資訊(例如,PID,指向使用者棧的指針、可執行的目标檔案的名字以及程式計數器)。
-
task_struct中的一個條目指向mm_struct,它描述了虛拟存儲器中的目前狀态。其中pgd指向第一級頁表(頁全局目錄)的基址,而mmap指向一個vm_area_struct(區域結構)的連結清單,其中每個vm_area_structs都描述了目前虛拟位址空間的一個區域(area)。當核心運作這個程序時,它就将pgd存放在CR3控制寄存器中。
一個具體區域結構包含下面的字段:
- vm_start:指向這個區域的起始處。
- vm_end:指向這個區域的結束處。
- vm_prot:描述這個區域的内包含的所有頁的讀寫許可權限。
- vm_flags:描述這個區域内頁面是與其他程序共享的,還是這個程序私有的(還描述了其他一些資訊)。
- vm_next:指向連結清單中下一個區域結構。
存儲器映射(Windows下也有類似的機制,名叫記憶體映射)
- Linux(以及其他一些形式的Unix)通過将一個虛拟存儲器區域與一個磁盤上的對象(object)關聯起來,以初始化這個虛拟存儲器區域的内容,這個過程稱為存儲器映射(memory mapping)。虛拟存儲器區域可以映射到兩種類型的對象的一種:
-
(1)Unix檔案上的普通檔案:一個區域可以映射到一個普通磁盤檔案的連續部分,例如一個可執行目标檔案。檔案區(section)被分成頁大小的片,每一片包含一個虛拟頁面的初始化内容。因為按需進行頁面高度,是以這些虛拟頁面沒有實際進行實體存儲器,直到CPU第一次引用到頁面(即發射一個虛拟位址,落在位址空間這個頁面的範圍之内)。如果區域檔案區要大,那麼就用零來填充這個區域的餘下部分。
-
(2)匿名檔案:一個區域也可以映射到一個匿名檔案,匿名檔案是由核心建立的,包含的全是二進制零。CPU第一次引用這樣一個區域内的虛拟頁面時,核心就在實體存儲器中找到一個合适的犧牲頁面,如果該頁面被修改過,就将這個頁面換出來,用二進制零覆寫犧牲頁面并更新頁表,将這個頁面标記為是駐留在存儲器中的。注意在磁盤和存儲器之間沒有實際的資料傳送。因為這個原因,映射到匿名檔案的區域中的頁面有時也叫做請求二進制零的頁(demand-zero page)。
- 無論在哪種情況下,一旦一個虛拟頁面被初始化了, 它就在一個由核心維護的專門的交換檔案(swap file)之間換來換去。交換檔案也叫做交換空間(swap space)或者交換區域(swap area)。需要意識到的很重要的一點,在任何時刻,交換空間都限制着目前運作着的程序能夠配置設定的虛拟頁面的總數。
共享對象
- 一個對象可以被映射到虛拟存儲的一個區域,要麼作為共享對象,要麼作為私有對象。如果一個程序将一個共享對象映射到它的虛拟位址空間的一個區域内,那麼這個程序對這個區域的任何寫操作,對于那些也把這個共享對象映射到它們虛拟存儲器的其他程序而言也是可見的。而且,這此變化也會反映在磁盤上的原始對象中。(IPC的一種方式)
- 另一方面,對一個映射到私有對象的區域做的改變,對于其他程序來說是不可見的,并且程序對這個區域所做的任何寫操作都不會反映在磁盤上的對象中。一個映射到共享對象的虛拟存儲器區域叫做共享區域。類似地,也有私有區域。
-
共享對象的關鍵點在于即使對象被映射到了多個共享區域,實體存儲器也隻需要存放共享對象的一個拷貝。
一個共享對象(注意,實體頁面不一定是連續的。)
-
私有對象是使用一種叫做寫時拷貝(copy-on-write)的巧妙技術被映射到虛拟存儲器中的。對于每個映射私有對象的程序,相應私有區域的頁表條目都被标記為隻讀,并且區域結構被标記為私有的寫時拷貝。
fork函數
- 當fork函數被目前程序調用時,核心為新程序建立各種資料結構,并配置設定給它一個唯一的PID。為了給這個新程序建立虛拟存儲器,它建立了目前程序的mm_struct、區域結構和頁表的原樣拷貝。它将兩個程序中的每個頁面都為标記隻讀,并将兩個程序中的每個區域結構都标記為私有的寫時拷貝。
- 當fork在新程序中傳回時,新程序現在的虛拟存儲器剛好和調用fork時存在的虛拟存儲器相同。當這兩個程序中的任一個後來進行寫操作時,寫時拷貝機制就會建立新頁面,是以,也就為每個程序保持了私有位址空間的抽象概念。
execve函數
- 假設運作在目前程序中的程式執行了如下的調用:
-
execve("a.out",NULL,NULL) ;
- execve函數在目前程序中加載并運作包含在可執行目标檔案a.out中的程式,用a.out程式有效地替代了目前程式。加載并運作a.out需要以下幾個步驟:
- 删除已存在的使用者區域。删除目前程序虛拟位址使用者部分中的已存在的區域結構。
- 映射私有區域。為新程式的文本、資料、bss和棧區域建立新的區域結構。所有這些新的區域都是私有的、寫時拷貝的。文本和資料區域被映射為a.out檔案中的文本和資料區。bss區域是請求二進制零的,映射到匿名檔案,其大小包含在a.out中。棧和堆區域也是請求二進制零的。
- 映射共享區域。如果a.out程式與共享對象(或目标)連結,比如标準C庫libc.so,那麼這些對象都是動态連結到這個程式的,然後再映射到使用者虛拟位址空間中的共享區域内。
- 設定程式計數器(PC)。execve做的最後一件事情就是設定目前程序上下文中的程式計數器,使之指向文本區域的入口點。
使用mmap函數的使用者級存儲器映射
#include <unistd.h>
#include <sys/mman.h>
void *mmap(void *start,size_t length,int prot,int flags,int fd,off_t offset) ;
//傳回:若成功時則為指向映射區域的指針,若出錯則為MAP_FAILED(-1)
- mmap函數要求核心建立一個新的虛拟存儲器區域是,最好是從位址start開始的一個區域,并将檔案描述符fd指定的對象的一個連續的片(chunk)映射到這個新區域。連續的對象片大小為length位元組,從距檔案開始處偏移量為offset位元組的地方開始。start位址僅僅是一個暗示,通常被定義為NULL。
//munmap函數删除虛拟存儲器的區域:
#include <unistd.h>
#include <sys/mman.h>
int munmap(void *start,size_t length);
//傳回:若成功則為0,若出錯則為-1
-
1、需要額外的虛拟存儲器時,使用一種動态存儲器配置設定器(dynamic memory allocator)。一個動态存儲器配置設定器維護着一個程序的虛拟存儲器區域,稱為堆(heap)。在大多數的unix系統中,堆是一個請求二進制0的區域;對于每個程序,核心維護着一個變量brk,它指向堆的頂部。
-
2、配置設定器将堆視為一組不同大小的塊(block)的集合來維護。每個塊就是一個連續的虛拟存儲器組塊(chunk),要麼是已配置設定的,要麼是未配置設定的。
- 1)顯式配置設定器(explicit allocator):如通過malloc,free或C++中通過new,delete來配置設定和釋放一個塊。
- 2)隐式配置設定器(implicit allocator):也叫做垃圾收集器(garbage collector)。自動釋放未使用的已配置設定的塊的過程叫做垃圾回收(garbage collection)。
-
3、malloc不初始化它傳回的存儲器,calloc是一個基于malloc的包裝(wrapper)函數,它将配置設定的存儲器初始化為0。想要改變一個以前已配置設定的塊的大小,可以使用realloc函數。
-
4、配置設定器必須對齊塊,使得它們可以儲存任何類型的資料對象。在大多數系統中,以8位元組邊界對齊。
- 不修改已配置設定的塊:配置設定器隻能操作或者改變空閑塊。一旦被配置設定,就不允許修改或者移動它。
-
5、碎片(fragmentation)
- 有内部碎片(internal)和外部碎片(external)。
- 外部碎片:在一個已配置設定塊比有效載荷在時發生的。(如對齊要求,配置設定最小值限制等)
- 外部碎片:當空閑存儲器合計起來足夠滿足一個配置設定請求,但是沒有一個單獨的空閑塊足夠大可以來處理這個請求時發生的。
-
6、隐式空間連結清單
- 放置配置設定的塊的政策有:首次适配(first fit),下一次适配(next fit),和最佳适配(best fit)。
- 如果空閑塊已經最大程度的合并,而仍然不能生成一個足夠大的塊,來滿足要求的話,配置設定器就會向核心請求額外的堆存儲器,要麼是通過調用nmap,要麼是通過調用sbrk函數;配置設定器都會将額外的(增加的)存儲器轉化成一個大的空閑塊,将這個塊插入到空閑連結清單中,然後将被請求的塊放置在這個新的空閑塊中。
-
7、書中對配置設定器的設計舉了一個小例子,10.9.12節。
-
8、一種流行的減少配置設定時間的方法,稱為分離存儲(segregated storage),維護多個空閑連結清單,其中每個連結清單中的塊有大緻相等的大小。
垃圾收集
- 垃圾收集器是一種動态存儲配置設定器,自動釋放程式不再需要的已配置設定塊(垃圾)。支援垃圾收集的系統中,應用顯式配置設定堆塊,但從不顯式釋放它們。
- 垃圾收集器将存儲器視為一個有向可達圖,節點分為根節點和堆節點,堆節點對應堆中的已配置設定塊,根節點對應包含指向堆中的指針但不在堆中的位置,如寄存器、棧裡的變量、虛拟存儲器中讀寫資料區域内的全局變量。當存在根節點到p的有向路徑時,稱p是可達的,不可達節點無法被應用再次使用,即為垃圾。
- Java等語言對于建立和使用指針有嚴格的控制,能夠回收所有垃圾。C/C++語言的垃圾收集器通常不能維護可達圖的精确表示,稱為保守的垃圾收集器,它不能回收所有垃圾。
和存儲器有關的錯誤
-
在使用C語言和虛拟存儲器打交道時,很容易犯一些錯誤,而且它們常常是緻命的。
- 間接引用壞指針。間接引用指向空洞或隻讀區域的指針,會造成段異常或保護異常而終止。
- 讀未初始化的存儲器。.bss存儲器位置總是被加載器初始化為0,但堆存儲器不是這樣,假定它為0會造成不可預料的結果。
- 允許棧緩沖區溢出。不檢查串的大小就寫入棧中的目标緩沖區可能會有緩沖區溢出錯誤。
- 假設指針和指向的對象大小相同。這可能會導緻配置設定器的合并代碼失敗,但沒有明顯的原因。
- 造成錯位錯誤。如超出循環造成覆寫錯誤。
- 引用指針,而不是指向的對象。
- 誤解指針運算。指針的算術操作是以指向的對象的大小為機關進行的,而不是位元組。
- 引用不存在的變量。比如棧中的局部變量,棧彈出後它就不再合法了。
- 引用空閑堆塊中的資料。和上一個類似,這回發生在被釋放的堆中。
- 引起存儲器洩漏。忘記釋放已配置設定塊,産生垃圾,對于不終止的程式(守護程序、伺服器),存儲器洩漏的錯誤非常嚴重。
任務3:
結對學習照片
結對同學部落格
2017-2018-1 20155201 《資訊安全系統設計基礎》第十三周學習總結
我的學習回報
(S,E,B,m)=(4,1,2,4),即4個組,每個組1行,每個塊2個位元組,位址是4位。這裡假設每個字都是單位元組,每次都讀1個字。
初始時,高速緩存是空的:
- a)讀位址0的字。因為組0的有效位是0,緩存不命中,是以高速緩存從存儲器取出塊0,,并存儲在組0中。然後高速緩存傳回取出的高速緩存行的m[0]。
- b)讀位址1的字。高速緩存命中。
- c)度位址13的字。
- d)讀位址8的字。
- e)讀位址0的字。又發生緩存不命中,因為前面引用位址8時,剛好替換了塊8。
任務4:
實驗測試個人解析
1、實驗5:使用openssl進行混合密碼系統加密時,會話秘鑰的分發最可能用到()
-
[x] - A .
AES_encrypt
-
[x] - B .
RSA_public_encrypt
-
[ ] - C .
AES_decrypt
-
[ ] - D .
RSA_private_decrypt
-
[ ] - E .
AES_cbc_encrypt
-
[x] - F .
RSA_private_encrypt
-
[ ] - G .
RSA_public_decrypt
正确答案:
B、C
答案解析:
非對稱算法的應用:
- 秘鑰分發:用對方公鑰加密,對方用自己的私鑰解密
- 簽名驗簽:簽名主要是用自己私鑰加密,對方用自己公鑰驗簽名
測試時我的了解是選擇加密的選項,是以就選擇了三個en開頭的加密類型。
2、實驗4:中我們實作的測試程式是()驅動。
-
[ ] - A .
網絡裝置
-
[ ] - B .
字元裝置
-
[x] - C .
塊裝置
- 以上都不是
正确答案:B
- 實驗中實作了字元裝置。
- 在LINUX裡面,裝置類型分為:字元裝置、塊裝置以及網絡裝置, PCI是一種和ISA為一類的總線結構,歸屬于網絡驅動裝置~
- 字元裝置、塊裝置主要差別是:在對字元裝置發出讀/寫請求時,實際的硬體I/O一般就緊接着發生了,而塊裝置則不然,它利用一塊系統記憶體作為緩沖區,當使用者程序對裝置請求能滿足使用者的要求時,就傳回請求的資料,如果不能就調用請求函數來進行實際的I/O操作
在實驗的筆記送出中我重點摘抄了塊裝置驅動的内容,是以在考試時就理所當然的選擇了塊裝置,在實驗中沒有理論與實踐相結合地進行學習。
3、實驗3:在Ubuntu虛拟機中編譯多線程程式時,gcc使用()選項
- -g
- -lthread
- -pthread
-
[x] - D .
-lpthread
正确答案:C
- 實際環境中隻有-pthread可用
在網絡上查找資料的時候看到使用D選項進行編譯是以就選擇了D。
參考資料:
多線程程式設計之Linux環境下的多線程(一)
4、實驗3:wc的使用中,wc () a.txt 給出a.txt檔案的行數。
- -L
- -l
- -Ll
- -c
-
統計行數wc -l
心急看錯了選擇大寫的L。
5、實驗1:使用mount指令時,會涉及到()的修改。
- /etc/fstab
- /etc/hosts
- /etc/passwd
- /etc/exports
正确答案:D
nfs伺服器的配置,配置檔案/etc/exports:
- ro 該主機對該共享目錄有隻讀權限
- rw 該主機對該共享目錄有讀寫權限
root_squash 客戶機用root使用者通路該共享檔案夾時,将root使用者映射成匿名使用者
no_root_squash 客戶機用root通路該共享檔案夾時,不映射root使用者
all_squash 客戶機上的任何使用者通路該共享目錄時都映射成匿名使用者
anonuid 将客戶機上的使用者映射成指定的本地使用者ID的使用者
anongid 将客戶機上的使用者映射成屬于指定的本地使用者組ID
sync 資料同步寫入到記憶體與硬碟中
async 資料會先暫存于記憶體中,而非直接寫入硬碟
insecure 允許從這台機器過來的非授權通路
這個路徑确實在實驗的時候沒有注意。
6、實驗1:Windows 主控端,Ubuntu虛拟機,ARM實驗箱三者IP要在同一網段,操作中是根據()的IP來确定網段的。
- Windows 主控端
- Ubuntu虛拟機
- ARM實驗箱
- 以上都可以
- ARM實驗箱的IP修改要重新燒錄Linux系統,Windows 主控端,Ubuntu虛拟機的IP比較容易修改,是以我們在超級終端中通過ifconfig檢視ARM實驗箱的IP,把Windows 主控端,Ubuntu虛拟機的IP改成和ARM實驗箱同一個網段。
事實上根據三者任意一者的IP位址确定網段都可以,但是在實驗步驟中,通過ARM實驗箱的IP位址确定網段比較簡單。
7、實驗2:有關套接字接口函數open_clientfd()、open_listenfd(),下面說法正确的是()
- 這兩個函數中open_clientfd()隻可以用于用戶端程式設計
- 這兩個函數中open_clientfd()可以用于用戶端和伺服器端程式設計
- 這兩個函數中open_listenfd()隻可以用于伺服器端程式設計
- open_clientfd()中的port參數是用戶端的端口
- open_clientfd()中的port參數是伺服器端的端口
- open_clientfd()傳回的clientfd可以有Unix I/O接口讀寫
- open_listenfd()傳回的listenfd可以有Unix I/O接口讀寫
正确答案:A、C、E、F
- 根據書本p666
clientfd是用戶端的socket套接字,其中的端口port參數是根據伺服器端的端口來選擇的,目的是為了與伺服器端建立連接配接。listen是socket傳輸中伺服器端才有的監聽行為。
8、實驗2:有關socket接口中的socket(),下面說法正确的是()
- 不論用戶端程式設計還是伺服器端程式設計都要調用socket()
- socket()中的type參數設定為SOCK_STREAM時,基于TCP的,資料傳輸比較有保障
- socket()中的type參數設定為SOCK_DGRAM時,基于TCP的,資料傳輸比較有保障
- 使用socket()傳回的檔案描述符通過read(),write()就可以傳輸資料了
- socket()中的protocol參數一般設為0
- socket()中的type參數設定為 SOCK_RAW ,允許對底層協定如IP或ICMP進行直接通路
-
[x] - G .
socket()可用getaddrinfo傳回的ai_family,ai_socktype和ai_protocol填充
正确答案:A、B、E、F、G
- 根據書本p654
socket中的Protocol在TCP傳輸中一般設為0。
學習進度條
代碼行數(新增/累積) | 部落格量(新增/累積) | 學習時間(新增/累積) | 重要成長 |
---|---|---|---|
目标 | 5000行 | 20篇 | 400小時 |
第一周 | 100/100 | 1/1 | 5/5 |
第二周 | 100/200 | 2/3 | 5/10 |
第三周 | 100/300 | 2/5 | 5/15 |
第四周 | 100/400 | 1/6 | 5/20 |
第六周 | 100/500 | 1/7 | 5/25 |
第七周 | 100/600 | 1/8 | 5/30 |
第八周 | 800/1400 | 3/11 | 10/40 |
第九周 | 1000/2400 | 3/14 | 15/55 |
第十一周 | 300/2700 | 2/16 | 20/75 |
第十三周 | 100/2800 | 2/18 | 20/95 |