今日学习内容总结
在上周的学习中,我们已经初步完成了服务端与客户端交互的代码操作。也就是对socket模块的一个使用与学习。并且体会到其中的黏包问题,以及解决黏包问题的一个策略以及思路。而今日的学习内容就是对传输层的UDP协议进行基本的学习与了解。然后就是一些概念性的理论知识内容。
UDP协议的实际应用
UDP协议的使用其实就是socket模块中,自己指定UDP协议。因为socket模块默认使用的协议是TCP协议。实例:
服务端
import socket
server = socket.socket(type=socket.SOCK_DGRAM) # 自己指定UDP协议(默认是TCP协议)
server.bind(('127.0.0.1', 8080))
msg, addr = server.recvfrom(1024)
print('msg>>>:', msg.decode('utf8'))
print('addr>>>:', addr)
server.sendto(b'hello word', 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)
操作系统的发展史
其实接下来的学习就是之前提到过的并发编程了。而学习并发编程其实就是在学习操作系统。所以我们先来了解一下操作系统的发展史。
阶段一:手工操作穿孔卡片
1946年第一台计算机诞生–20世纪50年代中期,计算机工作还在采用手工操作方式。此时还没有操作系统的概念。程序员将对应于程序和数据的已穿孔的纸带(或卡片)装入输入机,然后启动输入机把程序和数据输入计算机内存,接着通过控制台开关启动程序针对数据运行;计算完毕,打印机输出计算结果;用户取走结果并卸下纸带(或卡片)后,才让下一个用户上机。
手工操作的两个特点:
1.用户独占全机。不会出现因资源已被其他用户占用而等待的现象,但资源的利用率低。
2.CPU 等待手工操作。CPU的利用不充分。
阶段二:联机批处理系统
联机批处理系统,即作业的输入/输出由CPU来处理。主机与输入机之间增加一个存储设备——磁带,在运行于主机上的监督程序的自动控制下,计算机可自动完成:成批地把输入机上的用户作业读入磁带,依次把磁带上的用户作业读入主机内存并执行并把计算结果向输出机输出。完成了上一批作业后,监督程序又从输入机上输入另一批作业,保存在磁带上,并按上述步骤重复处理。监督程序不停地处理各个作业,从而实现了作业到作业的自动转接,减少了作业建立时间和手工操作时间,有效克服了人机矛盾,提高了计算机的利用率。
简单来说,联机批处理系统一次性可以录入多个用户指令、缩短了CPU等待的时间、提高了CPU的利用率。但是,在作业输入和结果输出时,主机的高速CPU仍处于空闲状态,等待慢速的输入/输出设备完成工作: 主机处于“忙等”状态。所以为了克服与缓解高速主机与慢速外设的矛盾,提高CPU的利用率,就引入了我们的第三阶段。脱机批处理系统
阶段三:脱机批处理系统
脱机批处理系统,即输入/输出脱离主机控制。缺点是主机内存中每次只能存放一道作业,每当他运行期间发出I/O请求之后,I/O进行运行,这个时候CPU处于空闲状态。
多道技术
多道技术就时计算机在单核的情况下实现并发的效果。必备知识:
并发:看起来像同时运行的就可以称之为并发
并行:真正意义上的同时执行(单核计算机肯定不能实现并行,但是可以实现并发。)
多道技术,其实就是时间和空间上的复用。
空间上的复用:多个任务共用一套计算机硬件。
时间上的复用:就是切换+保存状态。
1.当一个程序遇到IO操作时候,操作系统会剥夺该程序的CPU执行权限,作用:提高了CPU的利用率,并且也不影响程序的执行效率。
2.当一个程序长时间占用CPU的时候,操作系统也会剥夺该程序的CPU执行权限。作用:降低了程序的执行效率(原本时间+切换时间)。
进程理论
进程和程序的区别:程序就是一堆躺在硬盘上的代码,是“死”的。进程则表示程序正执行的过程,是“活”的。而进程就是为了更加精确的描述出程序的实际状态。
进程的调度:
1.先来先服务调度算法。缺点是对短作业任务不太友好
2.短作业优先调度算法。缺点是多长作业任务不太友好
3.时间片轮转法与多级反馈队列。
3.1 时间片轮转法:先公平的将CPU分给每个人执行
3.2 多级反馈队列:根据作业长短的不同再合理分配CPU执行时间
两个重要概念
并发与并行
并发
在操作系统中,是指一个时间段中有几个程序都处于已启动到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻电商只有一个程序在处理机上运行。简言之,是只系统具有处理多个任务的能力。
并行
当系统有一个以上CPU时,则线程的操作有可能非并发。当一个CPU执行一个线程是,另一个CPU可以执行另一个线程,两个线程互不抢占CPU资源,可以同时进行,这种方式我们称之为并行(Parallel)。简言之,是指系统具有用时处理多个任务的能力。
高并发就是,可以同时服务多个用户。高并行就是计算机拥有多个CPU。
同步与异步
同步
提交完任务之后原地等待任务的返回结果,期间不做任何事情。
异步
提交完任务之后不愿地等待任务的结果,直接去做其他事情,有结果自动提醒。
阻塞与非阻塞
阻塞
只要有一丁点阻塞,就是阻塞IO。比如一个线程占用了临界区资源,那么其它所有需要这个资源的线程就必须在这个临界区中进行等待,等待会导致线程挂起。这种情况就是阻塞,此时,如果占用资源的线程一直不愿意释放资源,那么其它所有阻塞在这个临界区上的线程都不能工作。
非阻塞
非阻塞允许多个线程同时进入临界区。
进程的三状态:
就绪态:程序之进入运行态之前肯定要处于就绪态
运行态:程序被CPU执行着
阻塞态:程序执行过程中有IO操作
图解:
同步异步与阻塞非阻塞结合
阻塞与同步,非阻塞和异步的定义是不一样的。同步和异步的区别是遇到IO请求是否等待。阻塞和非阻塞的区别是数据没准备好的情况下是否立即返回。同步可能是阻塞的,也可能是非阻塞的,而非阻塞的有可能是同步的,也有可能是异步的。
简单来说就是同步与异步是用来描述任务的提交方式的。阻塞与非阻塞是用来描述任务的执行状态的。虽然两者不同概念,但是可以结合。
原创文章,作者:kirin,如若转载,请注明出处:https://blog.ytso.com/245745.html