目   录

目   录 I

一、系统命令接口(一) 1

1.1  实验目的 1

1.2  预备知识 1

1.3  实验内容 2

1.4  实验指导 2

二、系统命令接口(二) 5

2.1  实验目的 5

2.2  预备知识 5

2.3  实验内容 5

2.4  实验指导 6

三、进程创建(一) 8

3.1  实验目的 8

3.2  预备知识 8

3.3  实验内容 13

3.4  实验指导 13

四、进程创建(二) 14

4.1  实验目的 14

4.2  预备知识 14

4.3  实验内容 15

4.4  实验指导 15

4.5  参考源代码 16

五、管道通信 17

5.1  实验目的 17

5.2  预备知识 17

5.3  实验内容 18

5.4  实验指导 18

5.5  参考源代码 19

六、进程调度 21

6.1  实验目的 21

6.2  预备知识 21

6.3  实验内容 21

6.4  实验指导 21

6.5  参考源代码 24

七、页面置换算法 28

7.1  实验目的 28

7.2  预备知识 28

7.3  实验内容 28

7.4  实验指导 29

7.5  参考源代码 33

八、文件系统调用 39

8.1  实验目的 39

8.2  预备知识 39

8.3  实验内容 39

8.4  实验指导 39

8.5  参考源代码 42

参考文献 44

一、系统命令接口(一)

1.1  实验目的

通过实际操作,了解Linux环境下的系统命令接口。

掌握系统启动和退出操作命令。

掌握基本的文件和目录操作命令。

1.2  预备知识

Linux是一套免费使用和自由传播的类Unix操作系统,它主要用于基于Intel x86系列CPU的计算机上。这个系统是由全世界各地的成千上万的程序员设计和实现的。

Linux的出现,最早开始于一位名叫Linus Torvalds的计算机业余爱好者,当时他是芬兰赫尔辛基大学的学生。他的目的是想设计一个代替Minix(是由一位名叫Andrew Tannebaum的计算机教授编写的一个操作系统示教程序)的操作系统,这个操作系统可用于386、486或奔腾处理器的个人计算机上,并且具有Unix操作系统的全部功能,因而开始了Linux雏形的设计。

Linux以高效性和灵活性著称。它能够在PC计算机上实现全部的Unix特性,具有多任务、多用户的能力。Linux是在GNU公共许可权限下免费获得的,是一个符合POSIX标准的操作系统。Linux操作系统软件包不仅包括完整的Linux操作系统,而且还包括了文本编辑器、高级语言编译器等应用软件。它还包括带有多个窗口管理器的X-Windows图形用户界面,如同我们使用Windows NT一样,允许我们使用窗口、图标和菜单对系统进行操作。

Linux一般有四个主要部分:内核、Shell、文件结构和实用工具。

1. Linux内核

内核是系统的心脏,是运行程序和管理像磁盘和打印机等硬件设备的核心程序。它从用户那里接受命令并把命令送给内核去执行。

2. Linux Shell

Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行。

实际上Shell是一个命令解释器,它解释由用户输入的命令并且把它们送到内核。不仅如此,Shell有自己的编程语言用于对命令的编辑,它允许用户编写由shell命令组成的程序。Shell编程语言具有普通编程语言的很多特点,比如它也有循环结构和分支控制结构等,用这种编程语言编写的Shell程序与其他应用程序具有同样的效果。

Linux提供了像Microsoft Windows那样的可视的命令输入界面--X Window的图形用户界面(GUI)。它提供了很多窗口管理器,其操作就象Windows一样,有窗口、图标和菜单,所有的管理都是通过鼠标控制。现在比较流行的窗口管理器是KDE和GNOME。

每个Linux系统的用户可以拥有他自己的用户界面或Shell,用以满足他们自己专门的Shell需要。

同Linux本身一样,Shell也有多种不同的版本。目前主要有下列版本的Shell:

  Bourne Shell:是贝尔实验室开发的。

  BASH:是GNU的Bourne Again Shell,是GNU操作系统上默认的shell。

  Korn Shell:是对Bourne SHell的发展,在大部分内容上与Bourne Shell兼容。

C Shell:是SUN公司Shell的BSD版本。

3. Linux文件结构

文件结构是文件存放在磁盘等存储设备上的组织方法。主要体现在对文件和目录的组织上。目录提供了管理文件的一个方便而有效的途径。我们能够从一个目录切换到另一个目录,而且可以设置目录和文件的权限,设置文件的共享程度。

使用Linux,用户可以设置目录和文件的权限,以便允许或拒绝其他人对其进行访问。Linux目录采用多级树形结构,图1.1表示了这种树形等级结构。用户可以浏览整个系统,可以进入任何一个已授权进入的目录,访问那里的文件。

文件结构的相互关联性使共享数据变得容易,几个用户可以访问同一个文件。Linux是一个多用户系统,操作系统本身的驻留程序存放在以根目录开始的专用目录中,有时被指定为系统目录。图1.1中那些根目录下的目录就是系统目录。

4. Linux实用工具

标准的Linux系统都有一套叫做实用工具的程序,它们是专门的程序,例如编辑器、执行标准的计算操作等。用户也可以产生自己的工具。

1.3  实验内容

1、启动Linux系统

2、文件和目录操作命令ls、cd、mkdir、rmdir、cat、cp、rm

3、退出系统命令shutdown

1.4  实验指导

1、启动Linux系统

启动Linux系统只需要直接加电就可以,在进入系统前需要输入用户的帐号和密码。

Linux系统中有两种帐号:root(供系统管理员使用)和普通用户(普通用户使用)。

登录步骤分为两步:

(1)输入用户的登录名

(2)输入用户的口令

当用户正确输入用户名和密码后,就能合法地进入系统。

2、文件和目录操作命令

显示目录内容ls命令

说明:对于每个目录,该命令列出其中所有的子目录与文件;对于每个文件,该命令输出文件名及其所要求的其他信息;当没有给出目录名或文件名时,则显示当前目录的信息。

命令格式    ls  [选项]  [目录或文件]

选项含义:使用man ls  (使用q键退出!)

例:以长格式显示当前目录中所有文件的详细信息   ls-l

注:-后面的参数是小写的字母L。

改变工作目录cd命令

说明:该命令将当前工作目录改变至[路径]所指定的目录。若没有指定[路径],则回到用户的主目录。

命令格式    cd  [路径]

选项含义:使用man帮助

例:返回上一级目录   cd   ..

进入子目录       cd   xh

说明:Linux下路径使用“/”表示,如“/home/user/xh”的形式。

创建目录mkdir命令

说明:该命令创建一个由dir-name命名的目录。dir-name不能是当前目录中已有的目录或文件名

命令格式    mkdir  [选项]  dir-name

选项含义:使用man帮助

例:在当前目录下建立默认权限并且名字为student的子目录   mkdirstudent

删除目录rmdir命令(只能删除空目录)

说明:dir-name表示目录名。使用该命令可以从某个目录中删除一个或多个子目录项。需要注意,一个目录被删除之前必须是空的。

命令格式    rmdir  [选项]  dir-name

选项含义:使用man帮助

例:删除当前目录下名为dir的空子目录    rmdir   dir

创建和显示文件cat命令

说明:如果没有指定文件,就从标准输入读取;如果指定了文件,则显示文件内容。

命令格式    cat  [选项]  文件列表

选项含义:使用man帮助

例:显示文本文件linuxbook.txt的内容,并在每行开始显示行号 cat   -b   linuxbook.txt

linuxbook.txt必须存在

建立文本文件testfile.txt    cat   >  testfile.txt

输入结束,按Ctrl D退出。

文件或目录复制cp命令

说明:该命令把指定的源文件(或目录)复制到目标文件(或目录)

命令格式    cp  [选项]  源文件或目录  目标文件或目录

选项含义:使用man帮助

例:把当前目录下的文件file1.txt复制到file2.txt     cpfile1.txtfile2.txt

删除文件或目录rm命令

说明:该命令的功能是删除一个文件或目录,也可以将某个目录及目录中的所有文件和子目录全部删除。

命令格式    rm  [选项]  文件名或目录名

选项含义:使用man帮助

例:删除当前目录下的文件file1.txt       rm file1.txt

3、退出系统shutdown命令

Linux在需要关闭时必须告知系统,不能只关掉电源。shutdown命令把系统带到可以关闭电源的安全点。shutdown命令可以安全地关闭或重启Linux系统。

如立即关闭系统:shutdown now

二、系统命令接口(二)

2.1  实验目的

掌握Linux系统下与用户有关的命令

了解Linux系统下进程管理命令

理解Linux系统下权限改变命令

2.2  预备知识

Linux是一个多用户、多任务的操作系统,在Linux系统中,多个用户可以通过终端或虚拟控制台,同时在相同计算机上操作。Linux在386/486/Pentium/Pentuim Pro上以保护模式运行,是真正的多任务操作系统,可以同时执行多个进程,具有进程间内存地址保护功能,因此当某个进程出错时,不会波及整个系统。同时也提供了进程间的通信方式,使各个进程能协同工作,以满足用户的需要。

Linux系统中的每个文件和目录都有访问许可权限,用它来确定谁可以通过何种方式对文件和目录进行访问和操作。

文件或目录的访问权限分为只读,只写和可执行三种。以文件为例,只读权限表示只允许读其内容,而禁止对其做任何的更改操作。可执行权限表示允许将该文件作为一个程序执行。文件被创建时,文件所有者自动拥有对该文件的读、写和可执行权限,以便于对文件的阅读和修改。用户也可根据需要把访问权限设置为需要的任何组合。

有三种不同类型的用户可对文件或目录进行访问:文件所有者,同组用户、其他用户。所有者一般是文件的创建者。所有者可以允许同组用户有权访问文件,还可以将文件的访问权限赋予系统中的其他用户。在这种情况下,系统中每一位用户都能访问该用户拥有的文件或目录。

每一文件或目录的访问权限都有三组,每组用三位表示,分别为文件属主的读、写和执行权限;与属主同组的用户的读、写和执行权限;系统中其他用户的读、写和执行权限。当用ls -l命令显示文件或目录的详细信息时,最左边的一列为文件的访问权限。

2.3  实验内容

1、与用户有关命令passwd、su、who

2、进程管理命令ps、kill

3、权限设置命令chmod

2.4  实验指导

1、修改用户口令passwd命令

说明:处于系统安全考虑,Linux系统中的每个用户除了用户名之外,还有其对应的用户口令。用户可以使用passwd命令修改自己的口令,超级用户可以修改其他用户的口令。

命令格式    passwd   [用户名]

注意:为了系统的安全,口令不在屏幕上显示。

例:修改用户xh的口令:    passwd  xh

2、改变用户权限su命令

说明:这个命令非常重要。它可以让一个普通用户拥有超级用户或其他用户的权限,也可以让超级用户以普通用户的身份做一些事情。普通用户使用这个命令时必须有超级用户或其他用户的口令。

命令格式    su  [使用者帐号]

3、查看当前在线用户who命令

说明:该命令主要用于查看当前在线上的用户情况,系统管理员可以通过该命令监视每个用户的情况。如果用户想和其他用户建立即时通讯,比如使用talk命令,那么也首先要确定该用户确实在线上。

命令格式    who

4、进程查看命令ps

说明:使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等。ps命令最常用于监控后台进程的工作情况。

命令格式    ps   [选项]

-e 显示所有进程。

-f 全格式。

-h 不显示标题。

-l 长格式。

-w 宽输出。

-a 显示终端上的所有进程,包括其他用户的进程。

-r 只显示正在运行的进程。

-x 显示没有控制终端的进程。

例:查看属于自己的进程详细信息:      ps    -u

以长格式查看属于自己的进程详细信息:  ps     -l

5、终止后台进程kill命令

说明:当需要中断一个前台进程的时候,通常是使用组合键;但是对于一个后台进程恐怕就不是一个组合键所能解决的了,这时就必须求助于kill命令。该命令可以终止后台进程。至于终止后台进程的原因很多,或许是该进程占用的CPU时间过多;或许是该进程已经挂死。总之这种情况是经常发生的。kill命令是通过向进程发送指定的信号来结束进程的。如果没有指定发送信号,那么默认值为TERM信号。TERM信号将终止所有不能捕获该信号的进程。

命令格式    kill  [-signal]  进程号

-signal  发送的信号类型,默认值为15,取值范围1~50

例:删除进程号(PID)为1330的进程:  kill   1330

6、改变文件或目录的访问权限chmod命令

说明:这是Linux系统管理员最常用到的命令之一,它用于改变文件或目录的访问权限。Linux系统中的每个文件和目录都有访问许可权限,用来确定谁可以通过何种方式对文件和目录进行访问和操作。文件或目录的访问权限分为只读(r),可写(w)和可执行(x)三种。有三种不同类型的用户可对文件或目录进行访问:文件所有者(u),同组用户(g),其他用户(o)。所有者一般为文件的创建者,他可根据需要把访问权限设置为所需要的任何组合,确定另两种用户的访问权限。

命令格式    chmod   [who] [opt] [mode]  文件名

其中who表示对象,是以下字母中的一个或组合:

  u:表示文件所有者

  g:表示同组用户

  o:表示其它用户

  a:表示所有用户

  opt则是代表操作,可以为:

  +:添加某个权限

  -:取消某个权限

  =:赋予给定的权限,并取消原有的权限

  而mode则代表权限:

  r:可读

  w:可写

  x:可执行

例:为同组用户增加对文件a.txt的读写权限:  chmod   g+rw   a.txt

假定myfile文件最初具有这样的权限:rwx rwx rwx :

命令结果含义

chmod a-x myfile      // rw- rw- rw- 收回所有用户的执行权限

chmod og-w myfile     // rw- r-- r- - 收回同组用户和其他用户的写权限

chmod g+w myfile     //rw- rw- r- - 赋予同组用户写权限

chmod u+x myfile     // rwx rw- r- - 赋予文件属主执行权限

chmod go+x myfile    // rwx rwx r- x 赋予同组用户和其他用户执行权限

三、进程创建(一)

3.1  实验目的

熟练掌握Linux环境下全屏幕文本编辑器vi的使用

掌握Linux系统中的编译器gcc的使用方法

掌握利用gcc编译调试c程序的方法

3.2  预备知识

一、Ubunt下vi的常用命令

vi是UNIX和Linux操作系统使用的全屏幕文本编辑器,任何一台安装了UNIX或Linux的计算机都提供这套软件。vi的用法和DOS下的文本编辑器有较大的区别,刚开始使用的时候可能会不大习惯,但是作为以后用到的编辑器,应该学会并灵活掌握。

vi有三种操作模式:命令模式(command mode)、插入模式(insert mode)和末行命令模式(last ling mode)。它们的功能介绍如下

命令模式:当执行vi后,首先会进入命令模式,此时输入的任何字符都被视为命令。命令模式用于控制屏幕光标的移动、文本的删除、移动复制文本、进入插入模式或末行命令模式。在命令模式下,无法进行文字的编辑。

插入模式:在命令模式下输入相应的插入命令进入该模式。只有在插入模式下,才可以进行文字数据输入,按Esc键可以回到命令模式。

末行命令模式:在命令模式下输入某些特殊字符,如“/”、“?”和“:”,可进入末行命令模式。在该模式下可存储文本或离开编辑器,也可设置编辑环境,如寻找字符串,列出行号等。

0 进入vi的命令

vi filename :打开或新建文件,并将光标置于第一行首

vi +n filename :打开文件,并将光标置于第n行首

vi + filename :打开文件,并将光标置于最后一行首

vi +/pattern filename:打开文件,并将光标置于第一个与pattern匹配的串处

vi -r filename :在上次正用vi编辑时发生系统崩溃,恢复filename

vi filename....filename :打开多个文件,依次进行编辑

不过有一点要特别注意,就是您进入vi之后,是处于[命令行模式(command mode)],您要切换到[插入模式(Insert mode)]才能够输入文字。初次使用vi的人都会想先用上下左右键移动光标,结果电脑一直哔哔叫,把自己气个半死,所以进入vi后,先不要乱动,转换到[插入模式(Insert mode)]再说吧!

1切换至插入模式(Insert mode)编辑文件

在[命令行模式(command mode)]下按一下字母[i]就可以进入[插入模式(Insert mode)],这时候就可以开始输入文字了。

Insert 的切换:若目前处于[插入模式(Insert mode)],就只能一直输入文字,如果您发现输错了字!想用光标键往回移动,将该字删除,就要先按一下[ESC]键转到[命令行模式(command mode)]再删除文字。

2退出vi及保存文件

如果在输入模式下,则先利用Esc键进入命令模式,在[命令行模式(command mode)]下,按一下[:]冒号键进入[Last line mode],然后即可选用下列命令退出vi:

∶q!   离开vi,并放弃刚才编辑的内容(不保存)

∶wq    存盘并退出

∶w     存盘但不退出,等待用户继续键入命令

∶q      退出vi,若文件被修改过,会要求确认是否放弃修改的内容。此命令可以与w配合使用

注意:如果不知道现在处于什么模式,可以多按几次Esc键,以便确定进入命令模式。

3命令行模式(command mode)功能键

⑴插入模式

i:切换进入插入模式[insert mode],按“i”进入插入模式后是从光标当前位置开始输入文件;

I:在当前行首

a:进入插入模式后,是从目前光标所在位置的下一个位置开始输入文字;

A:在当前行尾

o:进入插入模式后,是插入新的一行,从行首开始输入文字。

O:在当前行之上新开一行

r:替换当前字符

R:替换当前字符及其后的字符,直至按ESC键

s:从当前光标位置处开始,以输入的文本替代指定数目的字符

S:删除指定数目的行,并以所输入文本代替之

⑵从插入模式切换为命令行模式

按[ESC]键。

⑶移动光标类命令

h:光标左移一个字符

l:光标右移一个字符

space:光标右移一个字符

Backspace:光标左移一个字符

k或Ctrl+p:光标上移一行

j或Ctrl+n :光标下移一行

Enter :光标下移一行

w或W :光标右移一个字至字首

b或B :光标左移一个字至字首

e或E :光标右移一个字至字尾

) :光标移至句尾

( :光标移至句首

}:光标移至段落开头

{:光标移至段落结尾

nG:光标移至第n行首

n+:光标下移n行

n-:光标上移n行

n$:光标移至第n行尾

H :光标移至屏幕顶行

M :光标移至屏幕中间行

L :光标移至屏幕最后行

0:(注意是数字零)光标移至当前行首

$:光标移至当前行尾

⑷屏幕翻滚类命令

Ctrl+u:向文件首翻半屏

Ctrl+d:向文件尾翻半屏

Ctrl+f:向文件尾翻一屏

Ctrl+b:向文件首翻一屏

nz:将第n行滚至屏幕顶部,不指定n时将当前行滚至屏幕顶部。

⑸删除命令

ndw或ndW:删除光标处开始及其后的n-1个字

do:删至行首

d$:删至行尾

ndd:删除当前行及其后n-1行

x或X:删除一个字符,x删除光标后的,而X删除光标前的

Ctrl+u:删除输入方式下所输入的文本

#X: 删除光标前面的#个字符

dd: 删除光标所在的行

ndd:删除从光标所在行数的n行

⑹复制粘贴命令

yw :复制光标所在位置的一个字

nyw :复制光标所在位置的n个字

yy :复制光标所在位置的一行

nyy :复制从光标所在行往下数的n行

nd ↑(按向上的方向键):从光标所在行开始向上剪切n+1行

nd ↓(按向下的方向键):从光标所在行开始向下剪切n+1行

p :将缓冲区中的内容粘贴到光标所在位置

⑺撤销与更改命令

u :取消误操作,可按多次

cw :更改光标所在位置的一个字

ncw或nCW:更改光标所在位置的n个字

nCC:修改指定数目的行

⑻搜索及替换命令

/pattern:从光标开始处向文件尾搜索pattern

?pattern:从光标开始处向文件首搜索pattern

按n键,在同一方向重复上一次搜索命令

按N键,在反方向上重复上一次搜索命令

:s/p1/p2/g:将当前行中所有p1均用p2替代

:n1,n2s/p1/p2/g:将第n1至n2行中所有p1均用p2替代

:g/p1/s//p2/g:将文件中所有p1均用p2替换

⑼选项设置set

all:列出所有选项设置情况

term:设置终端类型

ignorance:在搜索中忽略大小写

list:显示制表位(Ctrl+I)和行尾标志($)

number:显示行号

report:显示由面向行的命令修改过的数目

terse:显示简短的警告信息

warn:在转到别的文件时若没保存当前文件则显示NO write信息

nomagic:允许在搜索模式中,使用前面不带“\”的特殊字符

nowrapscan:禁止vi在搜索到达文件两端时,又从另一端开始

mesg:允许vi显示其他用户用write写到自己终端上的信息

⑽最后行方式命令

在使用[last line mode]之前,请记住先按[ESC]键确定您已经处于[command mode]下后,再按[:]冒号即可进入[last line mode]。

:n1,n2 co n3   将n1行到n2行之间的内容拷贝到第n3行下

:n1,n2 m n3   将n1行到n2行之间的内容移至到第n3行下

:n1,n2 d      将n1行到n2行之间的内容删除

:w           保存当前文件

:e filename   打开文件filename进行编辑

:x          保存当前文件并退出

:q          退出vi

:q!         不保存文件并退出vi

:!command  执行shell命令command

:n1,n2 w!command 将文件中n1行至n2行的内容作为command的输入并执行之,若不指定n1,n2,则表示将整个文件内容作为command的输入

:r!command 将命令command的输出结果放到当前行

⑾寄存器操作

"?nyy:将当前行及其下n行的内容保存到寄存器?中,其中?为一个字母,n为一个数字

"?nyw:将当前行及其下n个字保存到寄存器?中,其中?为一个字母,n为一个数字

"?nyl:将当前行及其下n个字符保存到寄存器?中,其中?为一个字母,n为一个数字

"?p:取出寄存器?中的内容并将其放到光标位置处。这里?可以是一个字母,也可以是一个数字

ndd:将当前行及其下共n行文本删除,并将所删内容放到1号删除寄存器中。

vi的具体应用举例:

(1)在命令提示符下启动vi

如键入vi  first.c   此时看到最下面一行为状态提示信息

(2)此时按A键进入插入模式,注意界面最下一行的提示信息变成INSERT,并且显示当前光标所在位置为第1行第1列,接下来就可以键入具体的内容。

(3)如果键入了错误的字符想要修改,首先按ESC键进入命令模式,然后可以使用x键删除,修改完之后,再使用A键进入插入模式;如果只是单个字符错误,可以在命令模式下使用s键,可以同时修改字符,并进入命令模式。

(4)完成文本的时候,如果要保存,先按ESC键,从插入模式退回到命令模式,接着按“ : ”进入末行模式,按w键,保存当前结果,然后继续回到输入模式继续输入文本,或者使用“退出vi”中的命令组合退出vi。

郑重提醒

第一次用vi,有几点注意要提醒一下:

1、用vi打开文件后,是处于[命令行模式(command mode)],您要切换到[插入模式(Insert mode)]才能够输入文字。切换方法:在[命令行模式(command mode)]下按一下字母[i]就可以进入[插入模式(Insert mode)],这时候你就可以开始输入文字了。

2、编辑好后,需从插入模式切换为命令行模式才能对文件进行保存,切换方法:按[ESC]键。

3、保存并退出文件:在命令模式下输入:wq即可!(别忘了wq前面的:)

二、Linux下的编译器gcc

C语言是Linux下的最常用的程序设计语言,Linux上的很多应用程序都是用C语言编写的。Linux系统上运行的GNC C编译器(gcc)是一个全功能的ANSI C兼容编译器。虽然gcc没有集成的开发环境,但堪称目前效率很高的C/C++编译器。

命令格式    gcc  [选项]  源文件

选项含义

-o FILE  指定输出文件名,在编译为目标代码时,这一选项不是必须的。如果FILE没有指定, 缺省文件名是a.out.

-c   只编译不链接

-O   优化编译过的代码

-w   关闭所有警告,建议不要使用此项

3.3  实验内容

1、熟悉vi编辑器的使用

2、利用vi编写简单的c程序

3、使用gcc编译器进行编译调试

3.4  实验指导

1、假设要写一个hello.c文件,首先使用vi  hello.c命令,然后用I命令或者按insert进行编辑,内容如下:

#include<stdio.h>

int  main(){

printf(“Hello Linux!\n”);

return 0;

}

2、按ESC,在vi命令模式下使用:wq命令进行保存,并退出编辑器;

3、进入hello.c所在目录,使用gcc –o hello hello.c对源文件进行编译。该命令的意思就是对hello.c文件进行编译,声明生成的目标文件名为hello(参考 –o选项的说明)。

4、要看执行结果,使用 ./hello就可以在屏幕上看到输出结果了。

四、进程创建(二)

4.1  实验目的

加深对进程概念的理解,明确进程和程序的区别

理解Linux下进程创建的原理和特点

掌握fork()系统调用的使用方法

4.2  预备知识

1、进程的概念

Linux操作系统是面向多用户的。在同一时间可以有许多用户向操作系统发出各种命令。那么操作系统是怎么实现多用户的环境呢?在现代的操作系统里面,都有程序和进程的概念。那么什么是程序,什么是进程呢?通俗的讲程序是一个包含可以执行代码的文件,是一个静态的文件。而进程是一个开始执行但是还没有结束的程序的实例,就是可执行文件的具体实现。

一个程序可能有许多进程,而每一个进程又可以有许多子进程。依次循环下去,产生子孙进程,形成进程家族。

当程序被系统调用到内存以后,系统会给程序分配一定的资源(如内存、设备等等),然后进行一系列的复杂操作,使程序变成进程以供系统调用。在系统里面只有进程没有程序,为了区分各个不同的进程,系统给每一个进程分配了一个ID(就象我们的身份证)以便识别,就是PID。

为了充分的利用资源,系统还对进程的状态进行不同区分,将进程分为新建,运行,阻塞,就绪和完成五个状态,以及两个挂起状态。新建表示进程正在被创建,运行是进程正在运行,阻塞是进程正在等待某一个事件发生,就绪是表示系统正在等待CPU来执行命令,而完成表示进程已经结束了系统正在回收资源。关于进程状态的详细解说可以看《计算机操作系统》上面详细的解说。

2、进程的创建

创建一个进程的系统调用很简单,只要调用fork函数就可以了

pid_t  fork();

当一个进程调用了fork以后,系统会创建一个子进程,子进程和父进程只是进程ID不同,其他的都是一样,就像是进程克隆(clone)了自己一样。为了区分父进程和子进程,我们必须跟踪fork的返回值。这是fork函数很独特的地方,希望大家好好体会。

当fork调用失败(内存不足或者是用户的最大进程数已到),fork返回-1;否则fork的返回值有重要的作用。对于父进程fork返回子进程的ID(大于0),而对于子进程fork返回0。我们就是根据这个返回值来区分当前是处于父进程还是子进程。

父进程为什么要创建子进程呢?前面我们已经说过了Linux是一个多用户操作系统,在同一时间会有许多的用户在争夺系统的资源,有时进程为了早一点完成任务就创建子进程来争夺资源。一旦子进程被创建,父子进程一起从fork处继续执行,相互竞争系统的资源。

4.3  实验内容

使用fork系统调用,编写一段进程创建的c程序,实现从父进程创建一个子进程,在父子进程中分别输出不同的提示信息。

如:在父进程中输出:Message from Parent!

在子进程中输出:Message from Child!

4.4  实验指导

1、fork()函数

fork函数用于创建一个新的进程(子进程),其调用格式为:

pid_t ford();

正确返回:

等于0,创建了子进程,并且是在子进程中返回,即接下来执行子进程的代码

大于0,创建了子进程,从父进程中返回子进程的ID值。

错误返回:

等于-1,创建失败。

2、子进程和父进程的调度执行

子进程被创建后,就进入就绪队列,和父进程一起独立地等待调度。子进程继承父进程的程序段代码,子进程被调度执行后,也会和父进程一样,从fork()返回。从共享程序段代码的角度看,父子进程执行的程序段代码是同一个,在内存中只有一个程序段副本;但是从编程的角度来看,为了使父子进程作不同的事情,要在程序中区分父进程和子进程的代码段,这就需要借助于从fork()返回的值,来标志当前进程的身份,究竟是父进程,还是子进程。

从fork()返回后,都会执行如下语句: pid = fork();

得到返回的值pid后,有三种情况:

1)若pid < 0,则表示fork()出错,执行

if( pid<0){

printf(“fork error\n”);

exit(0);

}

2)若pid = 0,表示当前进程是子进程,后面执行的代码,是子进程要做的事情

if( pid == 0){

printf(“Message from Child!”);

exit(0);

}

3)若pid > 0,表示当前进程是父进程,后面执行的代码,是父进程要做的事情

if( pid > 0){

printf(“Message from Parent!”);

exit(0);

}

由于父子进程分别独立地进入就绪队列等待调度,所以谁会先得到调度,是不确定的,这与系统的调度策略和系统当前资源状态有关,因此谁先从fork()返回,继续执行后面的语句,也是不确定的。(观察这种不确定表现出来的情况是什么)

4.5  参考源代码

五、管道通信

5.1  实验目的

理解进程之间通信的基本原理

掌握利用管道进行进程之间通信的方法

5.2  预备知识

在Linux系统中,进程与进程之间需要互相交换数据,即进程通信。进程通信可以发生在同一主机的进程之间,也可以发生在不同主机与主机的进程之间。

Linux下进程间通信的几种主要手段有:

  1.无名管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了无名管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信;

  2.信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;Linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数);  

  3.报文(Message)队列(消息队列):消息队列是消息的链接表,包括Posix消息队列systemV消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。  

  4.共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。  

  5.信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。   

6.套接口(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和System V的变种都支持套接字。

下面具体介绍管道方式:

管道允许进程之间按照先进先出的方式传送数据。管道的实现是采用一个连接写进程和读进程的文件系统中的共享文件作为数据存储,所以该管道又称为管道(pipe)文件。写进程将数据写入管道文件,读进程从管道文件中读出数据。管道是一种临界资源,所以对管道的应用要考虑进程的同步。

5.3  实验内容

1、创建无名管道,然后向该管道写入字符,再将写入的字符读出

2、利用fork创建子进程,然后父子进程之间通过管道进行通信

5.4  实验指导

1、创建无名管道的系统调用格式为:

int  pipe(filedes);

int  filedes[2];

其中filedes是文件描述符,由filedes[0]和filedes[1]组成。filedes[1]是写入管道的描述符,filedes[0]是从管道读的描述符。

2、进程写管道

进程向管道写数据时必须注意管道的大小限制,管道中已有的数据与要写入之和不能大于管道的容量。

写管道的系统调用格式为:

write(filedes[1], buf, size);

int  filedes[1], size;

char  buf[];

其中filedes[1]为写入管道的描述符;buf是要写入管道的数据;size是写入的数据长度。

3、进程读管道

进程从管道中读数据时,如果管道中已经有数据,进程按照先进先出的原则通过读指针读取数据。

读管道的系统调用格式为:

read(filedes[0], buf, size);

int  filedes[0], size;

char  buf[];

其中filedes[0]为从管道读的描述符;从管道中读出的数据放入buf中;size是读出数据的长度。

5.5  参考源代码

1、无名管道读写字符串

2、父子进程通过管道进行通信

六、进程调度

6.1  实验目的

进程调度是处理机管理的核心内容

通过本实验加深对进程控制块、就绪队列等概念的理解

体会和了解优先权调度算法的具体实现方法

6.2  预备知识

在操作系统中,由于进程总数多于处理机,它们必然竞争处理机。进程调度的功能就是按一定策略、动态地把处理机分配给处于就绪队列中的某一进程并使之执行。根据不同的系统设计目标,可有多种选择进程的策略。例如系统开销较少的静态优先数法,适合于分时系统的轮轮法以及UNIX采用的动态优先数反馈法等。

有2种基本的进程调度方式,即剥夺方式(preemptive mode)和非剥夺方式(non-preemptive mode)。前者指就绪队列中一旦有优先级高于现行进程优先级的进程出现时,系统便立即把处理机分配给高优先级的进程。当然,被剥夺了处理机的进程的有关状态和上下文都必须妥善保存以便今后恢复。后者是,一旦处理机分给了某进程,除非该进程的时间片已满或它主动放弃处理机,系统不得以任何理由剥夺该现行进程的处理机。

引起进程调度的原因与操作系统的类型有关,大体可归结为以下几种:

(1) 进程运行完毕

(2) 进程提出I/O请求

(3) 进程执行某种原语操作(如P操作)导致进程阻塞

(4) 时间片已满

(5) 可剥夺方式中,就绪队列中某进程的优先级变得高于现行进程;

要上述情况出现就引发进程调度。由于进程调度的使用频率高,其性能优劣直接影响操作系统的性能。

6.3  实验内容

用C语言编写和调试一个基于优先权的进程调度程序。

6.4  实验指导

基于优先权的进程调度,把所有的进程按照优先权顺序插入就绪队列,调度的时候,从就绪队列中选择优先权最高的进程,调度运行。当一个进程运行的时候,动态修改其优先级系数和CPU时间,如果CPU时间增加到大于或等于所需的全部时间,则表示该进程运行完成,退出;否则,继续插入就绪队列,等待再一次被调度运行。

步骤:

1) 初始化工作:随机产生5个进程,设置好进程标志符pid、优先级pri、当前已获得的CPU时间统计cputime、运行完成总共需要的时间alltime、状态state(全部定义为1,即运行状态);

2) 创建一个有序链表,作为就绪队列,并把上述5个进程按优先级从高到低的次序插入就绪队列;

3) 如果就绪队列不为空,从就绪队列中取下第一个进程(优先级最高的进程)模拟运行;就绪队列为空,退出运行;

4) 修改该进程的优先级数值pri,增加CPU运行时间统计,即增加cputime;

5) 判断,如果cputime>=alltime,该进程运行完毕退出;否则,该进程继续插入就绪队列,等待下一次调度运行;

6) 继续执行步骤3)

算法流程:

1、数据结构说明

就绪队列是一个按照优先权排列的队列,所以我们采用有序链表结构(SortedList),在插入链表时,自动比较优先权,把尚未完成退出的进程插入到合适的位置。链表的首元素,一定是优先权最高的进程。

有序链表(SortedList)函数说明:

Node* InitSortedList( )   //初始化有序链表,返回一个链表的头结点

void  insertSortedList(LinkList L,PROC proc)  //按优先级把进程插入有序链表

PROC*  getHeadElement(LinkList L)  //摘取链表的头结点,即优先权最高的进程

两个自定义结构:

typedef struct PROC{  //进程的PCB结构

int pid;   //进程标志

int pri;           //优先级

int cputime;       //以用的CPU时间

int alltime;        //运行完成所需的所有时间

int state;         //状态

}PROC;

typedef struct Node{ //有序链表结点定义

struct PROC data;

struct Node *next;

}Node;

6.5  参考源代码

七、页面置换算法

7.1  实验目的

理解内存页面调度的原理

掌握几种理论页面置换算法的实现方法

7.2  预备知识

常用的页面置换算法有以下几种:

一、 先进先出法(FIFO)

这是最早出现的置换算法。该算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰。该算法实现简单只需把一个进程已调入内存的页面,按先后次序链接成一个队列,并设置一个指针,称为替换指针,使它总是指向最老的页面。

二、最佳置换法(OPT)

它是由Belady于1966年提出的一种理论上的算法。其所选择的被淘汰页面,将是以后永不使用的或许是在最长(未来)时间内不再被访问的页面。采用最佳置换算法,通常可保证获得最低的缺页率。但由于人目前还无法预知一个进程在内存的若干个页面中,哪一个页面是未来最长时间内不再被访问的,因而该算法是无法实现的,但可以利用此算法来评价其它算法。

三、最近最久未使用置换法(LRU)

最近最久未使用(LRU)置换算法,是根据页面调入内存后的使用情况进行决策的。由于无法预测各页面将来的使用情况,只能利用“最近的过去”作为“最近的将来”的近似,因此,LRU置换算法是选择最近最久未使用的页面予以淘汰。该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间t,,当须淘汰一个页面时,选择现有页面中其t值最大的,即最近最久未使用的页面予以淘汰。

7.3  实验内容

模拟实现先进先出页面置换、最佳页面置换、LRU页面置换算法中的一种或多种。

7.4  实验指导

1、页面调入和置换流程

2、结构说明

l MemPageCount定义为内存中物理块数目,参考教材4.6.2的内容

l InstructionCount定义为指令页面数目,即模拟算法中页面号引用串的数目

l mempage[MemPageCount]表示内存物理块集合,即存放指令页面的物理块

l 结构体page中,serial表示页面号,time表示时间计数

关于time值的说明:

l time字段在OPT算法中没有用处,而是使用distance来表示将来最久不使用。

l 在FIFO算法中,根据time值选择要置换出去的页面,哪个页面的time值越大,表示进入内存的时间越早;新进入内存的页面time=0,然后每次都给内存中所有页面的time值加一,保证最先进入的页面time值最大,而不管该页面有否再次被使用。

l 在LRU算法的置换中,同样选择time值大的页面换出,此时time值越大,表示在过去越久没有被使用过;新进入的页面time=0,然后每次给内存中所有页面的time值加一;如果内存中的页面被再次使用,则先将该页面的time置零,表示最近刚刚被使用过,保持time值最小,然后给所有页面的time值加一。

1、先进先出(FIFO)置换算法

注:在FIFO算法中,无论有无发生缺页或者置换,都需要对每个在内存中的页面的time值进行增加操作,以保持最先进入的那个页面的time值是最大的;一个新进来的页面,其time值设置为0。算法也可以通过队列结构来实现,利用队列的先进先出(FIFO)特性完成,无需设置time字段。

2、最佳(OPT)置换算法

注:distance用于记录内存物理块集合中每个页面距离再次被使用的页面跨度,缺省值为9999,如果某个页面在后续指令集合中不再出现,则用最大值9999缺省取代;如果页面再次被使用,则两次使用所跨的页面数,为页面跨度。用最大页面跨度表示以后永不使用或未来最长时间内不再被访问。

3、最近最久未使用(LRU)算法

注:在LRU算法中,无论是否发生缺页或者置换,除了命中(刚刚被访问过的页面)页面time值清零之外,其它所有内存中的页面的time值都加一,以保证最近刚刚被访问的页面的time值最小,相应time值最大的页面就是最近最久没有被访问的页面。

7.5  参考源代码

八、文件系统调用

8.1  实验目的

理解文件系统的实现技术

掌握与文件有关的系统调用

8.2  预备知识

文件是数据的集合,系统文件不仅包含文件中的数据,而且还有文件系统的结构。文件系统负责在外存上管理文件,并把对文件的存取、共享和保护等手段提供给操作系统和用户。文件系统不仅方便了用户使用,保证了文件的安全性,还可以大大提高系统资源的利用率。

Linux最早的文件系统是Minix,它受限甚大且性能低下。其文件名最长不能超过14个字符(虽然比8.3 文件名要好)且最大文件大小为64M字节。64M字节看上去很大,但实际上一个中等的数据库将超过这个尺寸。第一个专门为Linux设计的文件系统被称为扩展文件系统(Extended File System)或EXT。它出现于1992年四月,虽然能够解决一些问题但性能依旧不好。1993年扩展文件系统第二版或EXT2被设计出来并添加到Linux中。它是本章将详细讨论的文件系统。

将EXT文件系统添加入Linux产生了重大影响。每个实际文件系统从操作系统和系统服务中分离出来,它们之间通过一个接口层:虚拟文件系统或VFS来通讯。

VFS使得Linux可以支持多个不同的文件系统,每个表示一个VFS的通用接口。由于软件将Linux文件系统的所有细节进行了转换,所以Linux核心的其它部分及系统中运行的程序将看到统一的文件系统。 Linux的虚拟文件系统允许用户同时能透明地安装许多不同的文件系统。

对用户而言,应用程序可以通过文件系统提供的系统调用来使用文件资源,在用户程序中有关文件的操作主要有:创建文件、打开文件、读写文件、关闭文件等。

8.3  实验内容

1、创建文件

2、打开文件

3、关闭文件

4、读写文件

8.4  实验指导

1、创建文件

系统调用creat创建一个新文件或重写一个旧文件,并将文件描述符fd返回给用户程序,用户利用文件描述符对文件进行读写。

创建文件系统调用格式为:

int  creat(path, smode);

char*  path;

int  smode;

该系统调用的返回值是文件描述符。其中path为创建的文件名(包含全路径);smode为文件的实际权限,在文件修改模式命令chmod中,用户对文件读、写、执行的访问权mode用3位8进制表示,例如mode=751说明文件的所有者有读、写、执行权,同组用户有读、执行权,其他用户只有执行权。

系统按照smode指定的权限创建文件,如果创建成功,则返回文件描述符,否则返回-1。如果文件已经存在,重写一个旧文件意味着要将文件中原有内容清掉。

说明:

3位8进制表示法:r、w、x表示读、写、执行权。

每次使用时所有者、组、其他用户的访问权分别用相应的数字带入。记住这些数字的基本规律:001(x)、010(w)、100(r)是基本数字;3由1+2构成(x+w),5由1+4构成(x+r),6由2+4构成(w+r),7由1+2+4构成(x+w+r)。

2、打开文件

文件创建以后,必须用系统调用open将文件打开之后才能对文件进行读写操作。

系统调用的格式为:

int  open(path,  rwmode);

char*  path;

int  rwmode;

该系统调用返回值为打开文件的描述符。如果文件打开成功,则返回文件描述符,否则返回-1。其中path为含有全路径的要打开的文件名;rwmode为头文件fcntl.h中定义的对打开文件的访问模式:

rwmode = 0表示可读, O_RDONLY;

rwmode = 1表示可写, O_WRONLY;

rwmode = 2表示可读可写,O_RDWR;

3、关闭文件

当用户在文件使用完之后不再需要时,用系统调用close断开用户程序与文件之间的通路,关闭该文件。

系统调用格式为:

int  close(fd);

int  fd;

其中fd为文件描述符,根据fd从用户文件描述符表中得到指向文件表项的指针fp,由fp得到文件表项中的f.count,并对f.count作减1操作。操作结果如果不为0,表示还有进程在使用该文件,此时不能回收文件表项;操作结果为0,表示无进程使用该文件,此时将此文件表项置为空。

4、读文件

当文件打开后,可以用系统调用read对文件进行读操作。

系统调用格式为:

int  read(fd, buffer, count):

int  fd;

char*  buffer;

unsigned  count;

其中,fd是open返回的文件描述符;buffer是一个缓冲区,用于存放所读的数据;count是要读的字节数。如果系统调用成功,则返回实际读取的字节数;如果读的时候,读指针已经到达文件末尾,但还没有读够指定的字节数count,也立即停止,所以返回值可以小于等于count。在read系统调用中如果没有指定要读的字节数,则通常是读1个字节。

5、写文件

写文件系统调用write是在文件被open系统调用打开后,从缓冲区buffer将指定字节的内容写到由open返回的文件描述符所指定的文件中。

系统调用格式为:

int  write(fd, buffer, count);

int  fd;

char*  buffer;

unsigned  count;

其中,fd是open返回的文件描述符,该文件存放由write写入的内容;buffer是一个缓冲区,用于存放要写的内容;count是要写的字节数。

8.5  参考源代码

注意文件系统调用中的路径参数,根据实验环境具体填写(可以使用pwd命令查看当前工作路径)

参考文献

[1]《计算机操作系统》汤子瀛等编著  西安电子科技大学出版社  2001年

[2]《UNIX操作系统教程—管理与编程》刘循  高等教育出版社  2003年

[3]《计算机操作系统—学习指导与题解》梁红兵等编著 西安电子科技大学出版社  2003年

[4]《操作系统实验指导—基于Linux内核》徐虹等编著 清华大学出版社 2004年

[5]《操作系统原理与实例分析》蒲晓蓉等编著 机械工业出版社 2004年

[6]《Linux操作系统及实验教程》李善平等编著 机械工业出版社 1999年

[7]《操作系统习题与实验指导》左万历 高等教育出版社 2005年

[8]《数据结构、算法与应用—C++语言描述》Sartaj Sahni著 汪诗林等译 机械工业出版社 2004年

ubuntu 完整学习资料相关推荐

  1. 【Matlab】基于MNIST数据集的图像识别(深度学习入门、卷积神经网络、附完整学习资料)

    Matlab--数字0~9的图像识别(Phil Kim著.Matlab) 本文可以为那些想对深度学习和人工智能有初步了解的朋友提供一些基础入门的帮助. 本文所用参考书: <MATLAB深度学习 ...

  2. DirectX学习资料汇总

    前提   由于DirectX已经发展了好多年,现在已经发展到了DirectX 12.0,而且DirectX现在还在发展中.这里汇总一下我学DirectX时碰到的一些学习资料,供后来人按需获取. 网站篇 ...

  3. linux、C++、Java、HTML 语言学习资料总结

    总结是更好的进步 大家好,本篇文章分享我上学及工作后,整理的资料,linux系统方面,C++语言.JAVA语言等. linux系统,是我们服务器常见的系统,很多开发的软件都是在linux系统上运行的, ...

  4. 大数据基础学习二:在VMware虚拟机上安装Ubuntu完整步骤及需要注意的问题(以VMware Workstation 15.1.0 Pro和Ubuntu18.04.3优麒麟版为例)

    大数据基础学习二:在VMware虚拟机上安装Ubuntu完整步骤及需要注意的问题 (以VMware Workstation 15.1.0 Pro for Windows和Ubuntu18.04.3优麒 ...

  5. 备战金九银十,阿里P8师兄指导完整攻略(附:学习资料+面试宝典+项目实战笔记)

    前言 还剩下两个月就到了金九银十,一般来说,秋招的含金量明显是高于春招的. 那么如何准备即将到来的面试热潮呢?运筹帷幄之后,决胜千里之外! 坚决不打毫无准备的仗是小编的原则:不论是笔试还是面试都是有章 ...

  6. C/C++Linux服务器开发完整学习路线(含免费学习资料下载地址)

    C/C++Linux服务器开发完整学习路线(含免费学习资料下载地址) 相信大部分同学刚毕业或者想转行做c++服务端开发的时候都很迷茫不知道从哪里开始学习,于是准备参加各种培训班或者网络培训,有不知道该 ...

  7. 1.1 大数据简介-hadoop-最全最完整的保姆级的java大数据学习资料

    文章目录 1 hadoop-最全最完整的保姆级的java大数据学习资料 1.1 大数据简介 1.1.1 大数据的定义 1.1.2 大数据的特点 1.1.3 大数据的应用场景 1.1.4 大数据的发展趋 ...

  8. Python从入门到精通的完整学习路线图(流程图)【附:全套python学习资料】

    这是一篇 Python 入门指南, 针对那些没有任何编程经验,从零开始学习 Python 的同学.不管你学习的出发点是兴趣驱动.拓展思维,还是工作需要.想要转行,都可以用此文作为一个参考. 在这个信息 ...

  9. 独家 | 一文带你上手卷积神经网络实战(附数据集学习资料)

    原文标题:Understanding deep Convolutional Neural Networks with a practical use-case in Tensorflow and Ke ...

  10. 熬夜整理了2021年Python最新学习资料,分享给学弟学妹们【大学生必备】

    Python最新学习资料和视频 一.Python软件 安装教程 视频教程 二.学习规划 阶段一:Python基础 阶段二:Python核心编程 阶段三:web前端开发 阶段四:数据库 阶段五:后端开发 ...

最新文章

  1. Aliyun LOG Java Producer 快速入门
  2. 习题8-5 使用函数实现字符串部分复制 (20 分)
  3. Yii 判断是不是post方式提交的数据
  4. AUTOCAD自学教程一
  5. kafaka生产者消费者demo(简易上手demo)
  6. 什么是 Visual VM?
  7. linux配置redis服务,记一次linux下安装redis, 设置redis服务, 及添加环境变量
  8. 50道编程小题目之【质数的个数】
  9. SIGCHLD waitpid, 小心子进程结束事件被偷了
  10. CSDN - 屏蔽百度广告
  11. 发那科机器人寄存器Ar_发那科机器人数据寄存器和位置寄存器的运用介绍
  12. 太突然!北大方正破产了!负债3029亿元!
  13. java8新特性 函数式编程 Lamda
  14. php两张图片合成,php多张图片合成一张的方法及案例
  15. MATLAB2016a启动慢
  16. 高等数学-线性代数:特征向量与差分方程的连接
  17. WIN7的小喇叭不见了怎么办?音量图标不见了?
  18. 循环渐进NsDoor(一)
  19. “博客无双”第二期拍卖活动将于2011年1月26日14:00开始
  20. eclipse报错!!!!

热门文章

  1. 顺时针、逆时针两种方式减小的倒计时动画
  2. 综合能源管理电力市场改革的主要问题及分析_能谱网
  3. 从石器时代到硅器时代
  4. Django 字段选项之 related_name 和 related_query_name
  5. 计算机四级少选给分吗,计算机四级:考高分的有效途径(转载)
  6. 快讯 | 科技部公布首批国家人工智能创新平台名单,BAT+科大讯飞入选
  7. Rootkit Hacking Technology Defence Strategy Research
  8. java 类名_Java类的命名规则是什么
  9. 网络版库存管理系统如何共享库存信息
  10. 后台管理进程GameMaster