UDP协议
简介
UDP叫做用户数据报协议,是OSI七层参考模型中传输层使用的协议,他提供的是不可靠传输,既它在传输过程
中不保证数据的完整性!
端口号
UDP使用IP地址和端口号进行标识,以此将数据包发送至目标地址。端口的应用解决了多个UDP数据包发送过程
中使用同一信道的冲突问题。每个UDP数据包分配了一对无符号16位端口号,端口号的范围从0到65536。源端口标识
了源机器上发送数据包的特定进程或程序,而目标端口则标识了目标IP地址上进行该会话的特定应用程序。
端口分类:
①知名端口(0~1023):被分配给最重要、最常用的服务。如:DNS的默认端口是53,SSH是22,FTP是21。
②注册端口(1024~49151):操作系统上无任何特别之处,
③其余的端口(49152~65535):可以随意使用的端口。
实现
服务端
import socket
server = socket.socket(type=socket.SOCK_DGRAM) # 自己指定UDP协议(默认是TCP协议)
server.bind(('127.0.0.1', 8080)) # 绑定IP和端口号
msg, addr = server.recvfrom(1024) # 接收消息
print('msg>>>:', msg.decode('utf8'))
print('addr>>>:', addr)
server.sendto(b'hello baby', addr) # 发送消息到对应的地址
客户端
import socket
client = socket.socket(type=socket.SOCK_DGRAM)
server_addr = ('127.0.0.1', 8080) # 查找通讯录
client.sendto(b'hello server baby', server_addr)
msg, addr = client.recvfrom(1024)
print('msg>>>:', msg.decode('utf8'))
print('addr>>>:', addr)
'''
socket() 创建一个空的套接字
bind() 绑定UDP网络地址
getsockname() 获取套接字绑定的IP地址和端口
recvfrom() 接受返回发送该数据报的客户端地址和字节表示的数据报内容
sendto() 要发送的信息和目标地址
'''
操作系统的发展历程
1.第一代计算机(1940~1955):真空管和穿孔卡片
特点:没有操作系统的概念,所有的程序设计都是直接操控硬件。
优点:每个人独享,可以自己调试代码,找到bug。
缺点:浪费计算机资源。
2.第二代就算机(1955~1965):晶体管和批处理系统
特点:把代码都赞到一块,让一个CPU共享,但是还是一个一个的去运行,还是顺序算法(串行)
优点:批处理,节省了机时。
缺点:有人的参与了,搬过来搬过去的麻烦,拖慢程序运行的速度
3.第三代计算机(1965~1980):集成电路芯片和多道程序设计
第三代计算机的操作系统广泛应用了第二代计算机的操作系统没有的关键技术:多道技术
多道技术:(指的是多道/个程序)
1.空间上的复用:内存要支持同时跑进多个程序
2.时间上的复用:多个程序要让它们能切换(什么时候要切?一个程序占用的时间过长要切;当CPU遇到IO阻塞时,等待的时间要切)
4.第四代计算机(1980~至今):个人计算机
手工阶段
人工操作方式
此阶段无操作系统,用户在计算机上所有的工作都要进行人工干预,如程序的装入,运行,结果的输出
等,出现人机矛盾(速度和资源利用)
程序员将事先已穿孔的纸带(或卡片)装入纸带输入机(或卡片输入机),再启动它们将纸带(或卡片)
上的程序和数据输入计算机,然后启动计算机运行。仅当程序运行完毕并取走计算机结果后,才允许下一个用户上机。
缺点:
1. 用户独占全机。一台计算机的全部资源由上机用户所独占。
2. CPU等待人工操作。当用户进行装带(卡)、卸载(卡)等人工操作时,CPU及内存等资源是空闲的
单道批处理系统
把一批作业以脱机方式输入到磁带上,并在系统中配上监督程序,在它的控制下,使这批作业能一个接一
个地连续处理
在主机和输入机之间增加一个存储设备——磁带机,在监督程序的自动控制下,计算机自动完成任务,成批
地把输入机上的用户作业读入磁带,监督程序再依次把磁带上的用户作业读入主机内存并执行,
执行完成后把计算结果向输出机输出,完成一批作业后,监督程度又从输入机读取作业存入磁带机,
按照上面的步骤重复处理任务,监督程序不停地处理各个作业,实现了作业的自动转接,减少了作业的建
立时间和手工操作时间,有效地克服了人机矛盾,提高了计算机资源的利用率
缺点:每次主机内存中仅仅存放一道作业,每当它运行期间发出输入/输出请求时,高速的CPU需要等待慢速的输入/输出设备完成工作
脱机输入/输出方式
基本概念:程序和数据的输入输出都是在外围机的控制下完成的,或者说,它们是在脱离主机的情况下进
行的,故称为脱机输入/输出,反之把在主机直接控制下进行输入/输出的方式称为联机输入/输出方式)
具体做法:事先将装有用户程序和数据的纸带装入纸带输入机,在一台外围机的控制下,把纸带(卡片)
上的数据(程序)输入到磁带上。当CPU需要这些程序和数据时,在从磁带上高速地调入内存,类似的,当
CPU需要输出时,可由CPU把数据直接从内存高速地输送到磁带上,然后再另一台外围机的控制下,再讲磁带上
的结果通过相应的输出设备输出。
多道批处理系统
形成原因:为了提高资源的利用率和系统吞吐量
基本概念:用户所提交的作业先存放在外存上并形成一个队列,称为后备队列。然后由作业调度程序按一
定的算法,从后备队列中选择若干作业进入内存,使它们共享CPU和系统中的各种资源。(这样可以利用程序
A执行I/O操作而暂停执行时的CPU空挡时间,再调度执行另一道程序B运行,同样可以利用程序B在I/O操作时
的CPU空挡时间,再调度程序C运行,使多道程序交替运行)
优点
1.资源利用率高
2.系统吞吐量大
缺点
1.平均周转时间长
2.无交互能力
多道批处理系统需要解决的问题
1.处理机争用问题:既要满足各道程序运行的需要,又要提高处理机的利用率
2.内存分配和保护问题:系统应为每道程序分配必要的内存空间,并使他们互不影响。
3.I/O设备分配问题:采用适当的策略分配系统中的I/O设备,达到既能方便用户对设备的使用,又能提高设备的利用率
4.文件的组织和管理问题:有效的组织存放系统中的大量程序和数据,使其能便于使用,又能确保数据的安全
5.作业管理问题:对系统中所有的作业进行合理的组织
6.用户与系统的接口问题:使用户能方便的使用操作系统。
分时系统
把处理机的运行时间分成很短的时间片,按照时间片轮流把处理机分配给各个联机作业使用,若某个作业
在分配给它的时间片内不能完成其计算,则该作业暂时中断,把处理机让给另一作业使用,等待下一轮再继续
其运行,
由于计算机速度很快,作业运行轮转很快,给每个用户的印象是,好像它独占了一台计算机,而每个用户
可以通过自己的终端向系统发出各种操作控制命令,在充分的人机交互情况下,完成作业的运行,
具有上述特征的计算机称为分时系统,它允许多个用户同时联机使用计算机
缺点:无法对特殊任务做出及时响应
特征
1.多路性:运行多台终端同时连接到一台主机上,并按分时原则为每个用户服务。
2.独立性:每个用户在各自的终端上进行操作,互不影响(给用户的感觉就是像他一个人独占主机进行操作)
3.及时性:用户的请求能在很短的时间内获得响应(根据人们所能接受的等待时间确定的,通常仅为1~3秒)
4.交互性:用户可以通过终端与系统进行广泛的人机对话
实时操作系统
系统能够及时响应随机发生的外部事务,并在严格的时间范围内完成对该事件的处理
实时系统可以分为两类:
1.实时控制系统(硬实时系统)
用于飞机飞行,导弹发射的自动控制,要求计算机尽快处理测量系统测量的数据,及时对飞机或者导
弹进行控制,将有关信息通过显示终端提供给决策人员,
2.实时信息处理系统(软实时系统)
用于预定飞机票,查询有关航班航线票价等事情
要求计算机对终端设备发来的服务请求及时给予正确的回答
类型:工业控制系统、信息查询系统、多媒体系统、嵌入式系统
微机操作系统
配置在微型机上的操作系统
分类
1.单用户单任务操作系统(只允许一个用户上机,且只允许用户程序作为一个任务运行)
2.单用户多任务操作系统:只允许一个用户上机,但运行用户把程序分为若干个任务,使它们并发执行。
3.多用户多任务操作系统:允许多个用户通过各自的终端,使用同一台机器,共享主机系统中的各种资源,而每个用户程序又可进一步分为几个任务,使它们能并发执行。
网络操作系统
网络操作系统是网络上各计算机能方便而有效地共享网络资源,为网络用户提供所需的各种服务的软件和
有关规程的集合。是网络的心脏和灵魂,是向网络计算机提供服务的特殊的操作系统。
功能:
处理机管理、存储器管理、设备管理和文件管理
提供高效、可靠的网络通信能力;
提供多种网络服务功能,如:远程作业录入并进行处理的服务功能;文件转输服务功能;电子邮件服务功能;远程打印服务功能
嵌入式操作系统
嵌入式操作系统(简称:EOS)是指用于嵌入式系统的操作系统。嵌入式操作系统负责嵌入式系统的全部
软、硬件资源的分配、任务调度,控制、协调并发活动。
分布式操作系统
分布式软件系统是支持分布式处理的软件系统,是在由通信网络互联的多处理机体系结构上执行任务的系统。
进程
程序:完成特定任务的一系列指令集合
代码段+数据段
-----放在磁盘中的程序
进程:进行就是正在进行中的程序
1、用户角度: 进程是程序的一次动态执行过程
2、操作系统: 进程是操作系统分配资源的基本单位,也是最小单位
进程的三种状态
1、就绪状态。某些进程“万事俱备”(必要资源),只差CPU。(就绪队列)
2、执行状态。某进程占有CPU并在CPU上执行其程序。
3、阻塞状态。某些进程由于某种原因不能继续运行下去,等待处 理问题。也称为等待状态或封锁状态。如:请求I/O。(多个等待队列)
进程状态转换的原因
1)就绪-→执行:
对就绪状态的进程,当进程调度程序按一种选定的策略从中选中一个就绪进程,为之分配了处理机后,该进
程便由就绪状态变为执行状态;
2)执行-→阻塞:
正在执行的进程因发生某等待事件而无法执行,则进程由执行状态变为阻塞状态。
如:进程提出输入/输出请求而变成等待外部设备传输信息的状态,进程申请资源(主存空间或外部设备)
得不到满足时变成等待资源状态,进程运行中出现了故障(程序出错或主存储器读写错等)变成等待干预状态等等;
3)阻塞-→就绪:
处于阻塞状态的进程,在其等待的事件已经完成,如输入/输出完成,资源得到满足或错误处理完毕时,处
于等待状态的进程并不马上转入执行状态,而是先转入就绪状态,然后再由系统进程调度程序在适当的时候将
该进程转为执行状态;
4)执行-→就绪:
正在执行的进程,因时间片用完而被暂停执行,或在采用抢先式优先级调度算法的系统中,当有更高优先级
的进程要运行而被迫让出处理机时,该进程便由执行状态转变为就绪状态。
多道技术
串行
多个任务排队执行 总耗时就是多个任务完整时间叠加
多道
利用空闲提前准备 缩短总的执行时间并且还能提高CPU利用率
"""
多道技术
1.空间上的复用
多个任务共用一套计算机硬件
2.时间上的复用
切换+保存状态
切换cpu分两种情况:
1、 当一个程序遇到IO操作的时候, 操作系统会剥夺该程序的cpu执行权限
作用: 提高了cpu的利用率
2、当一个程序长时间占用cpu的时候, 操作系统也会剥夺该cpu的执行权限
弊端: 降低了程序的执行效率(原本时间+切换时间)
"""
并发与并行
并发
当有多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把
CPU运行时间划分成若干个时间段,再将时间段分配给各个线程执行,在一个时间段的线程代码运行时,其它线
程处于挂起状。.这种方式我们称之为并发(Concurrent)。
看上去像同时在执行就可以称之为是并发
"""
饭店里面有多桌客人(任务)
但是只有一个服务员(CPU)
如何让所有客人都感觉被服务员服务着(CPU执行)
让服务员在多桌客人之间快速的来回切换并保存状态即可
让CPU在多个程序之间利用多道技术来回切换+保存状态
单核肯定能够实现并发 但是不能实现并行!!!
"""
并行
当系统有一个以上CPU时,则线程的操作有可能非并发。当一个CPU执行一个线程时,另一个CPU可以执行另
一个线程,两个线程互不抢占CPU资源,可以同时进行,这种方式我们称之为并行(Parallel)。
必须同一时间同时运行才可以称之为并行
"""单核计算机肯定不能实现并行!!! 必须要有多个CPU"""
并发与并行的区别
并发的实质是一个物理CPU(也可以是多个物理CPU)在若干个程序之间多路复用,并发性是对有限物
理资源强制行使 多用户共享以提高效率。
并行指两个或两个以上事件或活动在同一时刻发生,在多道程序环境下,并行使多个程序同一时刻可在
不同CPU上同时执行。
并发是指一个处理器同时处理多个任务。
并行是指多个处理器或者是多核的处理器同时处理多个不同的任务。
并发是逻辑上的同时发生(simultaneous),而并行是物理上的同时发生。
同步与异步
同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication)
所谓同步,就是在发出一个*调用*时,在没有得到结果之前,该*调用*就不返回。但是一旦调用返回,就得到返回值了。
换句话说,就是由*调用者*主动等待这个*调用*的结果。
而异步则是相反,*调用*在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异
步过程调用发出后,调用者不会立刻得到结果。而是在*调用*发出后,*被调用者*通过状态、通知来通知调用
者,或通过回调函数处理这个调用。
典型的异步编程模型比如Node.js
举个通俗的例子:
你打电话问书店老板有没有《分布式系统》这本书,如果是同步通信机制,书店老板会说,你稍等,
“我查一下”,然后开始查啊查,等查好了(可能是5秒,也可能是一天)告诉你结果(返回结果)。
而异步通信机制,书店老板直接告诉你我查一下啊,查好了打电话给你,然后直接挂电话了(不返回结
果)。然后查好了,他会主动打电话给你。在这里老板通过“回电”这种方式来回调。
'''
同步
提交完任务之后原地等待任务的返回结果 期间不做任何事情
异步
提交完任务之后不愿地等待任务的结果 直接去做其他事情 有结果自动提醒
'''
阻塞与非阻塞
阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态.
阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。
非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。
还是上面的例子
你打电话问书店老板有没有《分布式系统》这本书,你如果是阻塞式调用,你会一直把自己“挂起”,直到得到
这本书有没有的结果,如果是非阻塞式调用,你不管老板有没有告诉你,你自己先一边去玩了, 当然你也要
偶尔过几分钟check一下老板有没有返回结果。
在这里阻塞与非阻塞与是否同步异步无关。跟老板通过什么方式回答你结果无关。
在处理 IO 的时候,阻塞和非阻塞都是同步 IO。
进程三状态图
就绪态:程序之进入运行态之前肯定要处于就绪态
运行态:程序被CPU执行着
阻塞态:程序执行过程中有IO操作
'''
如果想要尽可能的提升程序执行效率
就要想办法让我们的程序一直处于就绪态和运行态(不要有IO操作)
'''
阻塞:阻塞态
非阻塞:就绪态、运行态
同步异步与阻塞非阻塞结合
同步异步:用来描述任务的提交方式
阻塞非阻塞:用来描述任务的执行状态
# 上述两组属于两个不同概念 但是可以结合
同步阻塞:银行排队办理业务 期间不做任何事
同步非阻塞:银行排队办理业务 期间喝水吃东西 但是人还在队列中
异步阻塞:在椅子上坐着 但是不做任何事
异步非阻塞:在椅子上坐着 期间喝水吃东西办公 (程序运行的极致)