zoukankan      html  css  js  c++  java
  • UDP协议和进程

    UDP协议和进程

    UDP协议(了解)


    称之为是数据包协议

    特点:

    1,不需要建立链接

    2,不需要知道对方是否接收到

    3,数据不安全

    4,数据传输快

    5,能支持并发

    6,不会粘包

    7,无需先启动服务端在启动客户端


    优点:

    • 传输速度快

    • 能支持并发

    • 不会粘包

     

    缺点:

    • 数据不安全,容易丢失


    import socket

    client = socket.socket(type=socket.SOCK_DGRAM)

    address = ('127.0.0.1', 9002)

    while True:
       msg = input('Client---> Server:').encode('utf-8')

       client.sendto(msg, address)

       
       import socket


    # socket.SOCK_DGRAM--->UPD协议

    server = socket.socket(type=socket.SOCK_DGRAM)
    # 服务端需要绑定一个地址,让别人知道你在哪
    server.bind(
      ('127.0.0.1', 9002)
    )
    while True:

       # 发送数据给服务端的用户地址
       data, addr = server.recvfrom(1024)

       print(addr)
       print(data)

     

     

    TCP协议(称之为流式协议)


    优点:

    数据安全

    缺点:

    传输速度慢

    粘包


    面试:TCP和UDP的区别,简述优缺点即可。*

     

     

    并发编程

    1)操作系统发展史

    • 1.1 穿孔卡片

       

      • 读取数据速度特别慢

      • CPU的李永率极低

      • 单用户(一份代码)使用

         

    • 1.2 批量处理

      • 读取速度特别慢

      • CPU的利用率特别低

      • 联机(多份代码)使用

      • 效率还是很低

    • 1.3 脱机批处理

      • 读取数据速度提高

      • CPU的利用率速度提高

    1)多道技术(基于单核背景下生产的):


    单道:一条路走到黑---》串行

    比如:a,b需要使用CPU, a先使用,b等待a使用完毕后,b才能使用CPU

     

    多道(重要)

    比如:a,b需要使用CPU,a先使用,b等待a,直到a进入“IO或执行时间过长”

    a会(切换+保存状态), 然后b可以使用cpu,待b执行遇到“IO或执行时间过长”

    再将CPU执行权限交给a,直到两个进程结束。

     

    空间上的复用(重要):

    多个程序使用一个cpu

    时间上的复用(重要):

    切换 + 保存状态


    1,当执行程序遇到IO时, 操作系统会将cpu的执行权限剥夺

    优点:

    cpu的执行效率提高

    2,当执行程序执行时间过长时,操作系统会将cpu的执行权限剥夺

    缺点:

    程序的执行效率低

     

    并发与并行


    并发:

    在单核(一个cpu)情况下,当执行两个a,b程序时,a先执行, 当a遇到IO时, b开始执行争抢cpu的执行权限,再让b执行,他们看起像同时运行。

     

    并行:在多核(多个cpu)的情况下, 当执行两个a, b程序时,a与b同时执行,他们是真正意义上的同时运行。

     

    面试题:在单核情况下能否实现并行? 不行

     


    进程

    什么是进程?

    进程是一个资源单位

    进程与程序:

    程序:是一堆代码文件。

    进程:执行代码的过程,称之为进程。


     

    进程调度:(了解)

    先来先服务调度算法(了解)

    比如程序 a, b,若a先来, 则让a先服务, 待a服务完毕后, b再服务

    缺点:执行效率低

    短作业优先调度算法(了解)

     

    执行时间越短,则先先调度。

    缺点: 导致执行时间长的程序,需要等待所有时间短的程序执行完毕后,才能执行。

    现代操作系统的进程调度算法: 时间片轮转法 + 多级反馈队列 (知道)


     

    时间片轮转法

    比如同时有10个程序需要执行,操作系统会给你10秒,然后时间片轮转法会将10秒分成10等分。

    多级反馈队列:

    1级队列: 优先级最高,先执行次队列中程序。

    2级队列: 优先级以此类推 3级队列:


    同步与异步

    同步与异步指的是“提交任务的方式”

    同步(串行):

    两个a,b程序都要提交并执行,假如a先提交执行,b必须等a执行完毕后,才能提交任务。

    异步(并发):

    两个a,b程序都要提交并执行,假如a先提交并执行,b无需等a执行完毕,就可以直接提交任务。


    阻塞与非阻塞:

    • 阻塞(等待):

      凡是遇到IO都会阻塞。

      IO:

      input()

      output()

      time.sleep(3)

      文件的读写

      数据的传输

      -非阻塞 (不等待) :

      除了IO都是非阻塞

      (比如: 从1+1开始计算到100万)

      就是计算量比较大


      进程的三种状态:就绪态:同步与异步

       

      运行态:程序的执行时间过长---》将程序返回给就绪态

       

      阻塞态:遇到IO

       

      面试题:阻塞与同步是一样的吗?非阻塞与异步是一样的吗?

      同步与异步: 提交任务的方式

      阻塞与非阻塞: 进程的状态。

      异步非阻塞: ----> cpu的利用率最大化!


       

      创建进程的两种方式:

      # 方式一:
      from multiprocessing import Process
      # import time
      #
      # def tack(name): # 任务
      #     print(f'start...{name}的子进程')
      #     time.sleep(3)
      #     print(f'end...{name}的子进程')
      #
      # if __name__ == '__main__':

         # target = 任务(函数地址)--》创建一个子进程
         # p_obj1 = Process(target=tack, args=('wanglu', ))
         #
         #
         # p_obj1.start()# 告诉操作系统,去创建一个子进程
         # p_obj1.join() # 告诉主进程,等子进程结束后,再结束
         #
         # print('正在执行当前主进程...')
         #
         # list1 = []
         # for line in range(10):
         #     p_obj = Process(target=tack, args=('wanglu', ))
         #     p_obj.start()
         #     list1.append(p_obj)
         #
         # for obj in list1:
         #     obj.join()
         #
         # print('谢幕。。。')



      # 方式二:
      from multiprocessing import Process
      import time



      class MyProcess(Process):
         def run(self):
             print(f'start...{self.name}的子进程')
             time.sleep(3)
             print(f'end...{self.name}的子进程')


      if __name__ == '__main__':
         list1 = []

         for i in range(10):
             obj = MyProcess()
             obj.start()
             list1.append(obj)

         for obj in list1:
             obj.join()

         print('谢幕。。。')

       

       

    •  

     

  • 相关阅读:
    光脚丫学LINQ(036):一对一映射关系
    光脚丫学LINQ(033):建立映射关系的两个实体类必须分别包含一个主键列成员
    ASP.NET4的网页指令
    光脚丫学LINQ(032):探究AssociationAttribute.Storage
    [代码]服务器端的隐藏重定向
    maven项目bulid失败_No compiler is provided in this environment.
    [SC] OpenSCManager 失败 5:拒绝访问
    c3p0连接池:com.mysql.cj.exceptions.InvalidConnectionAttributeException
    iframe高度自适应
    彻底卸载mysql数据库~
  • 原文地址:https://www.cnblogs.com/zhangjinyi97/p/11997226.html
Copyright © 2011-2022 走看看