介绍:本书从程序员的视角详细阐述计算机系统的本质概念,并展示这些概念如何实实在在地影响应用程序的正确性、性能和实用性,《深入理解计算机系统》-读后感。全书共12章,主要内容包括信息的表示和处理、程序的机器级表示、处理器体系结构、优化程序性能、存储器层次结构、链接、异常控制流、虚拟存储器、系统级I/O、网络编程、并发编程等。书中提供大量的例子和练习,并给出部分答案,有助于读者加深对正文所述概念和知识的理解。
本书的最大优点是为程序员描述计算机系统的实现细节,帮助其在大脑中构造一个层次型的计算机系统,从最底层的数据在内存中的表示到流水线指令的构成,到虚拟存储器,到编译系统,到动态加载库,到最后的用户态应用。通过掌握程序是如何映射到系统上,以及程序是如何执行的,读者能够更好地理解程序的行为为什么是这样的,以及效率低下是如何造成的。
全书将软硬件串在一起帮助我们描述了程序是怎么在系统中工作的,书中的链接加载程序布局等我在《程序员的自我修养》中读到过,其余很多知识和计算机原理、 *** 作系统、系统编程也有很多重叠,总体说来内容并不是很陌生,但仍然有不少收获。第三部分io网络并发三章尚未阅读
写下之下的这些文字是为了帮助自己更好的复习全书的内容,尤其是自己以前掌握不深刻的部分
书的第一部分是全书的精华,主要讲程序与硬件,第四章除外,我没有看
第二章,重点是数的表示方法
移位运算算术右移和逻辑右移的区别
字节顺序大端和小端
数的格式转换先改变大小,再改变有无符号,无符号有符号隐式转换带来的灾难
整数的运算主要是各种溢出问题
浮点数乘法不具备可结合性,转换为整数时可溢出
第三章,重点是汇编程序,个人认为收获最大的一章
各种指令,mov,leal,移位,运算,控制,条件传送指令*,
各种逆向工程,结合习题很有意思
函数调用时帧栈结构
联合、结构数据分布和对齐的问题
内存越界和缓冲区溢出
64位(没有太仔细看,寄存器多了大了,函数调用有很多不同,很多函数不需要栈帧,参数通过寄存器传送)
第五章,程序优化,全章由一个例子贯穿始末,量化了不同方法带来的性能改进
编译器优化的局限性,限制这种能力的原因有:存储器别名的情况,函数调用(静态变量,可重入)
循环优化,不变的变量只算一次
减少函数调用(性能和可读性的折衷)
不必要的内存引用(尽量用临时变量在寄存器中,避免不必要的内存读写)
从处理器的角度考虑(流水、预测分支、关键路径),循环展开,考虑流水(充分利用处理器的多个加法器等,超标量)
程序剖析的工具 gprof
第六章,存储器层次结构
各种存储技术,寄存器,SRAM(高速缓存),DRAM(内存),硬盘(传统硬盘、固态硬盘),网络
各种缓存,高速缓存L1L2是内存的缓存,内存是硬盘的缓存,各种缓存的管理机制(这里只讲了高速缓存的,后面会将内存管理)
程序的局部性,时间和空间的
第二部分,主要将程序在系统的中的运行,这一部分和前一部分差距较大,原因是这一部分我比较熟?
第七章,链接
可以参见《程序员的自我修养》这本书,主要是目标文件格式阿,符号解析阿,重定位阿的,内容比较简略
静态库的链接顺序,经常会出错的一个问题
一些工具的使用,readelf,objdump,ldd
感觉从这一章开始,翻译就很不给力了
第八章,名字很奇特,叫异常控制流,讲了各个层面的异常,其实我觉得这一章还不如叫进程
四类异常:中断(IO设备),陷阱(trap,咋这么翻译呢,系统陷入多好听,主要是系统调用),故障(缺页),终止
进程相关,fork,execve,wait,waitpid
信号,读后感《《深入理解计算机系统》-读后感》。signal
非本地跳转,软异常?setjmp,longjmp,据说是try\\catch实现的基础
一些工具(pmap,strace,ps,top)
第九章,虚拟存储器,重点应该是内存管理,地址翻译的机制,我讨厌有些地方该叫内存却叫做存储器
内存管理,主要做了两件事,从虚拟地址到物理地址的翻译,提供了内存读写的保护(只读的内存不能写,只读写的不能运行)
动态内存的分配,给出了几种分配器的数据结构,这一部分没有仔细看
垃圾回收
各种内存的错误,总结的很好,基本我都犯过
回头再看第一章,人家总结的真好,整个一个计算机系统就是一个大抽象,把各种硬件系统抽象为一些简单的概念,这些概念让我们这些程序员能够轻松的处理程序而不用再管硬件了,伟大啊
三个基本抽象:
文件--负责抽象IO设备
虚拟存储器--负责抽象IO设备、内存
进程--负责抽象IO设备、内存、处理器
整本书就是负责介绍怎么抽象的
〔《深入理解计算机系统》-读后感〕随文赠言:【这世上的一切都借希望而完成,农夫不会剥下一粒玉米,如果他不曾希望它长成种粒;单身汉不会娶妻,如果他不曾希望有孩子;商人也不会去工作,如果他不曾希望因此而有收益。】
java 开发需要学哪些自java出来之后,就被很多人欢迎,虽然开始的时候有点麻烦,但是发展到现在很多人企业都在使用java做一些应用,包括了一些政府部门,因此java工程师需求也越来越大了。那么下面小编给大家说说java开发需要学哪些,希望能对你有些帮助。
java语法,通过任何一本Java入门书籍,都可以学会Java基本语法。千万不要认为,把书上的例子程序都能写出来就算学会了Java语法。要想真正掌握,还需要做大量的测试题。对语法不准确的理解,会使你写的代码出现逻辑错误。而这些错误会使你真正的项目开发中吃尽苦头:认为正确才会写上去。而在几十万行代码中找出几行有逻辑错误的代码,非常困难。因为你几乎不会怀疑你认为正确的代码存在错误。
常用类。永远不要写别人已经实现的代码。有很多功能,用JDk中现有的类就可以完成。需要熟悉JDK.可以通过研究JDK帮助文档和JDK源代码的方式,逐渐了解,需要的类都在什么地方。一方面,要熟悉有哪些可以直接使用的资源,另一方面,学习一下,SUN公司的工程师怎样写代码。
IDE集成开发环境。现在企业最常用的IBM公司的eclips类似的还有JBuilder,Idea,NetBean等等。毕竟,只有5%的顶尖高手在使用简单的文本编辑器在写Java代码。多数程序员都是使用这些东西。
数据库.MySql,Oracle,DB2.小项目多数使用MySql这样的免费数据库。大一些的项目会考虑使用Oracl或者DB2.Java项目很少使用SqlServer.因此,还需要学习数据库方面的一些知识。可以从SQL语言开始。这些数据库都支持标准SQL.学会基本的SQL,参考具体的数据库手册,就可以完成一般的项目开发了当然,要想使你程序运行的效率更高,需要更深入的学习。大部分的程序优化,都是从这部分开始的
JDBCJava数据库连接。使用Java程序 *** 作数据库。这部分非常重要。几乎所有的企业项目都会用到
2怎么学习java
一定要看书
现在学习Java变得比以前容易多了,除了有大量的视频教程外,还有专业的java培训机构,这都使学习变得更加傻瓜化,然而我要说的是,Java虽然变得越来越容易学,然而那只代表入门容易,并不代表这门编程技术就真的变简单了。如果仅仅学了些皮毛,高手写的程序你是望尘莫及的。在学习的过程中,书籍永远是知识最好的载体,很多出色的程序员大师精心编撰的编程书籍,富含的不仅仅是一些知识,更多的是他们所传授的思想,通过看书,专研书籍中的内容,会让你变得更加聪明,写的程序也更加的精炼。
编程的时候,一定要独立思考
现在网络很发达,我见很多程序员总爱百度,包括我带的许多人都是这样,一个jdbc这么初级的东东,他们编程几年了,每次用还总是百度查。这个东西应该是熟记于心的,随时用,信手拈来,这样才能成为高手。就好像一个修理工,一遍查手册,一边给你修车,亦或是一个医生,一边看教程,一边给你看病,想想就觉得恐怖。
算法很重要,要不断的优化程序
现在很多人都是快速的学习,快速的练习,反复的练习。而我的建议是,无论你学到什么阶段,都要去不断的优化自己的编程,能用3行实现的程序,不用5行,这样你编写的程序才能更加凝练。而且,编程学习的中后期,就要重视算法,尽量编程优质的程序,这才是编程的美妙之处。
写一个程序,不断改进
你学习的过程可能很漫长,我建议你从一开始的时候,就想着写一个小程序,比如一个计算器的程序,开始可能很简单,仅仅通过命令行的方式呈现,功能可能也只有加减乘除,但是随着你学习的深入,你可以不断的完善这个程序,直到有一天,你把它做成一个非常完善,性能非常卓越的程序后,你就真正学成了。
3怎样学java
1.态度
学习就要有学习的态度。虚怀若谷,才能海纳百川,如果有什么不懂得可以在网络上,论坛上提出自己的疑问,会有人在一定的时间内帮助你解决的。
还是那句老话“功夫不负有心人”,只要你肯下功夫,铁杵也会磨成针的,更不用说一个小小的JAVA技术了。所以,虚心的态度非常重要。
2.学好基础知识
千里之行始于足下,摩天大楼平地起,很多事情都是从最基础做起,没有基础,就谈不上更高级的发展。学习JAVA也一样,不从基础学习,连基础知识都没有掌握,还谈什么精通JAVA?
3.实践
几乎所有的老程序员都会这些建议,那就是多编码、多练习,熟能生巧就是如此。
我们都看过武侠小说,高手绝不是只理解招式的作用,而是通过千万次的练习,将招式变成自己下意识的行为,这才是高手。编程也是一样,当你看到工程详细说明时已经下意识的在脑中构建好了整个程序的框架,一切成竹在胸才是高手。
4java怎么样学习
学习JavaSE基础
可以找一本书(任何大学教材)学习Java的基础部分,不要看特别厚的书,比如Java编程思想,对于初学者看这类书太累。并不推荐只是看视频学习,而是要边看书边照着书上的代码打一遍。即使记不住,也要打一遍。此时的学习,主要是学习好Java的语法,知道每个常用的类 或者功能怎么用。并不推荐使用命令行来学习代码,直接用IDE就好了,因为大部分国内的公司也是用IDE开发的。学的时候并不一定要背下来,但是要在用的时候知道去哪里找相关的内容,然后通过反复的使用达到记住的目的。
学习高级特性
同样是阅读和练习。这部分更不可能完全的背下来,所以主要是下载一些现成的代码例子,然后读懂,接下来尝试去修改。比如“网络编程”,如果代码的例子讲解的是利用网络编程发送文字,那么可以尝试修改,学习如何发送图片等。在这一阶段的学习,还要掌握大量的Java包,对于数据结构有appache的common包,有google的Guava等,大部分的编程实际上都是利用其他人编写好的java包的。
深入理解JavaAPI
就是弄懂原理。比如List有几种实现,每个实现的区别是什么,Java在序列化的时候存储的格式是什么,java的垃圾回收原理是什么。对于这方面的学习,其实可以找一些“面试题”通常会问到,比如研究者July收集的各种题库也可以看书,比如Effective java 中文版(第2版)。
学习设计模式
其实这时为了更合理利用Java资源,进行正确的面向对象程序开发。这个时候要弄懂如何用java实现每一种设计模型(这时会综合利用继承、多态、抽象等机制)。可以看Head First 设计模式(中文版)等书,结合网上的资料。
开发工程级代码
这个阶段首先要下载一些其他人编写好的工程类的Java程序,看能不能看懂。如果能,学习他们的良好编程习惯,同时接着学习各种java的开源包。这类程序可以从GitHub上下载。然后在尝试参与到其他人的项目中,去修改他们的代码或者完成新的需求。其实能够做到这步,基本JavaSE就很好了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)