闲谈(三)关于程序的一些小理解

三个概念

CPU,内存,IO。

1,CPU

CPU是计算机的大脑,所有事情都必须有他处理。

单核时代只有一个CPU,多线程嗷来回的进行上下文切换,损耗很大,计算机的性能提升不起来。后来有了多核时代,终于可以实现并行运行。如果在这里更好的应用线程压榨CPU的性能,成为了我们挑战的目标。

Jvm内存结构中,有个程序计数器,用来记录程序指令执行的位置,方便CPU执行(CPU是来回切换程序执行的,由于速度较快,我们感知不到罢了),也与CPU有关。

CPU还有L1,L2,L3级缓存,速度远远大于内存,内存的速度又远远大于磁盘。

程序的执行往往是磁盘上加载,进入内存,然后进入CPU缓存,最后由CPU执行。

2,内存

如何更好的利用内存?又是难题,所以后来出现了Redis,nosql开始流行。

实现程序的时候,如果能有效的利用内存,程序就会快的飞起,这是考验内功。

内存有很多问题,比如内存大小有限,内存碎片问题,断电内存数据消失问题都是需要解决的问题。

Java程序启动的时候,会在内存开辟一块空间,程序的运行都和这块空间有关,如何更好的回收内存成为了一个重要的技术点,垃圾回收机制变更了n代,还是垃圾的不行,比如安卓手机,还走在优化的路上。

3,IO

磁盘IO

现在程序的性能瓶颈出现在磁盘上,因为它最慢,机械硬盘更是慢的可怕,所以ssd开始流行,但是稳定性不如机械,但是它速度快。

数据总归是存储在磁盘上的,读取数据离不开磁盘,磁盘IO成为一个重要的技术话题,这时候各个数据库开始设计各种数据结构,为了实现快速检索,来优化磁盘IO,一秒内进行多少次IO读写成为衡量程序优劣的重要指标,顺序写,顺序读总归要比随机读写要快,所以也出现了很多有意思的实现,比如先申请一定大小的磁盘空间,由程序自行分配,把磁盘当内存玩。

网络IO

数据总是要传输的,这又涉及到了网络IO,程序再牛子,带宽不够也是扯淡(所以俺的学生机是轻量应用嘿嘿嘿,比云服务器多了5M带宽)。

如何优化网络传输,各种协议层面上做文章,tcp一直牢牢把握着传输层,有人把udp实现了可靠传输,貌似比tcp快不少,搞这种的人上人很多,还有nio,bio,aio等不同的模型,有零拷贝技术,select,epoll等都是这方面的践行者。

大概只想到这里,有空在慢慢写叭。

正文完