本周总结

本周总结

软件开发架构

1.C/S架构
	Client:客户端
    Server:服务端
2.B/S架构
	Browser:浏览器
    Server:服务器/端
    ps:B/S架构本质还是C/S架构

架构总结

ATM:三层架构
选课系统:三层架构
本质也属于软件开发架构的范畴

软件开发设计的大方向>>>:统一接口

网络编程前戏

1.什么是网络编程
	基于网络编写代码 能够实现数据的远程交互
2.学习网络编程的目的
	能够开发cs架构的软件
3.网络编程的起源
	"""
	最早起源于美国军事领域
		想实现计算机直接数据的交互
			最早的时候只能用硬盘拷贝
			之后发明了网络编程
	"""
4.网络编程必备条件
	数据的远程交互
    ps:实现数据的远程交互必备的基础条件是物理连接介质

OSI七层协议简介

'''
OSI七层协议:规定了所有的计算机在远程数据交互的时候必须经过相同的处理流程,在制造过程中必须拥有相同的功能硬件
'''
应用层
表示层
会话层
传输层
网络层
数据链路层
物理连接层
ps:应,表,会,传,网,数,物

OSI七层协议之物理层

主要用于确保计算机直接的物理连接介质 接收数据(bytes类型,二进制)

OSI七层协议之链路层

2.以太网协议
	规定了计算机在出厂的时候都必须有一块网卡 网卡上有一串数字
    该数字相当于是计算机的身份证号码是独一无二的
    该数字的特征:12位16进制数据
    前6位产商编号 后6位流水线号
    该数字也称为:以太网地址/MAC地址

网络相关专业名词

1.交换机
	能够将所有接入交换机的计算机彼此互联起来
2.广播
	首次查找接入同一个交换机的其他计算机 需要朝交换机里面吼一嗓子
3.单播
	首次被查找的计算机回应查找它的计算机 并附带自己的mac地址
4.广播风暴
	接入同一台交换机的多台计算机同时发广播
5.局域网
	可以简单的理解为有单个交换机组成的网络
    在局域网内可以直接使用mac地址通信
6.广域网
	可以简答的理解为范围更大的局域网
7.互联网
	由所有的局域网,广域网连接到一起形成的网络
8.路由器
	不同的局域网计算机之间是无法直接实现数据交互的 需要路由器连接

OSI七层协议之网络层

IP协议:规定了所有接入互联网的计算机都必须有一个IP地址 类似于身份证号
	mac地址是物理地址可以看成永远无法修改
    IP地址是动态分配的 不同的场所IP是不同的
	IPV4:点分十进制
    IPV6:能够给地球上每一粒沙分一个IP地址

OSI七层协议之传输层

PORT协议(端口协议)
	用来标识一台计算机上面的某一个应用程序
    范围:0-65535
URL:统一资源定位符(网址)
	网址本质是有IP和PORT组成的!!!
IP + PORT:能够定位全世界独一无二的一台计算机上面的某一个应用程序

黏包现象

1.服务端连续执行三次recv
2.客户端连续执行三次send
问题:服务端一次性接收到了客户端三次的消息 该现象称为'黏包现象'

黏包现象产生的原因
	1.不知道每次的数据到底多大
    2.TCP也称为流式协议:数据像水流一样绵绵不绝没有间隔(TCP会针对数据量较小且发送间隔较短的多条数据一次性合并打包发送)
    
避免黏包现象的核心思路/关键点
	如何明确即将接收的数据具体有多大
ps:如何将长度变化的数据全部制作成固定长度的数据

struct模块

import struct
# 将数据打包成固定的长度
info = b'hello big boy'
print(len(info))  # 数据真实的长度(bytes) 13
res = struct.pack('i', len(info))  # 将数据打包成固定的长度 i是固定的打包模式
print(len(res))  # 打包之后的长度为(bytes) 4  报头

UDP协议

1.UDP服务端和客户端'各自玩各自的'
2.UDP不会出现多个消息发送合并

并发编程理论

操作系统发展史
	1.穿孔卡片阶段
     2.联机批处理系统
        3.脱机批处理系统

多道技术

单道技术
	所有的程序排队执行 过程中不能重合
多道技术
	利用空闲时间提前准备其他数据 最大化提升CPU利用率

多道技术详细
	1.切换
  	计算机的CPU在两种情况下会切换(不让你用 给别人用)
      2.保存状态
  	CPU每次切换走之前都需要保存当前操作的状态 下次切换回来基于上次的进度继续执行

进程理论

进程与程序的区别
	程序:一堆死代码(还没有被运行起来)
	进程:正在运行的程序(被运行起来了)
    
进程的调度算法(重要)
	1.FCFS(先来先服务)
  	对短作业不友好
	2.短作业优先调度
  	对长作业不友好
	3.时间片轮转法+多级反馈队列(目前还在用)
  	将时间均分 然后根据进程时间长短再分多个等级
    等级越靠下表示耗时越长 每次分到的时间越多 但是优先级越低

进程的并行与并发

并行
	多个进程同时执行 必须要有多个CPU参与 单个CPU无法实现并行
并发
	多个进程看上去像同时执行 单个CPU可以实现 多个CPU肯定也可以
    
### 进程的三状态
就绪态
	所有的进程在被CPU执行之前都必须先进入就绪态等待
运行态
	CPU正在执行
阻塞态
	进程运行过程中出现了IO操作 阻塞态无法直接进入运行态 需要先进入就绪态

传输层之TCP与UDP协议

TCP与UDP都是用来规定通信方式的

1.TCP协议(重要)
	三次握手链接
    1.TCP协议也称为可靠协议(数据不容易丢失)
    造成数据不容易丢失的原因不是因为有双向通道 而是因为有反馈机制
    给对方发消息之后会保留一个副本 直到对方回应消息收到了才会删除
    否则会在一定的时间内反复发送
    2.洪水攻击
    同一时间有大量的客户端请求建立链接 会导致服务端一致处于SYN_RCVD状态
    3.服务端如何区分客户端建立链接的请求
    可以对请求做唯一标识
	四次挥手断链接
    1.四次不能合并为三次
    因为中间需要确认消息是否发完(TIME_WAIT)
    
2.UDP协议
也称为数据报协议、不可靠协议

应用层

应用层相当于是程序员自己写的应用程序 里面的协议非常的多
常见的有:HTTP、HTTPS、FTP

socket模块

socket也叫套接字
	基于文件类型的套接字家族(单机)
    AF_UNIX
    基于网络类型的套接字家族(联网)
    AF_INET

socket代码简介

'''服务器端'''
import socket

# 1.产生一个socket对象并指定采用的通信版本和协议(TCP)
server = socket.socket()  # 括号内不写参数 默认就是TCP协议 family=AF_INET基于网络的套接字 type=SOCK_STREAM流式协议即TCP
# 2.绑定一个固定的地址(服务端必备的条件)
server.bind(('127.0.0.1', 8080))  # 127.0.0.1为本地回环地址 只有自己的电脑可以访问
# 3.设立半连接池(暂且忽略)
server.listen(5)
# 4.等待接客
sock, addr = server.accept()  # return sock,addr 三次握手
print(sock, addr)  # sock就是双向通话 addr就是客户端地址
# 5.服务客人
date = sock.recv(1024)  # 接收客户端发送过来的消息 1024字节
print(date.decode('utf8'))
sock.send('尊敬的客人 您说什么就是什么 一切按照您的要求来'.encode('utf8'))  # 给客户端发送消息 注意消息必须是bytes类型
# 6.关闭双向通道
sock.close()  # 四次挥手
# 7.关闭服务端
server.close()

'''客户端'''
import socket


# 1.生成socket对象指定类型和协议
client = socket.socket()
# 2.通过服务端的地址链接服务端
client.connect(('127.0.0.1', 8080))
# 3.直接给服务端发送消息
client.send('大爷有钱 把你们店最好的给我叫出来'.encode('utf8'))
# 4.接收服务端发送过来的消息
date = client.recv(1024)
print(date.decode('utf8'))
# 5.断开与服务端的链接
client.close()

代码优化

1.聊天内容自定义
	针对消息采用input获取
2.让聊天循环起来
	将聊天的部分用循环包起来
3.用户输入的消息不能为空
	本质其实是两边不能都是recv或者send 一定是一方收一方发
    用try包裹起来

半连接池的概念

server.listen(5)  # 半连接池

当有多个客户端来链接的情况下 我们可以设置等待数量(不考虑并发问题)
假设服务端只有一个人的情况下

同步与异步

用来表达任务的提交方式

同步
	提交任务之后原地等待任务的返回结果 期间不做任何事
异步
	提交完任务之后不原地等待任务的返回结果 直接去做其他事 有结果自动通知

阻塞与非阻塞

用来表达任务的执行状态

阻塞
	阻塞态
非阻塞
	就绪态,运行态

综合使用

同步阻塞
	效率最低
同步非阻塞
异步阻塞
异步非阻塞
	效率最高

创建进程的多种方式

1.鼠标双击软件图标
2.python代码创建进程
windows
    以导入模块的形式创建进程
    
from multiprocessing import Process
import time


def task(name):
    print('task is running', name)
    time.sleep(1)
    print('task is over', name)
    
    
if __name__ == '__main__':
    # p1 = Process(target=task, args=('jason',))  # 位置参数
    p1 = Process(target=task, kwargs={'name': 'jason123'})  # 关键字传参
    p1.start()  # 异步 告诉操作系统创建一个新的进程 并在该进程中执行task函数
    task('kevin')  # 同步
    print('主')

进程间数据隔离

同一台计算机上的多个进程数据是严格意义上的物理隔离(默认情况下)
'''子进程与主进程之间的数据是分开的(默认情况下)'''

进程的join方法

    '''join()  主进程代码等待子进程代码运行结束再执行'''
     '''同时进行则会同时异步操作,等待最长时间那个即可继续执行主进程'''

IPC机制

IPC:进程间通信
消息队列:存储数据的地方 所有人都可以存 也都可以取

from multiprocessing import Queue

q = Queue(3)  # 括号内可以指定存储数据的个数
# 往消息队列中存放数据
q.put(111)
print(q.full())  # 判断队列是否已满 False
q.put(222)
q.put(333)
print(q.full())  # 判断队列是否已满 True
# 从消息队列中取出数据
print(q.get())  # 111
print(q.get())  # 222
print(q.empty())  # 判断队列是否为空 False
print(q.get())  # 333
print(q.empty())  # 判断队列是否为空 True
# print(q.get())  # 如果队列中没有数据,他就会一直等着,直到拿到数据
print(q.get_nowait())  # 如果队列中没有数据,直接报错,不会等待

生产者消费者模型

该模型除了有生产者和消费者之外还必须有消息队列

进程对象的多种方法

1.如何查看进程号
from multiprocessing import Process, current_process
import os

current_process().pid
os.getpid()
os.getppid()  # 获取当前程序的主进程号
2.终止进程
	p1.terminate()
    3.判断进程是否存活
	p1.is_alive()

守护进程

守护进程会随着守护的进程结束而立刻结束

僵尸进程与孤儿进程

僵尸进程
	进程执行完毕后并不会立刻销毁所有的数据 会有一些信息短暂保留下来
    比如进程号,进程执行时间,进程消耗功率等给父进程查看
    ps:所有的进程都会变成僵尸进程
孤儿进程
	子进程正常运行 父进程意外死亡 操作系统针对孤儿进程会派遣福利院管理

多进程数据错乱问题

        
"""
多进程操作数据很可能会造成数据错乱>>>:互斥锁
	互斥锁
		将并发编程串行 牺牲了效率但是保障了数据的安全
"""
posted @ 2022-11-20 20:16  lsumin  阅读(15)  评论(0编辑  收藏  举报