12第十二章+UNIX操作系统(2)1.ppt_第1页
12第十二章+UNIX操作系统(2)1.ppt_第2页
12第十二章+UNIX操作系统(2)1.ppt_第3页
12第十二章+UNIX操作系统(2)1.ppt_第4页
12第十二章+UNIX操作系统(2)1.ppt_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、12.6 设备管理,打开一个设备文件即相当于申请对应的设备, 如该设备已处于打开状态则等待 关闭一个设备文件即相当于释放对应的设备, 如有等待者则唤醒一个 读写一个设备文件就相当于对所对应的设备执行I/O操作,缓冲与缓存,块型设备缓冲 用于磁盘、磁带等设备的I/O传输 每个缓冲区的长度与块型物理设备中一个块的长度相同, 即为512字节 缓冲区为所有块型设备公用, 其总数为15个,块型设备缓冲,struct buf int b_flags; /* see definition below */ struct buf *b_forw; /* headed by devtab of b_dev */

2、 struct buf *b_back; /* 设备b链向后指针 */ struct buf *av_forw; /* av链向前指针 */ struct buf *av_back; /* av链向后指针 */ int b_dev; /* 设备名 */ int b_wcount; /* 传送字数 */ char *b_addr; /* 内存地址(低位) */ char *b_xmem; /* 内存地址(高位) */ char *b_blkno; /* 设备物理块号 */ char b_error; /* 返回出错信息 */ char *b_resid; /* 传送剩余字节 */ bufNBUF

3、;,块型设备控制结构,struct devtab char d_active; /* busy flag */ char d_erncnt; /* error count */ struct buf *b_forw; /* first buffer for this dev */ struct buf *b_back; /* last buffer for this dev */ struct buf *d_actf; /* head of IO queue */ struct buf *d_actl; /* tail of IO queue */ ,块缓冲数据读写,内存区,缓冲区,磁盘块,i

4、omove,bread,breada,bwrite,bawrite,bdwrite,字符型设备缓冲,缓冲池 struct cblock struct cblock *c_next; /* pointer */ char info6; /* info container */ 读操作 写操作,预先读与延迟写,预先读(read ahead) 将以后即将使用的块读入缓冲区中 以后进程需要该块时便可在缓冲区中直接得到, 不必等待设备I/O传输 基于文件顺序访问的假设 预先读函数breada(dev,blkno,rablkno) rablkno链入d链 IO完成放入b链和av链,预先读与延迟写,延迟写(

5、delayed write) 当一个缓冲块尚未写满时, 暂不将其写到外存 以后继续写时, 不必将该块由外存读入内存 延迟写函数bdwrite(bp) 将bp对应的缓冲区链入b链和av链, 若以后还需要读写, 可在缓冲区中得到. 缓冲区在av链上取到用作其它用途前, 由b链换到d链, 写回外存.,12.7 系统调用,地位 操作系统API One of Programmer Interface The other being System Libs 主要包括 Process manipulation File manipulation Communication Others,12.7.1 有关进

6、程的系统调用命令,相关系统调用 创建子进程 Pid = fork() 子进程是父进程的复制品 返回值:父进程为子进程编号,子进程为0 加载并执行新程序 execl(prog, arg0,argn-1,0) 以arg0,argn-1为参数执行prog 覆盖原来程序,从第一条指令开始执行,12.7.1有关进程的系统调用命令,进程自我结束 exit(status) Status为终止状态 唤醒父进程 等待子进程终止 pid=wait( if(pid = 0) /*成立*/ /*子进程代码*/ else /*父进程代码*/ ,proc结构 p_pid=12 p_ppid=9 user结构,复制,父进程

7、,子进程,fork() 创建子进程,联系,子进程号(0整数),pid = fork(); if(pid = 0) /*不成立*/ /*子进程代码*/ else /*父进程代码*/ ,恒为0,pid=fork(); if(pid=0) /*不成立*/ execl(“P”,0); else /*父进程代码*/ ,proc结构 p_pid=9 p_ppid=5 user结构,pid=fork(); if(pid=0) /*成立*/ execl(“P”,0); else /*父进程代码*/ ,proc结构 p_pid=12 p_ppid=9 user结构,父进程,子进程,execl() 加载并执行新程

8、序,pid=fork(); if(pid=0) /*不成立*/ execl(“P”,0); else /*父进程代码*/ ,proc结构 p_pid=9 p_ppid=5 user结构,程序P (覆盖原来程序),proc结构 p_pid=12 p_ppid=9 user结构,父进程,子进程,execl() 加载并执行新程序,pid=fork(); if(pid=0) /*不成立*/ execl(“P”,0); else /*父进程代码*/ id=wait( int end_p1=end_p2=end_p3=end_p4=end_p5=end_p8=0; int pid, status; if(

9、pid1=fork()= =0) execl(P1,0); wait(,if(pid5=fork()= =0) execl(P5,0); if(pid6=fork()= =0) execl(P6,0); do /等待P3和P6结束 pid=wait( ,vfork 与 fork,fork 功能 复制地址空间(code+data+stack) 复制控制结构(proc,user) 特点 父子进程之间有两个各自独立的数据拷贝 问题 不加载新程序 不能实现数据共享,不能描述诸如“有界缓冲区”问题 若加载新程序 复制没有意义,浪费时间和空间,vfork与fork,vfork 只复制控制结构(proc+u

10、ser); 不复制地址空间(code+data) 父子进程共享地址空间 使用 父进程使用 vfork 创建子进程; 子进程与父进程共享地址空间; 子进程使用 execve 改变其虚拟地址空间.,12.7.2有关文件的系统调用命令,创建文件 fd=creat(path_name,mode) 分配一个inode 填写目录项 以写方式打开该文件 返回文件描述符 打开文件 fd=open(path_name,mode) 查目录找到inode 权限检查(mode, i_mode, i_uid, i_gid, u_uid, u_gid) 在file表中分配一个表项,指向该内存inode 在u_ofile中

11、取一表目,指向file表中对应表目 返回文件描述符fd,有关文件的系统调用命令,关闭文件 close(fd) 由fd查u_ofile找到对应入口 由u_ofilefd找到file表对应入口 f_count- 若f_count=0, i_count 若i_count=0, 且i_node修改过, i_node写回外存 u_ofilefd=-1(空闲标志),有关文件的系统调用命令,读命令 n_rd=read(fd,buf,bytes) 由u_ofilefd,找到file表对应入口 检查访问权限(f_flag, READ) 由f_inode找到内存inode入口 由f_offset, count和i

12、_addr计算磁盘块号(可能多个块)(bmap函数) 启动I/O设备读取盘块到系统缓冲区中(如buffer无,切换进程) 缓冲区信息复制到进程空间(iomove) 返回实际传输字节数nrd,有关文件的系统调用命令,写文件 n_wt=write(fd,buf,bytes) 由u_ofilefd,找到file表对应入口 检查访问权限(f_flag, WRITE) 由f_inode找到内存inode入口 由f_offset, count和i_addr计算磁盘地址块号(可能分配盘块) 申请系统缓冲区,将buf起始count数据送到缓冲区中(可多次) 缓冲区链到设备I/O链上, 如设备空闲启动设备 修改

13、inode中文件长度i_size 返回实际传输字节数nwt,有关文件的系统调用命令,文件指针定位 seek(fd,offset,origin) 由u_ofilefd找到file表入口 由f_inode找到内存inode 检查参数合法性(i_size0, i_size1, f_offset, offset) 按参数要求调整f_offset指针,有关文件的系统调用命令,建立文件链接 link(old_name,new_name) 查目录找到oldpathname(inode) 查目录找到newpathname的末级目录 检查操作合法性 Inode的i_nlink+ (name, i_number)

14、 末级目录 断开文件链接 unlink(path_name) 查目录找到pathname(inode) i_nlink-; 如结果为0, 释放所有磁盘块 (删除文件) 清除末级文件名在末级目录中的登记,有关文件的系统调用命令,建立管道 pipe(fd) 分配一个inode,(i_flag标志为PIPE文件,i_count=2) 分配2个file表目(f_flag分别为R和W,读/写指针为0) 分配2个u_ofile表目, 分别指向2个file表目 返回2个文件描述符fd0,fd1, 分别为u_ofile中的2个入口,有关文件的系统调用命令,安装文件卷 smount( ) 检查是否超级用户 找到

15、special_pathname文件的inode(用makenode建立) 合法性检查(特殊块型文件) 找到directory_pathname节点的inode 如非目录或引用数大于,错返 读入super block到buf,按filesys格式解释 分配一个mount表项,填写(m_dev,m_bufp,m_inodep) 安装节点inode的i_addr0=设备文件i_addr0 安装节点inode的i_flag =| IMOUNT,有关文件的系统调用命令,卸下文件卷 sumount(special_name) 查目录找到special_pathname的inode,取dev(i_addr0) 释放特殊文件的inode 由dev查mount表(m_dev)找到对应super block 系统缓冲区延迟写块写回 该卷所有更新inode写回 super block写回 释放super block所占用的缓冲区 由m_inodep找到安装节点的inode 安装节点i_flag =& IMOUNT 释放mount表项,12.8 外壳语

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论