从0开始-Linux学习笔记(一)

刘小泽写于18.6.24-7.1 一个星期入门linux
我相信这是比之前写的 “测序的世界” 更浩大的工程,但值得写出来!

计算机体系结构:

  • 相信你对计算机的大体构造有所了解了,电路板、电线还有一些硬件,这是必需品

  • 数据格式二进制 :计算机是个电子设备,它的数字来源在于控制线路通电与否;采用二进制相对于十进制更精确,能够方便控制电路板上的电流,有电代表数字1,无电代表数字0;想想,如果采用十进制,怎样精确控制电流的强弱来表示0-9呢?那会很麻烦!

  • CPU包括运算器和控制器 【相当于工厂的工人和总监】

    1. 运算器-- 工人(装货):通常是加法器、逻辑运算器

      加法器:加减乘除运算都使用加法器完成; 加法器使用加数与被加数(这些数据都在存储器中获取);【一般来讲,每个加法器只能进行一位加法运算,例如3位数的加法至少有3个加法器。 那么如果要计算32位的加法,就会有32个加数和32个被加数; 他们各需要32根线来进行运算,这势必很臃肿!那么如何解决?】

      ~ 这里引入了线路复用 ,可以同时传输指令、加数、被加数,很高效。但有两个问题

      Q1. 如何识别指令和数据呢?A1. 靠的就是CPU上的控制位,数值1为指令,0为数据。

      Q2. 如果刚传进来加数,想再传被加数,那么电路板上的电压就会调整为被加数的,之前的加数如过不存放起来,就消失了,怎么办?A2. 只需将前一个数据存放在寄存器

    2. 控制器-- 总监(调配):协调运算器到存储器哪个存储单元读取数据,另外运算完还要靠它去找存储器中还有什么空闲位置存放数据

  • 存储器RAM:【相当于工厂的仓库,有进有出】就是内存,每一个存储单元在全局上有唯一的地址;

    程序是由指定+数据构成的,而指令和数据都存储在存储器中,控制器要在存储器中获取控制指令,靠一根电线:指令/控制总线;【出厂的时候内存条中什么也没有,那么我们需要将执行的程序放到存储器中去,需要一个外围设备,辅助用户先存储一些指令和数据】

    缺点:断电丢失数据。所以需要一个外置设备保存数据或者用显示器显示出来

  • I/O设备 : 外围/辅助设备(键盘、鼠标、硬盘、显示器、网卡)中断interrupt:硬件通知机制。比如敲一下键盘,电信号会传输到CPU,告诉CPU停下手头的工作,过来看看发生了什么。所以任何的硬件发生了改动,哪怕很小就像敲一下键盘,都会产生一次interrupt。因此,中断越多,CPU的效率越低~【但是,当一次中断发生时,CPU怎么知道是键盘还是鼠标发生的改变呢?】【CPU的针脚和中断控制器相连~控制器上有多根线,每根线表示一个设备。但是如果外部设备非常多时怎么办?比如一个服务器连了500块硬盘,那么是不是需要500根线呢?并不科学!控制器的一根线上可以同时标示多个不同设备,也有点线路复用的意思】

  • 其他一些概念:

    北桥:直接连CPU,高速总线控制器,快速实现数据交换。

    南桥:离CPU远,低速,连接外围设备。所有外围设备通过南桥汇总后,由同一根线连接到北桥,由北桥再转给CPU【我们现在打开的网页都是存储在web服务器上的文件,相信你一定遇到过打开网页很卡,长时间加载不出来的情况~有没有想过是为什么?】
    原因不难理解:我们日常上网的流程就是:网页文件内容存储在web服务器硬盘,访问时需要先通过南桥再汇总到北桥,再交由CPU处理给网卡,发给各个用户。假如一个界面有2M,同时100万人访问,南桥连接的硬盘是支撑不了的,就会卡顿,严重会报废;那么你可能会想:为什么刷淘宝这么流畅?一个原因可能是,你的手机争抢网速比较给力,把阿里web服务器分配的有限的名额抢到手就能访问;另一个原因就是:为了避免高峰时段用户访问过多,南桥效率低下的问题,服务商会使用固态硬盘和北桥直接连接。当然,如果使用的是机械硬盘,南桥北桥差别不大,因为都很慢!】

    主频:前面说到,数据的输入是利用电信号的识别,也就是扳开关。有电为1,没电为0。扳一次开关为1Hz,那么我们平时所说的CPU主频2.9GHz,意思就是一秒能扳2.9 x 109 次,也就能有这么多次的数据变换

    CPU与内存主频关系:

    CPU主频(以GHz为单位)要高于内存(以MHz为单位),也就是说,比如CPU一次可以处理十个数据,但内存一次就能提供一个数据。那么CPU的强大会因为内存被拖慢。但是呢,目前升级CPU容易,升级内存主频成本会相当高。

    其实人生就是在不断的妥协、权衡和放弃当中,来追求最大化的幸福,计算机亦如此

    利用 缓存 解决这个问题,它就是一个折中。你可能听过一级、二级、三级缓存;级别越小,距离CPU距离越近,速度就越快。缓存原则--> 程序局部性原理:时间局部性:刚访问过的再次访问会快空间局部性:距离访问过的数据存储位置近的访问快

    低级 vs 高级语言:低级语言:微码(汇编语言,人能识别但机器不能,因为很低层所以难学)-->编译器(机器能理解,转换为机器语言)--> 机器语言(0,1代码;二进制)

    高级语言(汇编语言的上一级;兼具人类思考习惯和机器识别特性):要先转换为汇编再转换为对应芯片上的机器语言,需要额外机制(API - application program interface。不同CPU用汇编语言写的有相同功能的程序,使用API虚拟相同的执行环境)来满足不同机器上运行同一个程序。

    多任务处理:

    1. 交叉进行;

    2. 切分CPU与内存

    CPU:按照时间顺序划分为多个time slice( 比如两个任务,第一个5ms第二个5ms,然后反复交替)内存:按照任务数分段机制(第一段和第二段,有着相对的地址); 对于32位系统,最多使用232 = 4G物理内存;64位系统,264 基本无上限

    1. 如何指定哪个任务该做什么呢?指挥官就是——操作系统。负责一个程序的启动、终止和回收,程序的切换等工作。【运行的程序称为“进程”】

    内核: Kernel

    通过 System call 系统调用来实现统一接口。操作系统(Windows, Mac, Linux)就是种内核。【系统调用处于底层,相当于买馒头给了你一袋子小麦,利用起来比较麻烦,需要磨面、发面等,但是能做的事情很多,不止能做馒头,还能做包子面条】功能:

    1. 进程管理

    2. 内存管理

    3. 提供文件系统

    4. 提供网络功能

    5. 提供硬件驱动

    6. 提供安全机制

    库: API

    任何程序执行都需要一个执行入口。库也是一堆程序集合,他是可执行程序,但是它没有执行入口,因此不能直接执行,只能等其他程序调用时才执行,执行的时候又可以提供一个统一的调用机制(call)。有了操作系统(内核)以后任何程序都不能直接和硬件打交道,必须要通过操作系统(内核)来进行协调。但由于系统调用过于底层,就将其再次封装起来,使其功能更加强大(直接给你馒头,不需要自己将小麦加工成面粉),这种更高级的接口就是库(API,application program interface)。所以程序员写程序直接通过库来写就行,调用其功能来开发程序(没必要“造轮子”)。利用不同内核的库编的程序,由于库的内部细节不同,一般不能跨平台运行,但如果调用接口相同,就能运行。

    • windows下dll(Dynamic Link Library)动态链接库

    • linux下.so(Shared Object)共享对象

从0开始-Linux学习笔记(一)_第1张图片
1.png

要跑起来一个程序,只需要提供三个东西:内核、程序依赖的库、shell所以说,操作系统并不复杂,这三样最简单的只需要2/3M就够了【补充一下:应用程序放在硬盘上叫程序,但启动起来叫进程process】要做一个web服务器,你只需要提供程序和它依赖的库就能行那么你会想,为什么日常装的操作系统这么大,十几个G?有各种文件,作为对这个主线的补充;为了提供图形界面,会装很多图片

开机启动的模式:

从0开始-Linux学习笔记(一)_第2张图片
2.png

启动程序的方式:
1. 随开机一起启动,称为“后台服务”
2. 按需求启动,手动启动,称为“交互式程序”
shell:人机交互接口【下面会有更详细介绍】用户与系统(内核)进行交互分为:
1. GUI( graphic user interface) 可视化Gnome: C 开发; KDE: C++; XFace:嵌入式轻量系统
2. CLI( command line interface) 命令行:效率更高!sh,bash(最广泛,开源),csh,zsh,ksh,tcsh等


以上是计算机必备的硬件软件,下面介绍linux 必备常识

发展历史:

早期Unix,后来收费--> 荷兰教授Andrew: 仿照Unix,开发Minix(在欧洲教学)
--> 【芬兰赫尔辛基 Linus:Linux之父 】+ 【Stallman:倡导软件自由获取、修改、学习,创办GNU运动, (有意思的递归式缩写GNU is Not Unix),提出GPL协议(General Public License) 。研发了很多优秀产品:Emacs:文本编辑器; gcc: GNU C Complier C语言编译器】
--> Linux只是个内核,它本身不是应用程序。它的库(API)是glibc,一个C库。利用glibc和gcc能移植其他软件,比如bash
--> 完整的系统应被称作GNU/Linux,因为GNU提供了必备的软件
--> 无论linux还是GNU,他们都是源代码,使用C开发的程序
--> 要想运行起来,必须编译成二进制(0、1代码)
--> 自己操作很复杂,所以诞生了一些团队将源代码linux在通用平台上编译、打包成可直接执行的二进制程序
--> 1991年的SLS、1992年的德国研究人员开发的Debian (他妻子名字Deb开头,他的名字ian结尾,比较感人了)、1993年的redhat、还有德国的SUSE【他们都被称为发行商release】其实他们内核一样,软件一样,可能只是配置文件不一样,加入了自己的logo,调整的参数等等
--> 开始打包的发行本包括了2万多软件,有些臃肿,又不便于软件管理,所以想要寻求一款软件管理工具
--> Debian开发了dpt (debian package tools)的工具; redhat模仿Debian开发了rpm(redhat package manager)。这样就能实现软件查询、安装、升级、卸载、校验等功能
-->后来redhat虽然给了编译好的二进制版本,但是有些后期补丁不放出来,而且虽然不像微软赚版权费,但它赚服务费,交的钱越多,它帮你解决问题修复漏洞速度越快
--> 有组织看不下去,他叫CentOS (Community enterprise OS, 旨在社区共享、开放),除了不提供服务保障,其他和redhat都一样 ,算是redhat的二次发行版本
--> redhat主要针对企业,后来出来了针对个人的Fedora, 更新速度很快,基本每6个月就会更新,测试稳定后又引入redhat。Fedora其实就是为企业版提供测试开发的。
--> Debian没有专业公司维护,入门比较难用,适合高阶用户;redhat/ CentOS在国内、北美很流行;SUSE在欧洲较流行

--> 基于Debian也开发了二次发行版本Ubuntu,适用于PC机 --> 基于Ubuntu又开发了它的二次发行版Mint,界面更加好看
从0开始-Linux学习笔记(一)_第3张图片
3.png

Linux发展版本:

Linux是内核,内核是有版本的。91年是0.1,94年是1.0,然后几个著名的版本2.0, 2.2, 2.4, 2.6,3.0, 最新的是4.17.2。发行版本:例如Ubuntu 16.04.4 , CentOS 7。他们的核心都是linux 4.0+

Linux的哲学思想:

  1. 由目的单一的小程序组成;组合小程序完成复杂任务

  2. 一切皆文件

  3. 尽量避免和用户交互,中间不需要输入任何内容

  4. 配置文件 /etc 保存为纯文件格式

  5. 能简写绝不写全称


欢迎关注我们的公众号~_~  
我们是两个农转生信的小硕,打造生信星球,想让它成为一个不拽术语、通俗易懂的生信知识平台。需要帮助或提出意见请后台留言或发送邮件到[email protected]

bioinfoplanet

你可能感兴趣的:(从0开始-Linux学习笔记(一))