- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
操作系统课程设计萧伟崎(文华学院 武汉 430074)摘要 整篇文章阐述了整个课程设计的三个选题的实现过程,和具体实现方法。涉及进程控制和进程通信,增加系统命令调用,系统图形界面的选题。通过实验来说明顺序程序和并行程序之间的差异,系统是如何为程序员提供系统命令调用的,以及操作系统的图形界面的制作方法。1引言 进程控制和进程通信是操作系统的主要功能之一,进程是系统中竞争处理机的主要单位。进程之间的数据空间是相互隔开的,因此,合力完成同一个任务的进程们之间的通信过程显得尤为的重要。其次系统功能调用是操作系统提供给用户的接口之一,可以方便用户使用机器,文章介绍了两种实现增加系统调用的方法,实验主要是用内核模块法来进行的。而图形界面也是实现人与机器交互的方法之一,本实验采用操作系统的curses来绘制监控程序。所以此次实验,对于加深对操作系统的理解,三者具有很关键的作用。2进程控制和进程通信 2.1进程控制在linux操作系统中,产生一个子进程的方法主要是fork()函数。fork()函数是计算机程序设计中的分叉函数。返回值: 若成功调用一次则返回两个值,子进程返回0,父进程返回子进程标记;否则,出错返回-1。fork函数将运行着的程序分成2个(几乎)完全一样的进程,每个进程都启动一个从代码的同一位置开始执行的线程。这两个进程中的线程继续执行,就像是两个用户同时启动了该应用程序的两个副本。其实就相当于链表,进程形成了链表,父进程的fork函数返回的值指向子进程的进程id, 因为子进程没有子进程,所以其fork函数返回的值为0两个进程虽然数据空间不一样,但是却是执行相同的代码,因此我们可以使用如下的代码实现子进程:Main(){ //父进程代码 If((fork() == 0)) { //子进程代码 Exit(0);//子进程程序执行完毕 }//父进程代码}本次实验,主要目的是使用多进程的方法,来使计算加速,并与串行程序进行时间对比实验。顺序串行程序中,我们产生1000000个[1,2]之间的实型数,将其累加,最后输出,并记录输出总的计算时间。并行程序中,我们产生3个子进程,加上父进程,一共4个进程,每个进程产生并计算250000个实型数的和,最后汇总4个和再次相加最后产生总的计算结果,并输出时间与串行程序进行对比。2.2进程通信但是问题是,4个进程之间,计算结果如何传输?Linux操作系统中有一种名为“管道”的机制。管道是由内核管理的一个缓冲区,相当于我们放入内存中的一个纸条。管道的一端连接一个进程的输出。这个进程会向管道中放入信息。管道的另一端连接一个进程的输入,这个进程取出被放入管道的信息。其结构如下Linux函数原型int pipe(int filedes[2]);filedes[0]用于读出数据,读取时必须关闭写入端,即close(filedes[1]);close(fd[0]); /* 关闭读描述符 */ write(fd[1], \nhello world\n, 14);filedes[1]用于写入数据,写入时必须关闭读取端,即close(filedes[0])。 close(fd[1]); /* 关闭写描述符 */ read(fd[0], line, MAXLINE);借此,我们可以利用管道机制,实现父子进程之间的小数据量的通信。实际上,我们只需将计算结果传递给父进程即可。最后实验结果如下: 由此可见,多进程的程序的确比串行的程序要快,当数据规模变大时,其效果也就越明显。但是当数据规模较小时,由于创建进制要产生开销,并行计算效果可能不明显,甚至适得其反。3增加系统调用3.1系统调用的基本原理系统调用其实就是函数调用,只不过调用的是内核态的函数,但是我们知道,用户态是不能随意调用内核态的函数的,所以采用软中断的方式从用户态陷入到内核态。在内核中通过软中断0X80,系统会跳转到一个预设好的内核空间地址,它指向了系统调用处理程序。这里指的是在entry.S文件中的system_call函数。就是说,所有的系统调用都会统一跳转到这个地址执行system_call函数,那么system_call函数如何派发它们到各自的服务例程呢?我们知道每个系统调用都有一个系统调用号。同时,内核中一个有一个system_call_table数组,它是个函数指针数组,每个函数指针都指向了系统调用的服务例程。这个系统调用号是system_call_table的下标,用来指明到底要执行哪个系统调用。当int ox80的软中断执行时,系统调用号会被放进eax寄存器中,system_call函数可以读取eax寄存器获得系统调用号,将其乘以4得到偏移地址,以sys_ca
文档评论(0)