一 计算机发展史
1904 年,弗莱明发明电子管,1906 年,德福雷斯特,在二极管的灯丝和板极之间加了个栅板,从而发明了真空三极管,具有检波、放大和振荡三种功能。
二战时美军需要导弹弹道计算方面的统计表,每条弹道的数学模型是一组非常复杂的非线性方程组,这些方程组是没有办法求出准确解的,因此只能用数值方法近似地进行计算,而人工算一张表需要 200 人手动算两个月。
莫希利期望用电子管代替继电器以提高机器的计算速度,于是美军拨款 15 万美元做研究,当时任弹道研究所顾问、正在研制原子弹的数学家冯·诺依曼在研制中期加入了研制小组。原本的 ENIAC 存在两个问题,没有存储器且它用布线接板进行控制,算一次要搭几天,计算速度也就被这一工作抵消了。
1945 年,冯·诺依曼和他的研制小组发表了一个全新的“存储程序通用电子计算机方案”,在此过程中他对计算机的许多关键性问题的解决作出了重要贡献。最终,世界上第一台计算机 ENIAC Electronic Numerical And Calculator 诞生,用了 1.8 万只电子管,采用二进制、可重用的存储器等,功能有:按事先编好的程序自动执行算术运算、逻辑运算和存储数据。
但是,电子管笨重,能耗大、寿命短、噪声大,制造工艺复杂,易出故障,它本身的弱点和迫切的战时需要,促使许多科研单位和科学家,集中精力,迅速研制能取代电子管的固体元器。
二战时不少实验室在有关硅和锗材料的制造和理论研究方面,也取得了不少成绩,这就为晶体管的发明奠定了基础。
二战结束后,贝尔实验室加紧了对固体电子器件的基础研究。肖克莱等人决定集中研究硅、锗等半导体材料,探讨用半导体材料制作放大器件的可能性。他们经过一系列的实验和观察,逐步认识到
半导体中电流放大效应产生的原因。布拉顿发现,在锗片的底面接上电极,在另一面插上细针并通上电流,然后让另一根细针尽量靠近它,并通上微弱的电流,这样就会使原来的电流产生很大的变化。微弱电流少量的变化,会对另外的电流产生很大的影响,这就是“放大”作用。布拉顿等人,还想出有效的办法,来实现这种放大效应。他们在发射极和基极之间输入一个弱信号,在集电极和基极之间的输出端,就放大为一个强信号了。巴丁和布拉顿最初制成的固体器件的放大倍数为 50 左右。不久之后,他们利用两个靠得很近 (相距 0.05 毫米) 的触须接点,来代替金箔接点,制造了“点接触型晶体管”。1947 年 12 月,这个世界上最早的实用半导体器件终于问世了,在首次试验时,它能把音频信号放大 100 倍,它的外形比火柴棍短,但要粗一些。
在为这种器件命名时,布拉顿想到它的电阻变换特性,即它是靠一种从“低电阻输入”到“高电阻输出”的转移电流来工作的,于是取名为 trans-resistor(转换电阻),后来缩写为 transistor,中文译名就是晶体管。
由于点接触型晶体管制造工艺复杂,致使许多产品出现故障,它还存在噪声大、在功率大时难于控制、适用范围窄等缺点。为了克服这些缺点,肖克莱提出了用一种“整流结”来代替金属半导体接点的大胆设想。半导体研究小组又提出了这种半导体器件的工作原理。
1958 年:仙童公司 Robert Noyce 与德仪公司基尔比间隔数月分别发明了集成电路,开创了世界微电子学的历史;
1966 年:美国 RCA 公司研制出 CMOS 集成电路,并研制出第一块门阵列(50 门),为现如今的大规模集成电路发展奠定了坚实基础,具有里程碑意义
1971 年:全球第一个微处理器4004 由 Intel 公司推出,采用的是 MOS 工艺,这是一个里程碑式的发明
1978 年:64kb 动态随机存储器诞生,不足 0.5 平方厘米的硅片上集成了 14 万个晶体管,标志着超大规模集成电路(VLSI)时代的来临
1979 年:Intel 推出 5MHz 8088 微处理器,之后,IBM 基于 8088 推出全球第一台 PC
1988 年:16M DRAM 问世,1 平方厘米大小的硅片上集成有 3500 万个晶体管,标志着进入超大规模集成电路(VLSI)阶段
2009 年:intel 酷睿 i 系列全新推出,创纪录采用了领先的 32 纳米工艺。
二 计算机体系结构
电路原理
计算机怎么把电流转为数据?基础教材系列:计算机底层知识点积累;
组成原理
计算机硬件有几部分,干嘛用的?计算机组成原理(哈工大网课笔记);基础教材系列:《深入理解计算机系统》读书笔记;
操作系统
不同的机器有不同的 CPU 指令集,设备驱动程序是一种可以使计算机和设备进行相互通信的特殊程序,相当于硬件的接口,操作系统只有通过这个接口,才能控制硬件设备的工作,它是硬件和系统之间的桥梁。总之,我们直接操作计算机硬件很繁琐,为了避免大量繁琐的操作那就再封装一层,就有了操作系统。
机器的主板是出厂就有写死的程序 BIOS,它会在通电时主动去寻找要启动的操作系统,对于只认识 01 的计算机而言,它并没有操作系统的概念,它只是执行内存上一条一条的指令,要么加减乘除,要么 CURD。而操作系统也是由代码写成的,比如 windows 系统 80% 是用 C++ 编写,其余部分有 C 和汇编,底层接口用汇编编写。
对于 C#、VB 等高级语言而言,编译器完成的功能是把源码(SourceCode)编译成通用中间语言(MSIL/CIL)的字节码(ByteCode)。最后运行的时候通过通用语言运行库的转换,编程最终可以被 CPU 直接计算的机器码(NativeCode)。基础教材系列:编译原理——B 站笔记;
也存在从低级语言到高级语言的编译器,这类编译器中用来从由高级语言生成的低级语言代码重新生成高级语言代码的又被叫做反编译器。
LAMP 快速建站:快速上手系列:如何搭建个人博客或企业官网;直接下载网页所有静态文件;
数据结构与算法
网络
计算机彼此间通信,就是把数据转为信号传输再转回数据的过程。
一台计算机首先要把传送的信息 (如话音,图像) 变成电信号(电信号,就是用电传输信息,通过模拟方式或数字方式传出信号),然后调制到激光器发出的激光束上,使光的强度随电信号的幅度 (频率) 变化而变化,然后送入光纤,在光纤的两端分别都装有“光猫”进行信号转换,接收端检测器收到光信号后把它变换成电信号,我们看到的接到电脑上的细铜线是接收端变为电信号后的末端接口传输,已经不是光纤部分了,电信号经
网卡解调后恢复原信息。
单工、半双工及全双工之间的区别;
网卡解调:网卡上面装有处理器和存储器。网卡和局域网之间的通信是通过电缆或双绞线以串行传输方式进行的。而网卡和计算机之间的通信则是通过计算机主板上的 I/O 总线以并行传输方式进行。网卡的一个重要功能就是要进行串行 / 并行转换。由于网络上的数据率和计算机总线上的数据率并不相同,因此在网卡中必须装有对数据进行缓存的存储芯片。
在安装网卡时必须将管理网卡的设备驱动程序安装在计算机的操作系统中。这个驱动程序以后就会告诉网卡,应当从存储器的什么位置上将局域网传送过来的数据块存储下来。
网卡并不是独立的自治单元,因为网卡本身不带电源而是必须使用所插入的计算机的电源,并受该计算机的控制。因此网卡可看成为一个半自治的单元。当网卡收到一个有差错的帧时,它就将这个帧丢弃而不必通知它所插入的计算机。当网卡收到一个正确的帧时,它就使用中断来通知该计算机并交付给协议栈中的网络层。当计算机要发送一个 IP 数据包时,它就由协议栈向下交给网卡组装成帧后发送到局域网。
我们接收和发送的数据要遵循一些规则,这些规则就是协议,传输层协议就俩 TCP/UDP,它俩加端口号,就是其他各种应用层协议。
到此,才是程序员的工作起点,我们开发 web 系统,开发 app 客户端,用户使用这些系统,本质上,是我们按照数据结构和算法,在遵守操作系统规则的前提下,更高效地 CURD 数据,用前辈写好的协议更高效地传输数据。编程语言是实现算法的手段,各种程序工具层出不穷,只是为了更高效。
三 编程语言
c
C 语言之动态内存管理;
Java
基础: 快速上手系列:传智播客 Java 基础学习笔记;
开发必会系列:加密;
开发必会系列:《设计模式》读书笔记;
如何多线程下载一个文件;
jsessionid 的简单说明;
JVM: 开发必会系列:《深入理解 JVM(第二版)》读书笔记;
JAVA 内存泄露详解(原因、例子及解决);
2023 补充:
函数里用 String 接收数据库里查出来的字符,不断循环,他会被回收么?
首先,String s ="aaa"; s 在堆中的常量池,不会被回收。
String s = new String(); s 不在堆中的常量池,和其他对象一样在堆里,当函数运行结束出栈,他就会被标记清除算法标记,没有被引用就回收
在 spring 项目中,main 开始入栈,直到 s 所在函数入栈,再出栈,此时 s 应该在 gc 标记后回收,但如果 s 是被 spring 单例对象(是个类实例)的类成员变量引用(长生命周期对象引用了短生命周期对象),那每次 gc 标记都会判定 s 可达,那 s 就不会被回收,造成内存泄漏。要想释放,要么这个类实例被释放,比如置为 null,要么把类成员变量释放,这两个都不现实,因为并发时会循环调用,所以只能在函数里把类成员变量清空一下(目前选择了这个 ArrayList<String> a = new AArrayList<String>(); 每次进函数使用 a 之前先把 a 置为 null),或者把 s 清理调。
(引用 https://stackoverflow.com/questions/18406703/when-will-a-string-be-garbage-collected-in-java#:~:text=In%20Java%2C%20when%20an%20object%20has%20got%20no,string%20once%20created%20will%20%27never%27%20be%20garbage%20collected%3F)
内存中堆和栈的区别;
JVM gc 机制;
并发: 开发必会系列:《Java 多线程编程实战》读书笔记;
开发进阶系列:Java 并发之从基础到框架;
java 并发编程实践极客时间王宝令总结——笔记;
Java 并发编程系列;
《Java 并发编程实战》读书笔记;
《深入浅出 Java Concurrency》目录;
并发编程网;
框架: 开发必会系列:J2EE 是什么;
开发必会系列:为什么要用 spring;
开发必会系列:《spring 实战(第 4 版)》读书笔记;
开发必会系列:hibernate 事务;
开发必会系列:JavaEE 持久层框架对比与 hibernate 主键生成策略总结;
网络: 开发进阶系列:Java 网络通信编程从基础到框架;
架构: 快速上手系列:webservice;
开发进阶系列:《大型网站技术架构》读书笔记;
基于大中台架构的电商业务中台最佳实践之一:业务中台总体架构介绍;
Spring Cloud Netflix 微服务架构分享;
前端
快速上手系列:HTML;
快速上手系列:CSS;
快速上手系列:XML;
快速上手系列:JavaScript;
快速上手系列:JavaScript 进阶;
其他
快速上手系列:正则表达式;
程序员导航网;
C 语言中文网各种教程;
四 量化交易
《量化交易核心策略开发:从建模到实战》读书笔记;
《高频交易》读书笔记 ;
《打开量化交易的黑箱》读书笔记;
《经济学原理宏观》曼昆读书笔记;
《经济学原理微观》曼昆读书笔记;
《国富论》读书笔记 ;
《穷爸爸富爸爸》读书笔记;
《股票大作手回忆录》读书笔记 ;
金融知识学习综合笔记;
《如何建立自己的算法交易事业》读书笔记;
五 测试
测试领域各种工具实践:从零开始搭建一个测试技术练习平台;
git 的用法;
六 工作记录
dbvisivuser 连 oracle 数据库报错没有权限;
Informix 日志报错:Could not do a physical-order read to fetch netxt row;
dynatrace 监控发现 Java 代码中 new 对象耗时 100 多秒;
Jmeter 的 Throughput 有误差与分布式测试时的坑;
dynatrace 统计 sql 执行时间要考虑网络延时;
笔记本电脑链接投影仪报信号不支持;
2023 性能测试工作积累;
七 区块链
区块链:2019 年参加迅雷链宣讲会日记;
八 读研课堂笔记
B 站框框老师 + 宋浩老师概率论视频课笔记,宋浩老师数理统计视频课笔记;
高级数据库建模与设计笔记;
研究生怎么写论文;
大数据分析与应用笔记;
随机过程笔记;
物联网课程笔记;
高级软件工程笔记;
九 机器学习
吴恩达机器学习 2011 版本学习笔记;
学了 1 个月机器学习的总结;
吴恩达深度学习笔记;
李沐论文精读系列;
李沐动手学深度学习 pytorch 实践笔记;
机器学习金融预测领域 2023 部分综述论文阅读记录;
值得精读的 2 篇综述论文:混合模型——AI 金融预测的发展现状及未来趋势;
AI 金融预测领域综述文章筛选,附论文及代码链接;
回测收益 170% 的趋势交易策略——《基于模糊理论的趋势交易 - 王立新》论文精读;
笔记本 1050ti 跑 autoformer 模型,环境搭建过程;
笔记本 1050ti 运行 DLinear 模型遇到的问题;
Fast Training Algorithms for Deep Convolutional Fuzzy Systems With Application to Stock Index Prediction 论文及代码;
时间序列预测模型对比——视频笔记;
RNN 处理语言时,训练集的特征到底什么样?语言模型改为处理时间序列时,输入特征要怎么改?;
hugging face 的用法;
西瓜书与 d2l 笔记;
comfyui 使用模型两种方式;
__EOF__