博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
面试突击(二)——理解计算机编程技术复杂性的根源
阅读量:4936 次
发布时间:2019-06-11

本文共 1040 字,大约阅读时间需要 3 分钟。

       编程到底难在哪里呢?编程语言的语法复杂?业务逻辑复杂?可能都存在吧!不过就我自身的感受是编写多线程高并发相关的代码,以及编写网络通信的代码是比较复杂的,学习过c/c++不过我主要使用java编程,猜测管理系统内存直接和OS打交道的部分也应该是比较复杂的。如果没有多线程高并发编程,也不需要编写多进程之间通信的编程,我想编程可能就会轻松许多了。那问题来了,为啥会有进程、线程的存在呢?我认为计算机编程技术的复杂性的根源就在于这三个字——速度差

       同样话不读多少,先上一个图看一下!

 

 

从上图中我们能感受到CPU和数据存储设备的速度差是多么的悬殊,人类在各个方面对于性能的追求总是孜孜不倦的,因为更快代表着更强或者能更早的获取到机会争取到利益。

计算机核心的功能在于计算,最早是人肉输入信息让计算机来计算,不过人和计算机在速度上比,人绝对是智障。当然,人脑也是极易输入错误的,所以,就将相应的输入程序及数据先写好放到硬盘,到时候计算器直接从硬盘上读取就行了,不过硬盘太慢了CPU难以忍受,所以,为了更快的读取速度,就加上了内存,可是内存相对CPU还是慢的不行,后来又加上了L1/L2/L3三级缓存,这样总算是基本赶上CPU的速度了。解决了速度匹配的问题,但是引入了其他的问题,比如:内存及缓存空间比较小,所需数据比较多,命中不到还是需要从磁盘一级一级的把数据倒腾过来,计算的数据也同样需要一层层的在写回磁盘。磁盘——内存——L3——L2——L1——CPU之间还是存在速度差的,存在速度差就又快又慢就存在等待,存在等待就存在干的快的有空闲。为了不让CPU空闲,于是产生了多进程,不过多进程的上下文切换太重了,于是又有了线程,线程间是共享进程的公共内存空间的,多个线程对同一块内存地址都可以有写操作,于是就产生了多线程并非编程导致数据不一致性的问题。为了解决这个问题有引入了锁机制以及内存操作的管理模型,这样下来原本简单的编程就变得复杂了起来。

我认为单机编程的复杂性就在这里了,引起这个复杂性的根源就是——数据存储设备运输数据到计算设备的速度差导致的。如果仔细来好好分析,几乎所有的技术,都在是想方设法绞尽脑汁的在通过各种方法来解决这个问题的。比如:数据库的索引,内存数据库,零拷贝,线程池,单例模式,异步编程,事件驱动模型,日志追加写,数据先放入内存在一级一级的放入对应的缓存等等。

转载于:https://www.cnblogs.com/godtrue/p/11488804.html

你可能感兴趣的文章
LeetCode 860.柠檬水找零(C++)
查看>>
文件上传
查看>>
(Problem 92)Square digit chains
查看>>
HDU 2612 Find a way BFS,防止超时是关键
查看>>
0809
查看>>
FineUIPro v5.2.0已发布(jQuery升级,自定义图标,日期控件)
查看>>
HTML页和ashx之间关系的一点小应用
查看>>
智能合约安全前传-基础知识入门
查看>>
Myeclipse反编译插件
查看>>
Dubbo和Zookerper的关系
查看>>
centos 5 系统安装MYSQL5.7
查看>>
docker数据卷(转)
查看>>
地图定位及大头针设置
查看>>
oracle常用小知识点
查看>>
CATransform3D参数的意义
查看>>
"外部组建发生错误"
查看>>
怎么自己在Objective-C中创建代理
查看>>
svn检出maven工程到eclipse里面,部署到tomcat的步骤
查看>>
Under Armour Drive 4 Performance Reviews
查看>>
C#操作目录和文件
查看>>