4.2 虎牙客户端一面面经
1.面试问题
- 1.上来问项目
- 2.Qt信号槽机制简单说一下 只是说了简单的connect signal和slot,没有get到实际点
- 3.C11新特性 说了智能指针 auto lamda表达式,智能指针的底层实现还需要加强
- 4.STL容器用过哪些?底层实现,vector和queue的内存分配的不同点。
- 5.https 输入url到显示网页的过程
- 6.数据库索引?
- 7.聊天记录8w条?如何存取?存本地文件还是数据库?
面试官评价:基础还行,但是没什么亮点。给出的建议是培养自己的核心竞争力,要对某个方面比较了解。然后从底层实现去了解STL,能帮助更好的使用。2.自己准备的
1. 各类算法时间复杂度
- 冒泡排序 每一轮小的飘到前面,大的沉底
- 选择排序 每一轮选择当前轮中的最小元素放在这一轮的最前面
- 插入排序每一轮将第i个元素插入到前面有序序列中的对应位置,元素要移动的时候从开始往后移动 TODO:这个最不熟,需要写一下熟练一下
- 快排平均复杂度
- 堆排序 对于大小为n的堆调整一次的复杂度为
- 归并排序
2. 进程、线程
- 每个进程都有自己一片独立的内存空间,一个进程可以有多个线程
- 同一进程的线程共享进程的堆和方法区资源,但是有自己的本地方法栈
3. fork()的作用
作用:通过一个系统调用,创建一个与原来几乎完全相同的进程
但是返回值有两个,在子进程中返回0,在父进程中返回子进程的pid
4.同步机制
线程间通信方式:
管道:无名管道、有名管道(命名管道可以在不相关的进程和不同计算机之间使用)
socket
共享内存
事件
消息队列
进程间同步方式:
- 临界区:保证同一时刻只有一个线程能访问数据,在一个线程进入临界区之后,其他要进入临界区的线程将会被挂起。
- 互斥量(mutex)互斥量只有一个,可命名,跨进程
- 信号量:
- 事件:等待某个时间发生
5. 数据库索引
这部分没准备的,就说了个主键自动创建索引,然后在查询比较频繁的列上创建索引。需要加强。
6. tcp、udp如何实现的,握手过程
- 三次握手、四次挥手的过程:
- 参考链接
7. 事务的四大特性、事务隔离、锁
A (Atomicity)是指事务的原子性,事务的操作要么都发生,要么都不发生
C(Consistency)是指事务前后数据库都必须要处于一致性的状态
I(Isolation)事务隔离性是指在多个用户并发访问数据库时,一个用户的事务不能被其他用户的事务干扰
D(Durability)持久性,事务一旦提交,对数据库中数据的改变就是永久的
事务的隔离:
- 脏读:一个并发(TODO:与并行的区别?)的事务读取了另一个事务未提交的数据
- 不可重复读:一个事务查询范围内多次查询返回了不同的值,由于查询期间有其他事务提交
- 幻读:读取到一个并发的事务插入的数据,举个例子,事务A,在一个表中读取一个id为1的元组,如果没有就插入一条,查询时没有,并发事务B此时插入了一条数据 id为1,然后事务A插入的时候就会报主键冲突,导致事务失败。
隔离级别:
- 读未提交:
- 不可重复读:
- 可重复读:
- 串行化:
8. 设计模式
单例模式:饿汉(需要用到才创建)、懒汉(开始就创建)
3.自己项目
当socket接收缓冲区有新数据到来时,会发出readRead()信号,因此为该信号添加槽函数以读取数据
通过connecttoHost(IP,Port)连接服务器
当服务器被客户端访问时,会发出newConnection()信号,然后可以通过一个QTCPSocket类接受客户端的访问(server->nextPendingconnection())
当一个用户下线时,会向服务其发送一个下线信息,然后服务器广播这个用户的离线
点到点聊天
登录成功时服务器端会向客户端返回服务器端存储的所有用户信息,客户端接收用户信息后将其存储在friendlist中显示在聊天窗口右侧,存储信息中包含用户的ip地址,当双击好友列表中的成员时将会建立短暂的socket连接,此时当前客户端就可以向目标客户端发送信息
离线消息
当要发送的目标客户端不在线时,将离线消息发送到服务器缓存,将其保存在目标客户端的用户信息链表中,在服务器端关闭时保存在本地文件中,当目标客户端上线时,服务器端将数据离线消息发送给目标客户端。同时目标客户端的UI的label也会刷新告知用户有离线消息
文件传输功能
首先通过TCP连接向对方发送一个发送文件的请求,其中包含文件名以及文件的大小信息,当对方选择了接收文件的存储目录时,发送方首先创建一个udp的套接字,通过QUdpSocket类中bind方法和connect方法绑定接收方的IP和端口,连接建立后,发送方将文件分割成多个大小相同的包,每个包的大小为500字节(char [500]小于局域网的MTU)同时给每个包编号为seg = 1,2,…,n。首先用writeDatagram方法发送第一个包,接收方接受到该seg序号的包以后,用该序号给发送方发送一个ack的确认号,并将该数据包写入文件。当接收方接收到seg的确认号以后,便将seg + 1的包发送给接收方;若间隔一段时间后仍未收到seg的确认号,则认为超时出现,重新发送序号为seg的包给接收方。如此循环,知道发送至最后一个包。