• 计算机基础知识


    一、信息的表示和处理

    1.1 计算机如何表示整数

    有符号数和无符号数,尤其是如何用补码表示负数,数字的取值范围。

    1.2 计算机如何表示浮点数

    为什么小数的二进制表示法只能近似表示十进制小数。

    1.3 计算机如何表示负数

    1.4 数值的转换、移位

    这几点非常重要,因为几乎所有的编程语言都有数据类型,而最基本数据类型必然包括整数和浮点数。

    搞不清这些表示和运算,在编程中就会遇到一些稀奇古怪的问题。

    二、从汇编层面理解程序的执行

    顺序、分支、循环、函数调用、数组、结构体等在汇编层面是怎么实现的,寄存器和内存是怎么使用的。

    理解了这些其实也就理解了冯诺依曼计算机体系结构,这是计算机学科一个基础性的东西。

    2.1 冯诺依曼计算机体系结构

    2.2 程序在底层是怎么运转的

    知道程序在底层是怎么运转的, 对于学习各种虚拟机有很大的帮助,比如JVM,它要解析执行的是字节码,字节码本质上要表达的就是这些东西,只不过有所扩展。

    2.3 栈帧

    理解了栈帧,就能理解函数调用的本质,递归,以及尾递归的实现。

    2.4 安全相关的概念

    还有安全相关的概念,如缓冲区溢出这个臭名卓著的漏洞及其防范办法。

    三、进程和线程

    程序员必备的知识,不了解这个,简直是无法编程。

    3.1 需要掌握进程的地址空间,代码在哪里,堆在哪里,栈在哪里。

    3.2 进程和线程之间的关系

    要准确理解进程和线程之间的关系,为什么说进程是拥有资源的基本单位, 线程是CPU调度的基本单位?

    3.3 进程切换和线程切换之间的区别和联系。

    进程切换和线程切换之间的区别和联系。

    3.4 进程/线程的状态和转换

    进程是如何创建,执行,有哪些状态,状态之间的转换。 由此会涉及到并发和并行,线程之间的竞争和合作。

    3.5 锁的本质(硬件层面)

    锁的本质(硬件层面),乐观锁,悲观锁,死锁等问题。

    3.6 线程的实现方式

    线程的实现方式,用户级线程和内核级线程的对应方式。

    在编程的过程中,有些知识点会直接使用,如多线程编程,锁。 还有一些概念能用到很多地方,例如CAS,不仅仅是编程语言的概念,还能在更新数据库时使用。再比如你理解了线程的实现方式,迅速就能掌握go语言中并发的手段:goroutine。

    四、存储器的层次结构

    Tomcat用了多线程执行请求,Redis用了单线程来处理请求,Node.js也用了单线程来,这是为什么? 秘密都在存储器的层次结构。

    人类制造的计算机设备之间有着巨大的速度差异:

    img

    总之,CPU超级快,内存比较快,硬盘非常慢,网络更慢, 这个速度差异是IT行业的一个核心问题,人类想了很多办法试图去弥补这个差异:多线程,缓存,异步,多路复用,硬件层面的DMA

    记着下面这张图,每当你遇到某个软件的特性的时候,想一想和它有什么关系:

    img

    五、数据结构和算法

    它的重要性我罗嗦过很多次了,不用再重复了, 我就举个最简单的例子: 理解了B+ Tree才能理解MySQL的InnoDB的索引,理解了索引才能更好地优化查询,对吧?

    六、计算机网络

    现在的程序基本上都是网络程序, 所以这也是一个必备的基础知识,学习计算机网络的一大好处就是和工作直接相关,能直接使用,比较有动力。

    6.1 七层协议

    HTTP协议肯定跑不掉,TCP,UDP也得会,尤其是TCP可靠传输的原理:如何在一个不可靠的网络中进行可靠的传输, 这是无数前辈总结的经验,一定得掌握。

    6.2 通信协议

    要理解什么是通信协议,也许某一天你自己就需要定制一个协议来传输数据。

    6.3 分组交换

    分组交换是什么意思? 协议分层的本质是什么? 什么叫无状态的协议?

    6.3 socket编程

    Socket相关的编程更是重点,尤其是涉及到服务器端高并发的时候,如何维持和处理这些海量的socket, epoll等技术就得上场了。

    6.4 https原理

    还有非常重要的HTTPs的基本原理,也是网络安全的精华所在:对称加密,非对称加密,消息摘要,数字证书,中间人攻击。

    七、数据库

    不多说,关系模型、范式、SQL、索引、事务等知识都得掌握,尤其是要了解他们的实现方式。

    八、分布式的基础知识

    这些已经偏向应用层面了,但是现在很多系统都是分布式的了,分布式就变成了一种基础知识。

    8.1 系统通信:RPC, 消息队列等

    8.2 负载均衡的原理

    8.3 冷热备份

    8.4 数据分片

    数据分片:取模算法,一致性Hash,虚拟桶

    8.5 其他

    CAP原理,BASE原理,幂等性,一致性模型(强一致性,最终一致性…)和相关协议(两阶段提交,Raft,Paxos…)

    九、基本的设计思想

    下面这几种设计思想对我影响很大,需要大家特别注意。但是掌握起来却很不容易,需要在实践中不断地体会:

    正交:各个概念之间可以独立变化

    抽象:抛弃细节,找到本质和共性

    《深入理解计算机系统》一书中提到:“指令集是对CPU的抽象, 文件是对输入/输出设备的抽象, 虚拟存储器是对程序存储的抽象, 进程是对一个正在运行的程序的抽象, 而虚拟机是对整个计算机(包括操作系统、处理器和程序)的抽象。 如果你对这句话透彻理解了,说明对计算机系统的认识已经很深刻了。

    分层:我只想和我的邻居打交道, 如网络协议,Web应用开发。

    分而治之:大事化小,小事化了,架构设计必备。

    [我把这两年的精华文章都整理出来了](

  • 相关阅读:
    关于数据库字符集编码及通用软件产品的设计表结构的注意事项
    记一次调用第三方接口,对方获取到参数乱码问题
    Java获取固定格式日期&计算日期相差时长
    Redis之雪崩、穿透、击穿
    [LeetCode] 两数相加 (JavaScript 解法)
    React hooks 获取 dom 引用
    PHP + Redis 实现定任务触发
    测试PHP几种方法写入文件的效率与安全性
    如何调整firefox鼠标滚轮速度
    美美Apple ID 注册教程
  • 原文地址:https://www.cnblogs.com/daozhangblog/p/12446429.html
Copyright © 2020-2023  润新知