吉林大學(xué)操作系統(tǒng)課件第十二章UNIX操作系統(tǒng)2_第1頁
吉林大學(xué)操作系統(tǒng)課件第十二章UNIX操作系統(tǒng)2_第2頁
吉林大學(xué)操作系統(tǒng)課件第十二章UNIX操作系統(tǒng)2_第3頁
吉林大學(xué)操作系統(tǒng)課件第十二章UNIX操作系統(tǒng)2_第4頁
吉林大學(xué)操作系統(tǒng)課件第十二章UNIX操作系統(tǒng)2_第5頁
已閱讀5頁,還剩26頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、l打開一個設(shè)備文件即相當(dāng)于申請對應(yīng)的打開一個設(shè)備文件即相當(dāng)于申請對應(yīng)的設(shè)備設(shè)備, 如該設(shè)備已處于打開狀態(tài)則等待如該設(shè)備已處于打開狀態(tài)則等待 l關(guān)閉一個設(shè)備文件即相當(dāng)于釋放對應(yīng)的關(guān)閉一個設(shè)備文件即相當(dāng)于釋放對應(yīng)的設(shè)備設(shè)備, 如有等待者則喚醒一個如有等待者則喚醒一個 l讀寫一個設(shè)備文件就相當(dāng)于對所對應(yīng)的讀寫一個設(shè)備文件就相當(dāng)于對所對應(yīng)的設(shè)備執(zhí)行設(shè)備執(zhí)行I/O操作操作 緩沖與緩存緩沖與緩存n塊型設(shè)備緩沖塊型設(shè)備緩沖 n用于磁盤、磁帶等設(shè)備的用于磁盤、磁帶等設(shè)備的I/O傳輸傳輸 n每個緩沖區(qū)的長度與塊型物理設(shè)備中一個塊每個緩沖區(qū)的長度與塊型物理設(shè)備中一個塊的長度相同的長度相同, 即為即為512字節(jié)字節(jié)

2、 n緩沖區(qū)為所有塊型設(shè)備公用緩沖區(qū)為所有塊型設(shè)備公用, 其總數(shù)為其總數(shù)為15個個 塊型設(shè)備緩沖struct bufint b_flags; /* see definition below */struct buf *b_forw; /* headed by devtab of b_dev */ struct buf *b_back; /* 設(shè)備b鏈向后指針 */struct buf *av_forw; /* av鏈向前指針 */struct buf *av_back; /* av鏈向后指針 */int b_dev; /* 設(shè)備名 */int b_wcount; /* 傳送字數(shù) */char *

3、b_addr; /* 內(nèi)存地址(低位) */char *b_xmem; /* 內(nèi)存地址(高位) */char *b_blkno; /* 設(shè)備物理塊號 */char b_error; /* 返回出錯信息 */char *b_resid; /* 傳送剩余字節(jié) */bufNBUF;塊型設(shè)備控制結(jié)構(gòu)塊型設(shè)備控制結(jié)構(gòu)struct devtabstruct devtab char d_active; /char d_active; /* * busy flag busy flag * */ /char d_erncnt; /char d_erncnt; /* * error count error cou

4、nt * */ /struct buf struct buf * *b_forw; /b_forw; /* * first buffer for this dev first buffer for this dev * */ /struct buf struct buf * *b_back; /b_back; /* * last buffer for this dev last buffer for this dev * */ /struct buf struct buf * *d_actf; /d_actf; /* * head of IO queue head of IO queue *

5、*/ /struct buf struct buf * *d_actl; /d_actl; /* * tail of IO queue tail of IO queue * */ / 塊緩沖數(shù)據(jù)讀寫 內(nèi)存區(qū) 緩沖區(qū) 磁盤塊 iomove bread,breada bwrite,bawrite,bdwrite 字符型設(shè)備緩沖字符型設(shè)備緩沖 n緩沖池緩沖池 struct cblockstruct cblock struct cblock struct cblock * *c_next; /c_next; /* * pointer pointer * */ /char info6; /char in

6、fo6; /* * info container info container * */ / n讀操作讀操作 n寫操作寫操作 預(yù)先讀與延遲寫預(yù)先讀與延遲寫 n預(yù)先讀預(yù)先讀(read ahead) n將以后即將使用的塊讀入緩沖區(qū)中將以后即將使用的塊讀入緩沖區(qū)中 n以后進程需要該塊時便可在緩沖區(qū)中直接得以后進程需要該塊時便可在緩沖區(qū)中直接得到到, 不必等待設(shè)備不必等待設(shè)備I/O傳輸傳輸 n基于文件順序訪問的假設(shè)基于文件順序訪問的假設(shè) n預(yù)先讀函數(shù)預(yù)先讀函數(shù)breada(dev,blkno,rablkno)nrablkno鏈入鏈入d鏈鏈nIO完成放入完成放入b鏈和鏈和av鏈鏈預(yù)先讀與延遲寫預(yù)先讀與延

7、遲寫n延遲寫延遲寫(delayed write) n當(dāng)一個緩沖塊尚未寫滿時當(dāng)一個緩沖塊尚未寫滿時, 暫不將其寫到外暫不將其寫到外存存 n以后繼續(xù)寫時以后繼續(xù)寫時, 不必將該塊由外存讀入內(nèi)存不必將該塊由外存讀入內(nèi)存n延遲寫延遲寫函數(shù)函數(shù)bdwrite(bp)n將將bp對應(yīng)的緩沖區(qū)鏈入對應(yīng)的緩沖區(qū)鏈入b鏈和鏈和av鏈鏈, 若以后還需若以后還需要讀寫要讀寫, 可在緩沖區(qū)中得到可在緩沖區(qū)中得到. n緩沖區(qū)在緩沖區(qū)在av鏈上取到用作其它用途前鏈上取到用作其它用途前, 由由b鏈換鏈換到到d鏈鏈, 寫回外存寫回外存. l地位地位操作系統(tǒng)操作系統(tǒng)APIOne of Programmer InterfacelT

8、he other being System Libsl主要包括主要包括Process manipulationFile manipulationCommunicationOthers12.7.1 有關(guān)進程的系統(tǒng)調(diào)用命令有關(guān)進程的系統(tǒng)調(diào)用命令 n相關(guān)系統(tǒng)調(diào)用相關(guān)系統(tǒng)調(diào)用n創(chuàng)建子進程創(chuàng)建子進程nPid = fork()n子進程是父進程的復(fù)制品子進程是父進程的復(fù)制品n返回值:父進程為子進程編號,子進程為返回值:父進程為子進程編號,子進程為0n加載并執(zhí)行新程序加載并執(zhí)行新程序nexecl(prog, arg0,argn-1,0)n以以arg0,argn-1為參數(shù)執(zhí)行為參數(shù)執(zhí)行progn覆蓋原來程序,從

9、第一條指令開始執(zhí)行覆蓋原來程序,從第一條指令開始執(zhí)行12.7.1有關(guān)進程的系統(tǒng)調(diào)用命令有關(guān)進程的系統(tǒng)調(diào)用命令n進程自我結(jié)束進程自我結(jié)束nexit(status)nStatus為終止?fàn)顟B(tài)為終止?fàn)顟B(tài)n喚醒父進程喚醒父進程n等待子進程終止等待子進程終止npid=wait(&status)n返回終止子進程編號返回終止子進程編號n參數(shù)為子進程的終止?fàn)顟B(tài)參數(shù)為子進程的終止?fàn)顟B(tài)proc結(jié)構(gòu)結(jié)構(gòu) p_pid=9 p_ppid=5user結(jié)構(gòu)結(jié)構(gòu)pid = fork();pid = fork();if(pid = 0) /if(pid = 0) /* *成立成立* */ / / /* *子進程代碼子進程

10、代碼* */ / elseelse/ /* *父進程代碼父進程代碼* */ / proc結(jié)構(gòu)結(jié)構(gòu) p_pid=12 p_ppid=9user結(jié)構(gòu)結(jié)構(gòu)復(fù)制復(fù)制父進程父進程子進程子進程fork() 創(chuàng)建子進程創(chuàng)建子進程聯(lián)系聯(lián)系子進程號子進程號( (0整數(shù)整數(shù)) )pid = fork();pid = fork();if(pid = 0) /if(pid = 0) /* *不成立不成立* */ / / /* *子進程代碼子進程代碼* */ / elseelse/ /* *父進程代碼父進程代碼* */ / 恒為恒為0pid=fork();if(pid=0) /*不成立不成立*/ execl(“P”,0

11、);else/*父進程代碼父進程代碼*/proc結(jié)構(gòu)結(jié)構(gòu) p_pid=9 p_ppid=5user結(jié)構(gòu)結(jié)構(gòu)pid=fork();if(pid=0) /*成立成立*/ execl(“P”,0);else/*父進程代碼父進程代碼*/proc結(jié)構(gòu)結(jié)構(gòu) p_pid=12 p_ppid=9user結(jié)構(gòu)結(jié)構(gòu)父進程父進程子進程子進程execl() 加載并執(zhí)行新程序加載并執(zhí)行新程序pid=fork();if(pid=0) /*不成立不成立*/ execl(“P”,0);else/*父進程代碼父進程代碼*/proc結(jié)構(gòu)結(jié)構(gòu) p_pid=9 p_ppid=5user結(jié)構(gòu)結(jié)構(gòu)程序程序P ( (覆蓋原來程序覆蓋原來程

12、序) )proc結(jié)構(gòu)結(jié)構(gòu) p_pid=12 p_ppid=9user結(jié)構(gòu)結(jié)構(gòu)父進程父進程子進程子進程execl() 加載并執(zhí)行新程序加載并執(zhí)行新程序pid=fork();if(pid=0) /*不成立不成立*/ execl(“P”,0);else/*父進程代碼父進程代碼*/id=wait(&s)proc結(jié)構(gòu)結(jié)構(gòu) p_pid=9 p_ppid=5user結(jié)構(gòu)結(jié)構(gòu)程序程序P (P (覆蓋原來程序覆蓋原來程序) )exit(2)proc結(jié)構(gòu)結(jié)構(gòu) p_pid=12 p_ppid=9user結(jié)構(gòu)結(jié)構(gòu)父進程父進程子進程子進程exit() 進程自我終止進程自我終止 P1 P2 P3 P4P5 P6

13、P7 P8例子例子: 設(shè)有設(shè)有8個程序,執(zhí)行次序如下圖所示,試用個程序,執(zhí)行次序如下圖所示,試用fork,execl,wait,exit系統(tǒng)調(diào)用描述之系統(tǒng)調(diào)用描述之main() int pid1,pid2,pid3,pid4,pid5,pid6,pid7,pid8; int end_p1=end_p2=end_p3=end_p4=end_p5=end_p8=0; int pid, status; if(pid1=fork()= =0) execl(P1,0); wait(&status); if(pid2=fork()= =0) execl(P2,0); if(pid3=fork()=

14、 =0) execl(P3,0); if(pid4=fork()= =0) execl(P4,0); do /等待等待P2結(jié)束結(jié)束 pid=wait(&status); if(pid= =pid2) end_p2=1; if(pid= =pid3) end_p3=1; if(pid= =pid4) end_p4=1; while(end_p2= =0); if(pid5=fork()= =0) execl(P5,0); if(pid6=fork()= =0) execl(P6,0); do /等待等待P3和和P6結(jié)束結(jié)束 pid=wait(&status); if(pid= =

15、pid3) end_p3=1; if(pid= =pid4) end_p4=1; if(pid= =pid5) end_p5=1; if(pid= =pid6) end_p6=1; while(end_p3= =0|end_p6= =0); if(pid7=fork()= =0) execl(P7,0); do /等待等待P4,P5,P7結(jié)束結(jié)束 pid=wait(&status); if(pid= =pid4) end_p4=1; if(pid= =pid5) end_p5=1; if(pid= =pid7) end_p7=1; while(end_p4= =0|end_p5= =0

16、|end_p7= =0); if(pid8=fork()= =0) execl(P8,0); wait(&status); exit(0);vfork 與與 forknfork 功能功能n復(fù)制地址空間復(fù)制地址空間(code+data+stack)n復(fù)制控制結(jié)構(gòu)復(fù)制控制結(jié)構(gòu)(proc,user)n特點特點n父子進程之間有兩個各自獨立的數(shù)據(jù)拷貝父子進程之間有兩個各自獨立的數(shù)據(jù)拷貝n問題問題n不加載新程序不加載新程序n不能實現(xiàn)數(shù)據(jù)共享,不能描述諸如不能實現(xiàn)數(shù)據(jù)共享,不能描述諸如“有界緩沖區(qū)有界緩沖區(qū)”問題問題n若加載新程序若加載新程序n復(fù)制沒有意義,浪費時間和空間復(fù)制沒有意義,浪費時間和空間

17、vfork與與forknvfork n只復(fù)制控制結(jié)構(gòu)只復(fù)制控制結(jié)構(gòu)(proc+user);n不復(fù)制地址空間不復(fù)制地址空間(code+data)n父子進程共享地址空間父子進程共享地址空間n使用使用n父進程使用父進程使用 vfork 創(chuàng)建子進程創(chuàng)建子進程; n子進程與父進程共享地址空間;子進程與父進程共享地址空間;n子進程使用子進程使用 execve 改變其虛擬地址空間改變其虛擬地址空間.12.7.2有關(guān)文件的系統(tǒng)調(diào)用命令有關(guān)文件的系統(tǒng)調(diào)用命令 n創(chuàng)建文件創(chuàng)建文件 fd=creat(path_name,mode) fd=creat(path_name,mode) n分配一個分配一個inoden填寫

18、目錄項填寫目錄項n以寫方式打開該文件以寫方式打開該文件n返回文件描述符返回文件描述符 n打開文件打開文件 fd=open(path_name,mode) fd=open(path_name,mode) n查目錄找到查目錄找到inoden權(quán)限檢查權(quán)限檢查(mode, i_mode, i_uid, i_gid, u_uid, u_gid)n在在file表中分配一個表項,指向該內(nèi)存表中分配一個表項,指向該內(nèi)存inoden 在在u_ofile中取一表目,指向中取一表目,指向file表中對應(yīng)表目表中對應(yīng)表目 n返回文件描述符返回文件描述符fd有關(guān)文件的系統(tǒng)調(diào)用命令有關(guān)文件的系統(tǒng)調(diào)用命令n關(guān)閉文件關(guān)閉文件

19、 close(fd) close(fd) n由由fd查查u_ofile找到對應(yīng)入口找到對應(yīng)入口 n由由u_ofilefd找到找到file表對應(yīng)入口表對應(yīng)入口 nf_count- n若若f_count=0, i_count n若若i_count=0, 且且i_node修改過修改過, i_node寫回外存寫回外存 nu_ofilefd=-1(空閑標(biāo)志空閑標(biāo)志) 有關(guān)文件的系統(tǒng)調(diào)用命令有關(guān)文件的系統(tǒng)調(diào)用命令n讀命令讀命令 n_rd=read(fd,buf,bytes) n_rd=read(fd,buf,bytes) n由由u_ofilefd,找到找到file表對應(yīng)入口表對應(yīng)入口 n檢查訪問權(quán)限檢查訪

20、問權(quán)限(f_flag, READ) n由由f_inode找到內(nèi)存找到內(nèi)存inode入口入口 n由由f_offset, count和和i_addr計算磁盤塊號計算磁盤塊號(可能多可能多個塊個塊)(bmap函數(shù)函數(shù)) n啟動啟動I/O設(shè)備讀取盤塊到系統(tǒng)緩沖區(qū)中設(shè)備讀取盤塊到系統(tǒng)緩沖區(qū)中(如如buffer無無,切換進程切換進程) n緩沖區(qū)信息復(fù)制到進程空間緩沖區(qū)信息復(fù)制到進程空間(iomove) n返回實際傳輸字節(jié)數(shù)返回實際傳輸字節(jié)數(shù)nrd 有關(guān)文件的系統(tǒng)調(diào)用命令有關(guān)文件的系統(tǒng)調(diào)用命令n寫文件寫文件 n_wt=write(fd,buf,bytes) n_wt=write(fd,buf,bytes)

21、n由由u_ofilefd,找到找到file表對應(yīng)入口表對應(yīng)入口 n檢查訪問權(quán)限檢查訪問權(quán)限(f_flag, WRITE) n由由f_inode找到內(nèi)存找到內(nèi)存inode入口入口 n由由f_offset, count和和i_addr計算磁盤地址塊號計算磁盤地址塊號(可可能分配盤塊能分配盤塊) n申請系統(tǒng)緩沖區(qū),將申請系統(tǒng)緩沖區(qū),將buf起始起始count數(shù)據(jù)送到緩沖數(shù)據(jù)送到緩沖區(qū)中區(qū)中(可多次可多次) n緩沖區(qū)鏈到設(shè)備緩沖區(qū)鏈到設(shè)備I/O鏈上鏈上, 如設(shè)備空閑啟動設(shè)備如設(shè)備空閑啟動設(shè)備 n修改修改inode中文件長度中文件長度i_size n返回實際傳輸字節(jié)數(shù)返回實際傳輸字節(jié)數(shù)nwt 有關(guān)文件的

22、系統(tǒng)調(diào)用命令有關(guān)文件的系統(tǒng)調(diào)用命令n文件指針定位文件指針定位 seek(fd,offset,origin) seek(fd,offset,origin) n由由u_ofilefd找到找到file表入口表入口 n由由f_inode找到內(nèi)存找到內(nèi)存inode n檢查參數(shù)合法性檢查參數(shù)合法性(i_size0, i_size1, f_offset, offset) n按參數(shù)要求調(diào)整按參數(shù)要求調(diào)整f_offset指針指針 有關(guān)文件的系統(tǒng)調(diào)用命令有關(guān)文件的系統(tǒng)調(diào)用命令n建立文件鏈接建立文件鏈接 link(old_name,new_name) n查目錄找到查目錄找到oldpathname(inode) n查

23、目錄找到查目錄找到newpathname的末級目錄的末級目錄 n檢查操作合法性檢查操作合法性 nInode的的i_nlink+ n(name, i_number) 末級目錄末級目錄 n斷開文件鏈接斷開文件鏈接 unlink(path_name) n查目錄找到查目錄找到pathname(inode) ni_nlink-; 如結(jié)果為如結(jié)果為0, 釋放所有磁盤塊釋放所有磁盤塊 (刪除文件刪除文件) n清除末級文件名在末級目錄中的登記清除末級文件名在末級目錄中的登記 有關(guān)文件的系統(tǒng)調(diào)用命令有關(guān)文件的系統(tǒng)調(diào)用命令n建立管道建立管道 pipe(fd) n分配一個分配一個inode,(i_flag標(biāo)志為標(biāo)志

24、為PIPE文件,文件,i_count=2) n分配分配2個個file表目表目(f_flag分別為分別為R和和W,讀讀/寫指針為寫指針為0) n分配分配2個個u_ofile表目表目, 分別指向分別指向2個個file表目表目 n返回返回2個文件描述符個文件描述符fd0,fd1, 分別為分別為u_ofile中的中的2個入口個入口 有關(guān)文件的系統(tǒng)調(diào)用命令有關(guān)文件的系統(tǒng)調(diào)用命令n安裝文件卷安裝文件卷 smount( ) smount( ) n檢查是否超級用戶檢查是否超級用戶 n找到找到special_pathname文件的文件的inode(用用makenode建立建立) n合法性檢查(特殊塊型文件)合法性檢查(特殊塊型文件) n找到找到directory_pathname節(jié)點的節(jié)點的inode n如非目錄或引用數(shù)大于,錯返如非目錄或引用數(shù)大于,錯返 n讀入讀入super block到到buf,按按filesys格式解釋格式解釋 n分配一個分配一個mount表項,填寫(表項,填寫(m_dev,m_bufp,m_inodep) n安裝節(jié)點安裝節(jié)點inode的的i_addr0=設(shè)備文件設(shè)備文件i_addr0 n安裝節(jié)點安裝節(jié)點inode的的i_flag =| IMOUNT 有關(guān)文件的系統(tǒng)調(diào)用命令有關(guān)文件的系統(tǒng)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論