代码编织梦想

Python网络编程之六:操作系统发展史及网络编程总结

现代的计算机系统主要是由一个或者多个处理器,主存,硬盘,键盘,鼠标,显示器,打印机,网络接口及其他输入输出设备组成。

现代计算机系统是一个复杂的系统。

一、为什么要有操作系统

程序员无法把所有的硬件操作细节都了解到,管理这些硬件并且加以优化使用是非常繁琐的工作,这个繁琐的工作就是操作系统来干的,有了它,程序员不用去考虑操作系统具体的实现细节,只需要知道操作系统为应用程序留的接口,从而从这些繁琐的工作中解脱了出来,只需要考虑自己的应用软件的编写就可以了,应用软件直接使用操作系统提供的功能来间接使用硬件,因此,有了操作系统,会极大的提升应用软件的开发效率。

二、什么是操作系统

操作系统位于计算机硬件与应用软件之间,本质也是一个软件。操作系统由操作系统的内核(运行于内核态,管理硬件资源)以及系统调用(运行于用户态,为应用程序员写的应用程序提供系统调用接口)两部分组成,所以,单纯的说操作系统是运行于内核态的,是不准确的。

1 、操作系统的功能

1、为应用程序提供如何使用硬件资源的抽象(隐藏了丑陋的硬件调用接口):为应用程序员提供调用硬件资源的更好,更简单,更清晰的模型(系统调用接口)。应用程序员有了这些接口后,就不用再考虑操作硬件的细节,专心开发自己的应用程序即可。

例如:操作系统提供了文件这个抽象概念,对文件的操作就是对磁盘的操作,有了文件我们无需再去考虑关于磁盘的读写控制(比如控制磁盘转动,移动磁头读写数据等细节)

2、管理硬件资源(将应用程序对硬件资源的竞态请求变得有序化):现代的操作系统运行同时运行多道程序,操作系统的任务是在相互竞争的程序之间有序地控制对处理器、存储器以及其他I/O接口设备的分配。

例如:
同一台计算机上同时运行三个程序,它们三个想在同一时刻在同一台计算机上输出结果,那么开始的几行可能是程序1的输出,接着几行是程序2的输出,然后又是程序3的输出,最终将是一团糟(程序之间是一种互相竞争资源的过程);操作系统将打印机的结果送到磁盘的缓冲区,在一个程序完全结束后,才将暂存在磁盘上的文件送到打印机输出,同时其他的程序可以继续产生更多的输出结果(这些程序的输出没有真正的送到打印机),这样,操作系统就将由竞争产生的无序变得有序化。

在这里插入图片描述

三、操作系统与普通软件的区别

1、主要区别是:你不想用暴风影音了你可以选择用迅雷播放器或者干脆自己写一个,但是你无法写一个属于操作系统一部分的程序(时钟中断处理程序),操作系统由硬件保护,不能被用户修改。

2、操作系统与用户程序的差异并不在于二者所处的地位。特别地,操作系统是一个大型、复杂、长寿的软件。

大型:linux或windows的源代码有五百万行数量级。按照每页50行共1000行的书来算,五百万行要有100卷,要用一整个书架子来摆置,这还仅仅是内核部分。用户程序,如GUI,库以及基本应用软件(如windows Explorer等),很容易就能达到这个数量的10倍或者20倍之多。

长寿:操作系统很难编写,如此大的代码量,一旦完成,操作系统所有者便不会轻易扔掉,再写一个。而是在原有的基础上进行改进。(基本上可以把windows95/98/Me看出一个操作系统,而windows NT/2000/XP/Vista则是两位一个操作系统,对于用户来说它们十分相似。还有UNIX以及它的变体和克隆版本也演化了多年,如System V版,Solaris以及FreeBSD等都是Unix的原始版,不过尽管linux非常依照UNIX模式而仿制,并且与UNIX高度兼容,但是linux具有全新的代码基础)。

四、操作系统发展史

1 、第一代(1940~1955) 手工操作----穿孔卡片

第一代计算机的产生背景:

1、第一代之前人类是想用机械取代人力,第一代计算机的产生是计算机由机械时代进入电子时代的标志,从Babbage失败之后一直到第二次世界大战,数字计算机的建造几乎没有什么进展,第二次世界大战刺激了有关计算机研究的爆炸性进展。

2、lowa州立大学的john Atanasoff教授和他的学生Clifford Berry建造了据认为是第一台可工作的数字计算机。该机器使用300个真空管。大约在同时,Konrad Zuse在柏林用继电器构建了Z3计算机,英格兰布莱切利园的一个小组在1944年构建了Colossus,Howard Aiken在哈佛大学建造了Mark 1,宾夕法尼亚大学的William Mauchley和他的学生J.Presper Eckert建造了ENIAC。这些机器有的是二进制的,有的使用真空管,有的是可编程的,但都非常原始,设置需要花费数秒钟时间才能完成最简单的运算。

在这个时期,同一个小组里的工程师们,设计、建造、编程、操作及维护同一台机器,所有的程序设计是用纯粹的机器语言编写的,甚至更糟糕,需要通过成千上万根电缆接到插件板上连成电路来控制机器的基本功能。没有程序设计语言(汇编也没有),操作系统则是从来都没听说过。
在这里插入图片描述

特点:

没有操作系统的概念
所有的程序设计都是直接操控硬件

工作过程:

程序员在墙上的机时表预约一段时间,然后程序员拿着他的插件版到机房里,将自己的插件板街道计算机里,这几个小时内他独享整个计算机资源,后面的一批人都得等着(两万多个真空管经常会有被烧坏的情况出现)。

后来出现了穿孔卡片,可以将程序写在卡片上,然后读入机而不用插件板。
在这里插入图片描述

优点:

程序员在申请的时间段内独享整个资源,可以即时地调试自己的程序(有bug可以立刻处理)

缺点:

浪费计算机资源,一个时间段内只有一个人用。

注意:

同一时刻只有一个程序在内存中,被cpu调用执行,比方说10个程序的执行,是串行的。

穿孔卡带的过程:

程序员将对应于程序和数据的已穿孔的纸带(或卡片)装入输入机,然后启动输入机把程序和数据输入计算机内存,接着通过控制台开关启动程序针对数据运行;计算完毕,打印机输出计算结果;用户取走结果并卸下纸带(或卡片)后,才让下一个用户上机。

2 、第二代(1955~1965) 磁带存储—批处理系统

第二代计算机的产生背景:

由于当时的计算机非常昂贵,自认很自然的想办法较少机时的浪费。通常采用的方法就是批处理系统。

特点:

设计人员、生产人员、操作人员、程序人员和维护人员直接有了明确的分工,计算机被锁在专用空调房间中,由专业操作人员运行,这便是‘大型机’。

有了操作系统的概念:

有了程序设计语言:FORTRAN语言或汇编语言,写到纸上,然后穿孔打成卡片,再讲卡片盒带到输入室,交给操作员,然后喝着咖啡等待输出接口

工作过程:

在这里插入图片描述

第二代如何解决第一代的问题/缺点:

1、把一堆人的输入攒成一大波输入,
2、然后顺序计算(这是有问题的,但是第二代计算也没有解决)
3、把一堆人的输出攒成一大波输出

优点:

批处理,节省了机时

缺点:

1、整个流程需要人参与控制,将磁带搬来搬去(中间俩小人)
2、计算的过程仍然是顺序计算→串行
3、程序员原来独享一段时间的计算机,现在必须被统一规划到一批作业中,等待结果和重新调试的过程都需要等同批次的其他程序都运作完才可以(这极大的影响了程序的开发效率,无法及时调试程序)

3、第三代(1955~1965)集成电路,多道程序系统

第三代计算机的产生背景:

20世纪60年代初期,大多数计算机厂商都有两条完全不兼容的生产线。

一条是面向字的:大型的科学计算机,如IBM 7094,见上图,主要用于科学计算和工程计算

另外一条是面向字符的:商用计算机,如IBM 1401,见上图,主要用于银行和保险公司从事磁带归档和打印服务

开发和维护完全不同的产品是昂贵的,同时不同的用户对计算机的用途不同。

IBM公司试图通过引入system/360系列来同时满足科学计算和商业计算,360系列低档机与1401相当,高档机比7094功能强很多,不同的性能卖不同的价格。

360是第一个采用了(小规模)芯片(集成电路)的主流机型,与采用晶体管的第二代计算机相比,性价比有了很大的提高。这些计算机的后代仍在大型的计算机中心里使用,此乃现在服务器的前身,这些服务器每秒处理不小于千次的请求。

如何解决第二代计算机的问题1:

卡片被拿到机房后能够很快的将作业从卡片读入磁盘,于是任何时刻当一个作业结束时,操作系统就能将一个作业从磁带读出,装进空出来的内存区域运行。

同时的外部设备联机操作:SPOOLING,该技术同时用于输出。当采用了这种技术后,就不在需要IBM1401机了,也不必将磁带搬来搬去了(中间俩小人不再需要)

如何解决第二代计算机的问题2:

第三代计算机的操作系统广泛应用了第二代计算机的操作系统没有的关键技术:多道技术

多道技术产生的技术背景:

cpu在执行一个任务的过程中,若需要操作硬盘,则发送操作硬盘的指令,指令一旦发出,硬盘上的机械手臂滑动读取数据到内存中,这一段时间,cpu需要等待,时间可能很短,但对于cpu来说已经很长很长,长到可以让cpu做很多其他的任务,如果我们让cpu在这段时间内切换到去做其他的任务,这样cpu不就充分利用了吗。

多道技术:

多道技术中的多道指的是多个程序,多道技术的实现是为了解决多个程序竞争或者说共享同一个资源(比如cpu)的有序调度问题,解决方式即多路复用,多路复用分为时间上的复用和空间上的复用。

空间上的复用:将内存分为几部分,每个部分放入一个程序,这样,同一时间内存中就有了多道程序。

空间上的复用最大的问题是:程序之间的内存必须分割,这种分割需要在硬件层面实现,由操作系统控制。
如果内存彼此不分割,则一个程序可以访问另外一个程序的内存,如果这么做:
1、首先丧失的是安全性,比如你的qq程序可以访问操作系统的内存,这意味着你的qq可以拿到操作系统的所有权限。
2、其次丧失的是稳定性,某个程序崩溃时有可能把别的程序的内存也给回收了,比方说把操作系统的内存给回收了,则操作系统崩溃。

时间上的复用:当一个程序在等待I/O时,另一个程序可以使用cpu,如果内存中可以同时存放足够多的作业,则cpu的利用率可以接近100%,类似于我们小学数学所学的统筹方法。(操作系统采用了多道技术后,可以控制进程的切换,或者说进程之间去争抢cpu的执行权限。这种切换不仅会在一个进程遇到io时进行,一个进程占用cpu时间过长也会切换,或者说被操作系统夺走cpu的执行权限)

如何解决第二代计算机的问题3:
分时操作系统:

多个联机终端+多道技术

20个客户端同时加载到内存,有17在思考,3个在运行,cpu就采用多道的方式处理内存中的这3个程序,由于客户提交的一般都是简短的指令而且很少有耗时长的,索引计算机能够为许多用户提供快速的交互式服务,所有的用户都以为自己独享了计算机资源。

CTTS:麻省理工(MIT)在一台改装过的7094机上开发成功的,CTSS兼容分时系统,第三代计算机广泛采用了必须的保护硬件(程序之间的内存彼此隔离)之后,分时系统才开始流行。

MIT,贝尔实验室和通用电气在CTTS成功研制后决定开发能够同时支持上百终端的MULTICS(其设计者着眼于建造满足波士顿地区所有用户计算需求的一台机器),很明显真是要上天啊,最后摔死了。

后来一位参加过MULTICS研制的贝尔实验室计算机科学家Ken Thompson开发了一个简易的,单用户版本的MULTICS,这就是后来的UNIX系统。基于它衍生了很多其他的Unix版本,为了使程序能在任何版本的unix上运行,IEEE提出了一个unix标准,即posix(可移植的操作系统接口Portable Operating System Interface)

后来,在1987年,出现了一个UNIX的小型克隆,即minix,用于教学使用。芬兰学生Linus Torvalds基于它编写了Linux。

4、(1980~至今)现代计算机

第四代计算机的产生背景:

进入20世纪80年代,大规模集成电路工艺技术的飞跃发展,微处理机的出现和发展,掀起了计算机大发展大普及的浪潮。一方面迎来了个人计算机的时代,同时又向计算机网络、分布式处理、巨型计算机和智能化方向发展。于是,操作系统有了进一步的发展,如:个人计算机操作系统、网络操作系统、分布式操作系统等。

1、个人计算机操作系统

1、个人计算机上的操作系统是联机交互的单用户操作系统,它提供的联机交互功能与通用分时系统提供的功能很相似。
2、由于是个人专用,因此一些功能会简单得多。然而,由于个人计算机的应用普及,对于提供更方便友好的用户接口和丰富功能的文件系统的要求会愈来愈迫切。

2、网络操作系统

1、计算机网络:通过通信设施,将地理上分散的、具有自治功能的多个计算机系统互连起来,实现信息交换、资源共享、互操作和协作处理的系统。
2、网络操作系统:在原来各自计算机操作系统上,按照网络体系结构的各个协议标准增加网络管理模块,其中包括:通信、资源共享、系统安全和各种网络应用服务。

3、分布式操作系统

表面上看,分布式系统与计算机网络系统没有多大区别。分布式操作系统也是通过通信网络,将地理上分散的具有自治功能的数据处理系统或计算机系统互连起来,实现信息交换和资源共享,协作完成任务。

分布式:将一个大的任务拆分成几个小的任务,分配给不同的任务处理机制,具体怎么分配是由系统中的算法决定的,大家同时来运行自己的任务,然后各自将人物的返回结果再返回给你这个大的任务。

特点:
(1)分布式系统要求一个统一的操作系统,实现系统操作的统一性。
(2)分布式操作系统管理分布式系统中的所有资源,它负责全系统的资源分配和调度、任务划分、信息传输和控制协调工作,并为用户提供一个统一的界面。
(3)用户通过这一界面,实现所需要的操作和使用系统资源,至于操作定在哪一台计算机上执行,或使用哪台计算机的资源,则是操作系统完成的,用户不必知道,此谓:系统的透明性。
(4)分布式系统更强调分布式计算和处理,因此对于多机合作和系统重构、坚强性和容错能力有更高的要求,希望系统有:更短的响应时间、高吞吐量和高可靠性。

五、网络编程总结

1 、思维结构图

在这里插入图片描述

2 、知识整理

网络编程专栏里面的文章都进行过详解,可前往查阅!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/qq_35092730/article/details/111091862

华为交换机MAC地址表分类与实验-爱代码爱编程

MAC地址表分类: 动态表项由接口通过对报文中的源MAC地址学习方式动态获取到,这类MAC地址有老化的时间,并且可以自己修改,老化时间越短,交换机对周边的网络变化越敏感,适合在网络拓扑变化比较环境中,老化时间越长,越适合在网络拓扑比较稳定的环境中 静态MAC地址和黑洞MAC地址(一种特殊的静态MAC地址)是没有老化时间的。黑洞MAC地址表项的功能是用

Win10 开启ping但是不关闭防火墙-爱代码爱编程

Win10 开启ping但是不关闭防火墙 面临的问题网上的解决方案方案不可行?修改方案 面临的问题 在学校的局域网内,两个不同子网/网段的PC,ping 不同,我使了下发现可以ping同对方的网关,因此可能是防火墙的问题(原理没有深究)。关闭正在使用网络的防火墙,关闭之后就可以ping通了。但是我的电脑关闭防火墙就没有任何防护了,因此不太像关

华三 h3c private vlan配置-爱代码爱编程

[SWA]vlan 2 [SWA-vlan2]port  g1/0/1 [SWA]vlan 3 [SWA-vlan3]port g1/0/2 [SWA]vlan 10 [SWA-vlan10]port g1/0/3 [SWA-vlan10]private-vlan primary [SWA-vlan10]private-vlan seco

网站常见错误代码解释-爱代码爱编程

转载自:http://www.llidc.com/news/27.html 一般的错误都在这里了 404错误提示—找不到文件或者目录不存在 403错误提示–找不到默认首页 505错误提示–服务器内部错误 1xx-信息提示 这些状态代码表示临时的响应。客户端在收到常规响应之前,应准备接收一个或多个1xx响应。 100-继续。 101-切换协议。2xx

虚拟机与电脑主机网络配置-爱代码爱编程

下面主要分享记录我的虚拟机网络配置过程以及遇到网络不通问题的解决办法: 1、配置:在虚拟机上将网络连接配置成NAT模式,当然桥接模式也行,我是使用NAT模式,如下图: 然后再在终端中查看网络地址等信息,虚拟机中使用如下命令: ifconfig 其中ens33为我们使用到的网卡,虚拟机的IP地址为192.168.229.128,当然每个人的不一样。 再

高级计算机网络(习题三加解析)-爱代码爱编程

个性不要个体;独立不要孤立;自由不要自私;浪漫不要散漫 路漫漫其修远兮,吾将上下而求索—屈原 离骚 文章介绍: 这是计算机网络老师布置的课后作业,参考文章:习题一 , 习题二 , 持续更新… 题目都很新型,网上很难能够找出所有答案,今天分享出来,希望能够帮助有需要的人,一起学习进步! # 本文章分享由小亮子整理汇总,如有转载,请注明出处!!

python的 lambda() filter() isinstance() setattr()-爱代码爱编程

1、lambda: g = lambda x:x+1 使用lambda定义一个匿名函数,如上所示,x作为函数的入口参数,x+1为函数体 2、filter(function,iterable) 该函数接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判断,然后返回 True 或 False,最后将返回 True 的元素放到

Python3 《零基础小白从入门到实战》之“for循环”-爱代码爱编程

for循环,每次循环,循环变量都会获取遍历对象中的一个值,执行循环体语句,当遍历对象中的值,全部获取完毕,停止循环。 for 被循环的数据需要多个数据 for循环可以循环 list, tuple, dict, str 语法格式: for 循环变量 in 遍历(循环)对象: 循环体 例如1: for i in (

Python 如何用 shell 调用脚本中的函数+参数传递-爱代码爱编程

【前言-给自己看的屁话】 最近玩python 遇到了这个问题,在网上查了下,大部分博客文章都是讲的同一种方法,看起来一知半解的,所以觉得自己有必要整理一下。 1、问题描述 无论是在windows下也好,Linux下也好,都有shell,windows下是powershell,Linux下是bash等。windows下的python 可以有IDLE,Li

python统计单词出现的次数-爱代码爱编程

#统计单词出现次数 import re with open("实验三\word.txt",'r',encoding='utf-8') as f: str=f.read() print(str) #去英文标点 # for i in str: # if i in string.punctuation: # str = str.r

python中的matplotlib进行绘图-爱代码爱编程

import matplotlib.pyplot as plt plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签 # x = ["chb01","chb02","chb04","chb05","chb06","chb07","chb08","chb09","chb10","chb14","chb1

python 直接赋值&深浅拷贝 解析-爱代码爱编程

直接赋值:引用同一个对象,赋值和被赋值的无论有什么修改,另外一个也会改变 浅拷贝:赋值和被赋值的最内一层的无论有什么修改,另外一个也会改变 深拷贝:完全独立,不受影响 import copy a = [1, 2, 3, 4, ['a', 'b']] # 原始对象 b = a # 直接赋值 c = copy.copy(a) # 浅拷贝