• Linux系统运维与架构设计-浅谈计算机系统


    Linux系统运维与架构设计-浅谈计算机系统

    1.1 什么是计算机

    计算机是一种用于高速计算的电子机器,可以进行数值运算、逻辑判断,还有存储记忆功能,
    能够接收和存储信息,并按照存储在其内部的程序对海量数据进行自动、高速的处理,然后把处理的结果输出的现代化智能电子设备。日常生活中常见的台式机、笔记本、手机等等都属于计算机。

    1.2 计算机发展历史

    计算机从1945年发展至今经历了四个阶段,分别是电子管计算机、晶体管计算机、集成电路计算机和超大规模集成电路计算机。

    • 电子管计算机(1945年-1957年)
      第二次世界大战是电子管计算机产生的催化剂,而最著名的电子管计算机是来自美国的埃尼阿克(ENIAC),这一时期的计算机有如下特点:

      • 集成度小,占用空间大
      • 功耗高,运行速度慢
      • 操作复杂,更换程序需要接线
    • 晶体管计算机(1957年-1964年)
      1948年,贝尔实验室的三个科学家发明了晶体管,相比电子管而言,晶体管有着更小的体积,更低的功耗以及更高的运算效率。而全世界第一台晶体管计算机TX-0诞生于麻省理工大学的MIT林肯实验室,而当时性能最高的计算机是PDP-1,它具备4K的内存,每秒可以执行20W条指令,同时配备了512*512的显示器,晶体管相对于电子管计算机而言:

      • 集成度相对较高,占用空间相对较小
      • 功耗相对较低,运行速度较快
      • 操作相对简单,交互更加方便
    • 集成电路计算机(1964年-1980年)
      集成电路计算机出现的背景是德州仪器的工程师发明了集成电路(IC),集成电路计算机相对于晶体管计算机而言:

      • 计算机变得更小
      • 功耗相对较低,
      • 运行速度较快
      • 具备进入千家万户的条件
        在集成电路计算机阶段,IBM有两款畅销的计算机 IBM 7094和IBM 1401 ,但是这两款计算机主打的功能不同,并且相互无法兼容,而且企业购买IBM 7094和IBM1401后也不愿意投入两组人力开发,在此背景下IBM推出了兼容的产品System/360,也就是操作系统的雏形,它的出现使得不同的电子元器件,不同电路的计算机都能在同一个操作系统下运行。
    • 超大规模集成电路计算机(1980年-今)
      CPU就是超大规模集成电路的典型产品,一个芯片可以集成上百万的晶体管。
      而且超大规模集成电路计算机速度更快,体积更小,价格更低,更能被大众接受,同时在此阶段计算机用途也变得丰富起来,可以用于文本处理,表格处理以及高交互的游戏和应用。
      而乔布斯在这个阶段推出了Apple,Apple二代。

    随着计算机的发展,未来会出现生物计算机和量子计算机。

    生物计算机是以蛋白质分支作为主要原材料,和人体结合起来进行相关的运算。而且生物计算机体积小,不易损坏,提供生物级别的自动修复以及不受信号干扰和无热损耗。

    量子计算机是遵循量子力学的物理计算机,目前量子计算机已经有相关的研究成果

    2013年5月,谷歌和NASA发布了D-Wave Tow
    2017年5月,中国科学院宣布制造出光量子计算机。
    2019年1月,IBM展示了世界首款商业化量子计算机

    而且目前国内的阿里和腾讯在量子计算机领域进行相关的研究。

    1.3 计算机的分类

    计算机可以按照不同的用途分为超级计算机,大型机,小型机,个人计算机。

    • 超级计算机
      超级计算机是功能最强,运算速度最快,存储容量最大的计算机,主要用于国家高科技领域尖端技术研究,我们使用每秒一万亿浮点数计算(1TFlop/s)指标来衡量超级计算机的性能。
      如果想要了解超级计算机的排名,可以访问网站 https://www.top500.org/。
      目前(2019/10/18)排名第一的超级计算机配置
      IBM

    • 大型计算机
      IBM z15™
      大型计算机又称为大型机、大型主机、主机等等,大型计算机具有高性能。可处理大量数据与复杂运算,应用场景通常是银行、证券等金融机构。在大型机市场领域,IBM占据着很大的份额。
      由于大型机造价高昂,不够灵活,伸缩性弱,目前很多企业替换成小型机。
      阿里巴巴在2008年发起去IOE行动,I就是IBM大型机,O就是商业数据库Oracle,E就是EMC存储,IOE代表了高成本,高维护费用的存储系统。去IOE就是将大型机换成了普通的服务器,将Oracle替换成了分布式的MySQL,去IOE行动直接驱动了阿里云的诞生。

    • 小型机
      服务器也被称为小型机,普通服务器,相对于大型机而言,不要特殊的空调场所,同时也具备不错的算力。常见的服务器厂商包括戴尔,联想,IBM。
      普通服务器已经替代了传统的大型机,成为大规模企业计算机的中枢纽,比如国内的阿里云、腾讯云、华为云都是基于服务器构建的。

    • 工作站
      工作站是高端的通用微型计算机,可以提供比个人计算机更强大的性能,类似于普通台式电脑,体积大,性能强劲,例如Mac Pro。

    • 微型计算机
      微型计算机又称为个人计算机,是最普通的一类计算机,可以分为台式机、笔记本电脑、一体机,微型计算机是成本最低的,但是从构造本质来讲,个人计算机与超级计算机、大型机、小型机、工作站没有区别。

    平常开发人员通常接触的比较多的是微型计算机,例如笔记本、台式机,而运维人员通常接触的是服务器。

    1.4 计算机的计算单位

    1.4.1 容量单位

    在购买电脑时,通常会选择高配置的内存、硬盘。例如最新款(2019)15寸的MacBookPro已经可以选配32G内存和4T的固态硬盘,而这里的32G和4T就是常用的容量单位。

    在物理层面,我们使用高低电平来记录信息,通常使用高电平表示1,低电平表示0,因此在计算机底层只能认识0,1两种状态。而0,1能够表示的内容太少,迫切需要更大的容量表示方法,因此诞生了字节(Byte),千字节(KB),兆字节(MB),吉字节(GB),太字节(TB),拍字节(PB),艾字节(EB)。

    1YB=1024ZB
    1ZB=1024EB
    1EB=1024PB
    1PB=1024TB
    1TB=1024GB
    1GB=1024MB
    1MB=1024KB
    1KB=1024B
    1Byte=8bit
    • 位(bit)是最小的计算机容量单位,通常用于门电路,只能存储0或者1
    • 字节(Byte)、千字节(KB)、兆字节(MB)表示网络传输,文件大小,是最基本的容量计量单位。
    • 吉字节(GB)通常用于表示计算机内存、磁盘的容量单位
    • 太字节(TB),拍字节(PB)通常是用于表示云盘、移动硬盘的容量单位
    • 艾字节(EB)通常是用于表示数据中心的容量单位

    现在通常笔记本的内存通常是8G,16G,32G,64G等等,而运行在笔记本之上的操作系统普遍都是64位的,因为32位系统只能使用4G内存,下面是4G的内存换算

    4G=2^2 * 2^10 * 2^10 * 2^10 =4*1024*1024*1024=2^32

    在购买内存或者买移动硬盘时,通常使用的存储单位就是GB或者是TB,
    但是在买4T的移动硬盘时,实际的可用容量却只有3T多,因为计算机的存储单位是以2的10次方(即1024)换算,而硬盘厂商们是以1000为换算单位。

    4T的硬盘换算成位如下所示

    4T=4*1024GB*1024MB*1024KB*1024B*8bit

    而硬盘厂商的实际容量

    4T=1000*1000*1000*1000*8

    因此实际的可用容量是

    4*1000*1000*1000*1000/1024/1024/1024/10243.63T

    而在一些互联网巨头(例如国内的BAT,国外的亚马逊、苹果、微软、谷歌,脸书)公司中,可能使用到比TB更大的海量数据,也就是PB或者EB,它们的换算单位如下所示。

    1PB=1024TB
    1EB=1024PB

    1.4.2 速度单位

    • 网络速度
      网络常用的单位是Mbps
      而网络带宽提供商(例如长城宽带)声称的百兆带宽实际上是100Mbit/s,但是100M光纤测试的峰值速度只会有12.5MB/s,它们之间的换算是100Mbit/s=(100/8)MB/s=12.5MB/s。

    • CPU速度
      CPU的速度一般是由CPU的时钟频率所体现的,而时钟频率的单位是赫兹(Hz),目前主流的CPU时钟频率一般都在2GHz以上,而赫兹(Hz)其实就是秒分之一,也就是每秒钟的周期性变动重复次数的计量。
      GHz即十亿赫兹(10^9Hz),2GHz就是二十亿赫兹,也就是说2GHz的CPU每秒可以变化20亿次。

    1Khz=1000hz
    1Mhz=1000khz
    1Ghz=1000Mhz

    1.5 计算机的体系结构

    1.5.1 冯诺依曼体系结构

    冯诺依曼体系就是将程序指令和数据一起存储的计算机设计概念结构。
    早期的计算机仅能运行固定用途的程序,如果想要运行别的程序,必须要更改计算机结构、重新设计电路。而冯洛伊曼是把程序存储起来,并设计通用的电路。存储程序指令,设计通用电路。

    冯诺依曼体系结构
    冯诺依曼体系结构

    • 必须有存储器,存储运行的程序和数据,长期记忆程序、数据、中间结果和最终结果的运算能力
    • 必须要有控制器,控制程序的流程以及数据的流转
    • 必须要有运算器,负责完成数据的算数、逻辑运算
    • 必须要有输入设备,负责完成程序指令和数据的输入
    • 必须要要输出设备,负责完成程序的处理结果输出

    现代计算机都是属于冯诺依曼机。

    1.5.2 现代计算机的体系结构

    现代计算机结构由冯诺依曼结构基础之上进行修改,主要是解决CPU和存储器速度差异的问题:即存储器、运算器和控制器集中在一块芯片上。

     现代计算机的体系结构
    现代计算机的体系结构

    1.6 浅谈计算机系统

    计算机系统组成
    计算机系统组成

    1.6.1 计算机系统概述

    计算机系统由硬件(Hardware)系统和软件(Software)系统两大部分组成。
    软件是运行在硬件之上,而硬件的好坏会直接影响软件运行的性能。
    通过软硬件的共同协作就可以完成日常常见的任务,例如听歌、看电影、购物、聊天等等。

    1.6.2 计算机硬件系统

    计算机硬件系统主要由主机和外部设备组成。
    主机主要是包含中央处理器和内存储器。
    中央处理器主要由运算器和控制器组成。
    而内存储器分为RAM和ROM,其中RAM(Random Access Memory)表示随机存储内存,这种存储器在断电时将会丢失其存储的内容。而ROM(Read-Only Memory)表示只读内存,是一种只能读出事先存储数据的固态半导体存储器。

    外部设备主要包含外部存储器、输入设备、输出设备组成。常见的外存储器包含移动硬盘U盘等等。而常见的输入设备包含鼠标键盘等等,常见的输出设备包含声卡、显卡等等。

    每个计算机组件的IO性能也各不相同,核心组件(CPU,内存,磁盘)都遵循容量越大,IO性能越差,在后期程序优化时,通常需要考虑时间和空间的问题

    计算机各组件IO性能汇总
    计算机各组件IO性能汇总

    1.6.3 计算机软件系统

    软件的出现实现了人和计算机更好的交互,它是由开发人员采用某种编程语言(C/C++/Java等等)编写的一系列指令以及不同业务场景产生的数据组成。

    通常将软件分为系统软件和应用软件

    • 系统软件
      驱动程序、操作系统、语言处理程序等都是属于系统软件。
      驱动程序是硬件厂商使用编程语言(C/C++)编写的程序,在使用硬件(例如打印机、显卡等等)前必须安装对应的驱动程序。
      操作系统是负责通过驱动程序管理硬件资源,同时给应用软件提供运行平台,目前主流的操作系统有Windows,Linux,macOS,Android,iOS。
      语言处理程序是用于将编程语言编写的源程序编译或者解释成对应平台的机器语言。

    • 应用软件
      微信、支付宝、淘宝、Office都是属于应用软件,它们都是运行在操作系统之上的。
      运行在不同操作系统之上的软件交互方式也不一样,Linux上的软件通常是使用字符界面的交互方式,运行在Windows,macOS上的软件通常是以鼠标、键盘操作的交互方式,运行在Android,iOS上的软件通常是以手势触控、语音等交互方式。

    1.7 开发者必备硬件配置

    开发者在购买笔记本或者台式机时,通常需要关注CPU,内存、磁盘以及显卡的相关配置。
    和普通用户不同,由于开发时需要安装许许多多相关的应用程序和配置各个集成开发环境,因此推荐购买高配置的电脑,如果你想购买MacBookPro,可以参考如下配置。

    组件名称 配置
    CPU i9 2.3Hz
    内存 32G
    磁盘 512SSD
    显卡 Radeon pro Vega 20

    MacBookPro 2019配置
    macOS

    如果你想购买运行Windows的笔记本,参考如下配置。
    Alienware 17R5
    如果是想要从事软件开发,电脑最低配置不要低于Intel i7 CPU + 内存 16G+ 固态硬盘 256G,出色的硬件能够提高开发效率。

    1.8 Java开发者常用软件

    由于本人是Java出身,这里罗列出Windows和macOS平台在做Java开发时常用到的一些应用软件。

    • Windows/macOS应用篇

      • 微信/企业微信/QQ/ 钉钉/阿里旺旺
      • 百度网盘
      • 迅雷下载
      • WPS/Office
      • 有道词典
      • 网易邮箱大师
      • QQ音乐/网易云音乐
    • macOS篇

      • Dash 帮助文档
      • iTerm 终端
      • IINA 视频播放
      • Screen Flow 录屏
      • Parallels Desktop 虚拟机
      • iStat Menus 系统资源监控
      • Fantanstical 日历
      • CleanMyMac X
    • 开发工具篇

      • JDK
      • Visual Studio Code
      • IntelliJ IDEA
      • Git/Github /Gitlab
      • Maven/Gradle
      • Navicat/DataGrip
      • Chrome/Firefox/Safari
      • SecureCRT/Xshell
      • Xmind Zen
      • 亿图图示
      • PowerDesigner
      • 印象笔记/剪藏
      • Typora/小书匠

    1.9 计算机的字符与编码集

    1.9.1 字符集编码

    在计算机底层(内存、硬盘)都是使用01001二进制的方式存储数据,而字符编码集是描述了计算机数据(例如字符数据)和底层二进制数据的对应关系,例如在ASC||码中字符a对应的十进制整数是97,字符A对应的十进制整数是65。

    1.9.2 字符集编码的历史

    • ASC||码
      由于计算机最早是诞生在英美,因此最早的字符集是ASC||,用于表示日常开发中常用的大小写字母以及常用的符号,使用7bits表示,包含95个可打印字符课33各个不可打印字符(包括控制字符),95+33=128,即2的7次方。

    • 可扩展的ASC||码
      随着计算机的发展以及逐渐普及,ASC||码在很多应用或者国家中的符号无法表示,例如数学符号"≠,≥,≈,π",因此对ASC||进行扩充,由原来的7bit扩充到8bits,因此可以表示256个字符。扩展的运算符增加了数学运算符、带音标的欧洲字符以及其他常用符、表格符等等。

    • Unicode
      随着计算机的进一步发展。越来越多的国家开始使用使用计算,而对于欧洲、中亚、拉丁美洲国家的语言多样性,由于语言体系不一样,不以有限字符组合的语言,而中国、韩国、日本的语言最为复杂。

    Unicode定义了世界通用的符号集,可以表示世界上所有的国家、所有语言的文字、符号,使用UTF-8,UTF-16,UTF-32实现了编码。

    UFT-8:一种变长的编码方案,使用 1~6 个字节来存储;
    UFT-32:一种固定长度的编码方案,不管字符编号大小,始终使用 4 个字节来存储;
    UTF-16:介于 UTF-8 和 UTF-32 之间,使用 2 个或者 4 个字节来存储,长度既固定又可变。

    1.9.3 中文编码集

    1980年国内发布了中文编码集 GB2312,一共收录了7445个字符,包含6763个汉字和682个其他符号,但是GB2312不符合国际标准,后来在1995年推出了GBK编码,向下兼容GB2312,向上支持国际ISO标准,GBK收录了21003个汉字,支持全部中日韩汉字。

    但是GBK,GB2312都只是本地化的编码集,如果中国人使用GBK或者GB2312开发了一个网站程序,被国外的用户访问了,但是国外的用户不支持GBK或者GB2312,那么看到的网站内容就是乱码。

    在国内,Windows系统的默认编码是GBK编码,而日常开发中最常使用的是UTF-8字符集。

    1.10 计算机底层为什么只能识别二进制

    我们目前主要使用的计算机都是大规模集成电路,是采用大规模和超大规模的集成电路作为逻辑元件的。集成电路按其功能、结构的不同,可以分为模拟集成电路、数字集成电路和数/模混合集成电路三大类。而我们的计算机主要是采用数字集成电路搭建的。逻辑门是数字逻辑电路的基本单元。常见的逻辑门包括“与”门,“或”门,“非”门,“异或”等等。通过逻辑门可以组合使用实现更为复杂的逻辑运算和数值运算。逻辑门可以通过控制高、低电平,从而实现逻辑运算。电源电压大小的波动对其没有影响,温度和工艺偏差对其工作的可靠性影响也比模拟电路小得多,所以相对稳定。因为数字计算机是由逻辑门组成,而逻辑电路最基础的状态就是两个——开和关。所以,数字电路是以二进制逻辑代数为数学基础。二进制的基本运算规则简单,运算操作方便,这样一来有利于简化计算机内部结构,提高运算速度。但是在日常开发中,通常都会使用八进制和十六进制,因为八进制和十六进制相对于二进制表示数据更加简洁,而且一个八进制表示三个二进制,一个十六进制表示四个二进制。例如1024使用二进制表示为0b100 0000 0000,使用八进制表示为02000,使用十六进制表示为0x400。

    1.11 计算机常用进制及其转换

    1.11.1 进制概述

    进制的定义:进制是一种计数方式,也称为进位计数法或者位值计数法,使用有限数字符号表示无限的数值,使用的数字符号的数目称为这种进位制的基数或者底数,例如十进制就是由0-9十个数字组成。在计算机内存中,都是以二进制的补码形式来存储数据的,生活中以十进制方式计算的数据居多,例如账户余额,开发人员的薪水等等。计算的内存地址、MAC地址等等通常都是使用十六进制表示的,Linux系统的权限系统采用八进制的数据表示的。相同进制类型数据进行运算时会遵守加法:逢R进1;减法:借1当R,其中R就表示进制。

    计算机常用进制的组成、示例和使用场景

    进制名称 组成 数值示例 应用场景
    二进制 0,1 1010 计算机底层数据存储
    八进制 0-7之间的8个整数 010 linux权限系统
    十进制 0-9之间的10个整数 12 整数
    十六进制 0-9,a-f之间的10个整数加上6个字母 12f 数据的内存地

    1.11.2 十进制转换二进制、八进制、十六进制

    十进制转换二进制、八进制、十六进制可以采用短除法,即待转换的十进制数除以指定的进制(例如2,8,16),直到商数为0,求余数。

    十进制101转换为二进制的计算过程

    重复除以2 商数 余数
    101/2 50
    50/2 25
    25/2 12
    12/2 6
    6/2 3
    3/2 1
    1/2 0

    然后将余数的结果从下到上串联起来的结果:1100101,即十进制的101转换为二进制的结果为1100101

    十进制的237转换为二进制

    重复除以2 商数 余数
    237/2 118
    118/2 59
    59/2 29
    29/2 14
    14/2 7
    7/2 3
    3/2 1
    1/2 0

    然后将余数的结果从下到上串联起来的结果:11101101,即十进制的237转换为二进制的结果为11101101。

    1.11.3 二进制、八进制、十六进制转十进制

    首先明确不同进制的值是如何计算的,这里以十进制和二进制为例子,阐述它们的计算过程。

    十进制整数1024

    1024=1*10^3+2*10^1+4*10^0=1000+20+4=1024

    二进制整数 10000000000

    10000000000 =1*2^10=1024

    二进制、八进制、十六进制整数转十进制整数是使用按权展开法计算的,这里以二进制数据01100101为例子。从右往左开始数,如果二进制位为1,则依次用1*2^n,n从0开始。

    二进制整数01100101 转换为十进制整数的计算过程

    01100101=126+1*25+1*22+1*20=64+32+4+1=101

    八进制整数0127转换为十进制整数的计算过程

    0127=1*8^2+2*8^1+7=87

    十六进制整数0x12f转换为十进制整数的计算过程

    0x12f=1*16^2+2*16^1+f*16^0=256+32+15=303

    1.11.4 二进制转八进制、十六进制

    二进制转八进制是按照从右往左,每3位二进制对应1位八进制,因为2的3次方等于8

    二进制整数11001100转八进制计算过程

    11 001 100 =0314

    二进制转十六进制是按照从右往左,每4位二进制对应1位十六进制,因为2的4次方等于16。

    二进制整数1100 1110转十六进制计算过程

    1100 1110 =0xce

    1.11.5 八进制、十六进制转二进制

    八进制转二进制是按照从右往左,每1位八进制对应3位二进制。

    八进制整数0127转二进制整数计算过程

    0127=001 010 111

    十六进制转二进制是按照从右往左,每1位十六进制对应4位二进制。

    十六进制整数0x12f转换为二进制整数计算过程

    0x12f=0001 0010 1111
  • 相关阅读:
    topcoder SRM 592 DIV2 LittleElephantAndBooks
    codeforces round #201 Div2 A. Difference Row
    Codeforces Round #199 (Div. 2) A Xenia and Divisors
    objective-c "performSelector may cause a leak because its selector is unknown".
    ccrendertexture to uiimage
    TopCoder SRM 588 DIV2 KeyDungeonDiv2
    ios clang: error: linker command failed with exit code 1 (use -v to see invocation)解决方法
    c++ for_each()与仿函数
    c++ map删除元素
    c++ map和mutimaps 插入值
  • 原文地址:https://www.cnblogs.com/ittimeline/p/12973228.html
Copyright © 2020-2023  润新知