网站开发需求文档怎么写赣州市开发小程序
news/
2025/9/22 23:23:37/
文章来源:
网站开发需求文档怎么写,赣州市开发小程序,四川省建设厅官方培训网站,网站网站做庄是怎样做来源 | 编程技术宇宙责编 | 晋兆雨头图 | 付费下载于视觉中国背景曾经#xff0c;我面试的时候有两个最怕的。一怕问算法#xff0c;二怕问高并发。算法这个#xff0c;自从刷了不少LeetCode#xff0c;发现还是有套路可循的#xff0c;虽不敢说算法能力有多强#xff0c… 来源 | 编程技术宇宙责编 | 晋兆雨头图 | 付费下载于视觉中国背景曾经我面试的时候有两个最怕的。一怕问算法二怕问高并发。算法这个自从刷了不少LeetCode发现还是有套路可循的虽不敢说算法能力有多强至少没有以前那么怕了才怪。而第二个高性能高并发技术感觉有好多技术要学东学一点西学一点不成体系。直到有一次面试遇到了一个大牛问到了这方面结果被虐的体无完肤。幸运的是这位大牛不但技术一流还认真跟我交流了学习心得怎么样去有体系的系统去梳理这方面的技术知识而不是瞎学。CPU不管什么样的编程语言什么样的代码框架最终都是由CPU去执行完成的当然这么说不太准确也有GPU、TPU、协处理器等其他情况当然这不是本文探讨的重点。所以要想提高性能提高并发量首要问题就是如何让CPU跑的更快这个问题也是一直以来CPU厂商一直在努力追求的方向。如何让CPU更快CPU厂商做了两个方面的努力加快指令执行的速度加快CPU读取数据的速度对于第一个方向CPU执行指令的快慢是跟CPU的主频紧密相关的如何更快的取指令、指令译码、执行缩短CPU的指令周期提升主频在相当长一段时间里都是非常有效的办法。从几百MHz到如今到几GHzCPU主频有了长足的进步相同时间里能够执行的指令数变的更多了。对于第二个方向如何提升CPU读取数据的速度答案就是加缓存利用局部性原理将内存中经常会访问的数据搬运到CPU中这样大大提升了存取速度。从一级缓存到二级缓存乃至三级缓存CPU缓存的层级和容量也在不断提升读写数据的时间省了不少。但随着时间到推移尤其进入21世纪之后处理器厂商发现进一步提升主频变得越来越困难了CPU的缓存也很难进一步扩容。怎么办呢既然一个人干活的速度已经很难再提升那何不多找几个人一起干于是多核技术来了一个CPU里面有多个核心众人划桨开大船CPU的速度再一次腾飞甚至让一个核在“闲暇时间”利用“闲置资源”去执行另外的线程诞生了让一个核“同时”执行两个线程的超线程技术。上面简单交代了为了提升性能CPU所做的努力。但是光是CPU快是没用的还需要我们更好的去利用开发否则就是对CPU算力的浪费。上面提到了线程是的如何提高性能提高并发量使用多线程技术当然是一个非常好的思路。但多线程的引入就不得不提到两个跟线程有关的话题线程同步线程阻塞多个线程协同工作必然会引入同步的问题常规解决方案是加锁加锁的线程一般会进入阻塞。线程遇到阻塞了就需要切换而切换是有一定的成本开销的不仅是系统调度的时间开销还可能有CPU缓存失效的损失。如果线程频频加锁频频阻塞那这个损失就相当可观了。为了提升性能无锁编程技术就出现了利用CPU提供的机制提供更轻量的加锁方案。同时为了让切换后的线程仍然能够在之前的CPU核心上运行降低缓存损失线程的CPU亲和性绑定技术也出现了。现代操作系统都是以时间片的形式来调度分配给多个线程使用。如果时间片还没用完就因为这样或那样的原因将执行机会拱手相让那线程也太亏了。于是有人提出要充分利用CPU别让线程阻塞交出执行权自己在应用层实现多个执行流的调度这里阻塞了就去执行那里总之要把时间片充分用完这就诞生了协程技术阻塞了不要紧我还能干别的不要轻易发生线程切换。内存与CPU工作相关的第一亲密伙伴就是内存了二者协作才能唱好一出戏。提升内存访问的速度同样是高性能开发话题重要组成部分那如何提升呢硬件层面程序员是很难改变的咱们只好从软件层面下功夫。内存的管理经历了从实地址模式到分页式内存管理如今的计算机中CPU拿的的地址都是虚拟地址这中间就会涉及到地址的转换在这里就有文章可做有两个方向可以努力减少缺页异常使用大页技术现代操作系统基本上都会使用一个叫换页/交换文件的技术内存空间有限但进程越来越多对内存空间的需求越来越大用完了怎么办于是在硬盘上划分一块区域出来把内存中很久不用的数据转移到这块区域上来等程序用到的时候触发访问异常再在异常处理函数中将其从硬盘读取进来。可以想象如果程序访问的内存老是不在内存中而是被交换到了硬盘上就会频繁触发缺页异常那程序的性能肯定大打折扣所以减少缺页异常也是提升性能的好办法。从虚拟地址寻址真实的物理内存这个过程是CPU完成的具体来说就是通过查表从页表-一级页目录-二级页目录-物理内存。页目录和页表是存在内存中的毫无疑问内存寻址是一个非常非常高频的事情时时刻刻都在发生而多次查表势必是很慢的有鉴于此CPU引入了一个叫TLBTranslation Look- aside buffer的东西使用缓存页表项的方式来减少内存查表的操作加快寻址速度。默认情况下操作系统是以4KB为单位管理内存页的对于一些需要大量内存的服务器程序Redis、JVM、ElascticSearch等等动辄就是几十个G按照4KB的单位划分那得产生多少的页表项啊而CPU中的TLB的大小是有限的内存越多页表项也就越多TLB缓存失效的概率也就越大。所以大页内存技术就出现了4KB太小就弄大点。大页内存技术的出现减少了缺页异常的出现次数也提高了TLB命中的概率对于提升性能有很大的帮助。在一些高配置的服务器上内存数量庞大而CPU多个核都要通过内存总线访问内存可想而知CPU核数上去以后内存总线的竞争势必也会加剧。于是NUMA架构出现了把CPU核心划分不同的分组各自使用自己的内存访问总线提高内存的访问速度。I/OCPU和内存都够快了但这还是不够。我们的程序日常工作中除了一些CPU密集型的程序执行数学运算加密解密机器学习等等以外相当一部分时间都是在执行I/O如读写硬盘文件、收发网络数据包等等。所以如何提升I/O的速度是高性能开发技术领域一个重要的话题。因为I/O会涉及到与外设硬盘、网卡等的交互而这些外设又通常是非常慢相对CPU执行速度的所以正常情况下线程执行到I/O操作时难免会阻塞这也是前面在CPU部分提到过的。阻塞以后那就没办法干活了为了能干活那就开多个线程。但线程资源是很昂贵的没办法大量使用况且线程多了多个线程切换调度同样是很花时间的。那可不可以让线程执行I/O时不阻塞呢于是新的技术又出现了非阻塞I/OI/O多路复用异步I/O原来的阻塞I/O是一直等等到I/O的完成非阻塞I/O一般是轮询可以去干别的事过一会儿就来问一下好了没有但每个线程都去轮询也不是个事儿啊干脆交给一个线程去专门负责吧这就是I/O多路复用通过select/poll的方式只用一个线程就可以处理多个I/O目标。再然后再改进一下用epoll连轮询也不用了改用内核唤醒通知的机制同时处理的I/O目标还更多了。异步I/O就更爽了设置一个回调函数自己干别的事去了回头操作系统叫你来收数据就好了。再说回到I/O本身会将数据在内存和外设之间传输如果数据量很大让CPU去搬运数据的话既耗时又没有技术含量这是对CPU算力的很大浪费。所以为了将CPU从中解放出来又诞生了一门技术直接内存访问DMA把数据的传输工作外包出去交由DMA控制器来完成CPU只在背后发号施令即可。有了DMA再也不用麻烦CPU去执行数据的搬运工作。但对于应用程序而言想要把文件通过网络发送出去还是要把数据在内核态空间和用户态空间来回折腾两次这两步还得CPU出马去复制拷贝属于一种浪费为了解决这个问题提升性能又进一步产生了零拷贝技术彻底为CPU减负。算法架构CPU、内存、I/O都够快了单台计算机的性能已经很难提升了。不过现在的服务器很少是单打独斗了接下来就要把目光转移到算法、架构上来了。一台服务器搞不定那就用硬件堆出性能来分布式集群技术和负载均衡技术就派上用场了。这年头哪个后端服务没有数据库如何让数据库更快该轮到索引技术上了通过给数据库建立索引提升检索速度。但数据库这家伙的数据毕竟是存在硬盘上的读取的时候势必会慢要是大量的数据请求都怼上来这谁顶得住于是基于内存的数据库缓存Redis、Memcached应运而生毕竟访问内存比从数据库查询快得多。算法架构这一块的技术实在太多了也是从一个普通码农通往架构师的必经之路咱们下回再聊。总结高性能、高并发是后端开发永恒追求的话题。每一项技术都不是凭空出现的一定是为了解决某个问题而提出。我们在学这些技术的时候掌握它出现的原因和其他技术之间的关联在自己的大脑中建立一座技术知识层级图一定能事半功倍。关于本文你有什么想说的呢或者有什么重要技术被我遗漏了欢迎留言讨论。更多阅读推荐我是RedisMySQL大哥被我害惨了程序员应如何理解高并发中的协程一文聊“图”从图数据库到知识图谱编写贩卖《和平精英》游戏外挂5人被判刑苹果推出轻App码Firefox 84.0发布|极客头条赠书 | 实现病人数据自动分析建模Python能做的比你想象得更多
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/910729.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!