C++八股----4.2

1. 读写锁如何实现?
2. 如何实现线程池?线程池里放了多个任务后,这些任务怎么分配到各线程的?
3.哈希表的原理是什么?
4.怎么实现对一个树结构进行广度优先遍历?
5.栈内存和堆内存的区别?栈为什么分配速度快?它具体怎么分配?
6.当使用new创建一个新的数组,它指针是虚拟地址还是物理地址?什么时候回真正映射到物理内存?
7.https加密原理是怎么样的?
8.如果有个假冒服务器,它也可以跟你握手吗?

1. 读写锁是一种并发控制机制,允许多个线程同时读取共享资源,但写操作需要独占访问;初始化一个互斥锁(用于保护共享转态),初始化一个条件变量(用于阻塞等待的线程);读锁:如果没有写线程正在访问,允许读线程进入;写锁:如果没有读线程或写线程正在访问,允许写线程进入;解锁:读线程解锁时,介绍读取计数;写线程解锁时,通知等待的线程;

2. 线程池,通过三个类实现,(1)线程类,用于控制线程的启动和停止,以及维护一个指向事件循环的指针;(2)程池类:用于管理线程,包括初始化线程数量,已经放置一个任务队列,每来一个事件就放到队列里,如果有空闲线程就唤醒去执行;(3)任务函数的接口类,写一个基类,自己通过子类来自定义函数;
线程池收到任务后,会把任务放到共享的任务队列里面,每个线程会在循环里去拿任务,拿到任务时要加锁互斥,谁先拿到就执行。另外还可以考虑给任务添加优先级

3. 通过哈希函数将将键值映射到数组索引,再用数组存储键值对。举例:像C++中的unorder_map,使用链地址法解决冲突,在哈希冲突时把多个元素放到同一个桶里链表中。当存储的元素跟数组大小的比值超过一定阈值,会进行自动扩容;

4.  广度优先遍历就是对每一层进行遍历,用队列实现;先把根节点入队,出队时访问,然后把它的子节点按顺序入队,一直到队列为空;

5. 栈由操作系统自动分配回收,存储函数的现参、局部变量、返回地址等;堆是通过new/delete或者malloc/free由程序自己分配释放,能分配更大的内存,但可能会出现内存碎片等问题;操作系统在底层对栈提供支持,会分配专门的寄存器存放栈的地址,另外它的入栈出栈操作也十分简单,并且由专门的指令执行,所以下来会很快;堆的操作是由C/C++函数库提供,在分配内存的时候需要一定的算法寻找合适大小的内存。并且获取堆的内容需要两次访问,第一次访问指针,第二次根据指针保存的地址访问内存,因此堆比较慢。

6. 并不是物理内存,而是虚拟地址,后面需要通过页表和MMU(内存管理单元)来映射到物理内存;操作系统采用懒加载策略,只有在程序访问这块内存时,才会将虚拟内存页映射到物理内存。也就是说,程序触发缺页中断时,操作系统才会分配物理内存并更新页表来完成映射。

7. 客户端会发送一个Client random + TLS版本号 + 支持的密码套件列表的信息给服务端,服务器回应一个Server random + 自己的数字证书;客户端通过证书认证机构(CA)来验证证书是否合法,确认服务器身份后,用服务器的公钥加密一个pre-master发回给服务器;服务器用私钥解密得到该数;后面的就使用这个生成的会话秘钥client random + Server random + pre-master进行对称加密传输;

8. 如果是一个假冒服务器,它的证书没有权威CA的签名,或者证书域名不匹配,客户端会提示不信任,阻止连接。CA:是证书颁发机构,负责签发;证书:由CA颁发的电子文件,包含公钥、身份信息和CA的签名等;
全部评论
mark一下哈希表原理
点赞 回复 分享
发布于 04-04 16:38 湖北

相关推荐

许愿顺顺利利
牛客740257869号:两个百分之18 hh
点赞 评论 收藏
分享
评论
1
12
分享

创作者周榜

更多
牛客网
牛客企业服务