socket套接字之UDP协议

在我们创建socket对象的时候,默认是使用TCP协议的,如果想要使用UDP协议,需要给个参数。

server = socket.socket(type=socket.SOCK_DGRAM)

如果使用了UDP协议,那么它的一些方法也会发生变化。

举例

服务端(Server)

import socket
server = socket.socket(type=socket.SOCK_DGRAM)
# 绑定ip地址和端口号不变
server.bind(('127.0.0.1', 8080))
# 接收消息的方法改变了,不与客户端进行连接就直接获取消息
msg, addr = server.recvfrom(1024)
print('来自客户端:', msg.decode('utf8'))
print('客户端地址:', addr)
# 发送消息的方法改变了,根据客户端地址发送
server.sendto('来自服务端的消息'.encode('utf8'), addr)

客户端(Client)

import socket
client = socket.socket(type=socket.SOCK_DGRAM)
# 可以先写个变量存储服务端地址,后续用起来方便
server_addr = ('127.0.0.1', 8080)
# 发送消息的方法改变了,根据服务端地址发送
client.sendto('来自客户端的消息'.encode('utf8'), server_addr)
# 接收消息的方法改变了,可以获取服务端的消息和地址
msg, addr = client.recvfrom(1024)
print('来自服务端:', msg.decode('utf8'))
print('服务端地址:', addr)

由于使用的是UDP协议,不会建立双向通道,所以可以启动多个客户端给服务端发送消息,服务端都会接收到,谁先发送消息服务端就会优先收到,并且使用UDP协议是不会发生黏包问题的。

操作系统的发展史

手工操作

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

优点:用户独占全机,不会出现因资源已被其他用户占用而等待的现象。

缺点:CPU的利用不充分,资源的利用率低。

批处理系统

批处理系统:加载在计算机上的一个系统软件,在它的控制下,计算机能够自动地、成批地处理一个或多个用户的作业(这作业包括程序、数据和命令)。

联机批处理系统

主机与输入机之间增加一个存储设备——磁带,在运行于主机上的监督程序的自动控制下,计算机可自动完成:成批地把输入机上的用户作业读入磁带,依次把磁带上的用户作业读入主机内存并执行并把计算结果向输出机输出。完成了上一批作业后,监督程序又从输入机上输入另一批作业,保存在磁带上,并按上述步骤重复处理。

优点:不停地处理各个作业,从而实现了作业到作业的自动转接,减少了作业建立时间和手工操作时间,提高了计算机的利用率。

缺点:在作业输入和结果输出时,主机的高速CPU仍处于空闲状态,等待慢速的输入/输出设备完成工作

脱机批处理系统

为克服与缓解高速主机与慢速外设的矛盾,在联机批处理系统的基础上增加一台不与主机直接相连而专门用于与输入/输出设备打交道的卫星机。

优点:主机不是直接与慢速的输入/输出设备打交道,而是与速度相对较快的磁带机发生关系,有效缓解了主机与设备的矛盾。主机与卫星机可并行工作,二者分工明确,可以充分发挥主机的高速计算能力。

缺点:每次主机内存中仅存放一道作业,每当它运行期间发出输入/输出(I/O)请求后,高速的CPU便处于等待低速的I/O完成状态,致使CPU空闲。

脱机批处理系统就是现代计算机核心部件的雏形。

总结:操作系统的发展史其实就是提升CPU利用率的过程

多道技术

首先多道技术的目的是为了提升CPU利用率,降低程序等待时间。

串行

在没有使用多道技术时,程序的执行是串行的——多个任务排队执行,上一个任务结束时才开始执行下一个任务,总耗时就是多个任务完整时间叠加。

多道

使用了多道技术后,计算机内存中会同时存放几道相互独立的程序,在一个程序执行过程中,利用空闲提前准备,缩短总的执行时间并且还能提高CPU利用率。

CPU在两种情况下会被拿走:

  1. 程序遇到IO操作,CPU自动切走运行其他程序。
  2. 程序长时间占用CPU,系统发现之后也会强行切走CPU,保证其他程序也可以使用。

进程理论

程序是一堆没有被执行的代码(死的),进程是正在运行的程序(活的)。有了进程这个概念就可以更加精确的描述出一些实际状态。

进程调度算法发展史

1.先来先服务

那个程序先执行就会先运行完这个程序,然后再去执行下一个,如果第一个进程需要100h才能执行完毕,那么第二个进程就需要等待100h,所以这个算法对短作业不太友好。

2.短作业优先

会优先执行那些耗时短的进程。如果短作业有好几个,长作业就会到最好执行,所以对长作业不太友好。

3.时间片轮转法与多级反馈队列

时间片轮转法:先公平的将CPU分给每个人执行。

多级反馈队列:根据作业长短的不同再合理分配CPU执行时间。

总的来说,进程调度算法的目的就是为了能够让单核的计算机也能够做到运行多个程序。

并发与并行

并发

并发是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。

简单的来说就是程序看上去像同时在执行就可以称之为是并发。

并行

并行是指在同一个时间段内,两个或多个程序执行,有时间上的重叠,必须同一时间同时运行才可以称之为并行。单核计算机肯定不能实现并行,必须要有多个CPU才能实现并行的效果。

拓展:高并发与高并行

高并发:如果我说我们写的软件可以支持1个亿的并发量,那么一个亿的用户来了之后都可以感觉到自己被服务着。

高并行:如果我说我们写的软件可以支持1个亿的并行量,这种明显是不可能的,这句话的言外之意就是计算机有一亿个CPU,这是目前做不到的。

同步与异步

同步指的是提交完任务之后原地等待任务的返回结果,期间不做任何事情。比如我喊你吃饭,你没有听到我就一直喊,喊道你回应我为止。

异步指的是提交完任务之后不愿地等待任务的结果,直接去做其他事情,有结果自动提醒。比如我喊你吃饭,我就去饭店了,不管你来不来。

阻塞与非阻塞

一个进程是有着三个状态的。

就绪态:程序之进入运行态之前肯定要处于就绪状态。

运行态:程序被CPU执行着。

阻塞态:程序执行过程中有IO操作,程序会等待。

阻塞就是处于阻塞态,非阻塞就是处于就绪态和运行态,所以如果想要尽可能的提升程序执行效率,就要想办法让我们的程序一直处于就绪态和运行态,就是不要有IO操作。

同步异步与阻塞非阻塞总结

同步异步是用来描述任务的提交方式,阻塞非阻塞是用来描述任务的执行状态,所以我们可以结合出四种情况:

同步阻塞:相当于在银行排队办理业务,期间不做任何事。

同步非阻塞:相当于银行排队办理业务,期间喝水吃东西,但是人还在队列中

异步阻塞:相当于通过银行叫号方式等待办理业务,等待时在椅子上坐着,但是不做任何事。

异步非阻塞:相当于通过银行叫号方式等待办理业务,等待时在椅子上坐着,期间喝水吃东西办公。这个状态就是程序运行的极致。

socket套接字补充、操作系统发展史、进程的更多相关文章

  1. linux网络环境下socket套接字编程(UDP文件传输)

    今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作! 在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中, ...

  2. linux网络编程-(socket套接字编程UDP传输)

    今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作! 在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中, ...

  3. 进程、线程、socket套接字-资源大小 & 切换代价

    另,进程 & 线程的很多知识可以看这里:http://www.cnblogs.com/charlesblc/p/6135666.html 今天查了一下进程和线程的资源占用. 比如问:栈和堆的大 ...

  4. 网络编程初识和socket套接字

    网络的产生 不同机器上的程序要通信,才产生了网络:凡是涉及到倆个程序之间通讯的都需要用到网络 软件开发架构 软件开发架构的类型:应用类.web类 应用类:qq.微信.网盘.优酷这一类是属于需要安装的桌 ...

  5. 19 网络编程--Socket 套接字方法

    1.Socket(也称套接字)介绍 socket这个东东干的事情,就是帮你把tcp/ip协议层的各种数据封装啦.数据发送.接收等通过代码已经给你封装好了 ,你只需要调用几行代码,就可以给别的机器发消息 ...

  6. Socket(套接字) IP TCP UDP HTTP

    Socket(套接字) 阮老师的微博 (转)什么是套接字(Socket)? 应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问题.多个TCP连接或多个应用程序进 ...

  7. 网络编程基础之Socket套接字简单应用

    一.Socket套接字实现通信循环 所谓通信循环,简单理解就是客户端可以给服务端循环发送信息并获得反馈的过程. 1.基础版 通信循环的程序分为两部分,即两个python模块,分别为客户端.py和服务端 ...

  8. Linux之socket套接字编程20160704

    介绍套接字之前,我们先看一下传输层的协议TCP与UDP: TCP协议与UDP协议的区别 首先咱们弄清楚,TCP协议和UCP协议与TCP/IP协议的联系,很多人犯糊涂了,一直都是说TCP/IP协议与UD ...

  9. 进程间通信系列 之 socket套接字及其实例

    进程间通信系列 之 概述与对比   http://blog.csdn.net/younger_china/article/details/15808685  进程间通信系列 之 共享内存及其实例   ...

随机推荐

  1. PAT B1013 数素数

    输入样例: 5 27   输出样例: 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 解题思路: 从2开始 ...

  2. 搭建 SpringBoot 项目(前端页面 + 数据库 + 实现源码)

    SpringBoot 项目整合源码 SpringBoot 项目整合 一.项目准备 1.1 快速创建 SpringBoot 项目 1.2 项目结构图如下 1.3 数据表结构图如下 1.4 运行结果 二. ...

  3. Python入门-正则表达式

    正则匹配函数 # 需要先导入re模块 import re #字符串,匹配查找 info = "www baidu com" print("=======字符串自带find ...

  4. Ubuntu更换apt镜像源

    1. 手动更改 备份镜像源 cd /etc/apt cp sources.list sources.list.bak 修改镜像源 sudo vim sources.list # 复制粘贴下面镜像源,保 ...

  5. spring原始注解(value)-03

    本博客依据是是spring原始注解-02的代码 注入普通数据类型:@Value注解的使用 1.添加driver属性,使用value注解 @Service("userService" ...

  6. BUCK电路和BL8033使用记录

    我开始时用的是MPS的MP1584EN,这个芯片各方面都挺不错的.有次老大让我画个降压电路,看到用的是MP1584就说国外的芯片太贵,让我用上海贝岭的BL8033.BL8033确实很好用,虽然它没有1 ...

  7. mysql组提交

    当mysql开启binlog日志时,会存在一个内部XA的问题:事务在存储引擎层redo log的写入和binlog的写入一致性问题. mysql通过两阶段提交很好的解决了redo log和binlog ...

  8. Dockerfile 命令详解及最佳实践

    Dockerfile 命令详解 FROM 指定基础镜像(必选) 所谓定制镜像,那一定是以一个镜像为基础,在其上进行定制.就像我们之前运行了一个 nginx 镜像的容器,再进行修改一样,基础镜像是必须指 ...

  9. PostgreSQL与PostGIS安装使用时需要注意的坑

    最近些许繁忙,没有时间系统整理PostgreSQL和PostGIS的安装和使用方法.所以就简单记录一下遇到的坑. 1.找不到 libintl-9.dll 我安装的PostgreSQL版本是11.7,P ...

  10. HCNP Routing&Switching之MUX VLAN

    前文我们了解了代理ARP相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/16188230.html:今天我们再来聊一聊vlan隔离相关话题MUX VLA ...