实验一 Linux系统简介

通过实验一主要是学习到了Linux 的历史简介,linux与windows之间的区别,主要是免费和收费,软件和支持,安全性,使用习惯,可制定性,应用范畴等。linux具有稳定的系统,安全性和漏洞的快速修补,多用户,用户和用户组的规划,相对较少的系统资源占用,可定制裁剪,移植到嵌入式平台(如安卓设备),可选择的多种图形用户界面(如 GNOME,KDE)等优点。因为是第一次接触到Luinx的操作系统,直观感受就是luinx上许多功能的执行都需要通过输入命令来完成的。

实验二 基本概念及操作

  • 物理机系统上可以通过使用[Ctrl]+[Alt]+[F1]~[F6]进行切换登陆,当切换到其中一个终端后想要切换回图形界面,可以按下[Ctrl]+[Alt]+[F7]来完成
  • echo“ ”可以用来打印字符串
  • tab键可以补全命令,补全目录,补全命令参数
  • Ctrl+c键可以强行终止当前程序
  • Ctrl+d 键盘输入结束或退出终端 Ctrl+s 暂定当前程序,暂停后按下任意键恢复运行 Ctrl+z 将当前程序放到后台运行,恢复到前台为命令fg Ctrl+a 将光标移至输入行头,相当于Home键 Ctrl+e 将光标移至输入行末,相当于End键 Ctrl+k 删除从光标所在位置到行末 Alt+Backspace 向前删除一个单词 Shift+PgUp 将终端显示向上滚动 Shift+PgDn 将终端显示向下滚动

    使用键盘上的方向上键,恢复你之前输入过的命令
  • 通配符是一种特殊语句,主要有星号(*)和问号(?),用来对对字符串进行模糊匹配(比如文件名,参数名)。当查找文件夹时,可以使用它来代替一个或多个真正字符
  • touch 可用来创建文件,用touch No.{1..10}.txt 可创建10个连续命名的文件
  • 使用man来查看手册,--help来查看帮助
  • 还学习到了输出图形字符的命令,首先进行命令包的安装:

    $ sudo apt-get update sudo apt-get install sysvbanner

    $ sudo apt-get update sudo apt-get install toilet

    $ sudo apt-get update sudo apt-get install figlet

    然后可以看到下面的图形:





实验三 用户文件权限管理

  • 本次实验主要学习了linux中创建、删除用户,及用户组等操作,以及Linux 中的文件权限设置。
  • 实验步骤如下:
  1. 新建一个叫 lilei 的用户:

  2. 登录用户:



    3.默认情况下新创建的用户是不具有 root 权限的,也不在 sudo 用户组,可以让其加入 sudo 用户组从而获取 root 权限:



    4.文件权限:每个文件的三组权限(拥有者,所属用户组,其他用户,记住这个顺序是一定的)对应一个 " rwx ",也就是一个 “ 7 ”



    加减赋值操作:g、o 还有 u 分别表示 group、others 和 user,+ 和 - 分别表示增加和去掉相应的权限:



    5.作业:
  • 添加loutest用户

  • 使用 sudo 创建文件 /opt/forloutest,设置成用户 loutest 可以读写

实验四 Linux目录结构和文件基本操作

  • 本次实验主要学习了以下操作命令:

cd 进入目录

cd ~ 到用户目录

cd .. 到上一级目录

cd /xxx/xxx/xxx 绝对路径,输入的必须是最精确的路径

cd ../../../xxx/xxx/xxx 相对路径,从当前位置开始向上一级然后再进入其他文件夹

cd xxx/xxx/xxx/ 相对路径,从当前位置开始直接走向下一级的文件夹

用cd时多用TAB按键来补全

pwd 查看当前的路径位置

ls 查看当前文件夹下所有文件和文件夹

ll 查看当前文件夹下所有文件和文件夹(更详细)

touch 新建一个文件

mkdir 新建一个文件夹

mkdir -p 新建一个路径(文件夹套文件夹)

rm 删除(文件)

rm -r 删除目录路径

rm -f 强制删除

cp [文件] [路径] 复制文件到某个路径中

cp -r [文件夹] [路径] 将整个文件夹(路径)复制到这个目标路径中

mv [文件] [路径] 剪切文件到某个路径中

mv [旧文件] [新文件名] 重命名文件/文件夹

cat 打开文件,查看文件内容(直接打开看)

more 打开文件,但看得更舒服

head 只看文件的前几行

tail 只看该文件里的最后几行【实时监控】

file 查看文件类型

  • 作业

    1.创建一个 homework 目录,建立名为 1.txt~10.txt 文件,并删除 1.txt~5.txt

2.Linux 的日志文件放在var/log的目录下

实验五 环境变量与文件查找

- 这次实验学习了环境变量的作用与用法,及几种搜索文件的方法

1.declare 命令创建一个变量名为 tmp 的变量,使用 = 号赋值运算符,将变量 tmp 赋值为 shiyanlou:读取变量的值,使用 echo 命令和 $ 符号($ 符号用于表示引用一个变量的值,初学者经常忘记输入):

2.环境变量的作用域比自定义变量的要大,如 Shell 的环境变量作用于自身和它的子进程。在所有的 UNIX 和类 UNIX 系统中,每个进程都有其各自的环境变量设置,且默认情况下,当一个进程被创建时,除了创建过程中明确指定的话,它将继承其父进程的绝大部分环境设置。set,env,export。这三个命令很相似,都是用于打印环境变量信息

3.文件搜索:

  • whereis 简单快速



    你会看到它找到了三个路径,两个可执行文件路径和一个 man 在线帮助文件所在路径,这个搜索很快,因为它并没有从硬盘中依次查找,而是直接从数据库中查询。whereis 只能搜索二进制文件(-b),man 帮助文件(-m)和源代码文件(-s)。

  • locate 快而全



    通过“ /var/lib/mlocate/mlocate.db ”数据库查找,不过这个数据库也不是实时更新的,系统会使用定时任务每天自动执行 updatedb 命令更新一次,所以有时候你刚添加的文件,它可能会找不到,需要手动执行一次 updatedb 命令(在我们的环境中必须先执行一次该命令)。它可以用来查找指定目录下的不同文件类型,如查找 /etc 下所有以 sh 开头的文件。

    注意:它不只是在 /etc 目录下查找,还会自动递归子目录进行查找。

  • which 小而精



    which 本身是 Shell 内建的一个命令,我们通常使用 which 来确定是否安装了某个指定的软件,因为它只从 PATH 环境变量指定的路径中去搜索命令。

  • find 精而细

  • find 应该是这几个命令中最强大的了,它不但可以通过文件类型、文件名进行查找而且可以根据文件的属性(如文件的时间戳,文件的权限等)进行搜索

  • -mtime n:n 为数字,表示为在 n 天之前的“一天之内”修改过的文件

    -mtime +n:列出在 n 天之前(不包含 n 天本身)被修改过的文件

    -mtime -n:列出在 n 天之内(包含 n 天本身)被修改过的文件

    -newer file:file 为一个已存在的文件,列出比 file 还要新的文件名

  • 作业

    找出 /etc/ 目录下的所有以 .list 结尾的文件:

实验六 文件打包与解压缩

  • zip的压缩和打包:



    上面命令将目录 /home/shiyanlou/Desktop 打包成一个文件,并查看了打包后文件的大小和类型。第一行命令中,-r 参数表示递归打包包含子目录的全部内容,-q 参数表示为安静模式,即不向屏幕输出信息,-o,表示输出文件,需在其后紧跟打包输出文件名。后面使用 du 命令查看打包后文件的大小。
  • 使用unzip命令解压缩zip文件

unzip -q shiyanlou.zip -d ziptest

使用安静模式-q,将文件解压到指定目录-d 若文件夹不存在则在当前目录下自动创建该文件夹

$ unzip -l shiyanlou.zip

如果你不想解压只想查看压缩包的内容 :使用 -l 参数

  • 创建一个 tar 包:



    上面命令中,-c 表示创建一个 tar 包文件,-f 用于指定创建的文件名,注意文件名必须紧跟在 -f 参数之后,比如不能写成 tar -fc shiyanlou.tar,可以写成 tar -f shiyanlou.tar -c ~。你还可以加上 -v 参数以可视的的方式输出打包的文件。上面会自动去掉表示绝对路径的 /,你也可以使用 -P 保留绝对路径符。
  • 说了这么多,其实平常使用的参数并没有那么复杂,只需要记住常用的组合就可以了。 常用命令:

    zip:

    打包 :zip something.zip something (目录请加 -r 参数)

    解包:unzip something.zip

    指定路径:-d 参数

    tar:

    打包:tar -cf something.tar something

    解包:tar -xf something.tar

    指定路径:-C 参数

实验七 文件系统操作与磁盘管理

  • df :查看磁盘的容量

    df -h #同--human-readable 以K,M,G为单位,提高信息的可读性。

    du:查看目录的容量

    du -h #同--human-readable 以K,M,G为单位,提高信息的可读性。

    du -a #同--all 显示目录中所有文件的大小。

    du -s #同--summarize 仅显示总计,只列出最后加总的值。

    dd命令用于转换和复制文件,不过它的复制不同于cp

    dd if=/dev/stdin of=/dev/stdout bs=10 count=1

    if =输入内容(从键盘输入内容stdin)

    of=输出 形成和存入哪个文件里

    bs=单位大小 默认byte,可以为K,M,G

    count=几个单位

  • 使用 mkfs 命令格式化磁盘(我们这里是自己创建的虚拟磁盘镜像)

  • 作业:找出当前目录下面占用最大的前十个文件

du : 计算出单个文件或者文件夹的磁盘空间占用.

sort : 对文件行或者标准输出行记录排序后输出.

head : 输出文件内容的前面部分.

du:

-a:显示目录占用空间的大小,还要显示其下目录占用空间的大小

sort:

-n : 按照字符串表示的数字值来排序

-r :按照反序排列

head :

-n : 取出前多少行

实验八 Linux下的帮助命令

  • 内建命令实际上是 shell 程序的一部分,其中包含的是一些比较简单的 Linux 系统命令,这些命令是写在bash源码的builtins里面的,由 shell 程序识别并在 shell 程序内部完成运行,通常在 Linux 系统加载运行时 shell 就被加载并驻留在系统内存中。而且解析内部命令 shell 不需要创建子进程,因此其执行速度比外部命令快。比如:history、cd、exit 等等。

  • 外部命令是 Linux 系统中的实用程序部分,因为实用程序的功能通常都比较强大,所以其包含的程序量也会很大,在系统加载时并不随系统一起被加载到内存中,而是在需要时才将其调入内存。虽然其不包含在 shell 中,但是其命令执行过程是由 shell 程序控制的。外部命令是在 Bash 之外额外安装的,通常放在/bin,/usr/bin,/sbin,/usr/sbin等等。比如:ls、vi等。

  • 简单来说就是:一个是天生自带的天赋技能,一个是后天得来的附加技能。我们可以使用 type 命令来区分命令是内建的还是外部的。例如这两个得出的结果是不同的

得到这样的结果说明是内建命令,正如上文所说内建命令都是在 bash 源码中的 builtins 的.def中

xxx is a shell builtin

得到这样的结果说明是外部命令,正如上文所说,外部命令在/usr/bin or /usr/sbin等等中

xxx is /usr/bin/xxx

若是得到alias的结果,说明该指令为命令别名所设定的名称;

xxx is an alias for xx --xxx

实验九 Linux任务计划crontab

  • 启动日志

    $sudo apt-get install -y rsyslog

    $sudo service rsyslog start

启动crontab

$sudo cron -f &

创建任务计划

$crontab -e

查看已创建任务计划

$crontab -l

启动

$ps aux | grep cron

or

$pgrep cron

删除

$crontab -r

实验十 命令执行顺序控制与管道

1.有选择的执行命令:命令&&用来实现选择性执行,它表示如果前面命令的执行结果为0则执行后面的,否则不执行。

命令||用来实现选择性执行,它表示如果前面命令的执行结果不为0则执行后面的,否则不执行。

命令|通过管道将上一个命令的输出作为下个命令的输入

cut

cut /etc/passwd -d ':' -f 1,6

打印/etc/passwd文件中以:为分隔符的第1个字段和第6个字段分别表示用户名和其家目录

cut /etc/passwd -c 2-5

打印/etc/passwd文件中每一行的第2-5个字符,包含第5个

cut /etc/passwd -c -5

打印/etc/passwd文件中每一行的前5个字符,包含第5个

cut /etc/passwd -c 5-

打印/etc/passwd文件中每一行的第5个字符以后的内容,包含第5个

grep

在文本中或 stdin 中查找匹配字符串

grep -rnI "shiyanlou" ~

我们搜索/home/shiyanlou目录下所有包含"shiyanlou"的文本文件,并显示出现在文本中的行号

-r 参数表示递归搜索子目录中的文件,-n表示打印匹配项行号,-I表示忽略二进制文件

export | grep ".*yanlou$"

查找环境变量中乙yan lou结尾的字符串

$就表示一行的末尾、

w

wc 命令用于统计并输出一个文件中行、单词和字节的数目

wc -l /etc/passwd

统计行数

-w 统计单词数

-c 统计字节数

-m 统计字符数

-L 最长行字节数

ls -dl /etc/

统计 /etc 下面所有目录数

sort

cat /etc/passwd | sort

默认按字典排序

cat /etc/passwd | sort -r

反转排序

cat /etc/passwd | sort -t ":" -k 3

按特定字段排序 -t参数用于指定字段的分隔符,这里是以":"作为分隔符;-k 字段号用于指定对哪一个字段进行排序

这里/etc/passwd文件的第三个字段为数字,默认情况下是以字典序排序的,如果要按照数字排序就要加上-n参数

uniq

用于过滤或者输出重复行

history | cur -c 8- | cut -d " " -f 1 | uniq

history命令查看最近执行过的命令

uniq命令只能去连续重复的行,不是全文去重,所以要达到预期效果,我们先排序

history | cut -c 8- | cut -d " " -f 1 | sort | uniq

history | cut -c 8- | cut -d " " -f 1 | sort | uniq -dc

输出重复过的行(重复的只输出一个)及重复次数

history | cut -c 8- | cut -d " " -f 1 | sort | uniq -D

输出所有重复的行

实验十一 简单的文本处理

  • tr 命令可以用来删除一段文本信息中的某些文字。或者将其进行转换。

    常见的方式为:tr [option]...SET1 [SET2]

    -d:删除和set1匹配的字符,注意不是全词匹配也不是按字符顺序匹配

    -s:去除set1指定的在输入文本中连续并重复的字符

  • col 命令可以将Tab换成对等数量的空格键,或反转这个操作:col [option]

  • join 这个命令就是用于将两个文件中包含相同内容的那一行合并在一起:join [option]... file1 file2

实验十二 数据流重定向

1.重定向简单来说就是将标准输出导向一个文件或追加到一个文件中

2.使用tee命令同时重定向到多个文件:

除了将需要将输出重定向到文件之外也需要将信息打印在终端

$ echo 'hello shiyanlou' | tee hello

实验十四 lunix下软件安装

  • 主要学习了 Ubuntu 下软件安装的几种方式,及 apt,dpkg 工具的使用。

    1.通常 Linux 上的软件安装主要有四种方式:

    - 在线安装

    - 从磁盘安装deb软件包

    - 从二进制软件包安装

    - 从源代码编译安装

    2.apt-get 是用于处理 apt包的公用程序集,我们可以用它来在线安装、卸载和升级软件包等,其基本的格式为:apt-get install <软件包名>即可。

    • 更新软件源

      sudo apt-get update

    • 升级没有依赖问题的软件包

      sudo apt-get upgrade

    • 升级并解决依赖关系

      sudo apt-get dist-upgrade

    • 软件的卸载

      sudo apt-get remove w3m

  1. dpkg 是Debian软件包管理器的基础,dpkg本身是一个底层的工具。上层的工具,像是 APT,被用于从远程获取软件包以及处理复杂的软件包关系。"dpkg"是"Debian Package"的简写。

    dpkg是常用于从本地磁盘安装deb格式软件的命令,搭配参数使用,例如sudo dpkg -i softname.deb(安装指定的deb软件包,如果是-I那就是查看软件包的信息)。

实验十五,十六 ,十七 进程概念和管理,lunix日志系统

  • 程序(procedure):不太精确地说,程序就是执行一系列有逻辑、有顺序结构的指令,帮我们达成某个结果。

  • 进程(process):进程是程序在一个数据集合上的一次执行过程,在早期的UNIX、Linux 2.4及更早的版本中,它是系统进行资源分配和调度的独立基本单位。

    • 进程有以下的特性:动态性:进程的实质是一次程序执行的过程,有创建、撤销等状态的变化。而程序是一个静态的实体。

      并发性:进程可以做到在一个时间段内,有多个程序在运行中。程序只是静态的实体,所以不存在并发性。

      独立性:进程可以独立分配资源,独立接受调度,独立地运行。

      异步性:进程以不可预知的速度向前推进。

      结构性:进程拥有代码段、数据段、PCB(进程控制块,进程存在的唯一标志)。也正是因为有结构性,进程才可以做到独立地运行。
  • 线程(thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。因为线程中几乎不包含系统资源,所以执行更快、更有效率。

  • 进程分类:以进程的功能与服务的对象分为用户进程与系统进程;以应用程序的服务类型分为交互进程、批处理进程、守护进程。

  • 通过 top 实时的查看进程的状态:

    由上面的就可以在知道当前系统的工作时间为下午4点23分,该机器已经启动了19天,当前系统中只有一个用户,load average后面的数值表示1、5、15分钟内cpu的平均负载。

  • 通过ps实时的查看进程的状态:

  • 通过 pstree 可以很直接的看到相同的进程数量,最主要的还是我们可以看到所有进程之间的相关性。

  • 首先通过前面的课程了解到常见的日志一般存放在 /var/log 中

根据服务对象粗略的将日志分为两类:系统日志和应用日志。系统日志主要是存放系统内置程序或系统内核之类的日志信息如 alternatives.log 、btmp 等等,应用日志主要是我们装的第三方应用所产生的日志如 tomcat7 、apache2 等等。

  • 配置日志

在做其中一个趣味实验的时候要安装安装aview和imagemagick,但我一个一个安装时会出现下面的情况:安装和更新失败的情况

  • 然后我选择了一次性更新和安装:安装成功了

  • 之后要下载网站上的图片,用 man 命令查看了如何从网站上下载图片的命令:

-使用asciiview命令显示图片

这种实验非常有趣而且还可以激发我们积极主动去学习的能力

总结

  • 这是我第一次接触到linux内核的知识,这些天一直跟着实验楼里面的实验一个一个的做,学习了一些linux的基本概念和基本的操作,以及一些对文件的操作命令。但在mount挂载磁盘到目录树、 fdisk 为磁盘分区、正则表达式等方面的知识理解上对我来说有一些困难,还是需要多多练习。
  • 我觉得写博客最重要的一个方面就是,如果自己在今后的学习过程中忘掉了或者不记得这方面的知识了,方便我们自己查阅和参考,能够快速拾起来遗忘的部分。
  • 通过看了老师给的那个makdown的教程,自己写出了第一篇博客,也学习到了makdown的一些编辑方法,我相信通过后面不断的写博客,我的会写得越来越好,越来越有条理和逻辑。
  • 这门课我感觉很有挑战性,下周继续努力跟着娄老师的步伐,努力学习。

20189220 余超《Linux内核原理与分析》第一周作业的更多相关文章

  1. Linux内核原理与分析-第一周作业

    本科期间,学校开设过linux相关的课程,当时的学习方式主要以课堂听授为主.虽然老师也提供了相关的学习教材跟参考材料,但是整体学下来感觉收获并不是太大,现在回想起来,主要还是由于自己课下没有及时动手实 ...

  2. 2019-2020-1 20199314 <Linux内核原理与分析>第一周作业

    前言 本周对实验楼的Linux基础入门进行了学习,目前学习到实验九完成到挑战二. 学习和实验内容 快速学习了Linux系统的发展历程及其简介,学习了下的变量.用户权限管理.文件打包及压缩.常用命令的和 ...

  3. 2019-2020-1 20199303<Linux内核原理与分析>第二周作业

    2019-2020-1 20199303第二周作业 1.汇编与寄存器的学习 寄存器是中央处理器内的组成部份.寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令.数据和位址.在中央处理器的控制部件中 ...

  4. 20169219 linux内核原理与分析第二周作业

    "linux内核分析"的第一讲主要讲了计算机的体系结构,和各寄存器之间对数据的处理过程. 通用寄存器 AX:累加器 BX:基地址寄存器 CX:计数寄存器 DX:数据寄存器 BP:堆 ...

  5. 2019-2020-1 20199314 <Linux内核原理与分析>第二周作业

    1.基础学习内容 1.1 冯诺依曼体系结构 计算机由控制器.运算器.存储器.输入设备.输出设备五部分组成. 1.1.1 冯诺依曼计算机特点 (1)采用存储程序方式,指令和数据不加区别混合存储在同一个存 ...

  6. Linux内核原理与分析-第二周作业

    写之前回看了一遍秒速五厘米:如果

  7. 2018-2019-1 20189221《Linux内核原理与分析》第一周作业

    Linux内核原理与分析 - 第一周作业 实验1 Linux系统简介 Linux历史 1991 年 10 月,Linus Torvalds想在自己的电脑上运行UNIX,可是 UNIX 的商业版本非常昂 ...

  8. 2020-2021-1 20209307 《Linux内核原理与分析》第九周作业

    这个作业属于哪个课程 <2020-2021-1Linux内核原理与分析)> 这个作业要求在哪里 <2020-2021-1Linux内核原理与分析第九周作业> 这个作业的目标 & ...

  9. 20169212《Linux内核原理与分析》课程总结

    20169212<Linux内核原理与分析>课程总结 每周作业链接汇总 第一周作业:完成linux基础入门实验,了解一些基础的命令操作. 第二周作业:学习MOOC课程--计算机是如何工作的 ...

  10. 20169212《Linux内核原理与分析》第二周作业

    <Linux内核原理与分析>第二周作业 这一周学习了MOOCLinux内核分析的第一讲,计算机是如何工作的?由于本科对相关知识的不熟悉,所以感觉有的知识理解起来了有一定的难度,不过多查查资 ...

随机推荐

  1. 【转载】 C#中List集合使用OrderByDescending方法对集合进行倒序排序

    在C#的List集合操作中,有时候需要针对List集合进行排序操作,如果是对List集合按照元素对象或者元素对象的某个属性进行倒序排序的话,可以使用OrderByDescending方法来实现,Ord ...

  2. Workerman简单开发示例实践(一)

    一.去官网下载workerman,地址:https://www.workerman.net/download,下载后解压任意文件夹. 二.在解压文件目录下新建http_test.php,输入如下代码: ...

  3. Objective-C 知识点拾遗

    -- :: UIWebView的使用总结 UIWebView全解

  4. C++ primer学习笔记_6_函数---函数定义、参数传递

    1. 习题参考: 6.14 举一个形参应该是引用类型的例子,再举一个形参不能是引用类型的例子. 答: 形参使用引用类型的情况:(1)避免拷贝传递大对象的时候,这里的string对象s:(2)当需要从函 ...

  5. 数据库与数据仓库的区别实际讲的是OLTP与OLAP的区别

    什么是数据仓库 数据仓库,英文名称为Data Warehouse,可简写为DW或DWH.数据仓库,是为企业所有级别的决策制定过程,提供所有类型数据支持的战略集合.它出于分析性报告和决策支持目的而创建. ...

  6. cmake 的简单使用示例

    https://www.zybuluo.com/khan-lau/note/254724 CMake 用法导览 Preface : 本文是CMake官方文档CMake Tutorial (http:/ ...

  7. 树莓派3b安装opencv

    前言:最近买了一个CSI接口的摄像头,最准用树莓派做人脸识别项目.树莓派上本身已经安装了python2.python3,最开始通过sudo apt-get install python3-opencv ...

  8. Pthon魔术方法(Magic Methods)-容器相关方法

    Pthon魔术方法(Magic Methods)-容器相关方法 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.容器相关方法汇总 __len__: 内建函数len(),返回对象的 ...

  9. 剑指Offer(二十):包含min函数的栈

    剑指Offer(二十):包含min函数的栈 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/ba ...

  10. Docker万字详解!

    一.简介   1.了解Docker的前生LXC LXC为Linux Container的简写.可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性.相当于C+ ...