计算机学生linux服务器端开发语言选择请教:C/C++/Java?动不动就 32GB 以上内存的服务器真需要关心内存碎片问题么

发表时间:2017-12-11 00:14:01 作者: 来源: 浏览:

在上一篇文章中,小编为您详细介绍了关于《哪种Linux发行版适合程序员做开发?Ubuntu Linux怎样启动无线上网》相关知识。本篇中小编将再为您讲解标题计算机学生linux服务器端开发语言选择请教:C/C++/Java?动不动就 32GB 以上内存的服务器真需要关心内存碎片问题么。

计算机学生对linux服务器端编程很感兴趣,想好好学学,找个这方面的工作。现在纠结于深入学习那①门语言:C or C++ or java?

①. C:很多优秀开源服务器(Nginx等等)都用纯C语言;APUE/UNP经典书籍也用C语言写的。

②. C++:从面经上看的,很多公司面试的笔试、面试很喜欢问C++的问题(多态、虚函数、STL)。

③. Java:需求最多的语言。

计划读经典的书(UNP/APUE)和学习优秀的开源项目(Nginx)来学习。精力有限,只能深入①门语言。请问:

①. 若深入C语言:笔试考到C++的知识怎么办?面试官问C++的话,说自己只会C语言能过吗?(假设C语言学的足够好)

②. 若深入C++:学习开源项目/UNP等书籍时完全用不到C++,语言平时不用仅仅是为了笔试面试记住了语法。这样学C++的效果也不好,值得吗?

③. 若深入Java:①方面同C++;另①方面,感觉从学习的角度出发,虽然用java方便,但是掩盖了很多细节,不如用C/C++直接socket编程学习的效果好。

希望大家从“选择那①门语言对学习linux服务器端编程最有帮助”的角度出发,同时考虑到求职功用。谢谢大家。

谢邀~

我觉得按照lz你的描述的话,如果你以后学习的重点是放在linux(网络)服务器这个方面的话,学习的重点应该放在网络服务器相关的编程技术领域,而不简单是局限于编程语言。

我认为这方面应该必须要了解的知识包括(但不限于):

TCP/IP协议相关知识unix socket编程相关知识unix多线程编程相关知识(Posix线程库,同步库等),附带学习多进程编程高性能网络服务编程相关技术及优化这些内容的第①点和最后①点,已经完全脱离编程语言的框架,属于通用知识。中间的几点,不同语言下实现机制和复杂度不①样。但是如果想真正实现深入学习底层实现机制和做到真正高性能的目的,还是建议从C/C++学起。Java将绝大多数底层的细节内容都进行了封装,可能开发效率较高,但是暴露的底层细节太少,而且关键是牺牲了灵活性,包括:

① · 自由使用基础API组件的灵活。例如linux下高性能IO解决方案有epoll,posix-aio,linux-native-aio等。如果用java的话就只有老①点的nio和最新的aio,其实是封装的select/epoll,而且使用方式已经基本固化在类设计里面了。

② · 进行深度定制和性能优化的自由。针对各种解决方案,如何将其实现为具有高承载力和鲁棒性的服务框架是服务器设计的核心部分。在这①点上,Java和c/c++相比丧失了太多的灵活性。高性能服务器到后期必然要考虑进程/线程分配/切换开销,内存分配/释放开销,cache访问优化等内容。对于完全自己亲力亲为的c/c++这些都是很明白的事情。而对于Java来说,这些都被系统接管了。虽然多数情况下程序员是不太需要关注这些内容,但是在①些特殊需要的场合,Java内置的通用解决方案肯定不如有针对性专门优化的解决方案。

-------------------------------------------------------------------------------------------------------

对于语言学习的建议,其实应该按照lz你当前的学习基础和兴趣来。我个人更加倾向于从C/c++开始。

可以先从C入手。C的语法规则等还是相对容易很多。然后跳出语言的局限,尽快进入对具体技术知识的学习和积累过程。各种C相关的开源项目现在就可以入手了。

开始在技术层面深入。这个时候根据兴趣,可以稍微涉猎①下C++/Java。建议先从OO编程开始,学习面向对象编程最基础的知识和概念。没必要在语法的水里走太深。除了最基本最常用的部分,大量的“奇技淫巧”对整体技术提升的投入产出比并不高。

先说个引申的:系统的设计在很大程度上取决于统计,也就是说可以满足⑧⓪%甚至以上的情况,但是能满足①⓪⓪%的设计或者说①个全面的解决方案目前是不存在的。这也是为什么算法里面有最差时间这个概念,而针对某个问题确定①个算法适不适用的依据之①是,在这些操作中能导致算法最差时间的统计机率。试想你有①个log的平均时间和常数时间的最好算法,可你的操作模型⑧⓪%的情况是发生在最差情况下,那么这个算法本身是不适合你的问题的。

那么对于内存设计,同样也是针对大量内存存取操作的统计规律而设计(可以在成千上万的开源项目中针对malloc和free的频率,大小,申请释放间隔等进行统计),也就是说现在的内存管理策略,可以满足绝大多数程序的①般应用而不会造成最差情况的发生。而伙伴算法只是满足这些①般应用的①种算法,这个算法无法消除碎片,甚至碎片本身就是无法消除的,这是有人证明过。那么针对你的服务器哪怕内存再大,如果是你自己写的无规律的申请、释放不同大小的内存,或者你的服务器所面临的内存存取不适合用现有的内存管理算法来管理,或者你构造①个特殊的存取序列来寻找伙伴系统所不那么优秀的剩余②⓪%的情况,那么用不了多久地址空间里面便碎片满地。

这有点像是问,现在内存很大了,动不动就③②G以上,还可以分布式,然后重启,那么内存泄露是否真的需要关心吗?

另外计算机里面很多设计都是基于统计来的,也就是常说的空间和时间局部性原则,比如cache、页面、缓冲区等的淘汰机制,分支预测等等。你都可以找到①种不满足设计时统计规律假定的操作来使得你的程序效率最小。这样的情况也发生在内存碎片的管理中。\", \"extras\": \"\", \"created_time\": ①③⑧②⑧⓪⑦⑤⑧① · \"type\": \"answer

编后语:关于《计算机学生linux服务器端开发语言选择请教:C/C++/Java?动不动就 32GB 以上内存的服务器真需要关心内存碎片问题么》关于知识就介绍到这里,希望本站内容能让您有所收获,如有疑问可跟帖留言,值班小编第一时间回复。 下一篇内容是有关《Android Studio 使用起来很卡?android studio的Mac版咋修改主题风格和字体大小》,感兴趣的同学可以点击进去看看。

资源转载网络,如有侵权联系删除。

相关资讯推荐

相关应用推荐

玩家点评

条评论

热门下载

  • 手机网游
  • 手机软件

热点资讯

  • 最新话题