当前位置: 首页 > news >正文

网站后台管理界面代码门户网站建设推广

网站后台管理界面代码,门户网站建设推广,深圳制作网站有几家,黄骅贴吧海鲜城项目部分 1.这个项目是什么? 高并发内存池的原型是谷歌一个开源项目#xff0c;tcmalloc#xff0c;而这个项目#xff0c;就是tcmalloc中最核心的框架和部分拿出来进行模拟。他的作用就是在去代替原型的内存分配函数malloc和free。这个项目涉及的技术有#xff0c;c…项目部分 1.这个项目是什么? 高并发内存池的原型是谷歌一个开源项目tcmalloc而这个项目就是tcmalloc中最核心的框架和部分拿出来进行模拟。他的作用就是在去代替原型的内存分配函数malloc和free。这个项目涉及的技术有c数据结构(双向链表哈希桶)操作系统内存管理多线程互斥锁单例模式等方面的技术。 2.这个项目是怎么组成的? 由threadcachecentralcache和pagecache三部分组成什么意思呢当用户使用我们这个项目去申请内存时进入这个函数后先去threadcache申请内存如果不够再去向第二层centracahhe去申请内存要是还是不行就去第三层申请内存最后把申请到的内存返回给用户。这就是tcmalloc的大概实现当然了很多细节还没展开说。 3.这个项目实现后效果怎么样? 在项目完成后拿我们实现的tcmalloc去和原先的malloc对比。 申请固定内存大小时我创建了4个线程分别执行10轮操作每轮n申请释放1万次也就是一共进行了40万次的申请释放结果是malloc用了31ms左右而tcmlloc只用了11ms左右就是快了3倍。 当我尝试申请不同内存时同样的4个线程执行10轮1轮1万次共40万次申请释放操作这次malloc的时间用了1023ms而tcmalloc只用了113ms倍数来到了10倍也就是说理想状况下在未来的多线程开发环境下申请不同的内存使用malloc函数如果要用10s才能完成内存的申请和释放,我只要用1s。 4.你在这个项目收获了什么? 调试方面: 一加深了条件断点理解和使用还可以设置具体断点条件让它停下来 二:学会了使用查看函数栈帧当在断点处停下当前函数没问题就可以调用函数堆栈去看看调用这个函数的函数有没有问题。(蛮实用的) 三:疑似死循环的处理 当我们设置了断点但它迟迟没有到达断点处程序也没有崩溃就可能进入死循环了这时候全部中断程序就会停在死循环的部分。 对操作系统内存管理的理解: 以前认为申请内存就是简单从内存里哇一块过来就行实现了这个项目后才发现申请内存的时候可能有多层内存池这个没有空间再逐步往后申请再比如申请不同内存块再造成的内存碎片问题啊等等 对c语法和数据结构更加熟悉项目是c虽然代码不是很多但都是精华涉及了很多语法的使用比如智能指针强制转换类的使用啊还有数据结构啊对链表的操作插入删除哈希桶的操作对齐映射等等加强了我对代码的掌控力 5.你在这个项目遇到的最大困难是什么? 可能就是调试的时候吧因为我是写完一个功能然后调试一下确保每个功能没有问题然后到了最后我感觉没啥大问题了然后十多个文件一运行得得得得一排排错误把我整懵了就开始调试了除了一些语法其中比较难调试的是申请内存的一套龙过程经常调试过程中要么就是因为空指针要么就是走到不该走的地方去了后面加了应有的条件判断还是函数功能的完善问题就越来越少当时看蛮兴奋的。 还有一个比较大的问题当时比较tcmalloc和malloc的效率发现tcmalloc还比malloc申请释放内存要慢一点然后我就上网查为什么怎么解决后面发现可以用vs自带的性能分析设置成debug模式然后进入调试的性能诊断后面发现自己的有个函数占了时间的近一半(mapobjecttospan函数–地址和页号的映射关系)然后发现这个函数加了锁恰恰这个函数又经常被调用就造成了效率低下然后我就查资料csnd说用基数树不用加锁又能完成原先的函数功能我就把基数树套上去后就发现果然快了很多 6.为什么基数树不要加锁? 因为不可能存在多个线程对同一个页进行读取映射和建立映射的操作读取映射的时候是在span中use_count不为0时而建立映射是在usecount为0的时候一个页中的usecount没有两种状态所以不可能出现多个线程对一个页进行读取映射和建立映射的操作。 7.那一个线程读取映射一个线程建立映射怎么办呢? 如果是红黑素哈希表的话那就会有影响哈希和红黑树的插入删除都会影响到整个数的一个情况。所以必须要加锁但如果是基数树的话因为它的空间一旦开好就是固定的所以不用担心建立其他页的映射会影响本页的读取就和一个固定大小的数组一样不需要加锁 8.那说说你在这个项目对锁的使用吧? 这个项目三部分可能会涉及线程安全第一部threadcache我的解决方案是使用线程局部储存使得每一个线程都有自己的专属内存在这个线程内部是全局可见的但在其他线程那是不可访问的所以通过这种方法就不必再加锁了因为他本身就解决了线程安全问题了 第二部分有线程安全问题的cencatalacache当多个线程向哈希桶拿内存的时候会有问题所以我给它加了个哈希桶锁不用把整个哈希桶都锁起来这样一来只有线程访问相同一个桶的时候才有加锁解锁的消耗这也是他效率高的原因一部分 第三步有线程安全的是当多个线程访问pagecache的哈希桶时会有线程安全因为在这里一个线程操作会影响多个地方的桶加锁解锁太频繁了所以在这里我选择直接加把大锁一次只能一个线程访问pagecache的哈希桶。 9.那说说用户在申请一块内存要经过哪些流程吧?小伙子 好的面试官 假设用户要申请一个7字节的内存然后调用tcmalloc这个函数进入这个函数后我们先把7字节对齐成8这样做是为了避免内存碎片对齐的字节方便后续我们对内存碎片的处理。对齐后线程第一次申请内存通过线程局部存储获得自己专属的threadcache然后通过threadcache去申请内存对齐的字节数是8那我们就找到threadcache的哈希桶的0下标去获取一个8字节的内存块然后发现没有这时候就找二哥centralcache因为哈希桶的对齐映射关系是一致的线程也去centalcache的哈希桶0号去获取一个非空span接着计算thread要多少个8字节内存块这一块我使用的是慢反馈算法第一次给一个第二次给两个第三次给三个越就是你调用的越多以后我就返回越多个内存块给你但最多返回512个这次是第一次就返回一个8字节内存块就行那就哈希桶里找啊找之前加锁发现一个非空的span都没有就去找大哥找之前解锁然后加上大哥的锁找大哥要多少呢三弟刚刚要一个然后乘以他要的字节也就是8个字节不满一页按一页申请大哥就去自己的第一个哈希桶找有没有1页的内存卡发现没有就往后找发现还是没有就向系统申请一个128页的内存块然后继续找把128拆成一个一页的和一个127页的返回一页给二弟二弟把这个一页切成512的8字节挂在自己的0号哈希桶返回一个给三弟用。至此整个申请内存流程大致完成。 10.说的不错那你说说你释放的流程吧? 厚礼谢感谢 这个项目的释放内存函数叫tcfree。 当用户通过tcfree释放内存块时线程会把这个内存卡先挂在三弟的对应的哈希桶后面如果这个哈希桶后的链表数量超过了我们设定的值就把这段链表取出来挂着二哥对应的哈希桶后面同时查找映射表看看不同的内存块挂着不同的span后面确保每个span后跟着的内存块都是span这个范围里的。同样的当二哥后面挂的链表过长满足一页大小之后就把他取下来然后挂着大哥对应的哈希桶后面同时从这页开始尝试向前合并页数向后合并页数这里返回的是一页就尝试向后看看有没有2页的有就合成三页然后把1/2页的span删除继续向后合并直至遇到空桶。至此这个项目大概释放内存流程就走完了 11.给定100亿个整数设计算法找到只出现一次的整数 C语法部分 1.1.谈谈智能指针吧? 智能指针就是利用对象的生命周期来控制程序资源当对象出了作用域就自动调用对象的析构函数就能解决内存泄露问题了 2.智能指针有哪几种呢?讲讲他们的区别? 根据解决智能指针拷贝问题方法的不同把智能指针大概分以下几种 第一种autoptr他是通过转移资源所有权来解决拷贝问题也就是假如有一个智能指针a指向一块资源这时候用a拷贝出一个b智能指针此时b就接管了资源的所有权a就废了。 第二种是uniqueptr他的解决方法是通过把类的拷贝构造函数和拷贝赋值函数私有化直接不让进行智能指针的拷贝 第三种sharedptr,他是通过引用计数来解决智能拷贝问题每一块资源都对应着一个引用计数当增加了一个智能指针指向这块资源引用计数就加加如果有指针不指向这块资源了智能指针不必直接调用析构函数去释放这块内存而是将引用计数减一如果此时为0则进行调用析构。 ps这个引用计数变量是在堆区这块资源的所有智能指针对象共享这一个变量不能放栈区那每个个智能指针都有一个计数了也不能变为全局或者变为静态变量那么就是所有资源的所有对象都共享这个计数也不对。 第四种是为了解决sharedptr的循环引用的问题(当智能指针管理的是节点是并且节点一指向节点二节点二指向节点一那么此时双方的引用计数都是2当节点一节点二出了作用域引用计数减为一但此时会进入死胡同节点一的资源释放取决于节点二中的prev变量节点二资源的释放取决于节点一中的next变量的释放而节点一中的next的释放又取决于节点一节点二中的prev释放取决于节点二的资源释放就进入死循环了)是weakptr他把节点中的prev和next指针换成了weakptr指针构造出来的weakptr指针和sharedptr一块管理资源但不会增加引用计数就解决其的循环引用问题了 3.c有强制转换为什么还要增加其他的类型转换。 一把所以情况混在一起可读性低 二有时会减少精度 4.c有哪些类型转换? staticcast用于两个类型相近的转换比如int和double的转换 reinterpretcast用于两个类型不同的转换 constcast用于去除const属性使用后就可以对const变量进行修改了 PSconst变量认为其不会变就变值放在寄存器中但我们修改的是内存中的值所以打印出来还是原来的值因为此时OS是从寄存器中拿的值。这是我们可以用volatie关键词对const进行修饰这样就不会做多余的优化而且去内存中拿值了 最后一种类型转换是dynamic是一种向下转换将父类的指针或引用转化成子类的指针或引用但如果父类的指针原先是指向父类的转换成子类的指针它可能会调用子类的资源那么就是不安全的此时调用dynamiccast就会失败并返回一个空指针 5.谈谈进程通信中的管道传输吧? 管道通信是父子进程的一种通信方式父进程先创建管道然后再创造子进程然后父子进程关掉相应的读写文件符确定谁向谁输入。管道通信自带互斥和同步 要不就是父进程在操作管道要么就是子进程在操作当写满了写端进程就被挂起待管道有空间了再唤醒写端。管道通信是半双工通信要实现双方同时通信需要两个管道此为匿名管道pipe函数创建匿名管道参数是一个输出型数组返回两个指向管道的读写文件描述符。 6.再谈谈命名管道吧? 两个无亲缘关系的进程可通过命名管道的文件名打开同一份管道文件进行通信mkpipo函数第一个参数是表示要创建命名管道名字是以路径还是文件名(默认当前路径创建)第二个参数是以什么权限打开创建一个命名管道服务端以读的方式客户端以写的方式打开就可以通信了。 7.二者区别 匿名管道和命名管道的区别在于创建方式(函数)和打开方式(匿名默认都打开命名要自己去选择) 8.共享内存通信? 在物理空间申请一块共享空间然后将不同进程的页表和这块空间建立映射同时在其各自的虚拟空间中开辟空间把虚拟空间也和其页表建立映射那么虚拟空间就和物理空间映射起来了这些进程就看见了同一份内存这一份内存就叫共享内存。创建共享内存用得是shmget函数第一个参数是key标识这块共享内存在系统的唯一性第二个参数是这块内存的大小第三个参数是创建共享内存的方式。 9.共享内存和管道比较的优缺点? 优点只需要拷贝两次而管道要拷贝四次所以最快。 缺点管道自带互斥和同步而共享内存啥也没有。 10.谈谈消息队列吧? 消息队列让不同进程看到同一份资源的方法是创建一个队列队列里都是数据块进程a和进程b要写入信息都在队列的尾部读取都在队列的头读取创建函数是msgget函数,第一个参数是key值是系统中的唯一标识第二个参数是打开方式。 全靠龙哥博客活着 各位看官要是想搞明白八股文去看2021dragon龙是这样打的吧超经典
http://www.w-s-a.com/news/736459/

相关文章:

  • 建一个购物网站多少钱上海商标注册
  • 琪觅公司网站开发面点培训学校哪里有
  • 北京建设工程信息网站江苏企业网站建设
  • php电子商务网站建设wordpress新建的页面如何加xml
  • 去百度建网站外贸业务推广
  • 百度seo 站长工具网络营销课程个人总结3000字
  • 设计品牌网站wordpress商城 中文站
  • 公司网站要备案吗百度售后电话人工服务
  • 北京移动网站建设制作一个购物网站
  • 网站优化排名如何做网络开发工程师
  • 域名已有服务器也有怎么做网站pc 手机网站 微站
  • 鞍山网站设计制作网站最好的外贸网站建设
  • 百度手机模板网站新变更营业执照注册号查了发现之前有备案过网站了
  • 群晖个人网站建设建设网站主机免费版
  • 下载好了网站模板怎么开始做网站阿克苏网站建设价格
  • 有谁做彩票网站学会了vue 能搭建一个网站平台
  • 描述对于营销型网站建设很重要飘红效果更佳教育培训排行榜前十名
  • 国外网站有哪些推荐的网站按关键词显示广告图片
  • 互联网招聘网站排名手机网站系统
  • 网站与云平台区别企业网站建设有什么要求
  • wordpress福利网站源码高端网站设计培训机构
  • 网站建设找客户招标网免费
  • 东莞食品网站建设扬州市住房建设局网站
  • 网站色彩心理建设网站的主要功能有哪些
  • 营销型网站建设运营企业宣传网页设计
  • 建设银行官方网站网址sem搜索
  • 简述建设网站的具体步骤网络建设方案ppt
  • 自建门户网站建设工程质量监理协会网站
  • 为企网站版面设计经历了哪几个阶段
  • 如何直到网站是用什么模板做的怎么在外贸公司拿订单