每日面经(六)

目录

1.代理中间人攻击

2.什么是内存泄漏

3.syn锁锁不同东西的区别

4.MySQL有哪些锁

5.move


1.代理中间人攻击

代理中间人攻击(Man-in-the-middle attack)是指攻击者通过拦截通信双方的通信,使其认为彼此正直接通信,从而窃取信息,甚至篡改、伪造信息的一种攻击方式。由于攻击者能够拦截和读取通信内容,所以也被称为“转发攻击(replay attack)”。

代理中间人攻击通常是在公共的、开放的网络环境下进行的。攻击者通过一些手段截取通信双方的通信,然后对通信内容进行修改并重新发送给另一方,达到窃取信息、篡改信息的目的。

常见的代理中间人攻击手段包括ARP欺骗、DNS欺骗、IP欺骗等。攻击者可以通过这些手段将受害者的网络流量重定向到攻击者的计算机上,从而实现拦截和窃取通信内容的目的。

为防止代理中间人攻击,我们可以采用HTTPS协议进行通信。HTTPS在HTTP协议的基础上增加了SSL/TLS协议,用于对通信进行加密、认证和完整性保护,从而防止窃听和篡改。

此外,我们还可以采用数字证书来验证服务器的身份。数字证书是一种由第三方机构颁发的身份证明,用于证明服务器的身份。当客户端与服务器建立连接时,服务器会向客户端发送数字证书,客户端将数字证书与预置的可信证书列表进行比对,以确定服务器的身份是否合法。如果数字证书无效或不匹配,则客户端不信任服务器,此时连接将被中断。

2.什么是内存泄漏

内存泄漏(memory leak)是指程序中已经不再使用的内存没有得到释放,导致系统内存的占用不断增加,甚至耗尽全部资源而导致程序崩溃的一种现象。

当程序使用动态分配的内存时,需要手动申请内存、使用内存和释放内存。如果程序中使用的动态分配内存没有在合适的时间释放,就会导致内存泄漏。内存泄漏的情况有很多种:

  1. 没有正确地使用free或delete释放掉申请的内存。
  2. 代码中出现了死循环或递归调用导致内存被无限制地占用。
  3. 堆栈数据结构中的指针、引用等没有被正确地处理,导致内存泄漏。
  4. 事件监听器没有被正确地释放,导致对象无法被垃圾回收器清理,从而导致内存泄漏。

内存泄漏可能会导致程序的运行变慢、占用系统的资源过多,甚至会导致程序崩溃。为了避免内存泄漏的发生,我们可以采取以下几种方法:

  1. 在程序中使用智能指针等资源管理工具,能够自动管理内存释放,避免手动释放内存失误的情况。
  2. 在代码中检查有没有存在使用动态分配的内存没有被正确释放的情况,及时释放内存。
  3. 总结出出现内存泄漏的情况,并制定相应的内存管理策略,避免内存泄漏。

3.syn锁锁不同东西的区别

在计算机网络中,TCP协议通过三次握手建立连接,其中第二个阶段是客户端向服务器发送SYN包,服务器收到后回复一个带有SYN和ACK标志位的包告知客户端,客户端再回复一个带有ACK标志位的包,建立起TCP连接。SYN锁是通过协议头的SYN标志位实现的,用于握手建立连接过程中的同步锁。

在多线程编程中,锁通常用于同步访问共享资源,避免多个线程同时对共享资源进行写入操作。对于同步锁,锁的对象通常是共享资源,而不是协议头中的标志位,因此与TCP中的SYN锁不同。

因此,SYN锁和线程中的锁是针对不同情况下的同步锁,它们使用的方法不同,目的也不同。SYN锁是一种网络传输协议层面的同步机制,用于保证通信可靠性和完整性,而线程中的锁是一种针对共享资源的同步机制,用于避免多个线程对共享资源的竞争和混乱访问,确保线程安全。

4.MySQL有哪些锁

在 MySQL 中,常见的锁包括以下几种:

  1. 共享锁(Shared Lock),也称为读锁,它允许多个事务并发地读取同一行数据,但不允许任何一个事务修改该行数据,直到已经释放该锁。

  2. 排他锁(Exclusive Lock),也称为写锁,它禁止其他事务对于该锁定数据进行读取或修改,直到已经释放该锁。

  3. 行锁(Row Lock),是针对表中数据行的锁,它可以保证并发事务修改不同行时,不会相互阻塞。

  4. 表锁(Table Lock),作用于整张表,可以保证事务对表的修改是原子性的,但是在锁定期间,其他事务不能对同一个表进行修改操作。

  5. 间隙锁(Gap Lock),即锁定一个范围,在锁定该范围同时锁定范围之间的间隙,可以防止其他事务向该范围所在的空间插入新数据。

  6. next-key 锁(Next-Key Lock),每个 next-key 锁实际上都是一个索引项锁定和一个间隙锁定的组合。为了避免幻读情况的出现,InnoDB 存储引擎会在使用索引执行查询时自动加上 next-key 锁。

以上就是 MySQL 中常见的一些锁,这些锁在实际的并发控制处理中扮演着很重要的角色,在合适的场景下使用合适的锁可以提高数据库的并发处理效率。

5.move

在C++11中引入了一个新特性叫做“移动语义”(Move Semantics),可以显著提高代码的效率。在C++中,对象拷贝(Object Copy)造成的开销是比较高的,特别是当对象非常大或者在大量的数据结构中使用时。在这种情况下,可以使用移动语义来避免不必要的对象拷贝造成的开销。

移动语义通过将资源从一个对象“移动”(Move)到另一个对象,避免了拷贝的开销。移动一个对象后,源对象将不再拥有资源的所有权,它的状态可以是未定义的,但通常会被设为空状态。目标对象将获得源对象的资源所有权,而源对象不再拥有该资源。通过这种方式,移动语义可以在拷贝对象的同时避免不必要的开销,提高代码性能。

在C++11之前,以往有些语言的move语义都使用了快照机制,相对较灵活。至于C++的move语义,则是直接移动资源对象,会改变源对象的状态。

底层:

在 C++ 中,使用移动语义实际上是将一个对象的内存资源转移的过程,而并非将原对象中的内容拷贝到新的对象中。在编程语言层面,这个过程是通过将原对象的指针(或引用)指向被拷贝对象的底层实现来实现的。

具体来说, C++ 语言的移动语义是通过移动构造函数和移动赋值函数实现的。移动构造函数将一个临时对象的资源“移动”到新构造的对象中,而不是像拷贝构造函数那样创建一个副本。移动构造函数实际上是接受一个右值引用参数,将其指针转移给新对象,在转移之后,原对象将不再拥有资源的所有权。

class MyObject {
public:
    // Move ctor
    MyObject(MyObject&& other) noexcept {
        m_data = other.m_data;
        other.m_data = nullptr;
    }

    // Move assignment operator 
    MyObject& operator=(MyObject&& other) noexcept {
        if (this != &other) {
            delete m_data;
            m_data = other.m_data;
            other.m_data = nullptr;
        }
        return *this;
    }

private:
    int* m_data;
};

移动赋值函数与移动构造函数类似,但是不会创建新的对象。它会将已存在的对象与右值引用参数的指针进行交换,释放已存在对象所拥有的资源,而在新的对象中,所有权被右值引用参数接管。这样一来,就可以在不必要的拷贝操作上节省大量的开销,提高程序的性能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值