深浅拷贝 & 垃圾回收 & TCP/UDP三握三挥

一、深浅拷贝

在Python中对象的赋值其实就是对象的引用。当创建一个对象,把它赋值给另一个变量的时候,python并没有拷贝这个对象,只是拷贝了这个对象的引用而已。

  • 浅拷贝:而浅拷贝则是将一个对象的引用拷贝到另一个对象上,所以如果我们在拷贝中改动,会影响到原对象。我们使用函数function()执行浅拷贝

  • 深拷贝:深拷贝就是将一个对象拷贝到另一个对象中,这意味着如果你对一个对象的拷贝做出改变时,不会影响原对象。在Python中,我们使用函数deepcopy()执行深拷贝

深浅拷贝的作用

  • 1.减少内存的使用

  • 2.以后在做数据的清洗、修改或者入库的时候,对原数据进行复制一份,以防数据修改之后,找不到原数据。

import copy
sourceList = [1,2,3,[4,5,6]]
copyList = copy.copy(sourceList)
deepcopyList = copy.deepcopy(sourceList)

sourceList[3][0]=100

print(sourceList)           # [1, 2, 3, [100, 5, 6]]
print(copyList)             # [1, 2, 3, [100, 5, 6]]
print(deepcopyList)         # [1, 2, 3, [4, 5, 6]]

在这里插入图片描述

二、垃圾回收机制

  • 引用计数(python默认)

    • 引用计数(python默认):记录该对象当前被引用的次数,每当新的引用指向该对象时,它的引用计数ob_ref加1,每当该对象的引用失效时计数减1,一旦对象的引用计数为0,该对象立即被回收(Python语言默认采用的垃圾收集机制是 .引用计数法

    • 优点

      • 引用计数有一个很大的优点,即实时性,任何内存,一旦没有指向它的引用,就会被立即回收,而其他的垃圾收集技术必须在某种特殊条件下才能进行无效内存的回收。
    • 缺点
       
        1)引用计数机制所带来的维护引用计数的额外操作与Python运行中所进行的内存分配和释放,引用赋值的次数是成正比的,
       
        2)这显然比其它那些垃圾收集技术所带来的额外操作只是与待回收的内存数量有关的效率要低。
       
        3)同时,因为对象之间相互引用,每个对象的引用都不会为0,所以这些对象所占用的内存始终都不会被释放掉。

  • 标记清除

    • 标记清除第一段给所有活动对象标记,第二段清除非活动对象

    • 缺点:
       1)标记清除算法作为Python的辅助垃圾收集技术,主要处理的是一些容器对象,比如list、dict、tuple等

      因为对于字符串、数值对象是不可能造成循环引用问题。

      2)清除非活动的对象前它必须顺序扫描整个堆内存,哪怕只剩下小部分活动对象也要扫描所有对象。
      在这里插入图片描述

  • 分代回收

    • 分代回收:python将内存根据对象的存活时间划分为不同的集合,每个集合称为一个代,比如有年轻代、中年代、老年代,年轻代最先被回收

    • 分代回收是建立在标记清除技术基础之上的,是一种以空间换时间的操作方式。

    • Python将内存分为了3“代”,分别为年轻代(第0代)、中年代(第1代)、老年代(第2代)

    • 他们对应的是3个链表,它们的垃圾收集频率与对象的存活时间的增大而减小。

    • 新创建的对象都会分配在年轻代,年轻代链表的总数达到上限时,Python垃圾收集机制就会被触发

    • 把那些可以被回收的对象回收掉,而那些不会回收的对象就会被移到中年代去,依此类推

    • 老年代中的对象是存活时间最久的对象,甚至是存活于整个系统的生命周期内。

三、tcp/udp三次握手、四次挥手

TCP 三次握手
在这里插入图片描述

  • 第一次握手:

    A 的 TCP 客户进程也是首先创建传输控制块 TCB,然后向 B 发出连接请求报文段,(首部的同步位 SYN=1,初始序列 seq=x),(SYN=1 的报文段不能携带数据)但是要消耗掉一个序号,此时 TCP 客户进程进入 SYN-SENT (同步已发送)状态

  • 第二次握手:
    B 接收到连接请求报文段后,如果同意连接,则向 A 发送确认,在确认报文段中(SYN=1,ACK=1,确认号 ack=x+1,初始序号 seq=y),测试 TCP 服务器进程进入 SYN-RCVD(同步收到)状态

  • 第三次握手:
    TCP 客户进程收到 B 的确认后,要向 B 给出确认报文(ACK=1,确认号 ack=y+1,序号 seq=x+1)(初始为 seq=x,第二个报文段所以要 +1),ACK 报文段可以携带数据,不携带数据则不消耗序号。TCP 连接已经建立,A 进入 ESTABLISHED (已建立连接)状态

TCP 四次挥手
在这里插入图片描述

  • A 的应用进程先向其 TCP 发出连接释放报文段(FIN=1,序号 seq=u),并停止再发送数据,主动关闭 TCP 连接,进入 FIN-WAIT-1(终止等待1)状态,等待 B 的确定

  • B 收到连接释放报文段后即发出确认报文段,(ACK=1,确认号 ack=u+1,序号 seq=v),B 进入 CLOSE-WAIT (关闭等待)状态,此时的 TCP 处于半关闭状态,A 到 B 的连接释放

  • A 收到 B 的确认后,进入 FIN-WAIT-2 (终止等待2)状态,等待 B 发出的连接释放报文段

  • B 没有要向 A 发出的数据,B 发出连接释放报文段(FIN=1,ACK=1,序号 seq=w,确认号 ack=1),B 进入 LAST-ACK (最后确认)状态,等待 A 的确认

  • A 收到 B 的连接释放报文段后,对此发出确认报文段(ACK=1,seq=u+1,ack=w+1),A 进入 TIME-Wait (时间等待)状态。此时 TCP 未释放掉,需要经过时间等待计时器设置的时间 2MSL 后,A 才进入 CLOSED 状态

发布了37 篇原创文章 · 获赞 7 · 访问量 1122

猜你喜欢

转载自blog.csdn.net/Hanmin_hm/article/details/104756008
今日推荐