C++面经汇总帖(二)

一、线程池  

1. 线程池的概念:

          线程池就是首先创建一些线程,它们的集合称为线程池。使用线程池可以很好地提高性能,线程池在系统启动时即创建大量空闲的线程,程序将一个任务传给线程池,线程池就会启动一条线程来执行这个任务,执行结束以后,该线程并不会死亡,而是再次返回线程池中成为空闲状态,等待执行下一个任务。

2. 线程池的工作机制

         2.1 在线程池的编程模式下,任务是提交给整个线程池,而不是直接提交给某个线程,线程池在拿到任务后,就在内部寻找是否有空闲的线程,如果有,则将任务交给某个空闲的线程。

         2.1 一个线程同时只能执行一个任务,但可以同时向一个线程池提交多个任务。

3. 使用线程池的原因:

        多线程运行时间,系统不断的启动和关闭新线程,成本非常高,会过渡消耗系统资源,以及过渡切换线程的危险,从而可能导致系统资源的崩溃。这时,线程池就是最好的选择了。

二、红黑树、B树、B+树

1、红黑树是一种含有红黑结点并能自平衡的二叉查找树。它必须满足下面性质:

  • 性质1:每个节点要么是黑色,要么是红色。
  • 性质2:根节点是黑色。
  • 性质3:每个叶子节点(NIL)是黑色。
  • 性质4:每个红色结点的两个子结点一定都是黑色。
  • 性质5:任意一结点到每个叶子结点的路径都包含数量相同的黑结点。

详细可参考:30张图带你彻底理解红黑树

2、B树

3、B+树

4、B*树

总结:

二叉搜索树:二叉树,每个结点只存储一个关键字,等于则命中,小于走左结点,大于走右结点;

(B)B-树:多路搜索树,每个结点存储M/2到M个关键字,非叶子结点存储指向关键字范围的子结点;所有关键字在整颗树中出现,且只出现一次,非叶子结点可以命中;

B+树:在B-树基础上,为叶子结点增加链表指针,所有关键字都在叶子结点中出现,非叶子结点作为叶子结点的索引;B+树总是到叶子结点才命中;

B*树:在B+树基础上,为非叶子结点也增加链表指针,将结点的最低利用率从1/2提高到2/3;

详细可参考:B树,B-树和B+树、B*树的区别

三、DNS及域名解析的全过程

1. 浏览器先检查自身缓存中有没有被解析过的这个域名对应的ip地址,如果有,解析结束。

 2. 如果浏览器缓存中没有,浏览器会检查操作系统缓存中有没有对应的已解析过的结果。操作系统也有一个域名解析的过程,C:\Windows\System32\drivers\etc\host文件来设置,这个文件为了防止被病毒和黑客恶意篡改,所以它是只读的,你自己可以获取管理员权限才可以编辑,如果你在这里指定了一个域名对应的ip地址,那浏览器会首先使用这个ip地址。

3.  如果至此还没有找到域名对应的ip地址,这时候会真正的请求本地域名服务器(LDNS)来解析这个域名,这台服务器一般是距离你比较近的,并且这台服务器的性能都很好,一般大部分的域名都会在这里获取到并且解析完成。

4. 如果本地域名服务器(LDNS)仍然没有解析完成,就直接跳到根域名服务器(Root Server)请求解析。

5. 根域名服务器返回给本地域名服务器一个所查询域的主域名服务器(gTLD Server),gTLD是国际顶级域名服务器,如.com、.cn、.org等,全球只有13台左右。

6. 本地域名服务器(LDNS)再向第五步中根域名服务器返回过来的主域名服务器(gTLD Server)服务器发送请求。

7. 接收到请求的主域名服务器(gTLD Server)查找并返回此域名对应的Name Server域名服务器的地址,这个Name Server通常就是用户注册的域名服务器。

8. Name Server域名服务器根据映射关系表找到目标ip,返回给本地域名服务器(LDNS)。

9. 本地域名服务器(LDNS)缓存这个千辛万苦获得来的域名和对应的ip。

10. 本地域名服务器(LDNS)把解析的结果返回给用户,用户根据TTL值缓存到本地系统缓存中,域名解析过程至此结束

在实际的DNS解析过程中,可能还不止这10步,如Name Server可能有很多级,或者有一个GTM来负载均衡控制,这都有可能会影响域名解析过程。

四、三大范式

1、第一范式*(确保每列保持原子性)

2、第二范式(确保表中的每列都和主键相关)

3、第三范式(确保每列都和主键列直接相关,而不是间接相关)

五、进程调度算法

六、聚簇索引与非聚簇索引

七、上万数据里求Top5(堆排序、mapreduce、CUDA实现)

八、C++内存空间

const char * arr = "123";//字符串123保存在常量区,const本来是修饰arr指向的值不能通过arr去修改,但是字符串“123”在常量区,本来就不能改变,所以加不加const效果都一样

char * brr = "123";//编译不通过,“123”内存存储结构为 const char[4],用const类型初始化非const类型,必然出错

const char crr[] = "123";//

char drr[] = "123";//

参考帖:https://www.cnblogs.com/hesper/p/11427526.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值