zoukankan      html  css  js  c++  java
  • 第五章 网络编程和并发编程

    1、python的底层网络交互模块有哪些?

      socket, urllib,urllib3 , requests, grab, pycurl

    2、简述OSI七层协议

      应用层:HTTP,FTP,NFS

      表示层:Telnet,SNMP

      会话层:SMTP,DNS

      传输层:TCP,UDP

      网络层:IP,ICMP,ARP,

      数据链路层:Ethernet,PPP,PDN,SLIP,FDDI

      物理层:IEEE 802.1A,IEEE 802.11

    3、什么是C/S和B/S架构

      C/S架构:是指客服端和服务端,交互性好,对服务器压力小,安全,但是更新服务端的是后客户端也得更新。

      B/S架构:是指浏览器和服务器,优点是不需要更新客服端,缺点是交互性差,安全性低。

    4、简述TCP三次握手四次挥手的过程。

      建立连接:

      第一次握手:客户端向服务器发出请求。

      第二次握手:服务器收到请求,同意连接,想客服端发送确认报文。

      第三次握手:客服端接收到报文,向上层应用传达已建立连接。

      释放连接:

      第一次挥手:数据传输结束后,客服端发送连接释放报文段,并结束数据传输。

      第二次挥手:服务端接收到连接释放报文段后,向客户端发送确认报文。

      第三次挥手:服务器没有要发送的数据后,其应用进程就通知服务器释放TCP连接。这个阶段服务器所发出的最后一个报文。

      第四次挥手:客户端收到连接释放报文段之后,必须发出确认。再经过2MSL(最长报文端寿命)后,本次TCP连接真正结束,通信双方完成了他们的告别。

    5、什么事arp协议?

      arp协议是地址解析协议,使用ARP协议可实现通过IP地址获得对应主机的物理地址(MAC地址)。

    6、TCP协议和UDP协议的区别?为什么TCP协议更可靠?

      1、TCP是面向连接的,发送数据之前必须建立连接,UDP不需要建立连接就可以发送数据。

      2、TCP协议提供可靠的服务,通过TCP传输数据,无差错,不丢失,不重复,且按序到达,UDP是尽最大努力交付,且不保证可靠交付。

      3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)

      4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信。

      5、TCP首部开销20字节;UDP的首部开销小,只有8个字节。

      6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道

      tcp:可靠 对方给了确认收到信息,才发下一个,如果没收到确认信息就重发  

      udp:不可靠 一直发数据,不需要对方回应

    7、什么是局域网和广域网?

      局域网,LAN(Local Area Network)是指在某一区域内(如一个学校、工厂和机关内)由多台计算机互联成的计算机组。

      广域网,WAN(Wide Area Network)也称远程网。通常跨接很大的物理范围,所覆盖的范围从几十公里到几千公里,它能连接多个城市或国家,或横跨几个洲并能提供远距离通信,形成国际性的远程网络。

    8、什么是socket?简述基于TCP协议的套接字通信流程。

      Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部。  

    9、什么是黏包?socket中造成黏包的原因是什么?哪些情况会发生黏包现象。

      黏包就是数据黏在一起,TCP协议是面向字节流的,基于tcp的套接字客户端往服务端上传文件,发送时文件内容是按照一段一段的字节流发送的,在接收方看了,根本不知道该文件的字节流从何处开始,在何处结束

      所谓粘包问题主要还是因为接收方不知道消息之间的界限,不知道一次性提取多少字节的数据所造成的。

      只有TCP有粘包现象,UDP永远不会粘包。

      客户端粘包:

      发送端需要等缓冲区满才发送出去,造成粘包(发送数据时间间隔很短,数据量很小,TCP优化算法会当做一个包发出去,产生粘包)

      服务端粘包:

      接收方不及时接收缓冲区的包,造成多个包接收(客户端发送了一段数据,服务端只收了一小部分,服务端下次再收的时候还是从缓冲区拿上次遗留的数据,产生粘包)

    10、IO多路复用的作用

      阻塞IO:特点就是在IO执行的两个阶段(等待数据和拷贝数据两个阶段)都被阻塞了。

      非阻塞IO:特点就是,数据准备阶段,用户发出read操作时,如果数据没有准备完成,会立刻返回一个error,用户进程可以去做其他事情,需要不断的轮询查看数据是否准备完成,但是在数据拷贝期间,进程还是阻塞的。

      IO多路复用:select和epoll可以让单个线程同时处理多个连接,内核会监视所有select负责的socket,当有一个数据准备完成时,select就会返回,这是用户进程就可以直接进行read操作了。适用于多个连接。

      异步IO:用户进程发出read操作时就可以去干其他事了,内核会等数据准备完成时,将数据拷贝到进程,这一切完成后,内核会给用户进程发一个报文,告知一切都已完成。

    11、什么是防火墙以及作用?

      防火墙作为一个边界防御工具,其监控流量——要么允许它、要么屏蔽它。

    12、select, poll, epoll的区别

      select:它仅仅知道了,有I/O事件发生了,却并不知道是哪那几个流(可能有一个,多个,甚至全部),我们只能无差别轮询所有流,找出能读出数据,或者写入数据的流,对他们进行操作。所以select具有O(n)的无差别轮询复杂

      度,同时处理的流越多,无差别轮询时间就越长。

      poll:本质上和select没有区别,它将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备状态, 但是它没有最大连接数的限制,原因是它是基于链表来存储的.

      epoll:epoll可以理解为event poll,不同于忙轮询和无差别轮询,epoll会把哪个流发生了怎样的I/O事件通知我们。所以我们说epoll实际上是事件驱动(每个事件关联上fd)的,此时我们对这些流的操作都是有意义的。

    13、请简述进程、线程、协程的区别,以及应用场景。

      进程:操作系统是由一个个的进程组成的,一个应用程序就可以看作一个进程,他有自己独立的运行空间,有自己独立的堆和栈,进程是操作系统资源分配的最小单位。

      线程:线程是属于进程的,进程可以创建线程,线程之间共享堆不共享栈,线程是操作系统资源调动的最小单位。

      协程:协程也是共享堆不共享栈,他是由程序员调度的。

    14、什么是GIL锁。

      GIL是全局解释锁,这个机制只允许一个线程控制python解释器。

    15、python中如何使用线程池和进程池?

       concurrent.futures 模块中的 Executor,Executor 提供了两个子类,即 ThreadPoolExecutor 和 ProcessPoolExecutor,其中 ThreadPoolExecutor 用于创建线程池,而 ProcessPoolExecutor 用于创建进程池。

    16、threading.local的作用?

      threading.local()这个方法的特点用来保存一个全局变量,但是这个全局变量只有在当前线程才能访问,如果你在开发多线程应用的时候  需要每个线程保存一个单独的数据供当前线程操作,可以考虑使用这个方法,简单有效。

    17、进程之间如何进行通信?

      1、管道,通常指无名管道,是 UNIX 系统IPC最古老的形式。

      特点:单向的,具有固定的读端和写端,他只能用于有亲缘关系的进程之间(父子进程、兄弟进程),他可以看作特殊的文件,可以读写,但是寻在于内存中。

      2、FIFO,也称为命名管道,它是一种文件类型。 

      特点:他可以在无关进程之间通信,可以看作一种特殊的设备文件,存在于文件系统中。

      3、消息队列,是消息的链接表,存放在内核中。一个消息队列由一个标识符(即队列ID)来标识。 

      特点:他是面向记录的,有一定特殊的格式和优先级,消息队列是独立于进程的,进程消失,消息队列不会消失,消息不一定是先进先出的顺序,也可以根据类型读取。

      4、信号量(semaphore)与已经介绍过的 IPC 结构不同,它是一个计数器。信号量用于实现进程间的互斥与同步,而不是用于存储进程间通信数据。

      特点:信号量用于进程间同步,若要想在进程间传递顺序需要共享内存。

      5、共享内存(Shared Memory),指两个或多个进程共享一个给定的存储区。

      特点:共享内存是最快的一种IPC,因为进程是直接堆内存进行存取,因为多个进程可以同时操作,所以需要进行同步,信号量和共享内存通常一起使用。

    18、什么是并发和并行?

      并发:在计算机领域开发过程中,并发指的是应用能够交替执行不同的任务,比如多线程,多线程并非是同时执行多个任务,而是通过时间轮转发等算法的调度,时多个任务以我们察觉不到的速度交替执行。

      并行:指多个任务同时执行。

      区别:一个是交替,一个是同时。

    19、解释什么是异步非阻塞。

      同步阻塞:调用结果返回前,进程会被挂起,直到调用结果返回,效率低。

      异步阻塞:不同的是,调用结果返回前会用回调或者消息的方式通知进程,但是调用结果返回前,进程还是会被挂起,效率一样的低。

      同步非阻塞:调用结果返回前,进程可以去做其他事情,但是需要通过轮询不断的查看调用结果是否返回,效率比前两个高,但是耗CPU,也一般。

      异步非阻塞:调用结果返回之前,进程可以去做其他事情,当函数调用完成后,会以回调或者消息的形式通知进程,效率最高。

    20、路由器和交换机的区别?

      区别一:路由器可以给局域网自动分配IP,虚拟拨号。交换机则只是用来分配网络数据的。

      区别二:路由器可以把一个IP分配给很多个主机使用,这些主机对外只表现出一个IP。交换机可以把很多主机连起来,这些主机对外各有各的IP。

      区别三:交换机工作在中继层,根据MAC地址寻址,不能处理TCP/IP协议。

          路由器工作在网络层,根据IP地址寻址,可以处理TCP/IP协议。

      区别四:路由器提供防火墙服务,交换机不能提供该功能。

    21、什么是域名解析?

      域名解析是把域名指向网站空间IP,让人们通过注册的域名可以方便地访问到网站一种服务。IP地址是网络上标识站点的数字地址,为方便记忆,采用域名来代替IP地址标识站点地址。域名解析就是域名到IP地址的转换过程。

    22、如何修改本地的hosts文件?

      vi/ etc/host

    23、生产者消费者模型应用场景

      很多的生产者同时生产数据到流水线上,然后消费者在从流水线上取下,这样我们可以有多个生产者同时生产提升了效率,同时也可以容纳多个消费者在流水线上消费。

      爬虫的时候,会将网上的大量数据爬取下来放入本地或者云端供未来使用,如果数据量太大,我们的处理器会处理不过来,这时候就可以引入生产者,流水线,消费者的概念,就可以解决这个问题。

    24、什么是cdn?

      CDN的全称是Content Delivery Network,即内容分发网络。CDN是一组分布在多个不同地理位置的Web服务器,用于更加有效地向用户发布内容,在优化性能时,会根据距离的远近来选择。

    25、程序从FlagA执行到FlagB的时间大致为多少秒?

    import threading
    import time
    
    def _wait():
        time.sleep(60)
    #FlagA
    t = threading.Thread(target=_wait, daemon=False)
    t.start()
    #FlagB

      大致为0秒,因为线程开启速度非常快,start()方法为异步非阻塞,所以不会等待任务的结束。

    26、有A.txt和B.txt两个文件,使用多进程和进程池的方式分别读区者两个文件。

    27、以下哪些是常见的TCP Flags?

      SYN, ACK

    28、下面有关网络七层和四层的描述哪格式错误的?

      SNMP工作在四层

    29、tracerroute一般使用的是哪种网络层协议?

      ICMP

    30、iptables知识考察,根据要求写出防火墙规则。

      A、屏蔽192.168.1.5访问本机dns服务端口。

         BLOCK_THIS_IP="192.168.1.5"

      B、允许10.1.1.0/24访问本机的udp 8888 9999 端口

         iptables -t filter -A INPUT -s 192.168.1.0/24 -p udp -m state --state NEW -m udp --dport 8888 9999 -j ACCEPT

    31、

    32、请实现一个简单的socket编程,要求:

      1、实现server端的功能即可

      2、遵循基本语言编程规范

    import socket
    
    sk = socket.socket()
    sk.bind(('127.0.0.1', 8800))  # 把地址绑定到套接字
    sk.listen()  # 监听链接
    conn, addr = sk.accept()  # 接受客户端链接
    ret = conn.recv(1024)  # 接受客服端发来的数据
    print(ret)  # 保存客户端数据
    conn.send(b'hi')  # 想客户端发送信息
    conn.close()  # 关闭客户端链接
    sk.close()  # 关闭服务器套接字套接字

      顺便把客户端的也放上来吧

    import socket
    
    sk = socket.socket()
    sk.connect(('127.0.0.1', 8800))
    sk.send(b'hi')
    ret = sk.recv(1024)
    print(ret)
    sk.close()

    33、谈一下对于多线程编程的理解,对于CPU密集型怎样使用多线程,说说线程池,线程锁的用法,有没有用过multiprocessing和concurrent.future?

      多线程是为了解决多个任务同时执行的需求,同个进程内的多线程共享资源,他们是并发的,各个线程是在交替执行,同一时间只有一个线程在运行,他可以防止CPU资源浪费,防止阻塞,增加任务执行效率。

      CPU密集型就是计算密集型,应该使用多核多线程,这样多个线程可以真正意义上的并行处理,大大增加了运行效率,如果是IO密集型,多核就没有用了,因为多核的情况下,一个线程发出IO请求,也是会阻塞,并没有在单核的情况下有什么提高,反而会增加CPU的损耗,所以应该使用单核多线程。

      线程池:去你妈的

      线程锁:去你妈的

      没有用过

    34、关于守护线程,正确的是

      所有守护线程终止运行时,即使存在非守护线程,进程运行终止。

      主线程:main,不是守护线程

      守护线程:指程序运行期间在后台提供通用服务的一种线程。

      非守护线程:用户线程,有用户创建。

      主线程和守护线程一起被销毁,主线程和用户想程互不影响。

    35、TCP协议在每次建立或者拆除连接时,都要在收发双方之间交换几次报文?

      三次

    36、描述多进程开发中join与deamon的区别。

      deamon是主线程会设置子线程为守护线程,主线程一旦终止运行,全部线程都会被终止执行,即使子线程还没有执行完成。‘

      join的工作是线程同步,主线程执行结束后,会进入阻塞状态,等全部子线程运行结束后,主线程在终止。

    37、请简述GIL对python性能的影响。

      GIL是全局解释器锁,线程之后获取GIL才能运行,所以在python的多线程中,实际上同个进程内同一时间只能有一个线程在工作,者无疑对python的多线程的效率有着不小的影响。

    38、曾经在哪里使用过线程,进程,协程?

      没有用过

    39、请使用yield实现一个协程。

      

    40、请使用python内置的async语法实现一个协程

      

    41、简述线程死锁是如何造成的,如何避免?

      死锁是在多线程或者多进程的情况下,两个线程或者进程在争夺资源的时候,造成的一种互相等待的现象,被称为死锁。

    42、asynio是什么?

      异步IO

    43、gevent模块是什么?

      Gevent是一种基于协程的Python网络库,它用到Greenlet提供的,封装了libevent事件循环的高层同步API。它让开发者在不改变编程习惯的同时,用同步的方式写异步I/O的代码。

        

      

  • 相关阅读:
    BZOJ 2152 聪聪可可
    hdu 1028 && hdu 1398 && hdu 1085 && hdu 1171 ——生成函数
    bzoj 4827 [Hnoi2017]礼物——FFT
    bzoj 4503 两个串——FFT
    bzoj 3527 [Zjoi2014]力——FFT
    bzoj 3160 万径人踪灭——FFT
    bzoj 2194 快速傅立叶之二
    bzoj 2179 FFT快速傅立叶
    洛谷 3803 【模板】多项式乘法(FFT)
    CF 622F The Sum of the k-th Powers——拉格朗日插值
  • 原文地址:https://www.cnblogs.com/490144243msq/p/11517298.html
Copyright © 2011-2022 走看看