linux系统深入学习

1、开篇一——基础知识

1.1VMware软件介绍

这里用到的软件是VMware,是一种虚拟化的技术,其实一台计算机就是一台虚拟机,操作系统本身也就是虚拟化的技术,像CPU只有一颗,在某一时刻跟人一样只能想一件事情,只能运行一个程序,但是为什么现在可以同时运行多个进程?这种同时只是我们看到的同时,实际上是操作系统将硬件虚拟化之后提供给程序使用。

1.2、虚拟机的网络连接:

如果说虚拟机做好之后,不能连接到物理网络上,就选择edit>virtual network editor,然后里面有一个VMNET0(桥接网络)通过物理网卡能够跟外在的网络进行通信的一种机制,默认的选择是自动桥接,但是当物理网络和无线网络都开启了,可能就会出问题,所以这个时候就需要手动的选择以下。

 

 

1.3VMware虚拟机开启、关闭、挂起、复位

power on:开启虚拟机

power off:关闭虚拟机(相当于拔电源)

suspend:挂起虚拟机(使操作系统保持当前的状态,下次开机依然能够恢复该状态,相当于一个快照,让计算机静止在这一刻,下次开机还是从这一刻开始)

reset:相当于按重置按钮,冷重启

1.4VMware的快照机制

快照:应用在做一些快照方便系统快速恢复到制作了快照的地方,非常方便,所以在平时玩的时候,装完操作系统马上制作一个快照,然后随便捣鼓,搞坏了马上还原就行了,非常方便!

VMware来说ctrl + alt + insert(重启) 马上按F2进入虚拟机的BIOS界面,后面需要进行调整的就一个就是BOOTboot sequence启动次序),调整启动次序的。

1.5、电脑是怎么运行的?

系统在启动的时候首先是加电自检POST:POWER ON AND SELF TESTING):计算机只是一堆硬件,根本不可能自动的自检,硬件本身是没法进行任何计算工作的,实际上执行的是一条条指令(程序是由指令和数据构成的)来实现的,因此CPU只有加载到了指令之后才能执行,那么指令在什么地方存储的呢?内存是易失性存储器无法存储东西的,所以应该放在辅存上,这就是BOOT的作用了,辅存设备有很多,所以到哪里去加载指令就看BOOT的顺序了,但是系统在刚加电的时候,这些能够检测硬件且给硬件排序的程序又是从哪里来的呢?这就需要提到计算机系统的自举能力,计算机系统是依靠额外设备来实现的,就是BIOS

要理解BIOS就要理解下计算机的体系结构(冯诺依曼是计算机体系结构之父)了:

1.6、计算机体系结构:

1.6.1、计算机的五大基本部件

  • 计算器(或称运算器)(加法器/逻辑运算器)

那么计算机一个电子设备为什么能进行运算呢?

  • 控制器:控制计算器到哪里去取数据

计算器+控制器=(约等于)CPU

  • 存储器(内存:编址存储方式  RAM):负责存储数据的
  • 输入设备输出设备I/O

1.6.2计算机的五大部件是如何进行协调的

运算器从存储器里面去拿到数据,进行运算,然后将结果又放到存储器里面,但是CPU怎么知道到内存中去取哪些数据?运算完成后数据又放到内存的哪个地方?存储器指的内存,内存是一个编址存储设备,每一个存储单元8位(一个字节),每一个字节都是有地址的,内存是平面编址的,每个存储单元在全局上有一个唯一的编址,这个地址是使用数字的方式进行引用。

要知道计算机的核心设备就是运算器,加法器是最基础的,要做加法就需要加数和被加数即可进行运算,但是有一些特殊的场景,就是进位的情况(甚至连续进位的情况),即在进行下一位计算的时候还需要考虑上一次计算的进位情况,加法器要计算就需要取数据,指令中就会告诉运算器到内存的哪个地方去取数据,接下来就是由控制器控制着去内存中取数据,对于控制器而言,控制器需要接受控制指令,同时运算器要运算数据需要取得数据,传输数据的线路称为数据总线,对于控制器而言获取控制指令的线路成为控制总线,指令同样是存储在内存中的,计算完后,由控制器控制将数据存储在内存中。

存储器初始的时候,里面是空的,什么都没有,作为用户来讲,仍然需要将要执行的程序首先放到内存中去,然后让运算器和控制器进行相关操作,那么就需要一个外围的设备辅助着将用户的指令和数据存储在内存中,从而运算器和控制器可以从内存中取数据进行运算,运算完成后,还需要将数据从内存中搬到外置的地方,或者通过显示器显示出来,像显示器就是输出设备,所以计算机中,运算器、控制器、存储器是核心,输入和输出是用来跟用户进行交互的,用于辅助计算机的运行的。输入输出设备又称之为I/O设备。

  • 但是还有一个问题就是:

计算机继续需要两根线,一个传输加数,一个传输被加数,那么计算32位的加法,这该需要多少根线啊,所以说能不能只用一根线既传输加数又传输被加数又传输指令,这就叫线路复用。但是CPU如何知道传输的是数据还是指令呢?通过加控制位就可以解决了,但是还有一个问题就是如果一根线上既传加数又传被加数,加数传完后就一定需要一个地方来暂存加数,不然被加数一过来,加数就没了,所以就需要一个暂存的地方,就称之为寄存器。CPU中最核心的组件:运算器、控制器、寄存器

虚拟机就是用软件的方式模拟了运算器、控制器、寄存器等,但是这是结合实在的物理设备来虚拟出来的。

1.7、加电自检是如何完成的:

CPU要想执行指令,这个指令必须是在内存当中,而内存当中必须有那么一段指令事先放好了才能执行的,但是计算机刚开机的那一刻,根本就不知道是否有键盘,也不知道是不是有显示器,所以不知道从哪里输入数据,从哪里输出数据,而且内存也无法事先保存数据,所以就需要借助额外设备了(就是所谓的ROMread only memory)只读存储器,里面就是此前的适用于该计算机的一堆指令,这些指令可以映射到内存当中去,还有一个额外设备,叫元芯片,芯片里面放的指令不会丢失,就算计算机没有电也不会丢失,一开机,计算机会自动的,由硬件逻辑完成的,将芯片中的程序映射到内存中,在内存的最开始的那一段,然后CPU就会去读取那一段指令,去探测是不是有键盘、有没有显卡、有没有硬盘之类的),存储器称之为RAMrandom access memory)随机访问存储器这个过程就是加电自检。理解这个过程非常重要,因为后面的调优操作就是去调整内存中的数据是如何排列的,以及CPU是怎么去运行程序的。

1.8、中断

前面提到的内容还存在一个问题,就是外围的I/O设备可能有很多个,键盘、鼠标都是输入设备,硬盘既是输入又是输出设备,同样是I/O设备,当某一个时刻,需要从硬盘读数据的时候,如何通知硬盘而不是键盘,要读数据了,输入设备那么多,还有就是输出的时候,如何知道要将数据输出到哪个地方,是通过显示器输出还是通过硬盘输出的。这就是内核设备如何跟外围设备打交道的问题了。

 

比如说通过一根总线将外围设备连接起来,但在某一时刻怎么知道是哪个设备传输的数据呢?比如说敲了一下键盘,那么如何知道是键盘敲的还是鼠标点击的呢?这如果要知道的话,CPU就要时刻不停的去看看键盘是否敲了,鼠标是否点击了,但是如果一天都没有敲键盘,那么CPU轮询就白白浪费了,效率非常低,所以如果反过来,让键盘去通知CPU,如果敲击键盘了,就通知CPU键盘被敲击了,快来处理这个事件,这个机制叫做中断interrupt硬件通知机制),但是中断发生了,如何知道这个事件是键盘还是鼠标呢??很简单,就是需要一个控制芯片,在计算机中有一个芯片,叫可编程中断控制器,这个控制器跟CPU针脚是相连的,CPU通过这个控制器就可以知道是哪一个设备发生了事件,这个控制器的每一根线表示一个设备,比方说第一根线给键盘使用,第二根线给鼠标使用,那么当第一根线上电位发生变化时,CPU就会知道是键盘发生了事件。这里只需要知道,外围设备就是通过不停的中断来跟CPU进行交互的。但是如果中断多了,主机的效率就低了,但是不中断又不行。

【补充,待查】前端总线:FFB

1.9、南桥/北桥设备:

1.9.1、北桥(离CPU比较近):

高速总线控制器,需要大量数据传输的,需要工作在比较高的频率下的,需要快速进行数据传输的。

1.9.2、南桥:

慢速的,像键盘、硬盘这些慢速设备,南桥汇总后接入到北桥,大多数I/O设备都接在南桥上,这些设备经过南桥汇总后,由一根线汇总到连到北桥,由北桥再转给CPU

但是现在的结构发生了变化,北桥不是再用来控制内存了,而是CPU直接跟内存相连,北桥只跟南桥相连,以及其他总线的控制,这样速度会更快。

 

1.10CPU主频概率/程序的局部性原理

程序的局部性(时间上的局部性和空间上的局部性)原理:实验证明程序是遵循局部性原理的,表示的是在CPU读取程序数据时,为了尽量少的在内存中读取数据而是在缓存中读取数据,所以在CPU加载数据时,会将临近时间的数据都加载到内存中,以及数据所在的附近的数据也加载到内存,这样做可提高程序运行的速度。如果懂局部性原理的话,开发的程序的执行效率是非常高的。

1.11、屏蔽不同CPU的差异

计算机执行程序都是指令通过CPU的某根针脚来执行的,但是生产CPU 的公司却又很多,也就是说其CPU的运行机制各不相同,而程序的运行又依赖于CPU的运行机制,所以程序员要想写程序在特定的CPU上执行,就必须写机器语言,但是这显然是不现实的,所以生产CPU的公司有在CPU上添加了一层叫微码(汇编),但这时候程序员是容易理解了,但是机器难于理解,所以这其中又需要一个编译器,编译器就是将程序员写的程序转换成机器语言,在CPU上运行,注意汇编跟硬件的结合程度还是非常高的,执行效率还是非常高。后面为了进一步的方便程序员开发,又诞生了高级语言

这种语言有一种非常好的特性(本身是需要先转换成汇编,然后再翻译成机器语言)

高级语言要想运行就要一种额外的机制来弥合多种芯片之间的不同。如下图所示,在每家公司生产CPU的时候,为了屏蔽其底层的差异而为其CPU芯片制作了一个中间层为上层程序提供了一个公共的API(应用编程接口)API就是在不同的CPU上利用其CPU上的汇编而写出来的具有相同功能的程序,这个程序本身不会自己运行,而是告诉上层程序,不用关心CPU,而是虚拟了相同类型的执行环境,库是一种虚拟设备,

 

1.12、【补充常识】常见的CPU系列:

硬件架构:(CPU芯片的不同系列)

ARM(英国的一家公司):只负责生产知识产权,不生产芯片。省电、性能也不错

X86: intel

32:理论寻址范围为4G

X64:

64位:

安藤:原来属于惠普的

惠普现在也有一个:alpha

UltraSparc

Power:第一个主频超过4GCPU

M68000:摩托罗拉公司的   M68K

PowerPC:早期苹果的系统

linux基本上支持所有的CPU类型。

 

1.13、【补充尝试】常见的OS:

Windows

Linux

Unix

HP-UX

Solaris

AIX

SCO UNIX

UnixWare

Android

OS/2

……

 

2、开篇二——继续谈计算机:

2.1、批处理系统——线代操作系统的前身

2.1.1、批处理系统简介

我们的计算机只有一颗CPU,一段内存,有输入输出设备,那么在某一刻能运行的程序有多少呢?多个程序是如何运行的呢?为什么这些程序看上去会是并行执行的呢?计算机很快输入输出设备很慢如何处理呢?

 

在穿孔纸带上放多个job,一个job执行完成之后,CPU会自动的加载另一个job来执行,但是这种批处理在某一个时刻仍然只能执行一个程序。而且这种情况会造成严重的CPU运算资源的浪费,因为在程序运行的过程中难免会有I/O操作,这些操作在执行的时候,CPU是啥事没干的,这样就会使得CPU计算资源得不到充分的利用,而要想CPU时刻处于时刻繁忙的状态,那么就需要将资源切割开来。

2.1.2、批处理系统改进——计算机资源的切割

程序想运行需要的核心资源就是CPUMemoryCPU无法分片,但是可以一个程序执行一会,再去执行以下另一个程序,把CPU分成小的时间段来执行程序,这样的话就需要执行一会A程序后要保存下现场,比如说CPU运行A程序5ms,再运行下B程序5ms,这样交替,所以需要保存现场。对于内存的话,可以将内存进行分段,每一段都有1 2 3 4 ,每一段都有地址的起始位,这样程序就不需要改了。然后一个问题就是内存的大小可能不一样,就需要用虚拟地址空间了,每一个程序员不需要管有多少内存,就当32位系统就有4G的内存空间,64位系统就是内存无限大的,因为程序实际在运行的时候是用不了那么多内存的。前面说的5ms是每个程序执行的小片段时间,但是程序本身是无发做到的,这是由操作系统来控制的,操作系统就是一个软件,运行在硬件上,负责管理硬件资源,将硬件资源提供的计算能力(cpu切割成多个片分配给多个程序,内存分成多个段,)然后在进程之间进行协调,操作系统还负责程序的运行、终止、切换的操作。操作系统就是一种通用软件,不完成具体的操作,只是协调其他的具体的程序工作的。

  • 新的问题:如果一个程序能在linux上运行,那么是不是一定能在windows里面运行呢?硬件是一样的,就是系统不同

2.1.3、库的概念

前面提到是用来弥合底层硬件的不同的,库是一堆的程序,这些程序比较独特,任何一个程序都有一个执行入口,但是库不一样,它没有执行入口,不能独立运行,必须被调用才能执行,但是在执行的时候可以提供一个统一的调用机制,就像剃须刀,不管是哪个公司生产的,最终功能、使用方式是相同的就可以了。库也是一样,只提供调用接口,供程序调用。

【注】有了操作系统之后,任何程序想执行都不能直接跟硬件打交道,要想使用硬件功能必须通过系统调用跟硬件打交道,操作系统就像一个代理人介于程序和硬件之间,进行计算机硬件的管理工作。

2.1.4、系统调用(system call

系统调用是操作系统封装的偏底层的硬件访问接口,由于系统调用非常的底层,程序员在写程序的时候的需求如果直接使用系统调用的话,就需要做很多其他的操作才能完成,所以专门有人将系统调用再次的进行了封装,做成了更高级的接口,就是所谓的库(API。打比方说要用C语言来写一套程序并不是通过系统调用来写的,而是通过调用库来写的。(相当于就是程序员去调用别人已经写好的功能去实现一些更高级的功能而已)

(理解:比喻说人人都要吃馒头,可是系统调用就提供麦子,如果人们需要馒头还需要去取麦子,磨面粉,做馒头。。。非常麻烦,所以才会有人去将系统调用做更高层次的封装,直接把馒头给做好放那儿,因为馒头就是一个公共的东西,人人都需要)

(再次理解:系统调用是为了做的更简单,更容易被广泛的使用的,这就像极了社会的层次结构,社会的底层是一些老百姓,提供麦子、生产一些物品的原料上上层提供,但是普通的人只是要吃米饭、馒头、包子等,不可能去买麦子自己生产吧,所以就专门有人来做了这么一件事情,将麦子买过去进行加工、生产成馒头、包子等,那么人们需要吃就直接买就行了,这个比喻就恰当很多了,然后像超市是一个非常复杂的组合体,里面的很多东西也都是用的别人加工好的一些物品,然后对外提供更全面的服务的)

程序员是根据库来进行编程的,在windows里面调用windows提供的库来编程,在linux里面用linux提供的库来编程,一旦库不一样,在windows里面开发的程序在linux里面就使用不了。

 

2.2、计算机的整体框架:shell人机交互接口

2.2.1、计算机整体框架图

 

在图中可以看到一些应用程序是在库的基础上写的,一些应用程序直接调用内核提供的功能,但是有一个问题就是,在操作系统启动的时候,这个程序未必会运行起来,只是说程序具备了运行条件。通常运行程序有几种方式:(1)让操作系统已启动就让程序自动的运行起来,(2)按需手动启动(交互式程序)

2.3、交互式程序执行过程

交互式程序是需要跟用户来进行交互的,而用户来讲,我们使用计算机无非就是输入设备(键盘、鼠标等)和输出设备(显示器等),那现在的问题就是,我们敲击一下键盘,我们的信息一定是由CPU先接收的(通过中断先到达CPU),那CPU发现我们敲下键盘以后,它怎么知道是哪一个程序呢?CPU其实并不知道我们敲击键盘的信息意味着什么,比如说按下ctrl+C,那是不是复制粘贴,还是只是随便按下什么键,为什么ctrl + c就是复制,对于某些编辑器来讲,必须将键盘上的这个键解析成对应应用程序所能理解的功能,但现在问题是我们敲下的键盘首先是拿到CPU的,但是我们知道能够跟硬件交互的只有内核,所以CPU在获得这个信息以后,首先通知内核来进行处理的,而不是说直接交给word这类的软件,所以这个时候内核必须要能够在CPU上运行起来,并且接着去处理这么一个信号,当然内核是知道这个程序是由哪个进程发起来的,整个系统资源的监控包括上层运行的应用程序的资源监控都是由内核来完成的,所以内核会知道,到底是哪个进程处于当前焦点进程,而负责接收这么一个快捷键,因此再由内核转交给应用程序的,所以一个应用程序的执行过程是这样的,但是操作系统本身也是一个应用程序也需要运行起来,它既然需要运行,就需要指令和数据,而指令和数据是放在内存当中的,那就意味着在我们的存储器当中,既有内核还有其他的应用程序,那么如果一个恶意的应用程序,能够直接访问内核的话,能够直接跟内核进行交互的话,能够直接去修改内核中的某些数据的话,这意味着系统的稳定性将无法得到保证,所以说就必须要有一种机制将应用程序和内核隔离开来,通常情况下,像在intel这一类的平台上,它会提供所谓的保护机制,或者叫保护模式,一般我们的CPU会有四个级别,是同心圆的四个环,最内存,我们称之为0级别(或者叫第0环),0环也称之为特权级别,只有内核才能运行在特权模式下,而其他应用程序只能运行在最外层级别下,中间两层没用,所以任何时候,应用程序是不能访问内存当中,处于0级别的内存区域的,我们刚刚提到过,CPU和内存之间是紧密结合的,所以CPU0级别就会映射到内存中某一段处于保护的空间当中。

 

当我们的程序运行起来之后,在我们的内存当中是分成两段的,事实上是三段,最底层的一段是叫BIOS的映射程序POST加电自检以后,BIOS自动的就映射到内存的开端之处了,接下来就是载入内核了,在内存中,接下来的空间就是内核空间(kernel space)了,而后的一段空间是被多个应用程序所共享的,但是这样会存在很多问题,是比较粗糙的,只是便于理解的,这样去划分内存是非常容易产生内存碎片的,其实操作系统是一个非常复杂的东西,需要管理的任务,需要完成的功能是非常复杂的。

2.4、计算机中程序是如何启动的?

再次回到计算机上程序启动的问题,程序的启动有一种叫按需启动程序,那么如何让操作系统能够接受用户的命令,就说我用户输入命令指示要启动word,那么操作系统就能够将word启动起来,那也就意味着还需要给我们的操作系统提供一个特殊的应用程序(shell),shell是能够实现接收用户、理解用户的命令并且将它传输给内核,并且有内核指挥着某个应用程序启动的这么一个界面(有时候也称之为接口,这个要能够转换过来,是同一个意思),那么shell本身用来干什么呢?首先是提供一个用户可以跟它交互的界面,其次还要将用户的指挥行为翻译成计算机可以理解的命令或者内核可以理解的命令,比如说在桌面上双击一个图标,为什么就能够被解析成打开一个应用程序呢?这就是靠内核进行指挥了,但是能够提供一个界面让用户进行双击,并且能够显示一个鼠标的样子,这其实是由界面提供的,也就是shell提供的,所以说没有shell的话,用户就没法跟计算机进行交互,shell有两种,一种是GUI(图形用户接口),一种是CLI(命令行接口),无论是GUI还是CLI,其实也是应用程序,在不同的操作系统上,他们可能提供的有不同的替换的版本,像Linux上面常见的就有三种图形界面,在这样一个接口上,如果关掉了这个接口,那么基于这个接口的所有程序都会关闭,因为在这个接口上启动的程序,跟这个接口有着紧密的关系。

2.5、内核所提供的功能:

  1. 进程管理
  2. 内存管理
  3. 文件系统
  4. 网络功能
  5. 硬件驱动
  6. 安全机制

从上面的这些内核提供的功能可以看出,操作系统是一种通用软件,而不是针对于某一种应用程序的。

2.6、操作系统的发展历程

接着说前面提到的批处理操作系统,讲下操作系统的发展历程

由于批处理系统无法真正发挥硬件的真正能力,所以在这个时候,有三个组织:

GE(通用电器),美国的电报电话公司AT&TBELL(贝尔实验室),还有麻省理工大学的人工智能实验室(MIT)共同研究出了比批处理复杂高效很多的多任务多用户的系统,技术非常复杂,使用汇编进行开发的,基本的功能都已经实现了,且可以供多个用户共同使用。那些人给这个系统起了个名字叫Multics。而且这些计算机科学家在后面还接着为这款操作系统做了很多完善,加了很多功能,但是随着不断的添加新功能,他们有些迷失了发展的方向,所以后面有些组织渐渐的就退出了这款系统的开发,最终就剩下MIT接着进行这款系统的开发,由于BELL实验室退出,实验室中的很多工程师就空闲下来了,这其中包括Ken这个家伙,这家伙当时在Multics主机上研发了一个游戏叫space travel,是一款打飞机的游戏,在现在看来是很丑陋的,这款游戏只能运行在Multics上,由于bell实验室的退出,使得这款游戏无法跑,所以他就很郁闷,这样就到了72年左右,在当时,最著名的生产计算机的公司,除了IBM之外,还有一家叫DEC,它生产小型机、中型机、大型机等,有一些还是非常受欢迎的,当时ken申请bell实验室给他批一台PDP-11给他研究,但是实验室不批,所以ken非常郁闷,在实验室闲逛,然后在一个角落里,发现了PDP-7的一台机器,是一款非常落后的主机,但是他就是拿着PDP-7来研究他的游戏,space travel是一个应用程序,应用程序要想运行就必须依赖于内核,所以ken不得已只能自己去开发一个内核来跑他的游戏,就是模仿他对Multics的理解来开发的,最后他成功了,然后他就在实验室里到处晃推销他的游戏,但是没人对他的游戏感兴趣,都是对他的系统感兴趣,但是很遗憾的是,汇编所开发的程序,是跟硬件平台紧密结合的,想要在其他机器上运行是不可以的,所以PDP上开发的想要运行在其他机器上是不可以的,所以在实验室的要求下,ken又不得不将他的程序移植到其他主机的系列上,他又成功了,而且运行的还不错,接着此后一年,ken的这个系统风靡bell实验室,后来他的一个同事给他的系统起名为unics,因为当时他的这个系统功能非常简单,后来才改成了Unix,但是这个时候Unix一直都是使用汇编语言来研发的,性能是很不错的,但是移植起来比较困难,为了能够扭转这种劣势,当时Ken Thompson的一个同事丹尼斯·里奇,这个家伙看到ken没事就在那里移植系统,他就在想能不能使用高级语言重新开发Unix,这样就只需要使用编译器在不同的平台版本上进行编译就能够完成Unix的移植了。因为高级语言对底层硬件的依赖程度是非常低的。像C语言,虽然称之为高级语言,但是同时也兼具低级语言的特性。当时他们两个人一商量,不谋而合,然后他们在B语言的基础上,添加了变量、指针等新的特性,然后称之为C语言,而后这两个人完全使用C语言重写了Unix,当时这是一个非常胆大的尝试,因为高级语言的效率比低级语言至少低30%以上,但是他们准确的意识到计算机的以后肯定会得到很大的发展,发展到可以忽略这种差异,所以他们没有犹豫的用C语言重写了Unix,然后他们两个人在计算机通讯杂质上发表了一篇论文专门说他们的Unix操作系统,计算机通讯杂质每年都会举办年会来聚集来自全球各地的计算机科学家来探讨计算机的发展趋势,在那年的会议上ken他们也参加了,与会的很多科学家对他们的系统非常感兴趣,所以期望获得一份去学习和使用,他们因为不得已无偿提供给了他们,此后几年,大概到了1976的样子,ken(美国的工程师有一个非常好的福利,如果做出了突出贡献的人,可以放一年的年休)当时ken去美国加州大学学校去任教,当时那个学校有一个学生bill joy,他成立了一个操作系统研究小组(BSRG),专门研究Unix,改进、修复bug,提供新功能等,由于ken的加入,是的这个研究组成为当时Unix研究所中的领头羊,当时由于网络(美国军方网络)的兴起,而此时他们就需要一种协议,能在这个网络中传输网络数据报文,而这个协议的研究,他们不期望在一个封闭的系统中来实现,而当时Unix以及BSRG正好符合要求,所以他们就将这个协议的研究交给了bill joy这个小组,后来不久,像包括TCP网络协议中的拥塞控制等包括各种功能,都诞生在bill joy所领导的小组研究的Unix系统平台上,后来柔和了各种新功能,然后形成了一个单独的操作系统向外发布,并且重新取了一个名字叫BSDBerkeley system distribution)而且可以从中谋取盈利,而bell实验室当时那个原生的那个Unix就叫system +版本号,后来bell实验室被卖了,也就是不受AT&T的限制,所以一出来之后,立马就封装了商业版的Unix向外卖,并且还跟BSD打起了口水仗,打官司打了10年之久,到此为止,Unix的发展几乎陷入停顿状态。大概81年左右,PC兼容机出现,当时在美国很多公司就开始生产PC机了,但是任何一个机器没有操作系统是没法用的,Unix又没有往PC机上移植(Unix程序员不屑于把Unix移植到PC机上),于是美国的一个教授开发了一个操作系统叫做(CP/M)买一个PC需要2~3万美元,然后买一个操作系统又需要2~3万美元。这个时候在美国一个小公司Microsoft成立了,当时刚成立就3个人,当时也没啥干的,就卖basic(当时的一种脚本语言)的编译器,再就是包装发行卖Unix,他们的Unix还起了个很奇怪的名字叫Xennix,但是他们卖Unix的热情没有持续太久,因为比尔盖茨的一个好友的好友在另一家公司上班,是一个程序员,非常牛,仿照PC/M花了四个星期时间写了一个能在PC上运行的小系统,然后比尔盖茨敏锐的发现这么一个商机,然后利用他母亲(IBM董事会成员)的关系找到了IBM公司的董事长沃森,跟他谈,说有一个系统能装在PC机上,然后也不需要几万美元,只卖授权,就是说IBM卖一台机器,就给比尔盖茨几美元,然后比尔盖茨花了几万美元从那个程序员手上买断了那个系统,然后敲敲打打的修改了那个操作系统,取名为DOS,然后后面的故事就是PC机非常火,比尔盖茨也靠这个赚了一大笔钱,DOS也叫磁盘操作系统,是单用户单任务的操作系统,很不稳定,经常崩溃,但是在当时是非常好的,但是在另外三个人创立一家公司后,他们的前景就不那么好了,这三个人的领头的就是乔布斯,后面乔布斯那三个人看着PC机大卖特卖,他们也决定去折腾PC机,当然不是像IBM一样做PC兼容机了,他们是想做一个性能比较强的,超出于PC兼容机的,当时因为乔布斯非常崇拜图灵,因为图灵当时是一个同性恋,当时是不被接受的,所以被囚禁起来,然后郁闷了,就咬了一口涂有氰化钾的苹果死了,所以乔布斯的公司就取名苹果,而且是被咬了一口的苹果。乔布斯曾经去游荡过施乐公司的实验室,发现了其公司一个团队生产的鼠标以及基于图形界面的操作程序,然后乔布斯很敏锐的觉得图形界面操作肯定是以后的主流,因此跟施乐公司的老板谈买下了他的这个技术,回去经过一番研究,最终在苹果2代推出了他的图形操作的操作系统,这无疑是对比尔盖茨的当头一棒,然后比尔盖茨使用各种手段从乔布斯那里把图形操作的程序骗来了一个副本,在DOS的基础上继续开发图形操作系统。(伟大的企业家都是靠偷的)。由于Unix商用了,卖钱了,所以很多科研机构就无法免费试用Unix了,那么在荷兰的一个大学的一个教授一直在使用

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值