有关操作系统课程设计课中的几个问题

来源:互联网 发布:国外怎么看歼20知乎 编辑:程序博客网 时间:2024/05/22 16:39

 

先来巩固下基础的东西吧:

Linux 系统

首先,实验是在Linux下做的,机房的Linux系统的版本是Fedora,是从著名的Redhat派生出来的,就像ubuntu版本是从Debina派生出来的,是Linux系统版本下的两大派系。Redhat主要是用途服务器领域,但Fedora和Ubuntu都是主要用作普通用户桌面领域的。

Linux系统非常强大,迪士尼的动画都是在这个系统下制作的,还有一些好莱坞大片的影视特效。。

终端

终端相当于Windows下的Command,但是比它强大多了,Linux下的任何操作都可以由终端的命令来完成。而我们看到的华丽的界面只是Linux的GUI人机交互界面,只能算是Linux下的一个程序,而不像Windows那样将系统的页面写在内核里。所以Linux下的GUI更加灵活,性能更加高一些,所能产生的效果也比Windows下要华丽丽地多。

我们用的vi编辑器是非常强大的

好多人非常偏爱它,Linux下开发软件的高手一般都用它的。它的所有操作都可以让你双手不离开键盘的主键盘区,不需要鼠标,因为鼠标操作起来太慢。

一点我总结的VI常用的命令:

移动光标方向:左h 下j 上k 右l  (当然,不习惯的话还是用方向键吧)

插入:i,a,[Ins]   进入插入模式之后,屏幕的左下角会有提示的.

替换一个字符:r

保存文件: :w

保存文件为: :w 文件名

退出: :q

强制退出:  :q!

保存并退出:  :wq

--以上命令都是在普通模式(也就是刚进入的模式,或者是你按下ESC后的模式)下输入的,老师称它为命令模式,而其实命令模式是在输入一个冒号之后进入的。

再教大家一招:输入vimtutor 命令,有一个vi编辑器的教程,非常基础非常不错!

程序的编译和运行

程序代码写完并保存为文件了,下面就是要编译了,GCC是开源的一个编辑器,非常强大,用法也很简单。

编译单文件,命令格式是:

 

view plaincopy to clipboardprint?
  1. gcc 文件名 -o 输出文件名  

 

回车之后便会在当前目录下生成一个可以执行的文件了,可以通过

 

view plaincopy to clipboardprint?
  1. ls  

 

命令将当前文件夹下的所有文件列出来。

注意执行的时候,需要在文件名前加上./,意思是当前目录。因为Linux下文件名的后缀是没有什么意义的(对于系统识别文件格式来说),而如果不加./,那么Linux会以为这是一个目录名。

创建进程函数fork()

fork()是C语言下的一个创建子进程的函数,它的返回值是一个int类型的值,为-1表示创建进程失败,0指示当前进程是父进程,如果大于0那么就是子进程了。

关于fork()函数有一点是必须深刻理解的,那就是在它被执行的时候,所创建出来的子进程拥有与父进程相同的状态(程序的变量、程序的代码以及执行到哪一步了),所唯一不同的就是fork()这句所返回的值,父进程是0,而子进程大于0。 深刻理解关于fork()函数这一点,便能够很的理解进程的创建以及程序的执行情况了。

老师最后写在黑板右边的程序深刻分析

先来理解下都是所讲的输出缓存问题

程序在执行到输入语句(printf、putchar 等等)的时候,并不是立即输出,而是等到有空的时候再输出,这会有一个小小的时间段,这个输入输出缓存是以FIFO方式来处理的,因此以前我们写的单进程程序的时候一般不会感觉到它的存在,但是在多进程程序的时候,就会显露出来。多进程是怎么执行的呢?CPU随便地并且公平地分配时间片给每一个进程,谁拿到时间片谁就执行一下(也许执行完,也许执行不完),当一个进程还没来得及把缓存中的数据输出到屏幕上手里的时间片就耗没了的时候,它也不得不等到下一次轮到它执行的时候再输出。重点是:它在一个时间片内,也许把缓存内的数据成功输出了,也许没有输出。而它的子进程在创建的时候,连同它的缓存中的内容也一同复制给自己,只有父进程缓存中有内容的时候,父进程所要输出的内容才会在子进程执行的时候再被输出一遍。

下面再来一起看大家争论的那段程序

 

view plaincopy to clipboardprint?
  1. #include <stdio.h>  
  2. int main() {  
  3.     int p1,p2;  
  4.     while((p1=fork())==-1);  
  5.     if(p1==0)  
  6.         putchar('b');  
  7.     else {  
  8.         putchar('a');  
  9.         while((p2=fork())==-1);  
  10.         if(p2==0)  
  11.             putchar('c');  
  12.     }  
  13.     printf("-");//这条语句用来标示缓存是否已经被清空  
  14.     return 0;  
  15. }  

 

执行的结果可能会是:

如果输出一个"-",那表示此进程的缓存已经清空了,从上面的结果来看,创建的第三个进程运行的时候,第二个进程还没有来得及输出,所以连同第二个进程要输入的“a”也一同给复制了过来,此时第三个进程的缓存里就有了"a"和"c"两个字符,最后当然便输出了两个字符。

大家如果还有疑问,可以留言讨论。

原创粉丝点击