欢迎来到冰点文库! | 帮助中心 分享价值,成长自我!
冰点文库
全部分类
  • 临时分类>
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • ImageVerifierCode 换一换
    首页 冰点文库 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

    桂林理工大学《操作系统》实习报告何天从Word文件下载.docx

    • 资源ID:3290973       资源大小:471.21KB        全文页数:37页
    • 资源格式: DOCX        下载积分:3金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要3金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    桂林理工大学《操作系统》实习报告何天从Word文件下载.docx

    1、2、内存管理(MM)3、虚拟文件系统(Virtual File System,VFS)4、网络接口(NET);5、进程间通信(IPC)。进程调度控制着进程对CPU 的访问。当需要选择下一个进程运行时,由调度程序选择最值得运行的进程。可运行进程实际是仅等待CPU 资源的进程,如果某个进程在等待其它资源,则该进程是不可运行进程。Linux 使用了比较简单的基于优先级的进程调度算法选择新的进程。内存管理允许多个进程安全地共享主内存区域。Linux 的内存管理支持虚拟内存,即在计算机中运行的程序,其代码、数据和堆栈的总量可以超过实际内存的大小,操作系统只将当前使用的程序块保留在内存中,其余的程序块则保

    2、留在磁盘上。必要时,操作系统负责在磁盘和内存之间交换程序块。 内存管理从逻辑上可以分为硬件无关的部分和硬件相关的部分。硬件无关的部分提供了进程的映射和虚拟内存的对换;硬件相关的部分为内存管理硬件提供了虚拟接口。虚拟文件系统隐藏了各种不同硬件的具体细节,为所有设备提供了统一的接口,虚拟文件系统还支持多达数十种不同的文件系统,这也是Linux 较有特色的部分。虚拟文件系统可分为逻辑文件系统和设备驱动程序。逻辑文件系统指Linux所支持的文件系统,如ext2、fat 等,设备驱动程序指为每一种硬件控制器所编写的设备驱动程序模块。网络接口提供了对各种网络标准的存取和各种网络硬件的支持。网络接口可分为网

    3、络协议和网络驱动程序两部分。网络协议部分负责实现每一种可能的网络传输协议,网络设备驱动程序负责与硬件设备进行通信,每一种可能的硬件设备都有相应的设备驱动程序。 进程间通信支持进程间各种通信机。 二、代码分析结果2.1 do_fork()函数的参数(1) unsigned long clone_flags显然,这是一个标志参数,在函数中用于区分创建的性质如是否子进程与父进程共享文件系统信息等等。具体出现在几个复制函数如copy_file(clone_flags,p)、copy_fs(clone_flags,p)、copy_sighand(clone_flags,p)、copy_mm(clone_

    4、flags,p)以及copy_thread(nr,clone_flags,usp,p,regs)中。而其使用方法是和几个linux定义的32位宏变量相与,结果是零则表示没有该宏变量对应的性质。具体的使用将在分析上述几个函数时说明。(2) unsigned long usp 看样子这是一个寄存器的值,它出现在copy_thread函数中,对copy_thread()分析中可以看出这个参数的大致用法,似乎与堆栈有关。(3) struct pt_regs *regspt_regs数据结构的定义在LinuxIncludeAsm-i386Ptrace.h文件,其中包含一些寄存器的值和标志。源代码中对这个

    5、结构的解释是这样的:/*this struct defines the way the regsiters are stored on the stack *during a system call.*/2.2 fork.c文件中的全局变量(1) int nr_tasks=1;这里只能作大致的猜测,nr_tasks 变量是用于记录新创建的子进程连同父进程的个数,而且是和task数组相关。这一点在do_fork()函数中可以看出,当do_fork()把子进程的PCB初始化完并链接到进程队列中之后,nr_tasks增1: p-start_time=jiffies; tasknr=p; SET_LI

    6、NKS(p); nr_tasks+; 而在fork调用失败要滚回的时候,nr_tasks减1。(2) int nr_running=1;非常奇怪,在fork.c文件中仅定义了这个变量,以后再未出现,估计是标志可运行的进程个数。(3)unsigned long int total_forks=0; /* Handle normal Linux uptimes.*/ 与nr_tasks不同,total_forks只有在fork操作成功之后才增1,显 然它是用来记录fork操作的个数 的。 (4) int last_pid=0;last_pid是在创建中装载新建子进程的pid值的,从get_pid(

    7、)函数中被赋值返回,送到do_fork() 中。在get_pid()中: repeat: if(+last_pid)&0xffff8000) last_pid=1; for_each_task(p) if(p-pid=last_piod| p-pgrp=last_pid|session=last_pid) return last_pid; (5)task_struct *current这个变量的定义在fork.c文件中没有找到,但从源代码的字里行间可以十分清楚地看出current 是指向调用fork的进程的PCB的,即所谓父进程的task_struct 的地址。2.3do_fork()函数中定

    8、义的几个局部变量(1) int nr;这个变量被赋以find_empty_process()函数的返回值,并用来表示新创建的子进程在task数组中的下标。而在find_empty_process()函数中正常的返回源代码如下: for(i=0;ipid号,如果fork失败,则返回error。有两种失败可能,一是返回-EAGAIN,一是返回-ENOMEM。(3) unsigned long new_stack;这是用来标示新建子进程分给核心堆栈的内存空间的。相关源代码如下: new_stack=alloc_kernel_stack();这里new_stack是此内存空间的首地址,然后由子进程把持

    9、:kernel_stack_page=new_stack;但具体Linux 是怎样分配堆栈还没有生入分析。(4) struct task_struct *p; 显然,p是指向新建子进程的task_struct结构变量的,值得一提的是do_fork() 中一开始就做了 *p=*current 的语句,说明Linux是主张子进程复制父进程的PCB,然后再作一些初始化的修改以显示子之不同于父的一些个性。2.4文件的复制copy_files()在解释copy_files()的流程之前,有必要先看一下相关的数据结构: 1.task_struct中与文件相关的数据项是filesstruct files_s

    10、truct *files;它指向一个files_struct结构变量。2.files_struct它描述的是一个进程已经打开的文件:struct files_struct int count; fd_set close_on_exec; fd_set open_fds; struct file * fdNR_OPEN;可以看出,Linux中一个进程最多只能同时打开NR_OPEN个文件,而且前三项分别设为标准输入、标准输出和出错信息输出文件。 3.file结构变量每个打开的文件及插口附加项(socket etcetera)都由file结构表示:struct file mode_t f_mode;

    11、 loff_t f_pos; unsigned short f_flags; unsigned short f_count; unsigned long f_reada, f_ramax, f_raend, f_ralen, f_rawin; struct file *f_next, *f_prev; int f_owner; /* pid or -pgrp where SIGIO should be sent */ struct inode * f_inode; struct file_operations * f_op; unsigned long f_version; void *pri

    12、vate_data; /* needed for tty driver, and maybe others */ 三个数据的关系如下图所示: files task_struct files_struct file fd0 fd1 copy_files函数主要做了以下工作:定义了指向files_struct结构的指针oldf和newf其中oldf指向父进程的文件结构 oldf=current-files;2.然后作一下判断:如果子进程与父进程共享一个files_struct,则把父进程的files_struct中的count增1: if(clone_flags&CLONE_FILES) oldf

    13、-count+; return 0; 注:在文件IncludeLinuxSched.h中可以看到: #define CLONE_FILES 0x00000400 /*set if open files shared between processes*/ 否则,就要给子进程另外分配一块放files_struct的空间: newf = kmalloc(sizeof(*newf), GFP_KERNEL); tsk-files = newf; if (!newf) return -1;3.这只是分配了空间,还要初始化: newf-count = 1;close_on_exec = oldf-clo

    14、se_on_exec;open_fds = oldf-open_fds;4.最后要做的是子进程逐项拷贝父进程的指向文件的指针,其实便是files_struct中的fd数组的内容: old_fds = oldf-fd; new_fds = newf- for (i = NR_OPEN; i != 0; i-) struct file * f = *old_fds; old_fds+; *new_fds = f; new_fds+; if (f) f-f_count+; 这里f担任了中间传递的工作,而old_fds,new_fds 不停地从fd0扫到第一个为空的fd项,至多到NR_OPEN为止。2

    15、.5文件系统的复制copy_fs()其中重要的数据结构是 struct fs_struct *fs;fs 指出了进程本身在VFS(Virtual File System)中的位置,其中root指向根目录,pwd指向当前目录结点,umask给出了文件的缺省创建模式,count是文件的引用次数,在文件IncludeLinuxSched.h中有: struct fs_struct unsigned short umask; struct inode * root, * pwd; ;观察函数copy_fs()可以发现,其操作流程与copy_file()完全类似,这里不再赘述。 2.6信号处理信息的复制

    16、copy_sighand() 在Intel机器上最多只能接受32种信号,下面举了其中30种:1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL5) SIGTRAP 6) SIGIOT 7) SIGBUS 8) SIGFPE9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR213) SIGPIPE 14) SIGALRM 15) SIGTERM 17) SIGCHLD18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN22) SIGTTOU 23) SIGURG 24) SIGXCPU

    17、 25) SIGXFSZ26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO30) SIGPWR (30) SIGPWR其实信号数目决定于信号变量的长度,32位信号变量自然可以表示32 种信号,而象Alpha AXP这样的64位处理器就有可能处理64 种信号。对每种信号,各种进程可以选择使用自定义的处理函数或是系统的缺省处理函数。task_struct中由一个指针指向处理信息: struct signal_struct *sig; signal_struct的结构(IncludeLinuxSched.h)是这样的: struct signal_str

    18、uct int count; struct sigaction action32; 其中action数组的每一项为信号处理函数的入口地址,至于哪个信号对应哪个函数,则由信号变量的值影射到action数组的偏移量来对应。 这里是把父进程对信号的处理函数的入口地址逐项拷贝到子进程的signal_struct结构中。其实,task_struct中除了sig指针和前面提到的signal长型变量(那是用来记录进程收到的信号)之外,还有blocked变量 unsigned long blocked;进程所能接收信号的位掩码。置位表示屏蔽,复位表示不屏蔽。除了SIGSTOP和 SIGKILL之外,所有的信号

    19、都可以被阻塞(blocked)只有当信号被解除阻塞时,才会有效,否则一直被挂着。所谓阻塞即被blocked屏蔽,可能是做异或操作。三、遇到的问题(如何解决)及体会在Linux操作系统中,fork函数的主要功能是创建进程。在fork函数里面调用了很多的实现其他功能函数,比如:拷贝,文件的读/写,内存的调用等等。在遇到很多不明白的代码时,往往要先找到它所在的定义函数里面。要先大概理解整个函数的功能是什么之后,这这种需要耐心,细心的分析每一个语句的意思,明白它是什么调用其他函数和如何使用自身定义的成员。由于之前没有深入学习过Linux操作系统,不怎么知道它的工作方式。通过这次的源代码分析,虽然不能完

    20、全的了解到Linux系统的操作,但对于Linux操作系统中如何创建进程,及进程的一些使用都有了比较初步的了解。通过这次的代码分析,不仅让我们没有了看到代码就害怕的感觉,有耐心和有毅力,沉下心来,其实,不但我们思维能发挥出来,也让我们的大胆更灵活,更明智。第二部分、课程设计磁盘调度管理一、设计目的:加深对请求磁盘调度管理实现原理的理解,掌握磁盘调度算法。二、设计内容1用户可以为程序指定初始需要访问序列;2实现最短寻道和电梯调度两种调度算法;3.根据用户的选择输出实际的访问序列;4. 实现先来先服务算法和循环扫描算法;【扩展内容】5.通过动态的显示磁头移动过程,形象化理解磁盘调度过程;6. 用函数

    21、system(cls),清空屏幕。三、开发环境操作系统:Windows开发语言:C/C+开发环境:VC+ 6.0四、分析设计4.1实验原理在多道程序设计的计算机系统中,各个进程可能会不断提出不同的对磁盘进行读/写操作的请求。由于有时候这些进程的发送请求的速度比磁盘响应的还要快,因此我们有必要为每个磁盘设备建立一个等待队列。4.1.1先来先服务算法(FCFS :Afirst Come First Served)即先来的请求先被响应。FCFS策略为我们建立起一个随机访问机制的模型,但是假如用这个策略反复响应从里到外的请求,那么将会消耗大量的时间。为了尽量降低寻道时间,看来我们需要对等待着的请求进行

    22、适当的排序,而不是简单的使用FCFS策略。这个过程就叫做磁盘调度管理。有时候FCFS也被看作是最简单的磁盘调度算法。4.1.2最短寻道优先算法(SSTF:Shortest Seek Time First)该算法要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短,但这种调度算法却不能保证平均寻道时间最短。SSTF算法的平均每次磁头移动距离,明显低于FCFS的距离。SSTF较之FCFS有更好的寻道性能,故过去一度被广泛采用过。4.1.3电梯(扫描)算法(SCAN)该算法不仅考虑到欲访问 的磁道与当前磁道间的距离,更优先考虑的是磁头当前的移动方向。例如,当磁头正在自里向外移动时,SC

    23、AN算法所考虑的下一个访问对象,应是其欲访问的磁道,既在当前磁道之外,又是距离最近的。这样自里向外的访问,直至再无更外的磁道需要访问时,才将磁道换向自外向里移动。这时,同样也是每次选择这样的进程来调度,也就是要访问的当前位置内距离最近者,这样,磁头又逐步地从外向里移动,直至再无更里面的磁道要访问,从而避免了出现“饥饿”现像。4.1.4循环扫描算法(CSCAN)当磁头刚从里向外移动而越过了某一磁道时,恰好又有一进程请求访问此磁道,这时,该里程就必须等待,为了减少这种延迟,CSCAN算法规定磁头单向移动,而本实验过程中我们所设计的是磁头从里向外移动,而从外向里移动时只须改方向而已。4.2数据结构4

    24、.2.1算法的函数声名 数据结构算法函数名参数说明先来先服务(FCFS)int *FCFS(int cidao,int m,int nom)1. Cidao是存储输入的磁道号数组。2. count是用于记录总的请求次数。3. nom是当前的磁道号最短寻道时间(SSTF)int *SSTF(int cidao,int m,int nom)电梯(扫描)(SCAN)int *SCAN(int cidao,int m,int nom)循环扫描(CSCAN)int *CSCAN(int cidao,int m,int nom)4.2.2先来先服务(FCFS)算法的主要数据结构先来先服务,就是按输入的请求

    25、磁道序号一个一个的服务。但为了比较移动距离,所以,用一个for循环来比较当前磁道号与访问磁道号。核心代码:int *FCFS(int cidao,int m,int nom) m; if(nowcidao0&nowcidaom-1) /若当前磁道号大于请求序列中最小者且小于最大者 while(cidaok=0)&(rm) /当前磁道在请求序列范围内 if(now-cidaol)=(cidaor-now) /选择与当前磁道最近的请求给予服务 if(nowCopycidaol) j=cidaol-nowCopy; else j=nowCopy-cidaol; px-1 = cidaol; nowCopy=cidaol; /把移动到的磁道号赋给当前磁头号 printf( %d %d %d n,x,cidaol,j); x+; sum=sum+j; /用于刻录寻


    注意事项

    本文(桂林理工大学《操作系统》实习报告何天从Word文件下载.docx)为本站会员主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2023 冰点文库 网站版权所有

    经营许可证编号:鄂ICP备19020893号-2


    收起
    展开