2019-04-12-day031-进程基础
- 操作系统的发展历程
- 主要的人机矛盾是什么 : CPU的使用率
- 输入\输出数据和CPU计算没有关系
- 操作系统是怎么进化的
- 传统的纸带输入
- 磁带的存储降低了输入输出数据占用的时间,提高了CPU的利用率
- 多道操作系统的出现 : 提高了CPU的利用率,单纯的切换会浪费时间
- 一台计算机上同时可以出现多个任务
- 能够将多个任务所使用的资源隔离开
- 当一个任务遇到输入输出工作的时候能够让另一个任务使用CPU去计算
- 分时操作系统 : 降低了cpu的利用率,提高了用户的体验
- 时间片轮转
- 实时操作系统
- 操作精密仪器或者设备
- 实时交易类
- 操作系统的作用
- 在具体的应用与所有的硬件之间起到了一个协调管理的作用
- 负责分配计算机中所有的资源
- 主要的人机矛盾是什么 : CPU的使用率
- 输入输出 Input/Output
- 向内存输入 : read,recv,recvfrom,import,input
- 从内存输出 : write,send,sendto,print
CPU的工作效率和输入输出的工作效率差
- 并发和并行
- 多个程序交替在同一个cpu上被计算 并发
- 多个程序同时在多个cpu上被计算 并行
阻塞/非阻塞 - 阻塞 CPU不工作
- 非阻塞 CPU一直在工作
异步和同步 - 异步 :发布一个任务,不等待这个任务的结果就继续执行我的任务
- 同步 :发布一个任务,等待获取这个任务的结果之后才继续执行我的任务
同步阻塞/同步非阻塞/异步阻塞/异步非阻塞
- 进程和程序
- 进程就是运行中的程序
- 每一个进程在计算机中都有一个唯一的进程id,pid process id
- 进程 是计算机中资源分配的最小单位
- 三状态 : 就绪 运行 阻塞
- 线程 是计算机中能够被CPU调度的最小单位
- 是进程中的一个单位,它不能独立存在
举例
- 研究生 5min 没有io操作 15min
- 老教授 24h 没有io操作 24 + n分钟
- 研究生 3min 没有io操作 9min
- 短作业优先算法
- 先来先服务算法 FCFS
- 把CPU的时间分成很小的时间片
- 一会儿执行研究生A的任务,时间片到
- 执行老教授,时间片到
- 执行研究生B
课上代码
下载和校验
Server
# 认证 + 上传 + 下载 + 校验
import os
import sys
import json
import struct
import socket
import hashlib
upload_path = r'D:\PyCharmProject\s20\day31\下载和校验\upload'
def get_md5(usr,pwd):
md5 = hashlib.md5(usr.encode('utf-8'))
md5.update(pwd.encode('utf-8'))
return md5.hexdigest()
def pro_recv(conn):
num = conn.recv(4)
num = struct.unpack('i', num)[0]
str_dic = conn.recv(num).decode('utf-8')
dic = json.loads(str_dic)
return dic
def pro_send(conn,dic,pro = True):
bytes_dic = json.dumps(dic).encode('utf-8')
if pro:
len_bytes = struct.pack('i', len(bytes_dic))
conn.send(len_bytes)
conn.send(bytes_dic)
def login(conn):
dic = pro_recv(conn)
with open('userinfo', encoding='utf-8') as f:
for line in f:
user, pwd = line.strip().split('|')
if user == dic['user'] and pwd == get_md5(dic['user'], dic['passwd']):
return {'opt':'login','flag':True}
else:
return {'opt': 'login', 'flag': False}
def upload(dic,conn):
file_path = os.path.join(upload_path,dic['filename'])
with open(file_path,'wb') as f:
while dic['filesize']:
content = conn.recv(2048)
f.write(content)
dic['filesize'] -= len(content)
def download(dic,conn):
path = os.path.join(upload_path,dic['filename'])
if os.path.isfile(path):
# 文件存在,先发字典,再发文件
filesize = os.path.getsize(path)
dic = {'filesize':filesize,'exist':True}
pro_send(conn,dic)
with open(path,'rb') as f:
while filesize > 2048:
content = f.read(2048)
conn.send(content)
filesize -= len(content)
else:
content = f.read()
conn.send(content)
else:
# 文件不存在,先发字典,然后结束
dic = {'exist':False}
pro_send(conn, dic)
sk = socket.socket()
sk.bind(('127.0.0.1',9001))
sk.listen()
conn,_ = sk.accept()
ret = login(conn)
bytes_ret = json.dumps(ret).encode('utf-8')
conn.send(bytes_ret)
if ret['flag']:
while True:
dic = pro_recv(conn)
if hasattr(sys.modules[__name__],dic['operate']):
getattr(sys.modules[__name__],dic['operate'])(dic,conn)
else:
conn.close()
Client
import os
import json
import struct
import socket
download_path = r'D:\PyCharmProject\s20\day31\下载和校验\download'
def pro_send(sk,dic,pro = True):
bytes_dic = json.dumps(dic).encode('utf-8')
if pro:
len_bytes = struct.pack('i', len(bytes_dic))
sk.send(len_bytes)
sk.send(bytes_dic)
def pro_recv(sk,pro = True,num=1024):
if pro:
num = sk.recv(4)
num = struct.unpack('i', num)[0]
str_dic = sk.recv(num).decode('utf-8')
dic = json.loads(str_dic)
return dic
def upload(sk):
# 文件的上传,考虑是大文件,先发送文件信息,再发送文件内容
file_path = input('文件路径 :')
if os.path.isfile(file_path):
filename = os.path.basename(file_path)
filesize = os.path.getsize(file_path)
dic = {'filename':filename,'filesize':filesize,'operate':'upload'}
pro_send(sk,dic)
with open(file_path,'rb') as f:
while filesize > 2048:
content = f.read(2048)
sk.send(content)
filesize -= len(content)
else:
content = f.read()
sk.send(content)
print('上传成功')
else:
print('您要上传的文件不存在')
def download(sk):
filename = input('文件名 :')
# 要下载,并且先发送要下载文件的名字
dic = {'filename':filename,'operate':'download'}
pro_send(sk,dic)
# server回复:这个文件是否存在,文件的大小
ret = pro_recv(sk)
if ret['exist']:
file_path = os.path.join(download_path,filename)
# 根据文件大小来接收文件,收到的文件存储在download文件夹下的
with open(file_path, 'wb') as f:
while ret['filesize']:
content = sk.recv(2048)
f.write(content)
ret['filesize'] -= len(content)
print('下载成功')
else:
print('您要下载的文件不存在')
# def login():
# username = input('用户名 :')
# password = input('密 码:')
# dic = {'user': username, 'passwd': password, 'operate': 'login'}
# sk = yield
# pro_send(sk, dic)
def login2():
username = input('用户名 :')
password = input('密 码:')
dic = {'user': username, 'passwd': password, 'operate': 'login'}
sk = socket.socket()
sk.connect(('127.0.0.1', 9001))
pro_send(sk, dic)
dic_ret = pro_recv(sk,pro = False)
if dic_ret['opt'] == 'login' and dic_ret['flag']:
print('登陆成功')
else:
print('登陆失败')
sk.close()
return sk,dic_ret['flag']
# g = login()
# next(g)
# sk = socket.socket()
# sk.connect(('127.0.0.1',9001))
# g.send(sk)
sk,flag = login2()
while flag:
operate = [('上传',upload),('下载',download)]
for ind,opt in enumerate(operate,1):
print(ind,opt[0])
num = int(input('请输入您要选择的操作 :'))
operate[num-1][1](sk)
2019-04-12-day031-进程基础的更多相关文章
- 2019.04.12 Head First
第一节 认识python python.exe -V python 会进入解释器 quit()命令会退出解释器 IDEL,一个python的集成开发环境,能够利用颜色突出语法的编辑器,一个调试工具,P ...
- 36.React基础介绍——2019年12月24日
2019年12月24日16:47:12 2019年10月25日11:24:29 主要介绍react入门知识. 1.jsx语法介绍 1.1 介绍 jsx语法是一种类似于html标签的语法,它的作用相当于 ...
- 20.Nodejs基础知识(上)——2019年12月16日
2019年12月16日18:58:55 2019年10月04日12:20:59 1. nodejs简介 Node.js是一个让JavaScript运行在服务器端的开发平台,它让JavaScript的触 ...
- 19.go语言基础学习(下)——2019年12月16日
2019年12月16日16:57:04 5.接口 2019年11月01日15:56:09 5.1 duck typing 1. 2. 接口 3.介绍 Go 语言的接口设计是非侵入式的,接口编写者无须知 ...
- 16.go语言基础学习(上)——2019年12月16日
2019年12月13日10:35:20 1.介绍 2019年10月31日15:09:03 2.基本语法 2.1 定义变量 2019年10月31日16:12:34 1.函数外必须使用var定义变量 va ...
- 7.搭建hyperledger fabric环境及启动——2019年12月12日
2019年12月12日13:05:16 声明:从网络中学习整理实践而来. 1.介绍fabric Fabric 是一个面向企业应用的区块链框架,基于 Fabric 的开发可以粗略分为几个层面: 1. 参 ...
- Ubuntu LTS 系统学习使用体会和实用工具软件汇总 6.04 8.04 10.04 12.04 14.04 16.04
Ubuntu LTS 系统学习体会和工具软件汇总 6.04 8.04 10.04 12.04 14.04 16.04 ubuntu入门必备pdf:http://download.csdn.net/de ...
- PowerBI更新2019/04 - 解决方案架构 - PowerBI Solution Architecture(一图胜万字!)
Power BI 架构图 (2019/04) 1) Power BI Desktop 是一个免费的工具.它可以用来准备和管理数据模型:包括链接各种数据:做数据清洗:定义关系:定义度量值和层级关系:应用 ...
- 35.ES6语法介绍——2019年12月24日
2019年12月24日16:22:24 2019年10月09日12:04:44 1. ES6介绍 1.1 新的 Javascript 语法标准 --2015年6月正式发布 --使用babel语法转换器 ...
- 24.mongodb可视化工具部署——2019年12月19日
2019年10月09日17:05:54 教程链接:https://blog.csdn.net/qq_32340877/article/details/79142129 项目名:adminMongo g ...
随机推荐
- QT创建TCP Socket通信
最近在学习QT,了解到QT可以进行SOCKET网络通信,进行学习,并建立一个简单的聊天DEMO.为了测试是否能与VS2012下的程序进行通信,在VS2012下建立一个客户端程序,进行通信测试,发现可以 ...
- js 二维数组 for 循环重新赋值
javascript 二维数组的重新 组装 var arr = [[1,2],[3,4],[5,6],[7,8]]; var temp = new Array(); for(var i= 0 ;i&l ...
- 【mysql】group_concat函数substring_index函数
1.group_concat函数:用于将多个字符串连接成一个字符串 用法规则: SELECT GROUP_CONCAT(拼接的字段) from tableName; 使用:查询basic_projec ...
- [linux] grep 文本搜索工具
grep [option] pattern file Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来.grep全称是Global Regular ...
- 浅谈HTTP中GET、POST用法以及它们的区别
浅谈HTTP中GET.POST用法以及它们的区别 HTTP定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE.URL全称是资源描述符.我们可以这样认为: 一 ...
- Fix Python 3 on Windows error Microsoft Visual C++ 14.0 is required
Fix Python 3 on Windows error Microsoft Visual C++ 14.0 is required Fix the error for Python 3.6 and ...
- Selenium(基于JAVA语言)-》在eclipse上运行web项目在Mac系统上启动时提示nodename nor servname provided解决办法
最近使用eclipse进行自动化测试时,遇到一种情况,无法调起浏览器,且有报错,如下: org.openqa.selenium.WebDriverException: failed to lookup ...
- 【shell脚本】 变量基础学习整理
1.linux系统环境 echo 'echo /etc/profile ' >> /etc/profile echo 'echo /etc/bashrc' >> /etc/ba ...
- Python自学:第三章 使用列表中的各个值
bicycles = ['trek','cannondale','redline','specialized'] message = "My first bicycle was a &quo ...
- 关于AndroidStudio 经常弹出TortoiseSVN 同步的解决办法
我的AndroidStudio在使用时是从TortoiseSVN的文件夹下直接打开的 但是由于svn自己的特点每改一个文件就要跳出来一个svn的对话框 体验极其难受!砍人的心都有了 网上的解决办法都是 ...