## 你必须理解的计算机核心概念
原创 2017-07-13 老刘 [码农翻身](https://mp.weixin.qq.com/s/XmHhlZzpYbJWW_m5NMPqEw##)
前言: 计算机学科中有很多概念, 例如编码(原码,补码,反码), 虚拟内存, 文件, IO, 编译,链接,分组交换,关系, 事务,范式, Hash, 加密。。。等等,本文试图讲一下最重要的核心集合,从这个集合当中就可以变换出计算机编程的各种魔法。
1
冯·诺依曼结构计算机的原理
所有的计算机语言,不管是Java, Python, Go, C, C++, PHP...... , 无论你在TIOBE上是排行第一还是排行第100, 无论看起来多么花哨,功能多么强大,用起来多么舒服, 最终都要变成基本的二进制指令,老老实实地在冯·诺依曼结构计算机上按规矩执行。
这里是根, 我们看到的、用到的都是这棵树上的花和枝叶。
作为志向远大的、有着强烈好奇心的年轻人, 难道你不想到根部来看一看?
作为最基本的要求, 必须要了解CPU和内存这俩哥们是怎么亲密无间工作的: CPU从内存取出指令,进行译码和执行,执行时从内存中取出数据放到寄存器中, 进行计算, 然后把结果写回到内存。如果是跳转指令, CPU则取出跳转目的地的指令继续执行。
如此简单的过程,竟然组成了多姿多彩的电脑世界: 你可以听音乐,玩游戏、上网聊天、用Word来写文档..... 当然看起来微不足道的一个操作,进入到CPU和内存中都可能需要成千上万条指令来完成。
这些基本的指令组成了顺序、循环、分支等基本的程序结构,形成了更为强大的编程语言的基础。
CPU和内存、硬盘等设备的速度不匹配,是冯·诺依曼结构计算机的一个核心问题,为了解决这个问题,科学家们绞尽脑汁,想尽了办法, 又引出了一堆概念: 缓存,DMA, 同步,异步,阻塞....
扩展阅读:
《[从1加到100:一道简单的数学题挑战下你的大脑](http://mp.weixin.qq.com/s?__biz=MzAxOTc0NzExNg==&mid=2665513478&idx=1&sn=400cedb83e396021cbe04e3505cd7c2c&chksm=80d67a45b7a1f35371e2ba94c422adb3c55674eb0d496feeaa7e06f5ea46dd23d68f5c1270e2&scene=21#wechat_redirect)》
《[CPU阿甘](http://mp.weixin.qq.com/s?__biz=MzAxOTc0NzExNg==&mid=2665513017&idx=1&sn=5550ee714abd36d0b580713f673e670b&scene=21#wechat_redirect)》
书籍:《编码》 《穿越计算机的迷雾》
2
进程和线程
这俩家伙的重要性不言而喻,因为你写的所有的程序要么会成为一个独立的进程去执行,要么是被一个进程中的线程收编,没有例外 。
几乎所有的编程语言都会涉及到对多进程或者多线程编程的支持, 特别是多线程的并发编程, 所以你必须得搞明白它的本质是什么。
进程是对一个运行中的程序的抽象,没有这个概念,我们是无法实现一边听歌、一边上网的惬意生活。
对于CPU来讲, 它只是“浑浑噩噩”地从某个地方取指令,译码执行,但是它不会意识到在某一刻整个世界已经变了天, 它执行的程序已经发生了切换,另外一个程序(准确地讲叫进程)已经成功地抢班夺权。
每个进程都有一个被操作系统老大维护的进程控制块, 里边保存了这个进程在运行时的重要信息,是进程能来回切换的重要保证。
而线程则寄居于进程之内 , 共享进程提供福利(代码和数据)的同时, 还拥有自己的一亩三分地。
![](http://mmbiz.qpic.cn/mmbiz_png/KyXfCrME6UIOiatnicqEA11h9OaeAOrvv3Z7HrOpj51QibEQkyLa5LxjEtWP2KvCia292llrCEAFiczdoaxt2ib0RyqA/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1)
线程的出现,提升了系统的性能、吞吐量和响应性。 但是多进程/多线程编程也带来了一系列问题: 同步,通信,锁, 死锁。。。
扩展阅读:
《[我是一个进程](http://mp.weixin.qq.com/s?__biz=MzAxOTc0NzExNg==&mid=2665513283&idx=1&sn=4e5ea6d64a7687d1ddee20fe7de947c1&scene=21#wechat_redirect)》
《[我是一个线程](http://mp.weixin.qq.com/s?__biz=MzAxOTc0NzExNg==&mid=416915373&idx=1&sn=f80a13b099237534a3ef777d511d831a&scene=21#wechat_redirect)》
书籍:《操作系统概念》
3
虚拟内存
有了物理内存, 为啥还有虚拟内存?
一个重要的原因就是给各位进程先生提供一个由虚拟地址组成的独立王国, 给他们造成一种假象: 我最重要,我是独占内存的!
每个人在自己的独立王国里闹腾,就不会互相打架, 治安也就有了保证。
但是在虚拟地址王国里做不了什么事情,指令必须在物理内存中才能被执行, 操作系统老大用尽浑身解数,把每个进程的虚拟地址映射到实际地址上去,表面上不动声色,背后绝对惊心动魄,分段,分页,页表,还要动用CPU的TLB来加速。
程序并不是像你想象的那样,一下子全部装载到内存的, 而是慢慢地, 用到的时候才进行装载。
进程一条普通指令的执行, 其实有一大家子在鞍前马后地忙碌着, 而进程几乎浑然不觉,真是太幸福了。
扩展阅读:
书籍《深入理解计算机系统》, 《操作系统概念》
4
网络的核心概念
上面所说的都局限于一台计算机, 然而一张大网早已经把这些孤岛联系在一起。
这张大网就你我的周围, 我们都变成了它的一个节点。
大网的设计非常有趣,没有一个中心的节点,某几个甚至某一片节点阵亡都没有关系,大网继续生存,提供服务。
作为码农我们要理解的核心概念是: 分组交换, TCP/IP参考模型, socket , http(s)。
你也许没有想到,你上网玩游戏,听音乐,看这篇文章,其中的数据并不是一下子全发给你的, 而是被切分成适合网络传输的小块,给每个小块编上号, 每个小块都独立地走相同甚至不同的网络路径, 到达你这里,重新排序,组合,然后才展示给你, 这就是分组交换。
使用分组交换可以充分的利用网络带宽: 在你不使用的间隙,别人也可以利用。
但是一个很明显的问题就是分组数据丢失了怎么办? 如何检测, 怎么重发,如何缓存已经收到分组数据等一系列烦人的问题接踵而来。 这就是TCP要干的事情。
如果你能体会到TCP是在端系统实现的,中间节点一无所知,我想你就Get到了分组交换和分层的真谛。
TCP/IP参考模型定义了5层: 应用层,传输层,网络层,链路层,物理层。你一定得理解所谓的分层只不过是把你的数据层层包装而已,在传输的过程层中每到一个节点都会拆开某一层的包装,查看一下数据, 然后再次包装,转发出去,直到终点。
也许你不愿意了解底层烦人的细节, 但是一定要理解socket和http(s) , 这哥俩最贴近我们码农的日常生活,我们经常直接和他们对话,利用他们收发数据, 所以花点经历好好学学吧。
扩展阅读:
[TCP/IP之大明邮差](http://mp.weixin.qq.com/s?__biz=MzAxOTc0NzExNg==&mid=2665513094&idx=1&sn=a2accfc41107ac08d74ec3317995955e&scene=21#wechat_redirect)
[TCP/IP之大明内阁](http://mp.weixin.qq.com/s?__biz=MzAxOTc0NzExNg==&mid=2665513375&idx=1&sn=e11745d5cb28fa1f89465f8d0e5fae1a&chksm=80d679dcb7a1f0cadec0a1db45b3fa3f6eabde4a9e56a77acf551fbc1511e6b8f055ee2c97e3&scene=21#wechat_redirect)
[TCP/IP之蓟辽督师](http://mp.weixin.qq.com/s?__biz=MzAxOTc0NzExNg==&mid=2665513384&idx=1&sn=82c45e4430618270a744e212d2f57990&chksm=80d679ebb7a1f0fd27fe1814765a0e60b1c293ca4e09403271b4bb3f38f317439956fdca1bc1&scene=21#wechat_redirect)
[张大胖和socket](http://mp.weixin.qq.com/s?__biz=MzAxOTc0NzExNg==&mid=2665513387&idx=1&sn=99665948d0b968cf15c5e7a01ffe166c&chksm=80d679e8b7a1f0febad077b57e8ad73bfb4b08de74814c45e1b1bd61ab4017b5041942403afb&scene=21#wechat_redirect)
[我是一个网卡](http://mp.weixin.qq.com/s?__biz=MzAxOTc0NzExNg==&mid=2665513160&idx=1&sn=d938db4f1a2d62514b57e92fd8d3d749&scene=21#wechat_redirect)
[我是一个路由器](http://mp.weixin.qq.com/s?__biz=MzAxOTc0NzExNg==&mid=2665513173&idx=1&sn=6ec5281b12ed5195070fa4df22383595&scene=21#wechat_redirect)
图书:
《图解HTTP》
《计算机网络:自定向下的方法》
5
Hash 和 RSA
如果说Https是网络安全通信的一大基石, 那Hash和RSA 则是基石的基石。
为了保证消息在传输过程中的私密性, 完整性,不可伪造性,这哥俩可以说是功不可没。
其实不仅仅是Https , 在各种软硬件平台上都能看到他们勤奋的身影, 例如SSO, SSH, JWT ..... 所以非常值得你投入精力去学习。
RSA最为美妙之处就是有一对儿钥匙, 一个是私有的、保密的, 另外一个是公有的, 谁都可以知道, 这对于之前的对称密钥是个极大的颠覆, 谁能想到原先需要保密的密钥竟然可以公开呢!
更有意思的是私钥加密的数据只有相应的公钥才能解开, 反之亦然,这确实是很漂亮的概念。
RSA的概念很简单, 但是为了实现真正的安全消息传输,作为第一步必须得有数据签名做保证, 你需要理解如何对消息用Hash形成摘要,然后用私钥签名,又是如何验证这个签名的, 理解了这一点,很多东西都迎刃而解。
*ps : 下周发一篇https的文章,敬请期待。*
你看到的只是冰山一角, 更多精彩文章,请移步《[码农翻身文章精华](http://mp.weixin.qq.com/s?__biz=MzAxOTc0NzExNg==&mid=2665513504&idx=1&sn=25dd6420e3056101dd3f6fdaedacaa2a&chksm=80d67a63b7a1f37572a5159ff6f53810467c15c8beec94770e8360c45f45036360d77755ee78&scene=21#wechat_redirect)》
有心得想和大家分享? 欢迎投稿 ! 我的联系方式:微信:liuxinlehan QQ: 3340792577
**码农翻身**
用故事讲述技术
![](http://mmbiz.qpic.cn/mmbiz_jpg/KyXfCrME6UJI2DR5NKoJQL1SeaBFo3Scibtnicedec4T3HZOVYBJEQYpd7z12xcgXGyE3qGktEBATOmAyWowouQA/0.jpeg?tp=webp&wxfrom=5&wx_lazy=1)
* * * * *
create date:2017-7-14 14:49:44
- 开始
- 公益
- 更好的使用看云
- 推荐书单
- 优秀资源整理
- 技术文章写作规范
- SublimeText - 编码利器
- PSR-0/PSR-4命名标准
- php的多进程实验分析
- 高级PHP
- 进程
- 信号
- 事件
- IO模型
- 同步、异步
- socket
- Swoole
- PHP扩展
- Composer
- easyswoole
- php多线程
- 守护程序
- 文件锁
- s-socket
- aphp
- 队列&并发
- 队列
- 讲个故事
- 如何最大效率的问题
- 访问式的web服务(一)
- 访问式的web服务(二)
- 请求
- 浏览器访问阻塞问题
- Swoole
- 你必须理解的计算机核心概念 - 码农翻身
- CPU阿甘 - 码农翻身
- 异步通知,那我要怎么通知你啊?
- 实时操作系统
- 深入实时 Linux
- Redis 实现队列
- redis与队列
- 定时-时钟-阻塞
- 计算机的生命
- 多进程/多线程
- 进程通信
- 拜占庭将军问题深入探讨
- JAVA CAS原理深度分析
- 队列的思考
- 走进并发的世界
- 锁
- 事务笔记
- 并发问题带来的后果
- 为什么说乐观锁是安全的
- 内存锁与内存事务 - 刘小兵2014
- 加锁还是不加锁,这是一个问题 - 码农翻身
- 编程世界的那把锁 - 码农翻身
- 如何保证万无一失
- 传统事务与柔性事务
- 大白话搞懂什么是同步/异步/阻塞/非阻塞
- redis实现锁
- 浅谈mysql事务
- PHP异常
- php错误
- 文件加载
- 路由与伪静态
- URL模式之分析
- 字符串处理
- 正则表达式
- 数组合并与+
- 文件上传
- 常用验证与过滤
- 记录
- 趣图
- foreach需要注意的问题
- Discuz!笔记
- 程序设计思维
- 抽象与具体
- 配置
- 关于如何学习的思考
- 编程思维
- 谈编程
- 如何安全的修改对象
- 临时
- 临时笔记
- 透过问题看本质
- 程序后门
- 边界检查
- session
- 安全
- 王垠
- 第三方数据接口
- 验证码问题
- 还是少不了虚拟机
- 程序员如何谈恋爱
- 程序员为什么要一直改BUG,为什么不能一次性把代码写好?
- 碎碎念
- 算法
- 实用代码
- 相对私密与绝对私密
- 学习目标
- 随记
- 编程小知识
- foo
- 落盘
- URL编码的思考
- 字符编码
- Elasticsearch
- TCP-IP协议
- 碎碎念2
- Grafana
- EFK、ELK
- RPC
- 依赖注入
- 开发笔记
- 经纬度格式转换
- php时区问题
- 解决本地开发时调用远程AIP跨域问题
- 后期静态绑定
- 谈tp的跳转提示页面
- 无限分类问题
- 生成微缩图
- MVC名词
- MVC架构
- 也许模块不是唯一的答案
- 哈希算法
- 开发后台
- 软件设计架构
- mysql表字段设计
- 上传表如何设计
- 二开心得
- awesomes-tables
- 安全的代码部署
- 微信开发笔记
- 账户授权相关
- 小程序获取是否关注其公众号
- 支付相关
- 提交订单
- 微信支付笔记
- 支付接口笔记
- 支付中心开发
- 下单与支付
- 支付流程设计
- 订单与支付设计
- 敏感操作验证
- 排序设计
- 代码的运行环境
- 搜索关键字的显示处理
- 接口异步更新ip信息
- 图片处理
- 项目搭建
- 阅读文档的新方式
- mysql_insert_id并发问题思考
- 行锁注意事项
- 细节注意
- 如何处理用户的输入
- 不可见的字符
- 抽奖
- 时间处理
- 应用开发实战
- python 学习记录
- Scrapy 教程
- Playwright 教程
- stealth.min.js
- Selenium 教程
- requests 教程
- pyautogui 教程
- Flask 教程
- PyInstaller 教程
- 蜘蛛
- python 文档相似度验证
- thinkphp5.0数据库与模型的研究
- workerman进程管理
- workerman网络分析
- java学习记录
- docker
- 笔记
- kubernetes
- Kubernetes
- PaddlePaddle
- composer
- oneinstack
- 人工智能 AI
- 京东
- pc_detailpage_wareBusiness
- doc
- 电商网站设计
- iwebshop
- 商品规格分析
- 商品属性分析
- tpshop
- 商品规格分析
- 商品属性分析
- 电商表设计
- 设计记录
- 优惠券
- 生成唯一订单号
- 购物车技术
- 分类与类型
- 微信登录与绑定
- 京东到家库存系统架构设计
- crmeb
- 命名规范
- Nginx https配置
- 关于人工智能
- 从人的思考方式到二叉树
- 架构
- 今日有感
- 文章保存
- 安全背后: 浏览器是如何校验证书的
- 避不开的分布式事务
- devops自动化运维、部署、测试的最后一公里 —— ApiFox 云时代的接口管理工具
- 找到自己今生要做的事
- 自动化生活
- 开源与浆果
- Apifox: API 接口自动化测试指南