讀取文件為什麼要先讀到內核空間
① 計算機的CPU並不直接調取硬碟文件,為何卻要先載入到內存中
原因就是硬碟和內存在傳輸之間是有不同的地方的。計算機所有設備各部件之間的延時排列由高到低,依次為機械硬碟、固態硬碟、存儲器和CPU;從數據響應速度來看,存儲器明顯優於硬碟。數據的讀寫速度與固態磁碟的讀寫速度相差甚遠。
使用大的內存還有其他的好處,硬碟作為內存用,不是一個很好的建議,但內存可以用作硬碟,從而體驗更快的傳輸速度。這里我們需要用ramdisk軟體來實現,大內存用戶可以下載試用。
② 瀏覽網頁內容,下載文件等,是先到內存嗎為什麼不是先到cpu啊,懂的進
CPU只是處理指令,比如處理「下載」這個動作,至於下載存到哪裡是用戶的選擇,CPU裡面本身是沒有存儲空間的,所以不可能會存儲到CPU裡面的。CPU的存儲器裡面也只是存儲指令,根本不可能存儲用戶數據。當然這只是一個簡單的框架式的回答,計算機在執行用戶提交下載一個文件所要做的動作遠遠大於上面所說的。
③ 計算機要處理磁碟上的文件時,應先將文件內容讀到()中
計算機要處理磁碟上的文件,應先將文件內容讀到內存中。
計算機是由cpu來處理文件,而cpu會把要處理的文件先調用到內存中。
內存是計算機中重要的部件之一,它是與CPU進行溝通的橋梁。計算機中所有程序的運行都是在內存中進行的,因此內存的性能對計算機的影響非常大。內存(Memory)也被稱為內存儲器,其作用是用於暫時存放CPU中的運算數據,以及與硬碟等外部存儲器交換的數據。只要計算機在運行中,CPU就會把需要運算的數據調到內存中進行運算,當運算完成後CPU再將結果傳送出來,內存的運行也決定了計算機的穩定運行。 內存是由內存晶元、電路板、金手指等部分組成的。
④ 為什麼要把內存劃分為用戶空間與內核空間
內存劃分為用戶空間與內核空間的原因:
用戶空間和內核空間置於這種非對稱訪問機制下有很好的安全性,能有效抵禦惡意用戶的窺探,也能防止質量低劣的用戶程序的侵害,從而使系統運行得更穩定可靠。用戶空間與內核空間的許可權不同,內核空間擁有所有硬體設備的許可權,用戶空間只有普通硬體的許可權。
Linux系統對自身進行了劃分,一部分核心軟體獨立於普通應用程序,運行在較高的特權級別上,它們駐留在被保護的內存空間上,擁有訪問硬體設備的所有許可權,Linux將此稱為內核空間。
相對地,應用程序則是在「用戶空間」中運行。運行在用戶空間的應用程序只能看到允許它們使用的部分系統資源,並且不能使用某些特定的系統功能,也不能直接訪問內核空間和硬體設備,以及其他一些具體的使用限制。
⑤ 物理內存為什麼在使用時要映射到內核空間
物理內存為什麼在使用時要映射到內核空間
只是一個地址代碼而已,為了方便定址,讀取數據時輸出地址信號,再將數據信號鎖存就是地址對應的數據。通常,地址是經常變動的,數據不怎麼變動。還有就是CPU工作原理就是流水作業,不跳轉的話就是地址加1開始執行。
還有一個就是,電腦中,內核裡面只需要知道需要執行的程序在內存里的起始地址和末端地址,數據地址的起始和末端。內核空間很小,一般在KB到MB級別,對應現在動輒上GB的數據,你想存放數據也不現實。
⑥ C語言 讀取文件到內存
1.文件的大小。
文件大小:該文件所佔的存儲空間的大小,基本單位為位元組B,位元組向上分別為KB、MB、GB、TB,每級為前一級的1024倍,比如1KB=1024B,1M=1024KB。
2.是否可以不預先分配內存。
可以不預先分配跟文件大小一致的內存,但是從文件中讀出的每一行都要分配一個內存,可以為每一行設定一個固定的內存大小,比如A位元組,然後用C語言的malloc函數為該行數據分配內存,讀出數據後,判斷分配的內存是否夠用,如果不夠用,可以用C語言的realloc函數對該塊內存進行再分配。
malloc函數
malloc的全稱是memory allocation,中文叫動態內存分配,用於申請一塊連續的指定大小的內存塊區域以void*類型返回分配的內存區域地址,當無法知道內存具體位置的時候,想要綁定真正的內存空間,就需要用到動態的分配內存。
void* 類型表示未確定類型的指針。C,C++規定,void* 類型可以通過類型轉換強制轉換為任何其它類型的指針。
realloc函數
realloc的全程是reset allocation,中文名叫動態內存調整,用於調整一塊連續的已分配的內存塊區域。
3.數組和struct結構體的建立。
double數組:double a[100];
字元數組:char a[100];
struct結構體:
structst{
double a[100];
char b[100];
};
⑦ 如何在linux內核中讀寫文件
內核中讀寫文件
1.filp_open()在kernel中可以打開文件,其原形如下:
Struct file* filp_open(const char* filename, int open_mode, int mode); 該函數返回strcut file*結構指針,供後繼函數操作使用,該返回值用IS_ERR()來檢驗其有效性。
2. 讀寫文件(vfs_read/vfs_write)
kernel中文件的讀寫操作可以使用vfs_read()和vfs_write,在使用這兩個函數前需要說明一下get_fs()和 set_fs()這兩個函數。
vfs_read() vfs_write()兩函數的原形如下:
ssize_t vfs_read(struct file* filp, char __user* buffer, size_t len, loff_t* pos);
ssize_t vfs_write(struct file* filp, const char __user* buffer, size_t len, loff_t* pos);
注意這兩個函數的第二個參數buffer,前面都有__user修飾符,這就要求這兩個buffer指針都應該指向用空的內存,如果對該參數傳遞kernel空間的指針,這兩個函數都會返回失敗-EFAULT。但在Kernel中,我們一般不容易生成用戶空間的指針,或者不方便獨立使用用戶空間內存。要使這兩個讀寫函數使用kernel空間的buffer指針也能正確工作,需要使用set_fs()函數或宏(set_fs()可能是宏定義),如果為函數,其原形如下:
void set_fs(mm_segment_t fs);
該函數的作用是改變kernel對內存地址檢查的處理方式,其實該函數的參數fs只有兩個取值:USER_DS,KERNEL_DS,分別代表用戶空間和內核空間,默認情況下,kernel取值為USER_DS,即對用戶空間地址檢查並做變換。那麼要在這種對內存地址做檢查變換的函數中使用內核空間地址,就需要使用set_fs(KERNEL_DS)進行設置。get_fs()一般也可能是宏定義,它的作用是取得當前的設置,這兩個函數的一般用法為:
⑧ Windows將文件讀取到了內存地址空間的哪個地方
fopen只是打開一個文件 並不會載入在內存
⑨ 物理內存和內核內存是什麼
物理內存就是插到機器上的內存條!!
物理內存好象就是買的內存條
核心內存即內核內存,是操作系統為內核對象分配的內存
核心內存是虛擬內存,自己或系統自動設置。
內存在計算機中的作用很大,電腦中所有運行的程序都需要經過內存來執行,如果執行的程序很大或很多,就會導致內存消耗殆盡。為了解決這個問題, Windows中運用了虛擬內存技術,即拿出一部分硬碟空間來充當內存使用,當內存佔用完時,電腦就會自動調用硬碟來充當內存,以緩解內存的緊張。舉一個例子來說,如果電腦只有128MB物理內存的話,當讀取一個容量為200MB的文件時,就必須要用到比較大的虛擬內存,文件被內存讀取之後就會先儲存到虛擬內存,等待內存把文件全部儲存到虛擬內存之後,跟著就會把虛擬內里儲存的文件釋放到原來的安裝目錄里了。
⑩ 物理內存為什麼在使用時要映射到內核空間
你把概念弄混了,用戶態程序分配內存時(比如malloc、mmap),實際是分配的虛擬地址空間,「分配」操作的具體執行者肯定是內核,但此時並沒有分配物理內存,也並不是你說的將內存映射到內核空間。用戶態真正的物理內存分配,發生在「寫」相應內存時,會觸發缺頁異常,在缺頁異常中進行物理內存的分配,並創建相應的頁表,將其映射到進程的虛擬地址空間中。