1.说一说 select 的原理以及缺点
select原理: select是一种IO多路(多个TCP连接)复用技术,具体实现原理是
- select会维护一个文件描述符列表fd_set,用来存放需要监听的文件描述符fd,其本质是一个1024bit的bitmap数组,1代表需要检测的fd,0代表不需要检测的fd,初始时bitmap的元素全为1;
- 调用select开始对fd_set进行轮询,轮询操作需要将fd集合从用户态拷贝到内核态,因为检测一个fd是否有IO事件发生是由内核完成的。同时select会阻塞其他进程,直到检测到有事件发生才会返回事件个数,并修改fd_set对应的值,0表示无事件发生。由于select返回的只是事件发生的个数,所以要知道具体是哪一个fd有IO事件,还需要再次对fd_set进行轮询一遍。 缺点: 1.每次调用select都需要将文件描述符集合从用户态拷贝到内核态; 2.select只能返回事件发生的个数,而不知晓具体哪个fd发生了IO事件,所以还需要轮询一遍;
- select可监听的文件描述符有限,只有1024个,但可以通过FD_SETSIZE函数进行修改
- 文件描述符集合不能重用,因为每次监听都会对该集合进行修改
- 轮询机制过于耗时,尤其是当fd数量很多时
2.InnoDB中的行级锁是怎么实现的
- innodb的行锁是通过给索引的索引项加锁来实现的
- innodb按照辅助索引进行数据操作时,辅助索引和主键索引都将锁定指定的索引项
- 通过索引进行数据检索时,innodb才使用行级锁,否则innodb将使用表锁
3.HTTPS协议中间人攻击是什么?
https协议由 http + ssl 协议构成,具体的链接过程可参考SSL或TLS握手的概述
中间人攻击过程如下:
- 服务器向客户端发送公钥。
- 攻击者截获公钥,保留在自己手上。
- 然后攻击者自己生成一个【伪造的】公钥,发给客户端。
- 客户端收到伪造的公钥后,生成加密hash值发给服务器。
- 攻击者获得加密hash值,用自己的私钥解密获得真秘钥。
- 同时生成假的加密hash值,发给服务器。
- 服务器用私钥解密获得假秘钥。
- 服务器用加秘钥加密传输信息。
防范方法:
服务端在发送浏览器的公钥中加入CA证书,浏览器可以验证CA证书的有效性
4.简述一下 Linux 中的零拷贝
零拷贝(Zero-copy)是一种优化技术,用于减少数据在内核空间和用户空间之间的拷贝次数,提高数据传输的效率和性能。它通过最小化数据的复制操作,将数据直接从源位置传输到目标位置,而不需要额外的数据拷贝。
零拷贝的原理是利用操作系统和硬件的特性来实现数据的直接传输。在传统的数据传输过程中,数据通常需要经过多次复制:首先从磁盘或网络读取到内核缓冲区,然后再从内核缓冲区复制到用户空间缓冲区,最后才能被应用程序处理。而零拷贝技术通过使用内核缓冲区共享机制、DMA(直接内存访问)等方式,将数据直接从内核缓冲区传输到目标位置,避免了额外的数据复制操作。
5.什么是僵尸进程与孤儿进程?
在 Unix/Linux 系统中,正常情况下,子进程是通过父进程创建的,且两者的运行是相互独立的,父进程永远无法预测子进程到底什么时候结束。
当一个进程调用 exit 命令结束自己的生命时,其实它并没有真正的被销毁,内核只是释放了该进程的所有资源,包括打开的文件、占用的内存等,但是留下一个称为僵尸进程的数据结构,这个结构保留了一定的信息(包括进程号 the process ID,退出状态,运行时间),这些信息直到父进程通过 wait()/waitpid() 来取时才释放。
这样设计的目的主要是保证只要父进程想知道子进程结束时的状态信息,就可以得到
- 僵尸进程:一个进程使用 fork 创建子进程,如果子进程退出,而父进程并没有调用 wait 或 waitpid 获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中,这种进程称之为僵死进程。
- 孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么这些子进程将成为孤儿进程。孤儿进程将被 init 进程(进程号为1)所收养,并由 init 进程对它们完成状态收集工作。