网络编程与并发编程(总结)
网络编程
软件开发架构
c/s
client
server
b/s
broswer
server
ps:b/s本质上也是c/s架构
OSI七层协议
应用层
表示层
会话层
传输层
网络层
数据链路层
物理连接层
物理连接层
传输二进制的数据
数据链路层(以太网协议)
1.规定了二进制数据的分组依据
2.规定了每台计算机都必须有一块网卡
ps:网卡上刻有12位16进制的编号
前6位厂商编号
后6位流水线编号
编号:mac地址 唯一标识一台计算机
1+2=以太网协议
基于以太网协议通信
通信基本靠吼
广播
单播
广播风暴
交换机
让连接了交换机的计算机实现彼此之间互联
局域网
构成互联网的基本单位
ps:以太网协议不能跨局域网传输
路由器
连接不同局域网
网关
网络层
IP协议
规定了任何接入互联网的计算机都必须有一个IP地址
ip地址:点分十进制
版本:IPV4 IPV6
最小:0.0.0.0
最大:255.255.255.255
ip地址是动态分配的 不是一成不变的
arp协议
根据ip地址解析对方的mac地址
传输层
TCP UDP
基于端口工作的协议
端口(port):唯一标识一台计算机上的某一个应用程序,port号是动态分配的并且是有限
端口号的范围:0~65535
0~1024通常是操作系统需要使用的端口号
建议你使用8000之后的端口
django默认端口 8000
flask默认端口 5000
redis 6379
Mysql 3306
应用层
HTTP协议
FTP协议
IP+PORT能够唯一标识一台联入互联网的计算机上的某一个应用程序
TCP协议
三次握手
四次挥手
TCP之所以可靠的原因在于:反馈机制
发送消息后必须等到对方回应 才会将内存中的数据清除
UDP协议
数据报协议
无需双向通道
数据是不安全的
TCP类似于打电话
UDP类似于发短信
如何解决TCP的粘包问题
基于TCP实现大文件的上传
客户端:
1.先生成一个字典
2.制作字典的报头
3.发送字典的报头
4.发送字典数据
5.发送真实数据
服务端
1.接收固定长度的报头
2.解析获取字典的长度
3.接收字典数据
4.解析获取真实数据信息
5.接收真实数据
socketserver
能够实现并发的效果
并发:看上去像同时运行的
并行:真正意义上的同时执行
ps:单核的计算机绝对不可能实现并行 但是可以实现并发
并发编程
操作系统发展史
基于单核研究
多道技术
1.空间上的复用
多个程序公用一套计算机硬件
2.时间上的复用
切换+保存状态
例子:洗衣 烧水 做饭
切换
1.程序遇到IO操作系统会立刻剥夺走CPU的执行权限
IO:input,sleep,accept,recv...阻塞 日常生活中使用软件通常都是IO密集型
2.当你的程序长时间占用CPU的时候也会被操作系统剥夺走cpu的执行权限
进程理论
进程调度
时间片轮转法+多级反馈队列
进程三状态图
ps:程序不会立刻进入运行态 都会现在就绪态等待cpu的执行
同步异步:指的是任务的提交方式
同步:提交任务之后原地等待任务的返回结果 期间不做任何事
异步:提交任务之后立刻执行下一行代码 不等待任务的返回结果
>>> 结果的获取使用异步回调机制
阻塞非阻塞:指的是程序的运行状态
阻塞:阻塞态
非阻塞:就绪态或者是运行态
创建进程的两种方式
使用使用Process实例化
继承Process类重写run方法
ps:windows在开启进程的时候必须在__main__代码块内,因为windows是以模块导入的方式从上执行代码
什么是进程:
正在运行的程序
一个进程对应到内存中就是一块独立的内存空间
join方法
主进程等待某个指定的子进程运行结束,不影响其他子进程的运行
进程对象及其他方法
current_process().pid
os.getpid
os.getppid
terminate()
is_alive()
守护进程
daemon
这一句化必须在start之前使用
进程间数据是隔离的
互斥锁(抢票实例)
多个程序操作用一份数据的时候会出现数据错乱的现象
如何避免:
将操作数据的部分加锁处理
会将并发变成串行牺牲了效率但是保证了数据的安全
抢锁
acquire()
释放锁
release()
例子:抢厕所
进程间通信IPC机制
生产者消费者模型
线程理论
创建线程的两种方式
线程间通信
守护线程
线程对象及其他方法