1. 操作系统的发展历程

    • 主要的人机矛盾是什么 : CPU的使用率

      • 输入\输出数据和CPU计算没有关系
    • 操作系统是怎么进化的
      • 传统的纸带输入
      • 磁带的存储降低了输入输出数据占用的时间,提高了CPU的利用率
      • 多道操作系统的出现 : 提高了CPU的利用率,单纯的切换会浪费时间
        • 一台计算机上同时可以出现多个任务
        • 能够将多个任务所使用的资源隔离开
        • 当一个任务遇到输入输出工作的时候能够让另一个任务使用CPU去计算
      • 分时操作系统 : 降低了cpu的利用率,提高了用户的体验
        • 时间片轮转
      • 实时操作系统
        • 操作精密仪器或者设备
        • 实时交易类
    • 操作系统的作用
      • 在具体的应用与所有的硬件之间起到了一个协调管理的作用
      • 负责分配计算机中所有的资源
  2. 输入输出 Input/Output
    • 向内存输入 : read,recv,recvfrom,import,input
    • 从内存输出 : write,send,sendto,print
      CPU的工作效率和输入输出的工作效率差
  3. 并发和并行
    • 多个程序交替在同一个cpu上被计算 并发
    • 多个程序同时在多个cpu上被计算 并行
      阻塞/非阻塞
    • 阻塞 CPU不工作
    • 非阻塞 CPU一直在工作
      异步和同步
    • 异步 :发布一个任务,不等待这个任务的结果就继续执行我的任务
    • 同步 :发布一个任务,等待获取这个任务的结果之后才继续执行我的任务
      同步阻塞/同步非阻塞/异步阻塞/异步非阻塞
  4. 进程和程序
    • 进程就是运行中的程序
    • 每一个进程在计算机中都有一个唯一的进程id,pid process id
  5. 进程 是计算机中资源分配的最小单位
    • 三状态 : 就绪 运行 阻塞
  6. 线程 是计算机中能够被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-进程基础的更多相关文章

  1. 2019.04.12 Head First

    第一节 认识python python.exe -V python 会进入解释器 quit()命令会退出解释器 IDEL,一个python的集成开发环境,能够利用颜色突出语法的编辑器,一个调试工具,P ...

  2. 36.React基础介绍——2019年12月24日

    2019年12月24日16:47:12 2019年10月25日11:24:29 主要介绍react入门知识. 1.jsx语法介绍 1.1 介绍 jsx语法是一种类似于html标签的语法,它的作用相当于 ...

  3. 20.Nodejs基础知识(上)——2019年12月16日

    2019年12月16日18:58:55 2019年10月04日12:20:59 1. nodejs简介 Node.js是一个让JavaScript运行在服务器端的开发平台,它让JavaScript的触 ...

  4. 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 语言的接口设计是非侵入式的,接口编写者无须知 ...

  5. 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 ...

  6. 7.搭建hyperledger fabric环境及启动——2019年12月12日

    2019年12月12日13:05:16 声明:从网络中学习整理实践而来. 1.介绍fabric Fabric 是一个面向企业应用的区块链框架,基于 Fabric 的开发可以粗略分为几个层面: 1. 参 ...

  7. 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 ...

  8. PowerBI更新2019/04 - 解决方案架构 - PowerBI Solution Architecture(一图胜万字!)

    Power BI 架构图 (2019/04) 1) Power BI Desktop 是一个免费的工具.它可以用来准备和管理数据模型:包括链接各种数据:做数据清洗:定义关系:定义度量值和层级关系:应用 ...

  9. 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语法转换器 ...

  10. 24.mongodb可视化工具部署——2019年12月19日

    2019年10月09日17:05:54 教程链接:https://blog.csdn.net/qq_32340877/article/details/79142129 项目名:adminMongo g ...

随机推荐

  1. 解决CentOS6.5虚拟机克隆后无法上网(网卡信息不一致)的问题

    一.问题描述 虚拟机克隆后,由于网卡信息不一致的问题,导致不能上网或者执行“service network restart”命令失败 [root@lyy 桌面]# ifconfig //查看当前网卡信 ...

  2. /* * 有五个学生,每个学生有3门课的成绩,从键盘输入以上数据 *(包括学生号,姓名,三门课成绩),计算出平均成绩, *将原有的数据和计算出的平均分数存放在磁盘文件"stud"中。 */

    1.Student类:类中有五个变量,分别是学号,姓名,三门成绩 package test3; public class Student { private int num; private Stri ...

  3. Python 进程池

    进程池: 每一个进程在启动一个子进程时都会克隆一分数据,并开启额外一份内存空间,如果多次开启子进程,对内存的开销比较大,这里可以通过进程池来控制进程的最大个数,来解决.   进程池中有两个方法: ap ...

  4. UnicodeMath编码教程

    目录 1. 简介 2. 编码简单数学表达式 2.1 分数 2.2 上标和下标 2.3 空白(空格)字符使用 3. 编码其他数学公式 3.1 open/close分隔符 关于大括号方程组(cases) ...

  5. Bytom 技术 FAQ

    比原项目仓库: Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockchain/bytom 1.如何 ...

  6. LINQ之路13:LINQ Operators之连接(Joining)

    Joining IEnumerable<TOuter>, IEnumerable<TInner>→IEnumerable<TResult> Operator 说明 ...

  7. 近期Freecodecamp问题总结

    最近没什么事,刷了freecodecamp的算法题,发现了自己基础的薄弱 1 where are thou 写一个 function,它遍历一个对象数组(第一个参数)并返回一个包含相匹配的属性-值对( ...

  8. 基本数据类型float和double的区别

    float : 单精度浮点数 double : 双精度浮点数 两者的主要区别如下: 01.在内存中占有的字节数不同 单精度浮点数在机内存占4个字节 双精度浮点数在机内存占8个字节 02.有效数字位数不 ...

  9. python和jupyter安装

    python官网:https://www.python.org/ 进去之后选择适合自己电脑的系统类型,安装,我的是windows  下载之后,双击打开 在安装时请勾选上add to path 选项,安 ...

  10. 7.10 其他面向对象设计原则1: 开-闭原则OCP

    其他面向对象设计原则1: 开-闭原则OCP  Open-Closed Principle (OCP)5.1 设计变坏的前兆 Signs of Rotting Design  僵硬性 Rigidit ...