我們慢慢來說明為什麼要使用緩衝:
只有工作在管理員模式下,即只有核心**才可以訪問磁碟、終端、印表機等裝置,還可以訪問全部的記憶體。而使用者模式下只訪問特定區域的記憶體空間。
系統呼叫就是要從使用者空間陷入核心空間,進入管理員模式。系統呼叫是很花時間的,原因:(1)執行權從使用者**轉移到核心**本身要進行資料傳輸;(2)管理員模式對應特殊的堆疊和記憶體環境,系統呼叫前必須建立好,系統呼叫後又要把堆疊和記憶體環境恢復成使用者程式執行時的狀態,這種切換需要消耗很多時間。
read()和write()要訪問磁碟,它們是系統呼叫,為節約時間應儘量減少read()和write()的呼叫次數,為達到此目的就要增大檔案緩衝。
下面的**是自己實現使用緩衝區的who命令實現。
#include#include#include#include#include#include#include#define bufsize 16 //緩衝區中存放16條記錄
#define nullut ((struct utmp*)null) //定義乙個空指標,不指向任何實際的物件或函式
#define utsize (sizeof(struct utmp))
#define showhost
int my_utmp_open(char *filename);
struct utmp* my_utmp_next();
int my_utmp_reload();
void my_utmp_close();
void show_info(struct utmp*);
static char utmpbuf[bufsize*utsize]; //緩衝區大小
static int num_recs; //緩衝區中的資料個數
static int cur_rec; //緩衝區中已經使用的資料個數
static int fd_utmp=-1; //utmp檔案的描述符
int my_utmp_open(char *filename)
struct utmp* my_utmp_next()
int my_utmp_reload()
void my_utmp_close()
int main()
while((record=my_utmp_next())!=nullut)
my_utmp_close(); //關閉檔案
return 0;
}void show_info(struct utmp *buf)
管理員模式和使用者模式之間切換需要時間,相比之下,磁碟i/o消耗的時間更多,因此核心也利用緩衝技術來提高對磁碟的訪問速度。
因此read函式並不是把資料直接從磁碟讀到程序緩衝區,而是從核心緩衝區讀到程序緩衝區;同樣write也不會都導致核心的寫磁碟操作,只有當核心緩衝區積累到一定量時才一次寫入磁碟,有時突然斷電,則核心緩衝區的資料會丟失。
當程序要求的資料塊不在核心緩衝區時,核心把相應的資料加到請求資料列表中,然後掛起該程序,為其他程序服務。一段時間後(很短),核心把相應資料從磁碟讀到核心緩衝區,然後再把資料複製到程序緩衝區,最後喚起被掛起的程序。
使用讀寫緩衝
我們慢慢來說明為什麼要使用緩衝 只有工作在管理員模式下,即只有核心 才可以訪問磁碟 終端 印表機等裝置,還可以訪問全部的記憶體。而使用者模式下只訪問特定區域的記憶體空間。系統呼叫就是要從使用者空間陷入核心空間,進入管理員模式。系統呼叫是很花時間的,原因 1 執行權從使用者 轉移到核心 本身要進行資料...
WDM ioctl 緩衝區讀寫
1 method buffered buffered io中io管理器會分配一塊堆記憶體然後把使用者態緩衝區資料copy進來再傳給驅動程式,而輸出時io管理器會把堆記憶體中的資料copy回使用者態緩衝區。ulong inputsize i.ioctlinputbuffersize pvoid inp...
緩衝區方式讀寫操作
驅動程式建立裝置物件一共有三種讀寫方式,分別是緩衝區讀寫 直接方式讀寫和其他方式讀寫。這三種方式對應的裝置物件的flags子域分別是do buffered io do direct io和0。為什麼要設定緩衝區讀寫方式?讀寫操作一般由writefile或readfile函式引起,以writefile...