把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end
旋转立方体
旋转立方体end

网络编程知识点

osi五层协议

一、物理连接层
  传输二进制数据

二、数据链路层(以太网协议)
  1、规定了二进制数据的分组依据
  2、规定了每台计算机都必须有一块网卡
  ps:网卡上刻有12位16进制编号
    前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号是动态分配并且有限的
  端口号范围:0~65535
  0~1024通常是操作系统需要使用的端口号
  建议使用8000之后的端口
  Django默认端口:8000
  flask默认端口:5000
  Redis默认端口:6379
  MySQL默认端口:3306

五、应用层
  HTTP协议 FTP协议


  TCP协议
  三次握手
  四次挥手
  TCP之所以可靠地原因在于反馈机制
  发送消息后必须等到对方回应,才会将内存中的数据清除

  UDP协议
  数据报协议

  无需双向通道
  数据不安全

  客户端:
  1、生成字典
  2、制作字典报头
  3、发送字典报头
  4、发送字典数据
  5、发送真是数据
  服务端
  1、接收固定长度报头
  2、解析获取字典长度
  3、接收字典数据
  4、解析获取真是数据信息
  5、接收真实数据

  基于TCP实现大文件上传

socketserver
  实现并发效果
  并发:看上去同时运行  
  并行:真正意义上同时运行

并发编程
操作系统发展史
基于单核研究
多道技术
1、空间上的复用
多个程序共用一套计算机硬件
2、时间上的复用
切换+保存状态

切换
1、程序遇到IO操作系统会立刻剥夺走CPU的执行权限
IO:input,sleep,accept,recv。。。
日常生活中使用软件都是IO密集型
2、程序长时间占用CPU时也会被操作系统剥夺走CPU执行权限

进程理论
进程调度
时间片轮转发+多级反馈队列

进程三状态图
ps:程序不会立刻进入运行态,都会在就绪态等待CPU执行

同步异步:指的是任务的提交方式
同步:提交任务后原地等待任务结果
异步:提交任务后立刻执行下一行代码 不等待任务的返回结果

阻塞非阻塞:指的是程序的运行状态
阻塞:阻塞态
非阻塞:就绪态或运行态

创建进程的两种方式
使用process实例化
继承process类重写run方法
ps:windous在开启进程的时候必须在__main__代码块内,因为Windows是以模块导入的方式执行代码

什么是进程:
正在运行的程序
一个进程对应到内存中就是一块独立的内存空间

join方法
主进程等待某个指定的子进程运行结束,不影响其他子进程的运行

进程对象及其他方法
current_process().pid
os.getpid()
os.getppid()
terminate()
is_alive()

守护进程
daemon
这句话必须在start之前使用

进程间数据时隔离的

互斥锁
多个程序操作同一份数据时会出现程序错乱的现象
避免方法
将操作数据的部分加锁处理
将并发变成串行,牺牲效率,保证数据安全

抢锁
acquire()
释放锁
release()

抢票实例

什么是线程
进程:资源单位
线程:执行单位

每个进程都自带一个线程,线程执行,进程提供执行所需资源

内存比喻为工厂
进程相当于车间
线程相当于流水线


开进程
1、申请内存空间
2、拷贝代码

开进程
一个进程内可以开多个线程,线程之间数据共享
开启线程的开销远远小于开启进程的开销


队列:先进先出
堆栈:先进后出

from multiprocessing import Queue

q = Queue(5) # 括号内可以传参数,表示队列最大值

队列满了后再放入数据会原地等待,直到队列中有数据被取走(阻塞态)
队列中的数据取完后再取,程序会阻塞,直到添加新数据

q.full()判断队列是否被塞满
q.empty()判断队列中数据是否被取完
q.get_nowait()取值,没有值不等待直接报错

都不适用于多进程的情况

生产者:生产/制造数据的
消费者:处理数据的

 

posted @ 2019-08-12 15:21  远翔、  阅读(216)  评论(0编辑  收藏  举报
浏览器标题切换
浏览器标题切换end