4.1虎牙客户端实习一面准备与实际的面试情况

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. 各类算法时间复杂度
  • 冒泡排序 O ( n 2 ) O(n^2) O(n2) 每一轮小的飘到前面,大的沉底
  • 选择排序 O ( n 2 ) O(n^2) O(n2)每一轮选择当前轮中的最小元素放在这一轮的最前面 A [ i ] A[i] A[i]
  • 插入排序 O ( n 2 ) O(n^2) O(n2)每一轮将第i个元素插入到前面有序序列中的对应位置,元素要移动的时候从 A [ i − 1 ] A[i-1] A[i1]开始往后移动 **TODO:**这个最不熟,需要写一下熟练一下
  • 快排平均复杂度 O ( n l o g ( n ) ) O(nlog(n)) O(nlog(n))
  • 堆排序 O ( n l o g ( n ) ) O(nlog(n)) O(nlog(n)) 对于大小为n的堆调整一次的复杂度为 l o g ( n ) log(n) log(n)
  • 归并排序 O ( n l o g ( n ) ) O(nlog(n)) O(nlog(n))
2. 进程、线程
  • 每个进程都有自己一片独立的内存空间,一个进程可以有多个线程
  • 同一进程的线程共享进程的方法区资源,但是有自己的本地方法栈
    4.1虎牙客户端实习一面准备与实际的面试情况_第1张图片
3. fork()的作用

作用:通过一个系统调用,创建一个与原来几乎完全相同的进程

但是返回值有两个,在子进程中返回0,在父进程中返回子进程的pid

4.同步机制

线程间通信方式:

  1. 管道:无名管道、有名管道(命名管道可以在不相关的进程和不同计算机之间使用)

  2. socket

  3. 共享内存

  4. 事件

  5. 消息队列

    进程间同步方式

    参考链接

    1. 临界区:保证同一时刻只有一个线程能访问数据,在一个线程进入临界区之后,其他要进入临界区的线程将会被挂起。
    2. 互斥量(mutex)互斥量只有一个,可命名,跨进程
    3. 信号量:
    4. 事件:等待某个时间发生
5. 数据库索引

这部分没准备的,就说了个主键自动创建索引,然后在查询比较频繁的列上创建索引。需要加强。

6. tcp、udp如何实现的,握手过程
  • 三次握手、四次挥手的过程
  • 参考链接
7. 事务的四大特性、事务隔离、锁
  • A (Atomicity)是指事务的原子性,事务的操作要么都发生,要么都不发生

  • C(Consistency)是指事务前后数据库都必须要处于一致性的状态

  • I(Isolation)事务隔离性是指在多个用户并发访问数据库时,一个用户的事务不能被其他用户的事务干扰

  • D(Durability)持久性,事务一旦提交,对数据库中数据的改变就是永久的

    事务的隔离

    1. 脏读:一个并发(TODO:与并行的区别?)的事务读取了另一个事务未提交的数据
    2. 不可重复读:一个事务查询范围内多次查询返回了不同的值,由于查询期间有其他事务提交
    3. 幻读:读取到一个并发的事务插入的数据,举个例子,事务A,在一个表中读取一个id为1的元组,如果没有就插入一条,查询时没有,并发事务B此时插入了一条数据 id为1,然后事务A插入的时候就会报主键冲突,导致事务失败。

    隔离级别

    1. 读未提交:
    2. 不可重复读:
    3. 可重复读:
    4. 串行化:
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的包给接收方。如此循环,知道发送至最后一个包。

你可能感兴趣的:(面经)