OS实验思考题参考答案.pdf_第1页
OS实验思考题参考答案.pdf_第2页
OS实验思考题参考答案.pdf_第3页
OS实验思考题参考答案.pdf_第4页
OS实验思考题参考答案.pdf_第5页
已阅读5页,还剩9页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

1 操作系统上机实验思考题 实验一实验一 LINUXLINUX 及其使用环境及其使用环境 思考题:Linux 系统在用户登录和操作界面以及文件系统上有哪些特点? 答:1.Linux 系统在用户登录时要使用 root 账号和密码,否则无法完成 Linux 系统的登录. 2.Linux 是一套免费使用和自由传播的类 Unix 操作系统, 是一个基于 POSIX 和 UNIX 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 UNIX 工具软件、 应用程序和网络协议。它支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计 思想,是一个性能稳定的多用户网络操作系统。它主要用于基于 Intel x86 系列 CPU 的计算 机上。Linux 以它的高效性和灵活性著称。Linux 模块化的设计结构,使得它既能在价格 昂贵的工作站上运行,也能够在廉价的 PC 机上实现全部的 Unix 特性,具有多任务、多用 户的能力。Linux 操作系统软件包不仅包括完整的 Linux 操作系统,而且还包括了文本编辑 器、高级语言编译器等应用软件。它还包括带有多个窗口管理器的 X-Windows 图形用户界 面,如同我们使用 Windows NT 一样,允许我们使用窗口、图标和菜单对系统进行操作。 Linux 具有 Unix 的优点:稳定、可靠、安全,有强大的网络功能。在相关软件的支持下, 可实现 WWW、FTP、DNS、DHCP、E-mail 等服务,还可作为路由器使用,利用 ipchains/iptables 可构建 NAT 及功能全面的防火墙。 3. 文件系统指文件存在的物理空间, linux 系统中每个分区都是一个文件系统, 都有 自己的目录层次结构。linux 会将这些分属不同分区的、单独的文件系统按一定的方式形成 一个系统的总的目录层次结构。 一个操作系统的运行离不开对文件的操作, 因此必然要拥有 并维护自己的文件系统。 Llinux 文件系统使用索引节点来记录文件信息,作用像 windows 的文件分配表。 索引节点是一个结构,它包含了一个文件的长度、创建及修改时间、权限、所属关系、 磁盘中的位置等信息。 一个文件系统维护了一个索引节点的数组, 每个文件或目录都与索引 节点数组中的唯一一个元素对应。 系统给每个索引节点分配了一个号码, 也就是该节点在数 组中的索引号,称为索引节点号。 linux 文件系统将文件索引节点号和文件名同时保存在目录中。所以,目录只是将文件的名 称和它的索引节点号结合在一起的一张表, 目录中每一对文件名称和索引节点号称为一个连 接。 对于一个文件来说有唯一的索引节点号与之对应,对于一个索引节点号,却可以有多 个文件名与之对应。因此,在磁盘上的同一个文件可以通过不同的路径去访问它。 可以用 ln 命令对一个已经存在的文件再建立一个新的连接,而不复制文件的内容。连接有软连接 和硬 linux 文件系统将文件索引节点号和文件名同时保存在目录中。所以,目录只是 将文件的名称和它的索引节点号结合在一起的一张表, 目录中每一对文件名称和索引节点号 称为一个连接。 对于一个文件来说有唯一的索引节点号与之对应, 对于一个索引节点号, 却可以有多个 文件名与之对应。因此,在磁盘上的同一个文件可以通过不同的路径去访问它。 可以用 ln 命令对一个已经存在的文件再建立一个新的连接,而不复制文件的内容。连 接有软连接和硬连接之分,软连接又叫符号连接。它们各自的特点是: 硬连接:原文件名和连接文件名都指向相同的物理地址。 2 目录不能有硬连接;硬连接不能跨越文件系统(不能跨越不同的分区) 文件在磁盘中只有一个拷贝,节省硬盘空间; 由于删除文件要在同一个索引节点属于唯一的连接时才能成功, 因此可以防止不必要的 误删除。 符号连接:用 ln -s 命令建立文件的符号连接符号连接是 linux 特殊文件的一种,作为一 个文件,它的数据是它所连接的文件的路径名。类似 windows 下的快捷方式。 可以删除原有的文件而保存连接文件,没有防止误删除功能。 实验二实验二 进程管理进程管理 (1 1)进程的创建实验)进程的创建实验 思考题:系统是怎样创建进程的? 答:创建一个进程首先要调用 fork()函数 Pid_t fork() 当一个进程调用了 fork 以后, 系统会创建一个字进程, 这个子进程和父进程不同 的地方只有他的进程 ID 和父进程 ID,其他的都是一样.就象符进程克隆 (clone)自己一样.当然 创建两个一模一样的进程是没有意义的.为了区分父进程和子进程,我们必须跟踪fork 的返回 值. 当 fork 掉用失败的时候(内存不足或者是用户的最大进程数已到)fork 返回-1,否则 fork的返回值有重要的作用.对于父进程fork返回子进程的ID,而对于fork子进程返回0.我们 就是根据这个返回值来区分父子进程的. 父进程创建一个子进程的目的是由于 Linux 是一个多用户操作系统,在同一时间 会有许多的用户在争夺系统的资源.有时进程为了早一点完成任务就创建子进程来争夺资源. 一旦子进程被创建,父子进程一起从 fork 处继续执行,相互竞争系统的资源.有时候我们希望 子进程继续执行,而父进程阻塞直到子进程完成任务.这个时候我们可以调用 wait 或者 waitpid 系统调用. pid_t wait(int *stat_loc); pid_t waitpid(pid_t pid,int *stat_loc,int options); wait 系统调用会使父进程阻塞直到一个子进程结束或者是父进程接受到了一个信号.如 果没有父进程没有子进程或者他的子进程已经结束了 wait 回立即返回.成功时(因一个子进 程结束)wait将返回子进程的ID,否则返回-1,并设置全局变量errno.stat_loc是子进程的退出状 态.子进程调用 exit,_exit 或者是 return 来设置这个值. 为了得到这个值 Linux 定义了几个宏来 测试这个返回值. WIFEXITED:判断子进程退出值是非 0 WEXITSTATUS:判断子进程的退出值(当子进程退出时非 0). WIFSIGNALED:子进程由于有没有获得的信号而退出. 3 WTERMSIG:子进程没有获得的信号号(在 WIFSIGNALED 为真时才有意义). waitpid 等待指定的子进程直到子进程返回.如果 pid 为正值则等待指定的进程(pid).如果为 0 则等待任何一个组 ID 和调用者的组 ID 相同的进程.为-1 时等同于 wait 调用.小于-1 时等待 任何一个组 ID 等于 pid 绝对值的进程. stat_loc 和 wait 的意义一样. options 可以决定父进程 的状态.可以取两个值 WNOHANG:父进程立即返回当没有子进程存在时.WUNTACHED:当 子进程结束时 waitpid 返回,但是子进程的退出状态不可得到. 父进程创建子进程后,子进程一般要执行不同的程序.为了调用系统程序,我们可以使用系 统调用 exec 族调用.exec 族调用有着 5 个函数. int execl(const char *path,const char *arg,.); int execlp(const char *file,const char *arg,.); int execle(const char *path,const char *arg,.); int execv(const char *path,char *const argv); int execvp(const char *file,char *const argv): (2)进程的控制实验 思考题:什么是进程同步?wait()是如何实现进程同步? 答:1.我们把异步环境下的一组并发进程因直接制约而互相发送消息而进行互相 合作、互相等待,使得各进程按一定的速度执行的过程称为进程间的同步。具有同步关系的 一组并发进程称为合作进程,合作进程间互相发送的信号称为消息或事件。 如果我们对一 个消息或事件赋以唯一的消息名,则我们可用过程wait (消息名)表示进程等待合作进程 发来的消息,而用过程signal (消息名) 表示向合作进程发送消息。 2. 进程一旦调用了 wait,就立即阻塞自己,由 wait 自动分析是否当前进程的 某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程,wait 就会收集这 个子进程的信息, 并把它彻底销毁后返回;如果没有找到这样一个子进程,wait 就会一直 阻塞在这里,直到有一个出现为止。 wait()会暂时停止目前进程的执行,直到有信号来 到或子进程结束。如果在调用 wait()时子进程已经结束,则 wait()会立即返 回子进程结束状态值。子进程的结束状态值会由参数 status 返回, 而子进程的进程识别码也会一快返回。如果不在意结束状态值,则 参数 status 可以设成 NULL。子进程的结束状态值请参考 waitpid() 。 返回值 如果执行成功则返回子进程识别码(PID) ,如果有错误发生则返回 -1。失败原因存于 errno 中。 实验三实验三 进程间通信进程间通信 (1 1)信号机制实验)信号机制实验 程序 4 #include #include #include void waiting(),stop(); int wait_mark; main() int p1,p2; if(p1=fork()/*创建子进程 p1*/ if(p2=fork()/*创建子进程 p2*/ wait_mark=1; signal(SIGINT,stop);/*接收到c 信号,转 stop*/ waiting(); kill(p1,16);/*向 p1 发软中断信号 16*/ kill(p2,17);/*向 p2 发软中断信号 17*/ wait(0);/*同步*/ wait(0); printf(parent process is killed!n); exit(0); else wait_mark=1; signal(SIGINT,stop); waiting(); lockf(1,0,0); printf(child process2is killed by parent!n); lockf(1,0,0); exit(0); else wait_mark=1; signal(SIGINT,stop); waiting(); lockf(1,0,0); printf(child process1 is killed by parent!n); 5 lockf(1,0,0); exit(0); void waiting() while (wait_mark!=0); void stop() wait_mark=0; 思考题:1.该程序段前面部分用了两个 wait(0),他们起什么作用? 答:使父进程,进程 1,进程 2 起始同步。因为在多个进程并发执行的过程中,难以保证 结果的可再现性,所以在程序中用到了 wait()指令,以及后面的同步点从而对多个进程的执 行进行有序的控制,使其具有可再现性,保证最后结果的一致性。 (2 2)进程的管道通信实验)进程的管道通信实验 源程序:#include #include #include int pid1,pid2; main( ) int fd2; char outpipe100,inpipe100; pipe(fd);/*创建一个管道*/ while (pid1=fork( )=-1); if(pid1=0) lockf(fd1,1,0); sprintf(outpipe,child 1 process is sending message!); /*把串放入数组 outpipe 中*/ write(fd1,outpipe,50);/*向管道写长为 50 字节的串*/ sleep(5);/*自我阻塞 5 秒*/ lockf(fd1,0,0); exit(0); else 6 while(pid2=fork( )=-1); if(pid2=0) lockf(fd1,1,0);/*互斥*/ sprintf(outpipe,child 2 process is sending message!); write(fd1,outpipe,50); sleep(5); lockf(fd1,0,0); exit(0); else wait(0);/*同步*/ read(fd0,inpipe,50);/*从管道中读长为 50 字节的串*/ printf(%sn,inpipe); wait(0); read(fd0,inpipe,50); printf(%sn,inpipe); exit(0); 思考题:程序中的 sleep(5)起什么作用? 答:sleep 过程 进入 sleep 过程后,核心首先保存进入睡眠时的处理机运行级,再提高处理机 的运行优先级来屏蔽所有的中断,接着将该进程置为“睡眠”状态,将睡眠地址保 存在进程表项中,并将该进程放入睡眠队列中,如果进程的睡眠是不可中断的,做 了进程上下文的切换后,进程便可安稳地睡眠,当进程被唤醒并被调度执行时,将 恢复处理机的运行级为进入睡眠时的值,此时允许中断处理机。 如果进程的睡眠可被中断,但该进程并未收到软中断信号,则在做了进程上下 文的切换后也进入睡眠状态。当它被唤醒并被调度执行时,应再次检查是否有待处 理的软中断信号;若仍无,则恢复处理机的运行级为入睡眠时的值,最后返回 0。 如果在进入睡眠前检测到有软中断信号, 那么进程是否还要进入睡眠状态将取 决于该进程的优先级。 如果它是不可中断的优先级, 进程仍进入睡眠, 直至被 wakeup 唤醒;否则,即若进程的优先级为可中断的,则进程边不再进入睡眠,而是响应软 中断。 sheep(5)的作用是将该进程置入“睡眠”状态,等待 5 秒再将其唤醒。 一般进程进入睡眠状态有多种原因。例如,在执行一般磁盘的读/写操作时,进 程要等待磁盘 I/O 完成,此时进程可调用 sleep 使自己进入睡眠状态;当磁盘 I/O 完成时, 再由中断处理程序中的 wakeup 将其唤醒。又如,当进程访问一个上了锁的临界资源时,进 程也将调用 sleep 进入睡眠状态,当其他进程释放该临界资源时,利用 wakeup 将其唤醒。 (4 4)共享存储区通信)共享存储区通信 思考题:比较两种消息通信机制中数据传输的时间 由于两种机制实现的机理和用处都不一样,难以直接进行时间上的比较。如果 比较其性能,应更加全面的分析。 (1)消息队列的建立比共享区的设立消耗的资源少。 前者只是有个软件上设 7 定的问题,后者需要对硬件的操作,实现内存的映像,当然控制起来 比前者复杂。如果每次都重新进行队列或共享的建立,共享区的设立 没有什么优势。 (2)当消息队列和共享区建立好后,共享区的数据传输,受到了系统硬件 的支持,不耗费多余的资源;而消息传递,由软件进行控制和实现,需 要消耗一定的CPU资源.从这个意义上讲,共享区更适合频繁和大量的 数据传输. (3)消息的传递,自身就带有同步的控制.当等到消息的时候,进程进入睡 眠状态,不再消耗CPU资源.而共享队列如果不借助其他机制进行同步, 接受数据的一方必须进行不断的查询,白白浪费了大量的CPU资源.可 见消息方式的使用更加灵活. 答: 实验四实验四 存储管理存储管理 1 1 1 1 #include #include #include #define TRUE 1 #define FALSE 0 #define INVALID -1 #define NUL 0 #define total_instruction 320 #define total_vp 32 #define clear_period 50 typedef struct int pn,pfn,counter,time; pl_type; pl_type pltotal_vp; struct pfc_struct int pn,pfn; struct pfc_struct *next; ; typedef struct pfc_struct pfc_type; pfc_type pfctotal_vp,*freepf_head,*busypf_head,*busypf_tail; int diseffect,atotal_instruction; int pagetotal_instruction,offsettotal_instruction; 8 void initialize(); float FIFO(); float LRU(); float OPT(); float LFU(); float NUR(); int main() int S,i; srand(int)getpid(); S=(int)rand()%390; for(i=0;itotal_instruction;i+=1) ai=S; ai+1=ai+1; ai+2=(int)rand()%390; S=(int)rand()%390; for(i=0;itotal_instruction;i+) pagei=ai/10; offseti=ai%10; for(i=4;i=32;i+) float count5=0.0; int cur; printf(%2d page frames ,i); count0=FIFO(i); count1=LRU(i); count2=OPT(i); count3=LFU(i); count4=NUR(i); printf(n); float max=0.0; int j; for(j=0;j5;j+) if(maxpn.pfn=INVALID; freepf_head=busypf_head; freepf_head-next=NUL; busypf_head=p; p=freepf_head-next; freepf_head-next=NUL; freepf_head-pn=pagei; plpagei.pfn=freepf_head-pfn; if(busypf_tail=NUL) busypf_head=busypf_tail=freepf_head; else 10 busypf_tail-next=freepf_head; busypf_tail=freepf_head; freepf_head=p; printf(FIFO:%6.4f ,1-(float)diseffect/320); return(1-(float)diseffect/320); float LRU(total_pf) int total_pf; int min,minj,i,j,present_time; initialize(total_pf);present_time=0; for(i=0;inext=NUL; plpagei.pfn=freepf_head-pfn; plpagei.time=present_time; freepf_head=freepf_head-next; else plpagei.time=present_time; present_time+; 11 printf(LRU:%6.4f ,1-(float)diseffect/320); return(1-(float)diseffect/320); float NUR(total_pf) int total_pf; int i,j,dp,cont_flag,old_dp; pfc_type *t; initialize(total_pf); dp=0; for(i=0;ipfn; freepf_head=freepf_head-next; else plpagei.counter=1; if(i%clear_period=0) for(j=0;jtotal_vp;j+) 12 plj.counter=0; printf(NUR:%6.4f ,1-(float)diseffect/320); return(1-(float)diseffect/320); float OPT(total_pf) /*OPT(Optimal Replacement)ALGORITHM*/ int total_pf; int i,j,max,maxpage,d,disttotal_vp; int flagtotal_vp=0; pfc_type *t; initialize(total_pf); for(i=0;itotal_instruction;i+) if(plpagei.pfn=INVALID) diseffect+;

温馨提示

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

评论

0/150

提交评论