南京大学 计算机系统基础(一)主讲:袁春风老师

基础好的读目录回顾一下即可
本课程是以csapp为教材进行讲解的

程序执行结果,不仅取决于算法、程序编写、编程语言的语法语义 ,而且取决于语言处理系统、操作系统、ISA(指令集体系结构)、微体系结构(MicroArchitecture,决定性的计算机结构)等各个层次

本课程主要内容

  • 使学生清楚理解:
    计算机是如何生成和运行可执行文件的!
  • 重点在高级语言以下各抽象层
    • C语言程序设计层

      • 数据的机器级表示、运算
      • 语句和过程调用的机器级表示
    • 指令集体系结构(ISA)和汇编层
      • 指令系统、机器代码、汇编语言
      • 微体系结构及硬件层
    • CPU的通用结构
      • 层次结构存储系统
      • 操作系统、编译和链接的部分内容

文章目录

  • C语言程序举例
    • 用“系统思维”分析问题
      • 字面量问题
      • 违例地址问题
      • 运算电路问题
      • 链接器问题
      • 堆破坏
      • 编译器优化差别
      • 系统环境差别
      • 返回值差别
      • 执行时间差别
      • 老版本gcc编译差别
      • 指令差别
  • 为什么要学习计算机系统基础
    • 计算机系统抽象层的转换
    • “计算机系统基础”内容提要
    • 为什么要学习“计算机系统基础”呢?
  • 冯诺伊曼结构主要思想
    • 冯·诺依曼的故事
    • 现代计算机的原型
    • 你认为冯·诺依曼结构是怎样的?
    • 冯·诺依曼结构的主要思想
  • 现代计算机结构模型及工作原理
    • 认识计算机中最基本的部件
    • 计算机是如何工作的呢?
      • 类似“存储程序”工作方式
      • 程序由指令组成(菜单由菜谱组成)
    • 指令和数据
    • 从机器语言到高级程序语言
    • 最早的程序开发过程
    • 用汇编语言开发程序
    • 进一步认识机器级语言
    • 指令所能描述的功能
    • 用高级语言开发程序
    • 一个典型程序的转换处理过程
    • Hello程序的数据流动过程
    • 不同层次语言之间的等价转换
    • 开发和运行程序需什么支撑?
  • 编译语言和计算机系统层次
    • 现代(传统)计算机系统的层次
    • 计算机系统的不同用户
    • 指令集体系结构(ISA)
  • 本课程的主要学习内容
    • 后PC时代计算机教学面临的挑战
    • 计算机系统抽象层的转换
    • “计算机系统基础”课程
    • “计算机系统基础”课程内容概要

C语言程序举例

用“系统思维”分析问题

字面量问题

ISO C90标准下,在32位系统上 以下C表达式的结果是什么?

  • -2147483648 < 2147483647
    false(与事实不符)!Why?
  • 以下关系表达式结果呢? int i = -2147483648; i < 2147483647
    true!Why?
  • -2147483647-1 < 2147483647,结果怎样?

理解该问题需要知道:
编译器如何处理字面量
高级语言中运算规则
高级语言与指令之间的对应
机器指令的执行过程
机器级数据的表示和运算

违例地址问题

运算电路问题

  • 若x和y为int型, 当x=65535时, y=x*x; y的值为多少? y=-131071。
    Why? 现实世界中,x2≥0,但在计算机世界并不一定成立。
  • 对于任何int型变量x和y,(x>y) == (-x<-y) 总成立吗?
    当x=-2147483648,y任意(除-2147483648外)时不成立

理解该问题需要知道:
机器级数据的表示
机器指令的执行
计算机内部的运算电路

链接器问题

堆破坏

编译器优化差别

系统环境差别

返回值差别

执行时间差别

老版本gcc编译差别

指令差别

为什么要学习计算机系统基础

程序执行结果

  • 不仅取决于
    算法、程序编写
  • 而且取决于
    语言处理系统、操作系统、ISA、微体系结构、计算机系统抽象层的转换

不同计算机课程处于不同层次
必须将各层次关联起来解决问题

计算机系统抽象层的转换

“计算机系统基础”内容提要

课程目标:使学生清楚理解计算机是如何生成 和运行可执行文件的!

重点在高级语言以下各抽象层

  • C语言程序设计层

    • 数据的机器级表示、运算
    • 语句和过程调用的机器级表示
  • 操作系统、编译和链接的部分内容
  • 指令集体系结构(ISA)和汇编层
    • 指令系统、机器代码、汇编语言
  • 微体系结构及硬件层
    • CPU的通用结构
    • 层次结构存储系统

为什么要学习“计算机系统基础”呢?

  • 为什么要学习“计算机系统基础”呢?

    • – 为了编程序时少出错
    • – 为了在程序出错时很快找到出错的地方
    • – 为了明白程序是怎样在计算机上执行的
    • – 为了强化“系统思维”
    • – 为了更好地理解计算机系统,从而编写出更好的程序
    • – 为后续课程的学习打下良好基础
    • – 为了编写出更快的程序
    • – 为了更好地认识计算机系统

冯诺伊曼结构主要思想

计算机系统基本组成与基本功能

第一台通用电子计算机的诞生

1946年,第1台通用电子计算机ENIAC诞生
-由电子真空管组成
-美国宾夕法尼亚大学研制
-用于解决复杂弹道计算问题-5000次加法/s
-平方、立方、sin、cos等
-用十进制表示信息并运算
-采用手动编程,通过设置开关和插拔电缆来实现
Electronic Numerical Integrator And Computer电子数字积分计算机

冯·诺依曼的故事

1944年,冯·诺伊曼参加原子弹的研制工作,涉及到极为困难的计算。

1944年夏的一天,诺伊曼巧遇美国弹道实验室的军方负责人戈尔斯坦,他正参与ENIAC的研制工作。

冯·诺依曼被戈尔斯坦介绍加入ENIAC研制组,1945年,他们在共同讨论的基础上,冯·诺伊曼以“关于EDVAC的报告草案”为题,起草了长达101页的总结报告,发表了全新的“存储程序通用电子计算机方案”。

一向专搞理论研究的普林斯顿高等研究院批准让冯·诺依曼建造计算机,其依据就是这份报告。

现代计算机的原型

1946年,普林斯顿高等研究院(the Institute for Advance Study at Princeton,IAS )开始设计“存储程序”计算机,被称为IAS计算 机(1951年才完成,并不是第一台存储程序计算机,1949年由英国剑 桥大学完成的EDSAC是第一台)。

– 在那个报告中提出的计算机结构被称为冯·诺依曼结构。

冯·诺依曼结构最重要的思想是“存储程序(Stored-program)” 工作方式

**任何要计算机完成的工作都要先被编写成程序,然后将程序和原始数据送入主存并启动执行。一旦程序被启动,计算机应能在不需操作人员干预下,自动完成逐条取出指令和执行指令的任务。 **

– 冯·诺依曼结构计算机也称为冯·诺依曼机器(Von Neumann Machine)。

– 几乎现代所有的通用计算机大都采用冯·诺依曼结构,因此,IAS计 算机是现代计算机的原型机。 冯·诺依曼结构的主要思想是什么呢?

你认为冯·诺依曼结构是怎样的?

  • 应该有个主存,用来存放程序和数据
  • 应该有一个自动逐条取出指令的部件
  • 还应该有具体执行指令 (即运算)的部件
  • 程序由指令构成
  • 指令描述如何对数据进行处理
  • 应该有将程序和原始数据输入计算机的部件
  • 应该有将运算结果输出计算机的部件

你还能想出更多吗?

冯.诺依曼结构计算机模型

早期,部件之间用分散方式相连
现在,部件之间大多用总线方式相连

冯·诺依曼结构的主要思想

  1. 计算机应由运算器、控制器、存储器、输入设备和输出设备
    五个基本部件组成。

  2. 各基本部件的功能是∶

    1. 存储器不仅能存放数据,而且也能存放指令,形式上两者没有区别,但计算机应能区分数据还是指令;
    2. 控制器应能自动取出指令来执行;
    3. 运算器应能进行加/减/乘/除四种基本算术运算,并且也
      能进行一些逻辑运算和附加运算;
    4. 操作人员可以通过输入设备、输出设备和主机进行通信。
  3. 内部以二进制表示指令和数据。每条指令由操作码和地址码
    两部分组成。操作码指出操作类型,地址码指出操作数的地址。由一串指令组成程序。

  4. 采用**“存储程序”**工作方式。

现代计算机结构模型及工作原理

你还记得冯.诺依曼计算机结构的特点吗?

认识计算机中最基本的部件

现代计算机结构模型

CPU:中央处理器;PC:程序计数器;MAR:存储器地址寄存器
ALU:算术逻辑部件;IR:指令寄存器;MDR:存储器数据寄存器
GPRs:通用寄存器组(由若干通用寄存器组成,早期就是累加器)

你能想到计算机相当于现实生活中的什么呢?
工厂、饭店?

计算机是如何工作的呢?

先想象一下妈妈是怎样做一桌你喜欢(指定)的菜的?
厨房-CPU,你妈-控制器,盘-GPRs,锅灶等-ALU ,架子-存储器

类似“存储程序”工作方式

  • 做菜前

    原材料(数据)和菜谱(指令)都按序放在厨房外的架子(存储器)上,每个架子有编号(存储单元地址)。

    菜谱上信息∶原料位置、做法、做好的菜放在哪里等
    例如,把10、11号架上的原料一起炒,并装入3号盘
    然后,我告诉妈妈从第5个架上(起始PC=5)指定菜谱开始做

  • 开始做菜
    第一步∶从5号架上取菜谱 (根据PC取指令)
    第二步:看菜谱 (指令译码)
    第三步:从架上或盘中取原材料 (取操作数)
    第四步:洗、切、炒等具体操作(指令执行)第五步:装盘或直接送桌 (回写结果)
    第六步:算出下一菜谱所在架子号6=5+1 (修改PC的值)
    继做下一道苹(执行下一条指合)

如果你知道你妈妈是如何做菜的,你就已经知道计算机是如何工作的!
你能告诉我计算机是如何工作的吗?“存储程序”工作方式!

程序由指令组成(菜单由菜谱组成)

  • 程序在执行前
    数据和指令事先存放在存储器中,每条指令和每个数据都有地址,指令按序存放,指令由OP、ADDR字段组成,程序起始地址置PC(原材料和菜谱都放在厨房外的架子上,每个架子有编号。妈妈从第5个架上指定菜谱开始做)
  • 开始执行程序
    第一步∶根据PC取指令(从5号架上取菜谱)
    第二步:指令译码(看菜谱)
    第三步:取操作数(从架上或盘中取原材料)
    第四步∶指令执行(洗、切、炒等具体操作)
    第五步∶回写结果(装盘或直接送桌)
    第六步:修改PC的值(算出下一菜谱所在架子号6=5+1)
    继续执行下一条指令(继续做下一道菜)

指令和数据

  • 程序启动前,指令和数据都存放在存储器中,形式上没有差别, 都是0/1序列
  • 采用”存储程序“工作方式: – 程序由指令组成,程序被启动后,计算机能自动取出一条一条 指令执行,在执行过程中无需人的干预。
  • 指令执行过程中,指令和数据被从存储器取到CPU,存放在CPU 内的寄存器中,指令在IR中,数据在GPR中。

指令中需给出的信息:
操作性质**(操作码)**
源操作数1 或/和 源操作数2 (立即数、寄存器编号、存储地址)
目的操作数地址 (寄存器编号、存储地址)
存储地址的描述与操作数的数据结构有关!

从机器语言到高级程序语言

最早的程序开发过程

• 用机器语言编写程序,并记录在纸带或卡片上

用汇编语言开发程序

若用符号表示跳转位置和变量位置,是否简化了问题?

  • 于是,汇编语言出现
    – 用助记符表示操作码
    – 用标号表示位置
    – 用助记符表示寄存器
  • 在第4条指令 前加指令时 不用改变 add、jxx和 sub指令中的 地址码

你认为用汇编语言编写的优点是:
不会因为增减指令而需要修改其他指令
不需记忆指令编码,编写方便
可读性比机器语言强

不过,这带来新的问题,是什么呢? 人容易了,可机器不认识这些指令了!
需将汇编语言转 换为机器语言! 用汇编程序转换

进一步认识机器级语言

  • 汇编语言(源)程序由汇编指令构成
  • 你能用一句话描述什么是汇编指令吗?
    – 用助记符和标号来表示的指令(与机器指令一一对应)
  • 指令又是什么呢?
    – 包含操作码和操作数或其地址码 (机器指令用二进制表示,汇编指令用符号表示)
    – 只能描述:取(或存一个数) 两个数加(或减、乘、除、与、或等) 根据运算结果判断是否转移执行
  • 想象用汇编语言编写复杂程序是怎样的情形? (例如,用汇编语言实现排序(sort)、矩阵相乘) – 需要描述的细节太多了!程序会很长很长!而且在不同 结构的机器上就不能运行!

机器语言和汇编 语言都是面向机 器结构的语言, 故它们统称为机器级语言

结论:用汇编语言比机器语言好,但是,还是很麻烦!

指令所能描述的功能

对于以下结构的机器,你能设计出几条指令吗?
Ld M#,R# (将存储单元内容装入寄存器)
St R#,M# (将寄存器内容装入存储单元)
Add R#,M# (类似的还有Sub,Mul等;操作数还可“R#,R#”等)
Jxx M# (若满足条件,则转移到另一处执行)

用高级语言开发程序

  • 随着技术的发展,出现了许多高级编程语言

    – 它们与具体机器结构无关 – 面向算法描述,比机器级语言描述能力强得多

    – 高级语言中一条语句对应几条、几十条甚至几百条指令

    – 有“面向过程”和“面向对象”的语言之分

    – 处理逻辑分为三种结构
    • 顺序结构、选择结构、循环结构

    – 有两种转换方式:“编译”和“解释”
    编译程序(Complier):将高级语言源程序转换为机器级目标程序,执行时只要启动目标程序即可
    解释程序(Interpreter ):将高级语言语句逐条翻译成机器指令并立即执行,不生成目标文件

一个典型程序的转换处理过程

Hello程序的数据流动过程

数据经常在各存储部件间传送。故现代计算机大多采用“缓存”技术!
所有过程都是在CPU执行指令所产生的控制信号的作用下进行的。

不同层次语言之间的等价转换

操作码 地址码 地址码 偏移量

开发和运行程序需什么支撑?

支撑程序开发和运行的环境由系统软件提供
最重要的系统软件是操作系统和语言处理系统
语言处理系统运行在操作系统之上,操作系统利用指令管理硬件

编译语言和计算机系统层次

早期计算机系统的层次

  • 最早的计算机用机器语言编程,机器语言称为第一代程序设计语言(First generation programming language ,1GL )
  • 后来用汇编语言编程,汇编语言 称为第二代程序设计语言( Second generation programming language ,2GL )

现代(传统)计算机系统的层次

现代计算机用高级语言编程
第三代程序设计语言(3GL)为过程式 语言,编码时需要描述实现过程,即“ 如何做”。
第四代程序设计语言(4GL) 为非过程 化语言,编码时只需说明“做什么”, 不需要描述具体的算法实现细节。

可以看出:语言的发展是一 个不断“抽象”的过程,因 而,相应的计算机系统也不断有新的层次出现

  • 语言处理系统包括:各种语言处理程序(如编译、汇编、 链接)、运行时系统(如库函数,调试、优化等功能)
  • 操作系统包括人机交互界面、 提供服务功能的内核例程

程序执行结果

  • 不仅取决于 算法、程序编写
  • 而且取决于 语言处理系统、操作系统、ISA、微体系结构

功能转换:上层是下层的抽象,下层是上层的实现 底层为上层提供支撑环境!

最高层抽象就是点点鼠标、拖拖图标、敲敲键盘,但这背后有多少层转化啊!

计算机系统的不同用户

ISA处于软件和硬件的交界面(接口)

ISA是对硬件的抽象

所有软件功能都建立在ISA之上

指令集体系结构(ISA)

ISA指Instruction Set Architecture,即指令集体系结构,有时简称为指令系统
ISA是一种规约(Specification ) ,它规定了如何使用硬件

  • 可执行的指令的集合,包括指令格式、操作种类以及每种操作对应的操作数的相应规定;
  • 指令可以接受的操作数的类型;
  • 操作数所能存放的寄存器组的结构,包括每个寄存器的名称、编号、长度和用途;
  • 操作数所能存放的存储空间的大小和编址方式;
  • 操作数在存储空间存放时按照大端还是小端方式存放;
  • 一指令获取操作数的方式,即寻址方式;
  • 指令执行过程的控制方式,包括程序计数器(PC)、条件码定义等。

ISA在**通用**计算机系统中是必不可少的一个抽象层,Why ?

  • 没有它,软件无法使用计算机硬件!
  • 没有它,一台计算机不能称为“通用计算机”

ISA和计算机组成(Organization,即MicroArchitecture)是何关系?

  • 不同ISA规定的指令集不同,如,IA-32 (8个寄存器) 、MIPS (32个寄存器) 、ARM等
    计算机组成必须能够实现ISA规定的功能,如提供GPR、标志、运算电路等
    同一种ISA可以有不同的计算机组成,如乘法指令可用ALU或乘法器实现

ISA是计算机组成的抽象

本课程的主要学习内容

后PC时代计算机教学面临的挑战

后PC时代的几个特征

  • 计算资源多样化,I/O设备无处不在,数据中心、PMD与PC等共存
  • 软件和硬件协同设计(硬件、OS和编译器之间的关联更加密切)
  • 对应用程序员的要求更高
    • 编写高效程序必需了解计算机底层结构
    • 必需掌握并行程序设计技术和工具
    • 应用问题更复杂,领域更广
      • 气象、生物、医药、地质、天文等领域的高性能计算
      • Google、百度等互联网应用领域海量“大数据“处理·物联网(移动设备、信息家电等)嵌入式开发
      • 银行、保险、证券等大型数据库系统开发和维护
      • 游戏、多媒体等实时处理软件开发,。。。…

“并行”成为重要主题、培养具有系统观的软/硬件贯通人才是关键!

大规模 分布式 多粒度并行

计算机系统抽象层的转换

  • 计算机学科主要 研究的是计算机 系统各个不同抽 象层的实现及其 相互转换的机制
  • 计算机学科培养 的应该主要是在 计算机系统或在 系统某些层次上 从事相关工作的 人才

所有计算机专业课程基本上是围绕其中一个或多个不同抽象层开展教学!
本课程为基础课程,试图通过讲解程序开发和执行来构建计算机系统总体框架

“计算机系统基础”课程

从程序员角度出发来认识计算机系统

  • 教学目标: 培养学生的系统能力,使其成为一个“高效”程序员,在程序调 试、性能提升、程序移植和健壮性等方面成为高手;建立完整的 计算机系统概念,为后续的OS、编译、体系结构等课程打下坚 实基础

  • 以 IA-32+Linux+C+gcc 为平台(开源项目平台) •

  • 与以下MOOC课程的想法类似 https://www.coursera.org/course/hwswinterface
    主要内容:描述程序执行的底层机制

  • 思路: 在程序与程序的执行机制之间建立关联,强化理解而不是记忆

“计算机系统基础”课程内容概要

三个主题:

  • 表示(Representation)

    • – 不同数据类型(包括带符号整数、无符号整数、浮点数、数组、结构 等)在寄存器或存储器中如何表示和存储?
    • – 指令如何表示和编码(译码)?
    • – 存储地址(指针)如何表示?如何生成复杂数据结构中数据元素的地 址?
  • 转换(Translation)
    • – 高级语言程序对应的机器级代码是怎样的?如何转换并链接生成可执 行文件?
  • 执行控制流(Control flow)
    • – 计算机能理解的“程序”是如何组织和控制的?
    • – 如何在计算机中组织多个程序的并发执行?
    • – 逻辑控制流中的异常事件及其处理 – I/O操作的执行控制流(用户态→内核态)

前导知识:C语言程序设计

袁春风老师:计算机系统基础(一) 第一章相关推荐

  1. 第一章计算机系统基础知识,计算机系统基础知识 第一章(未完待续)

    1.1计算机系统的组成 1.1.1计算机发展概述 1.大型机阶段 1946年美国研制的第一台计算机ENIAC被公认为大型机的鼻祖. 大型机(mainframe)的发展经历了一下几代: 第一代采用电子管 ...

  2. 计算机系统基础(第一章习题)

    习题 1.若一台计算机的字长为2个字节,则表明该机器( ). A.能处理的数值最大为2位十进制数. B.能处理的数值最多由2位二进制数组成. C.在CPU中能够作为一个整体加以处理的二进制代码为16位 ...

  3. 从硬盘上把数据传回到计算机称为什么,计算机基础知识 第一章 习题三

    计算机基础知识第一章习题三 一.填空题 1. 高级语言不能直接被计算机识别并执行,必须翻译成机器语言,翻译的方式有两种:一种是编译方式,另一种是方式. 2. 计算机中存储数据的最小单位是:存储容量的基 ...

  4. pc都是微型计算机判断,(计算机应用基础统考)第一章 计算机基础知识

    1.第一章计算机基础知识第一章计算机基础知识考试内容 l 计算机的发展过程.分类.应用范 围及特点:信息的基本概念 l 计算机系统的基本组成及各部件的 主要功能,数据存储的概念 l 数据在计算机中的表 ...

  5. 微型计算机基础 教案,第一章微型计算机基础知识新080902电子教案(153页)-原创力文档...

    第一章 微型计算机基础知识;第一章? 微型计算机基础知识;§1.1 计算机中数的表示方法;1.1.1 进位计数制及各计数制间的转换;二进制数的特点; 十进制--符合人们的习惯二进制--便于物理实现十六 ...

  6. 电大计算机基础光盘电脑安装,电大《计算机应用技术基础》第一章 计算机的硬件安装...

    <电大<计算机应用技术基础>第一章 计算机的硬件安装>由会员分享,可在线阅读,更多相关<电大<计算机应用技术基础>第一章 计算机的硬件安装(28页珍藏版)&g ...

  7. 大学计算机基础试题第一章,大学计算机基础试题第一章

    大学计算机基础试题第一章 第一章 一.必答题 [1]. 与信息技术中的感测.存储.通信等技术相比,计算技术主要用于扩展人的_C_______器官的功能. A. 感觉 B. 神经网络 C. 思维 D. ...

  8. excel工具栏隐藏了怎么办_Office2016基础教程第一章:认识Excel #excel #职场 #办公技巧...

    今日详讲Excel基础 教程 第一章:认识Excel 1. 版本兼容性 2. Excel2016的独特之处 3. 安装Excel2016 4. 启动Excel2016 5. 退出Excel2016 6 ...

  9. 计算机基础应用win7,计算机应用基础WIN7第一章.ppt

    计算机应用基础WIN7第一章.ppt (20页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.9 积分 计算机应用基础 Windows7+Office2 ...

最新文章

  1. 空洞卷积(Dilated Convolution):有之以为利,无之以为用
  2. react native利用webvView嵌入h5页面以及RN与webView的通信
  3. LeetCode Linked List Random Node(蓄水池采样算法)
  4. i2s传输中左右声道数据格式
  5. ConcurrentHashMap的源码分析-CounterCells初始化图解
  6. 谷歌浏览器bug调试快捷键_Bug压榨初学者指南:如何使用调试器和其他工具查找和修复Bug
  7. 从交换机分析网络风暴
  8. 华为p20有没有计算机,用华为P20不知道这三个功能就亏大了!第一个很少人知道!...
  9. CSDN 的 Markdown 编辑器语法
  10. 个人身份信息(PII)是什么?会被恶意使用吗?如何保护它?
  11. 基于 smart-config技术实现
  12. 前端预览pdf文件流
  13. wma转mp3怎么弄_wma格式怎么转换mp3
  14. Python学习(二)列表,for循环,切片,元组
  15. 精通CSS.DIV网页样式与布局(二)—— 段落
  16. Fiddler实现苹果手机APP抓包
  17. 华为云weblogic10.3.6打补丁
  18. Java------IO流之文件专属流
  19. 锂电池放空后充不进电_锂电池充不进去电怎么办(锂电池为什么小偷不要)
  20. 基于微信小程序的机房设备故障报修平台

热门文章

  1. android 位移传感器 坐标,位移传感器
  2. NVIDIA Jetson TX2 上手指南
  3. html设置背景图片高度,如何使用CSS设置背景图像的大小?
  4. FOC:在MCU上检验Clark和Park坐标变换是否正确
  5. 基于S3C2440的电子鹰眼监控系统设计
  6. 怎么找电脑服务器文档,怎么找到电脑的服务器地址
  7. 最佳平方逼近 matlab,最佳平方逼近的Matlab
  8. [学习笔记]数据与科学训练营之五:机器学习
  9. IterNet: Retinal Image Segmentation Utilizing Structural Redundancy in Vessel Networks
  10. 阿里云ECS服务器环境搭建(2) —— ubuntu 16.04 安装中文输入法(搜狗输入法)