软件开发架构
 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()
 例子:抢厕所
 抢票实例
转载于:https://www.cnblogs.com/Ryan-Yuan/p/11339991.html