zoukankan      html  css  js  c++  java
  • 基于udp协议的套接字,socketserver模块,多道技术,进程理论

    进程指的是一个正在进行/运行的程序,进程是用来描述程序执行过程的虚拟概念

    进程vs程序

    程序:一堆的代码

    进程:程序执行的过程

    进程的概念起源于操作系统,进程是操作系统最核心的概念,操作系统的其他所有概念都是围绕进程来的

    操作系统理论:

    1.操作系统是什么

    操作系统是一个协调/管理/控制计算机硬件资源与软件资源的一段控制程序

    有两大功能:

    将复杂的硬件操作封装成简单的接口给应用程序或者用户去使用

    将多个进程对硬件的竞争变得有序

    操作系统发展史:

    并发:多个任务看起来是同时运行的

    串行:一个任务完完整整的运行完毕,才能运行下一个任务

    多道技术:

    (复用:共享/共用)

    1.空间上的复用:多个任务复用内存空间

    2.时间上的复用:多个任务复用cpu的时间

      (1)一个任务占用cpu时间过长会被操作系统强制剥夺走cpu的执行权限:比起串行执行反而会降低效率

      (2)一个任务遇到io操作也会被操作系统强行剥夺走cpu的执行权限,比起串行可以提升效率

    udp协议无连接,不存在粘包问题

    基于tcp的套接字,关键就是两个循环,一个链接循环,一个通信循环

    socketserver模块中分两大类:server类(解决链接问题)和request类(解决通信问题)

    基于tcp的socketserver我们自己定义的类中的

    1.   self.server即套接字对象
    2.   self.request即一个链接
    3.   self.client_address即客户端地址

    基于udp的socketserver我们自己定义的类中的

    1.   self.request是一个元组(第一个元素是客户端发来的数据,第二部分是服务端的udp套接字对象),如(b'adsf', <socket.socket fd=200, family=AddressFamily.AF_INET, type=SocketKind.SOCK_DGRAM, proto=0, laddr=('127.0.0.1', 8080)>)
    2.   self.client_address即客户端地址

    tcp

    # 服务端必须满足至少三点:
    # 1. 绑定一个固定的ip和port
    # 2. 一直对外提供服务,稳定运行
    # 3. 能够支持并发
    import socketserver

    # 自定义类用来处理通信循环
    class MyTCPhanler(socketserver.BaseRequestHandler):
    def handle(self):
    while True:
    try:
    data = self.request.recv(1024)
    if len(data) == 0: break # 针对linux系统
    print('-->收到客户端的消息: ', data)
    self.request.send(data.upper())
    except ConnectionResetError:
    break

    self.request.close()


    if __name__ == '__main__':
    server=socketserver.ThreadingTCPServer(('127.0.0.1',8081),MyTCPhanler)
    server.serve_forever() # 链接循环

     udp

    import socketserver

    class MyUdphandler(socketserver.BaseRequestHandler):
    def handle(self):
    data,sock=self.request
    sock.sendto(data.upper(),self.client_address)

    if __name__ == '__main__':
    server=socketserver.ThreadingUDPServer(('127.0.0.1',8081),MyUdphandler)
    server.serve_forever()

    无论是并行还是并发,在用户看来都是'同时'运行的,不管是进程还是线程,都只是一个任务而已,真是干活的是cpu,cpu来做这些任务,而一个cpu同一时刻只能执行一个任务

          一 并发:是伪并行,即看起来是同时运行。单个cpu+多道技术就可以实现并发,(并行也属于并发)

    你是一个cpu,你同时谈了三个女朋友,每一个都可以是一个恋爱任务,你被这三个任务共享
    要玩出并发恋爱的效果,
    应该是你先跟女友1去看电影,看了一会说:不好,我要拉肚子,然后跑去跟第二个女友吃饭,吃了一会说:那啥,我
    去趟洗手间,然后跑去跟女友3开了个房
    某天下午,egon,yuanhao,wupeiqi,alex约好了一起去嫖娼,但娼只有一个,cpu只有一个,但是却要‘同时’干
    四个任务(嫖出并发的效果),那就必须是干一会egon,再干一会yuanhao,再干一会wupeiqi,再干一会alex
    egon:花了200块钱,因为人美活好
    yuanhao:500块钱
    wupeiqi:100块钱,可能是不太行
    alex:没要钱,为啥???因为大家刚刚嫖的是他女朋友

         二 并行:同时运行,只有具备多个cpu才能实现并行

             单核下,可以利用多道技术,多个核,每个核也都可以利用多道技术(多道技术是针对单核而言的

             有四个核,六个任务,这样同一时间有四个任务被执行,假设分别被分配给了cpu1,cpu2,cpu3,cpu4,

             一旦任务1遇到I/O就被迫中断执行,此时任务5就拿到cpu1的时间片去执行,这就是单核下的多道技术

             而一旦任务1的I/O结束了,操作系统会重新调用它(需知进程的调度、分配给哪个cpu运行,由操作系统说了算),可能被分配给四个cpu中的任意一个去执行

      

    所有现代计算机经常会在同一时间做很多件事,一个用户的PC(无论是单cpu还是多cpu),都可以同时运行多个任务(一个任务可以理解为一个进程)。

        启动一个进程来杀毒(360软件)

        启动一个进程来看电影(暴风影音)

        启动一个进程来聊天(腾讯QQ)

    所有的这些进程都需被管理,于是一个支持多进程的多道程序系统是至关重要的

    多道技术概念回顾:内存中同时存入多道(多个)程序,cpu从一个进程快速切换到另外一个,使每个进程各自运行几十或几百毫秒,这样,虽然在某一个瞬间,一个cpu只能执行一个任务,但在1秒内,cpu却可以运行多个进程,这就给人产生了并行的错觉,即伪并发,以此来区分多处理器操作系统的真正硬件并行(多个cpu共享同一个物理内存)

  • 相关阅读:
    老旧ObjectARX SDK下载地址
    AutoCAD Civil 3D .NET 二次开发 勘误
    lisp网站
    Autodesk论坛中看到的一段代码,留存备用
    revit图纸导出dxf文件批量修改
    查询给定区域内曲面平均高程
    angular 输入型指令directive
    get set方法
    android 环境配置
    使用nginx启动angular项目
  • 原文地址:https://www.cnblogs.com/fushaunglin/p/9585073.html
Copyright © 2011-2022 走看看