软件开发架构
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()
例子:抢厕所
抢票实例
redis