day_28

上节课回顾

粘包问题

  1. 无法确认发送数据的大小。
  2. 短时间内发送多次数据量小并且间隔时间短的数据会一次性打包发送。

struct

可以将一个很长的数据,压缩成固定的长度,比如4.

解决粘包问题

1.通过struct模块弄一个报头。
可以把字典压缩成一个报头,发送给服务端。
2.服务端接收到报头后解压缩,获取真实字典数据长度。
接收字典真实数据。
注意: 字典里可以携带即将发送的数据描述信息,以及数据的真实大小。

上传大文件

udp

  • 不需要建立连接
  • 没有粘包问题
  • 发送数据不需要等待返回接收成功
  • 数据不安全,易丢失

socketserver

基于socket模块封装而成,内置的theadingTcp(),可以支持多个用户同时连接服务端。

ftp

今日内容

操作系统发展史

穿孔卡片

一个计算机机房,一次只能被一个卡片使用

缺点:cpu利用率最低

联机批处理系统

支持多用户去使用一个计算机机房

脱机批处理系统

高速磁盘:提高文件的读取速度

优点:提高cpu的利用率

多道技术(基于单核情况下研究)

  • 空间上的复用

    一个cpu可以提供给多个用户去使用

  • 时间上的复用

    切换+保存状态

IO操作:

input,print,time.sleep

  1. 若cpu遇到IO操作,会立即将当前执行程序CPU使用权断开

    优点:CPU的利用率高

  2. 若一个程序使用CPU的时间过长,会立即将当前执行程序CPU使用权断开

    缺点:程序的执行率降低

  • 并发与并行

    并发:指的是看起来像同时在运行,其实是多个程序不断切换+保存状态

    并行:真实意义上的同时运行,在多核的情况下,同时执行多个程序

进程

  • 程序与进程

    程序:一堆代码

    进程:一堆代码运行的过程

  • 进程调度

    当代操作系统调度:

    ​ 时间片轮转法+分级反馈队列

    1. 先来先服务调度:

      a,b程序,若a先来,先占用cpu

      缺点:程序a先使用,程序b必须等待程序a使用cpu结束后才能使用。

    2. 短作业优先调度:

      a,b程序,谁的用时短,先占用cpu

      缺点:若a使用时间最长,有n个程序使用时间短,必须等待所有用时短的程序结束后才能使用

    3. 时间片轮转法

      CPU执行的时间1秒钟,加载n个程序,要将1秒等分成多n个时间片

    4. 分级反馈队列

      将执行优先分为多层级别

      一级:优先级最高

      二级:优先级第二

      以此类推....

  • 进程的三个状态

    • 就绪态:

      所有进程创建时都会进入就绪态,准备调度

    • 运行态:

      调度后的进程,进入运行态

    • 阻塞态:

      凡是遇到IO操作的进程,都会进入阻塞态

      若IO结束,必须重新进入就绪态

  • 同步和异步

    指的是提交任务的方式

    • 同步:若有两个任务需要提交,在提交第一个任务时必须等待该任务结束后才能继续提交执行第二个任务
    • 异步:若有两个任务需要提交,在提交第一个任务时不需要等待
  • 阻塞与非阻塞

    • 阻塞

      阻塞态,遇到IO一定会阻塞

    • 非阻塞:

      就绪态,运行态

同步和异步,阻塞和非阻塞不是同一个概念!

主进程和子进程会产生各自的名称空间

current_process().pid: 获取子进程号
os.getpid(): 获取主进程pid号

cmd中查看进程号: tasklist |findstr 进程号

os.getppid()获取主进程的父进程的pid号

创建进程的两种方式

方法一

# 1.定义一个任务
def task(name):
    print(f'{name}的任务开始执行')
    time.sleep(1)
    print(f'{name}的任务已经结束')


# 在linux/mac系统下不会报错
# p = Process(target=task, args=('jason',))

if __name__ == '__main__':
    # target=执行函数的地址
    p = Process(target=task, args=('jason',))
    # 向操作系统提交创建进程的任务
    p.start()
    print('主进程')

方式二

#1.自定义一个类,并继承Process
class MyProcess(Process):

    # 父类的方法
    def run(self):
        print('任务开始执行')
        time.sleep(1)
        print('任务已经结束')


if __name__ == '__main__':
    p = MyProcess()
    p.start()
    # p.start()
    print('主进程')

最大化提高cpu使用率

尽可能减少不必要的IO操作

进程号回收的两种条件

  1. join,可以回收子进程与主进程
  2. 主进程正常结束,子进程与主进程也会被回收

僵尸进程与孤儿进程

僵尸进程

指的是子进程已经结束,但pid号还存在,未销毁

缺点:占用pid号,占用操作系统资源

孤儿进程

指的是子进程还在执行,但父进程意外结束

操作系统优化机制:

提供一个福利院,帮你回收没有父亲的子进程

守护进程

指的是主进程结束后,该主进程产生的所有子进程跟着结束,并回收

猜你喜欢

转载自www.cnblogs.com/maqiaobin/p/11715411.html