为什么要学习 Linux

    程序员不断改变我们的世界,直到有一天程序有了意识,能够脱离母体而存在,学习linux的我们或许有。。。

    有人说:windows是漂亮的,Linux是智慧的、透明的。

    全球TOP500超级计算机排行榜中99%都是linux内核。

    任何手持智能终端设备就连电子表的底层都是Linux

    你或许会认为Windows更为易用,Linux操作起来很慢,Linux入门曲线陡峭,其实当我们学会一些命令之后,一个命令所完成的事,Windows中需要几次步骤才能完成。

    基于命令行,执行速度快,工作效率高

    Linux系统遵循GPL协议,属于开源软件,你能用任意姿势获取源代码,修改源码,学习源码,而且Linux有自己的开源社区,能在上面开拓视野,接触许多科学前沿的东西。

 

结构:

    计算机的组成

    虚拟机的原理

    CPU平台

    操作系统基础

    操作系统的分类


冯诺依曼体系结构

    

    冯·诺伊曼明确提出了计算机的体系架构,1951年第一台电子计算机EDVAC开始,计算机经历了多次的更新换代,不管是最原始的、还是最先进的计算机,使用的仍然是冯·诺依曼最初设计的计算机体系结构。因此冯·诺依曼被世界公认为“计算机之父”,他设计的计算机系统结构,称为“冯诺依曼体系结构”。


    结构及框架

wKioL1l6hLOD_iVzAABoakCLGik184.jpg-wh_50

运算器:用于完成各种算术运算、逻辑运算和数据传送等数据加工处理。

控制器:用于控制程序的执行,是计算机的大脑。运算器和控制器组成计算机的中央处理器(CPU)。控制器根据存放在存储器中的指令序列(程序)进行工作,并由一个程序计数器控制指令的执行。控制器控制计算器各部件的协调

存储器:用于临时存放程序和数据,运算器运算结果,保存的位置。例如:内存。程序和数据以二进制代码形式不加区别地存放在存储器中,存放位置由地址确定。

输入设备:用于将数据或程序输入到计算机中,例如:鼠标、键盘。

输出设备:将数据或程序的处理结果输出至指定设备,例如:显示器、打印机。

           

总线的组成

    数据总线DB(Data Bus)地址总线AB(Address Bus)控制总线CB(Control Bus),也统称为系统总线。

    DB 用于数据交换的总线

    AB 用来传送地址的总线,地址总线的位数决定了CPU可直接寻址的内存空间大小,一般说来,若地址总线为n位,则可寻址空间为2^n字节。

    CB 传送控制信号时序信号。有的是微处理器送往存储器和I/O接口电路,也有是其它部件反馈给CPU的,控制总线的传送方向由具体控制信号而定,(信息)一般是双向的,控制总线的位数要根据系统的实际控制需要而定。实际上控制总线的具体情况主要取决于CPU。

    前端总线(FSB)是将CPU连接到北桥芯片的总线,前端总线(FSB)频率(即总线频率)是直接影响CPU与内存直接数据交换速度。

    

缓存

    cpu 4GHZ 内存 1600/1800MHZ,(单位换算:1GHZ=1000MHZ)内存大约1.56GHZ,CPU的速度远远超过内存的速度,由短板理论最终的速度取决于内存的速度。

    缓存以CPU频率工作,价格高,所以很小。

    主要意义:

    时间局部性  当某个数据被访问过一次之后,过不了多久时间就会被再一次访问。缓存对此数据缓存

    空间局部性 CPU在某一时刻需要某个数据,那么很可能下一步就需要其附近的数据;缓存将对附近的资源缓存

    

硬盘

    固态硬盘

        在不同的分区的读取速度一致

    机械硬盘

    

wKiom1l6oGqiuuPtAALbFHnFwhg901.jpg-wh_50

盘片(disk):硬盘中承载数据存储的介质。两面读写

磁头(head):通过磁性原理读取磁性介质上数据的部件。

磁道(tracle):当磁盘旋转时,磁头若保持在一个位置上,则每个磁头都会在磁盘表面划出一个圆形轨迹,这些圆形轨迹就叫做磁道。

扇区(sector):磁盘上的每个磁道被等分为若干个弧段,这些弧段便是磁盘的扇区。硬盘的读写以扇区为基本单位

分区:由外向内按柱面划分,外道长:固定角速度,单位时间内划动的距离越长

    C在外圈,单位时间内,读取的数据越多

    D在较内圈,单位时间内,读取的数据越少

            

虚拟机的原理


虚拟机的框架:

wKioL1l-hUCRnQwzAAAF2nAL7IY463.png

    vmware程序:虚拟出多个虚拟的计算机(CPU+内存+硬盘)

     

虚拟CPU

    切割CPU时间片

    cpu将时间片切割,使各个程序从表面上看是同时进行的。在微观上:每几个毫秒思考一件事,时间用完如果进程仍在执行,就记录进程的状态,连续运行后面的进程。

内存虚拟:有限内存切割后,分配给不同程序使用

    线性地址空间:假设每个程序有4G内存可用,实际只有自己占据的大小

        

    wKiom1l-hVjisNQIAAC6y7srfLM802.png

    进程地址空间: 将内存上不连续的内存页在逻辑上映射为一段连续的空间

    

    进程工作

        将程序运行为一个进程

        发起syscall,保留现场

        内核完成工作后恢复现场

        

    程序的结构结构

    wKioL1l_WraTqqDDAACDKAytdWo728.png

I/O设备虚拟:模拟器实现:动态分配大小

    

操作系统的基础

    CPU: 晶体管 10-20nm 45nm工艺 门电路 逻辑运算/算术、逻辑运算,芯片、多个针脚,每个针脚有不同的功能、完成不同的运算。调用针脚即可完成运算,调用CPU针脚完成运算:机器语言

    CPU针脚的功能即为CPU的指令,CPU多个指令叫指令集

    指令的分类:普通指令特权指令

wKioL1l6pjTAal5NAAA8CNZe3RM834.png-wh_50

    普通指令:普通用户仅能在环3上运行,如果要用到环0的指令,就需要向内核申请,即为发起系统调用

    特权指令:仅管理员可运行的指令,用于管理功能。

    

CPU常见平台

    IBM(power)

    SUN (ultrasparc)--> Oracle

    惠普 (alpha)(安腾)dec-康白-惠普

    Intel (x86,X86_64) 向下兼容

    AMD (amd64)

    ARM Intel只设计,不生产。三星,高通生产

    Andorid (linux)

    IOS (UNIX)

    摩托摩拉 (手持 m68k,服务器 m68k nommu)

    苹果,IBM,摩托摩拉 (powerpc,早期的强悍的CPU)

    天河二号:大堆CPU拼凑而成


面向硬件写程序所用的语言

wKioL1l-hw2RO4xCAAATGZ3qX2I703.png

程序员写程序时,调用CPU针脚完成一些功能。

机器语言:二进制指令,用01代码调用CPU针脚,过于底层。

汇编语言:"不同的芯片生产商",提供一个接口,微码编程语言。简化程序员的工作量, add 可以转换为01代码 

高级语言:用C,C++所写的源程序,只需要在不同的CPU平台之上编译为汇编语言对应的目标代码再经过转换为对应平台可理解的二进制指令


低级和高级语言所写的程序的区别

    低级语言:汇编语言所写的操作系统,在系统移植时,较为困难。计算机容易理解的语言,运行起来的性能更好    

    高级语言:c,c++,所写的系统,忽略底层硬件的差异。计算机不易理解的语言,运行起来性能差,需要经过编译、汇编、链接等步骤才能运行。


为什么出现操作系统    

用汇编语言所写的程序,难于移植,用高级语言仅解决了跨平台移植的问题,

面临的诸多问题:

1、CPU只有一颗,某时刻,只能运行做一件事。早期的批处理、脱机批处理、.... 消耗巨大财力、物力,却只能用到不到1/4的CPU时钟周期。

2、简化写程序的人的负担,为了写程序更加高效。程序员在硬件上写程序,对硬件功能的调用和硬件的驱动,在硬件上写一个qq music程序,需要驱动声卡,调用声卡发声

3、写程序的内存分配。程序是加载至内存中,才能使用,内存中程序如何占用?如果分配不适当,内存覆盖可能发生。


操作系统的功能

    协调进程在CPU上工作,达到不浪费CPU时钟周期为目的。

    统一驱动硬件,管理硬件,将一个个硬件功能抽象为更少的系统调用,便于程序员调用、写程序更为简洁。

        硬件驱动:硬件工作起来

        进程管理:CPU时间片切割和CPU的计算能力分配给不同的程序

        内存管理:将有限的内存资源分配给多个同时运行的程序

        网络管理:与其他主机通过网络通信

        安全管理


写程序面向的对象和语言

    用抽象化的思维

    硬件:机器语言、汇编语言、高级语言,考虑CPU平台,内存分配,硬件驱动等诸多问题    

    系统调用: 高级语言,system call 将底层硬件功能抽象为syscall,保证syscall少,库也比较底层

    库调用: 高级语言,系统调用虽少,但还是比较底层,直接将Syscall封装为一个个具体的功能。

    用具象化的思维

    面向硬件:给你的是"麦种",要想吃馒头,经过的步骤: 翻地、播种、浇水、施肥、收割、磨面、做包子、蒸馒头。

    面向系统调用:给你的是面粉,

    面向库调用: 给你你的是馒头



wKiom1l-lXjSQYkmAAALU8mYNKM153.png

越高层,写程序越容易,选择更少样。

越低层,写程序越难,选择更多样。

注意:用高级语言、调用库,写出的程序为源码程序(源程序)


程序运行前的步骤

    源码程序--> 编译 --> 汇编 --> 二进制指令(能调用对应CPU平台的针脚,不同系统有不同的格式)


二进制指令如何运行

    由操作系统分配资源,让程序占据CPU时间片内存资源 

    指令:被操作系统调度至CPU上,二进制指令能调用CPU上的某个指令(针脚),完成某些普通功能

wKiom1l-lnHh9l0_AAAWQ8rjwdQ361.png


用户接口

    跟操作系统交互的程序,称之为"用户接口":指挥其他程序的运行

    windows: 桌面

    Linux: UI

        GUI:Graphic User Interface,程序:Gnome,XFCE,KDE

        CLI: Command Line Interface,程序: sh,csh,ksh,zsh,bash

          

在不同的系统之上写的程序(源语序)

    ABI Application Binary Interface:  源码制作成二进制的格式(可执行文件的格式),运行接口,应用二进制格式。终端用户面向的接口。

    API Application Program Interface:  写程序面向的对象,应用编程接口,程序员面对的接口

    ABI不能兼容:

        不同操作系统上的程序,制作成二进制后,不能兼容,(Windows EXE,MSI. Linux ELF)

    API不能兼容:

        写程序面向的对象不同,不同的操作系统提供的systemcall,libcall接口不同一个系统上写的程序,不能在另一个系统之上编译~~~ (正如,不同的CPU芯片厂商提供不同的微码编程接口一样)

    API兼容:    

        写程序面向的对象不同,但是提供的Systemcall,libcall接口能够兼容(底层针脚不同,但是经过操作系统抽象硬件功能为兼容的接口,所写的程序在源码级别兼容,这就是遵循'POSIX'规范一个系统上写的程序,能在另一个系统之上编译~~~,编译后只能在对应平台运行,不能跨平台运行,ABI不同

        

操作系统的定义:

    广义:windows系统,我们所指的是用户接口(windows桌面、Linux bash)和内核

    狭义:内核


操作系统的分类:

    Solaris (sun) Ultrasparc

    Windows  (bill gates) x86

    AIX (IBM) power

    HP-UX (HP) alpha

    Unix (ken) m68k

    Linux (linus) 80386,....

    IOS (jobs)