周末总结
1.软件开发架构
2.网络编程
3.OSI七层协议
4.socket模块
5.黏包现象
6.并发编程理论
7.多道技术
8.进程理论
9.创建进程的方式
10.进程的join方式
11.进程对象的多种方法
1.软件开发架构
1.C/S架构
Client:客户端
Server:服务端
2.B/S架构
Browser:浏览器
Server:服务器/端
C/S架构
优势:不同公司的客户端由不同公司独立开发,可以高度定制化客户端功能
劣势:需要下载才能使用
B/S架构
优势:不用下载直接访问
劣势:无法高度定制化,并且需要遵守很多规则
2.网络编程
1.网络编程是基于网络编写代码,能够实现数据的远程交互
2.学习网络编程的目的是为了能够开发cs架构的软件
3.网络编程的起源
最早起源于美国军事领域,想实现计算机之间数据的交互
最早的时候用硬盘拷贝太麻烦,之后发明了网络编程
4.网络编程必备条件
数据的远程交互
1.早期的电话 电话线
2.早期的大屁股电脑 网线
3.笔记本电脑、移动电话 网卡
实现数据的远程交互必备的基础条件是物理连接介质
3.OSI七层协议
OSI七层协议规定了所有的计算机在远程数据交互的时候必须经过相同的处理流程、在制造过程中必须拥有相同的功能硬件
OSI七层协议:应用层、表示层、会话层、传输层、网络层、数据链路层、物理连接层
比较常见的是整合之后五层还有四层
整合后的五层:应用层、传输层、网络层、数据链路层、物理连接层
整合后的四层:应用层、传输层、网络层、网络接口层
接收网络消息,数据由下往上传递
发送网络消息,数据由上往下传递
4.socket模块
如果我们需要编写基于网络进行数据交互的程序,意味着我们需要自己通过代码来控制我们之前所学习的OSI七层,比较麻烦,相当于让我们写操作系统,我们可以使用socket
socket类似于操作系统,封装了丑陋复杂的接口,提供了简单快捷的接口
socket也叫套接字 基于文件类型的套接字家族(单机) AF_UNIX
基于网络类型的套接字家族(联网) AF_INET
5.黏包现象
服务端一次性接收到了客户端三次的消息,该现象称为黏包现象
黏包现象产生的原因
1.不知道每次的数据到底多大
2.TCP也称为流式协议:数据像水流一样绵绵不绝没有间隔(TCP会针对数据量较小且发送间隔较短的多条数据一次性合并打包发送)
避免黏包现象的核心思路:如何确定接收的数据具体有多大
import struct
data_dict = {
'file_name': 'xxx老师教学.avi',
'file_size': 123132131232342342423423423423432423432,
'file_info': '内容精彩 不要错过',
'file_desc': '名家大作 私人珍藏'
}
import json
data_json = json.dumps(data_dict)
print(len(data_json.encode('utf8'))) # 真实字典的长度 228
res = struct.pack('i', len(data_json.encode('utf8')))
print(len(res))
黏包问题解决方案
客户端
1.制作真实数据的信息字典(数据长度、数据简介、数据名称)
2.利用struct模块制作字典的报头
3.发送固定长度的报头(解析出来是字典的长度)
4.发送字典数据
5.发送真实数据
服务端
1.接收固定长度的字典报头
2.解析出字典的长度并接收
3.通过字典获取到真实数据的各项信息
4.接收真实数据长度
6.并发编程理论
计算机中真正干活的是CPU
操作系统发展史
1.穿孔卡片阶段
计算机很庞大,使用很麻烦,一次只能给一个人使用,期间很多时候计算机都不工作
好处:独占计算机,比较自由,不用排队
坏处:计算机利用率太低,浪费资源
2.联机批处理系统
提前使用磁带一次性录入多个程序员编写的程序,然后交给计算机执行
CPU工作效率有所提升,不用反复等待程序录入
3.脱机批处理系统
提升了CPU的利用率
7.多道技术
单道技术:所有的程序排队执行,过程中不能重合
多道技术:利用空闲时间提前准备其他数据,最大化提升CPU利用率
多道技术详细
切换:计算机的CPU在两种情况下会切换,切换给其他人用
1.程序有IO操作
输入\输出操作
input、time.sleep、read、write
2.程序长时间占用CPU,比较浪费,我们得让多个程序都能被CPU运行一下
保存状态
CPU每次切换走之前都需要保存当前操作的状态,下次切换回来基于上次的进度继续执行
8.进程理论
进程与程序的区别
程序:没有被运行起来的一堆死代码
进程:正在运行的程序
进程的调度算法(重要)
1.FCFS,先来先服务,对短作业不友好
2.短作业优先调度,对长作业不友好
3.时间片轮转法+多级反馈队列(目前还在用)
将时间均分,然后根据进程时间长短分为多个等级,等级越靠下表示耗时越长,每次分到的时间越多,但是优先级越低
并行:多个进程同时执行,必须要有多个CPU参与,单个CPU无法实现并行
并发:多个进程看上去像同时执行,单个CPU可以实现,多个CPU也可以
就绪态:所有的进程在被CPU执行之前都必须先进入就绪态等待
运行态:CPU正在执行
阻塞态:进程运行过程中出现了IO操作 阻塞态无法直接进入运行态 需要先进入就绪态
同步:提交完任务之后在原地等待任务的返回结果,期间不做任何事
异步:提交完任务之后不在原地等待任务的返回结果,直接去做其他事,有结果自动通知
阻塞:阻塞态
非阻塞:就绪态、运行态
综合使用
同步阻塞
同步非阻塞
异步阻塞
异步非阻塞
9.创建进程的方式
1.鼠标双击软件图标
2.python代码创建进程
from multiprocessing import Process
import time
def task(name):
print('task is running',name)
time.sleep(3)
print('task is over',name)
在不同的操作系统中创建进程底层原理不一样
windows:以导入模块的形式创建进程
linux/mac:以拷贝代码的形式创建进程
if __name__ == '__main__':
p1 = Process(target=task, args=('jason',)) # 位置参数
p1 = Process(target=task, kwargs={'name':'jason123'}) # 关键字参数
p1.start() # 异步 告诉操作系统创建一个新的进程 并在该进程中执行task函数
task() # 同步
print('主')
from multiprocessing import Process
import time
class MyProcess(Process):
def __init__(self, name, age):
super().__init__()
self.name = name
self.age = age
def run(self):
print('run is running', self.name, self.age)
time.sleep(3)
print('run is over', self.name, self.age)
if __name__ == '__main__':
obj = MyProcess('jason', 123)
obj.start()
print('主')
10.进程的join方式
from multiprocessing import Process
import time
def task(name, n):
print('%s is running' % name)
time.sleep(n)
print('%s is over' % name)
if __name__ == '__main__':
p1 = Process(target=task, args=('jason1', 1))
p2 = Process(target=task, args=('jason2', 2))
p3 = Process(target=task, args=('jason3', 3))
# p.start() # 异步
'''主进程代码等待子进程代码运行结束再执行'''
# p.join()
# print('主')
start_time = time.time()
p1.start()
p1.join()
p2.start()
p2.join()
p3.start()
p3.join()
# p1.join()
# p2.join()
# p3.join()
print(time.time() - start_time) # 3秒多
11.进程对象的多种方法
1.如何查看进程号
from multiprocessing import Process, current_process
current_process()
current_process().pid
import os
os.getpid()
os.getppid()
2.终止进程
p1.terminate()
ps:计算机操作系统都有对应的命令可以直接杀死进程
3.判断进程是否存活
p1.is_alive()
4.start()
5.join()
标签:总结,__,name,11.20,本周,print,time,进程,CPU
From: https://www.cnblogs.com/yueq43/p/16909004.html