计算机组成原理,第二张图中画波浪线的地方,余数不应该都是越来越小吗?

本人参加20考研,由于复试没有具体要求会问哪几门课,所以我就找了网上一些常见的计算机专业的面试题,整理如下



1、数据:数据库中存储的基本对象。

数据库:长期存储在计算机内的、有组织的、可共享的数据集合。
数据库管理系统:专门用于建立和管理数据库的一套软件。对外部程序提供访问数据库的方法,对内进行数据管理。
数据库系统:与和数据库相关的整个系统,一般由数据库、数据库管理系统、应用程序、数据库管理员和用户组成。

答:主要是通过事件来触发而被执行的。可以强化约束,来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化。

3、什么是存储过程?用什么来调用?

答:存储过程是一组SQL语句,优点是允许模块化的设计,可以程序中就可以调用多次。而且存储过程只编译一次,如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。
可以用一个命令对象来调用存储过程。

4、索引的作用?和它的优点缺点是什么?

答:索引就一种特殊的查询表,索引指定列的数据用某种数据结构进行排序。例如B+树
优点:加快数据库的检索速度。
缺点:需要额外的空间,且插入删除需要额外的时间
MySQL数据库几个基本的索引类型:
1、普通索引:没有任何限制
2、唯一索引:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。
3、主键索引:不允许有空值
4、全文索引:进行模糊查询

5、什么是事务?什么是锁?

答:事务一组sql语句,逻辑上构成一个整体。如果任何一个语句操作失败那么整个操作就被失败,以后操作就会回滚到操作前状态,也就是说要么全部执行,要么全部不执行。
锁:锁可以保证事务的完整性和并发性。在某段时间内不能使用某些数据或数据结构。
共享(S)锁:多个事务可封锁一个共享页;任何事务都不能修改该页;通常是该页被读取完毕,S锁立即被释放。
排它(X)锁:仅允许一个事务封锁此页;其他任何事务必须等到X锁被释放才能对该页进行访问;X锁一直到事务结束才能被释放。
更新(U)锁:用来预定要对此页施加X锁,它允许其他事务读,但不允许再施加U锁或X锁;当被读取的页将要被更新时,则升级为X锁;U锁一直到事务结束时才能被释放。

6、数据库的乐观锁和悲观锁是什么?

乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。
悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作

7、什么叫视图?游标是什么?

答:视图是一种虚拟的表,只能进行查询和修改操作。只存储了原表的结构而不存储数据。对视图的修改不影响基本表。
优点:简化操作,安全性,可将重要的信息不加入视图
缺点:对视图的操作还是建立在原表上的,性能较差

数据库管理系统是管理数据库的软件(Mysql,Oracle)。用户就可以在抽象意义下处理数据,而不必顾及这些数据在计算机中的布局和物理位置。

外模式 概念模式 内模式
1)外模式:以视图的形式展现给用户的。
2)概念模式:整个数据库中的逻辑结构,用来描述实体,以及它们之间的关系。
3)内模式:数据库的物理结构

10、范式是什么,内容有那些

在设计数据库时,为了使其冗余较小、结构合理,设计数据库时必须遵循一定的规则。在关系型数据库中,这种规则被称为范数。范数是符合某一设计规则的总结。
第一范式(1NF)数据库表中的所有字段值都是不可分割的原子值
第二范式(2NF)数据库表中的每一列都与主键完全相关,而不能只与主键的部分相关。
第三范式(3NF)数据库表中的每一列和主键直接相关,而不是间接相关。

11、超键、候选键分别是什么?

超键:在关系中能唯一标识元组的属性集称为关系模式的超键。
候选键:是最小超键,即没有冗余元素的超键。

12、数据库四大特性?

原子性:事务被视为不可分割的最小单元,事务的所有操作要么全部提交成功,要么全部失败回滚。
一致性:数据库在事务执行前后都保持一致性状态。
隔离性:一个事务所做的修改在最终提交以前,对其它事务是不可见的。
持久性:一旦事务提交,则其所做的修改将会永远保存到数据库中。

13、数据库与文件系统的比较?

相同:都是用来存储和访问数据的
不同点:后执行的全部过程

1、应用层进行DNS请求,在传输层通过UDP传输,在网络层查找路由表到达服务器,在数据链路层通过ARP获得MAC地址,在物理层通过比特流进行传输
2、应用层进行HTTP请求,在传输层通过TCP获得。

19、交换机、路由器、网关的概念?

网关:路由器的IP地址

停止-等待、后退N帧、选择重传

21、HTTP长连接、短连接
22、计算机网络的性能指标

带宽、时延、时延带宽积、吞吐量、速率

23、网络的体系结构?

相同:都采取分层的体系结构,都可以解决异构网络的互联
不同:TCP/IP和OSI的网络层和传输层差异

25、计算机网络和分布式计算机系统的区别?

分布式:系统中的各个计算机对用户透明

26、奈氏准则和香农定理

奈氏准则:码元传输速率是有上限的,一旦超出,就会有码间串扰;奈氏准则给出了码元的极限传输速率,但没有限制信息传输速率;带宽越大,码元传输速率越大。
香农定理:信道的带宽或信噪比越大,信息极限传输速率越大;对一定的带宽和信噪比,信息传输速率是有上限的。

27、电路交换、报文交换、分组交换
28、物理层接口特性:机械、电气、功能、规程
29、同步通信和异步通信?

同步通信:通信双方必须先建立同步;效率高
异步通信:发送方可在任意时间内进行发送,接收方是在数据的起始位和停止位的帮助下实现信息同步的;效率低

30、介质访问控制的概念?以及方法?

概念:为使用介质的每个节点隔离来自同一信道其他节点所传送的信号。
信道划分介质访问控制(频分多路复用、时分多路复用、波分多路复用、码分多路复用)
随机访问介质访问控制(纯ALOHA协议、时隙ALOHA协议、CSMA协议、CSMA/CD协议、CSMA/CA协议):实质是将广播信道转为点对点信道
轮询访问介质访问控制(令牌传递协议)

1-坚持、非坚持、p-坚持

先听后发、边听边发(区别于CSMA)、冲突停发、随机重发(使用二进制指数退避算法)

CSMA/CA:发送数据时先广播告知其他节点,让其他节点在某段时间内不要发送数据,以免出现碰撞
CSMA/CD:发送前侦听,边发送边侦听,一旦出现碰撞停止发送
1、CSMA/CD用在有线通信中,但是在无线通信中由于存在“隐蔽站”,因此无线通信使用CSMA/CA,其实就是尽可能的降低发生碰撞的概率
2、CSMA/CD可以检测冲突,但无法避免;CSMA/CA发送包的同时不能检测信道上有无冲突

34、局域网的主要特点?

1、为一个单位所拥有,且地理范围和站点数目均有限
2、所有站点共享较高的总宽带、较低的时延和较低的误码率

逻辑上采用总线型,物理上采用星型,信息以广播方式发送,使用CSMA/CD对总线进行控制。采用无连接,提供的是不可靠的交付

37、应用层的网络应用模型?

客户/服务器模型、P2P模型

38、DNS域名解析过程

递归与迭代相结合查询:

1、GET参数通过URL传递,POST放在请求体中
2、GET比POST更不安全,因为GET的参数直接暴露在URL上
3、GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
4、GET请求只能进行url编码,而POST支持多种编码方式。
但其实,它们没有本质区别,因为它们的底层都是TCP,可以给GET加上请求体,也可以给POST加上URL参数。比较重要的一个区别是:GET产生一个TCP数据包;POST产生两个TCP数据包。GET将请求头和数据一起发送,而POST先发送请求头,再发送数据。但是并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。

40、客户端不断进行请求链接会怎样?

客户端向服务端发送请求链接数据包
服务端向客户端发送确认数据包
客户端不向服务端发送确认数据包,服务器一直等待来自客户端的确认,即一直处于半连接状态。
2、DDos 预防 ( 没有彻底根治的办法,除非不使用TCP )
限制同时打开SYN半链接的数目

41、网络协百议至少包括三要素:

语法:用来规定信息格式;数据及控制信度息的格式、编码及信号电平等。
  语义:用来说明通信双方应当怎么知做;用于协调与差错处理道的控制信息。
  定时:(时序)定义了何时进行通信,先讲回什么,后讲什么,讲话的速度等。比如是采用同步传输还答是异步传输!

42、TCP的可靠性?

2、使用了序列号和确认号
4、三次握手和四次断开


1、动态规划和贪心算法的联系和区别?

联系:都分解成子问题进行解决,两者都具有最优子结构性质。
区别:贪心算法的基本要素除了最优子结构,还有贪心选择性质,它不从整体最优去考虑,只基于当前情况进行最优选择,因此也不要保存之前的解。动态规划除了最优子结构性质,还有重叠子问题性质,它基于相关子问题的解,需要保存之前所有的最优解

2、分治法与动态规划主要区别:

① 分治法将分解后的子问题看成相互独立的.
② 动态规划将分解后的子问题理解为相互间有联系,有重叠部分.

3、图的遍历与树的遍历有什么区别?

1、图的遍历可能会出现循环遍历的情况,要设置标记数组。而树的遍历则不会出现这种情况。
2、图可能存在不连通的情况,而树不存在,所以图的遍历要对所有的顶点都循环一遍。

4、哈希表的特性?如何实现?

哈希表是通过关键字进行查找的一种数据结构。要实现这种特性就需要散列函数把元素散列到某个位置,常用的散列方法包括直接寻址法、除留余数法、数字分析法等。

5、单链表中,增加头结点的目的

对第一个结点的操作和其他点一致,对空链表和非空链表的处理一致

6、数据的逻辑结构有哪些?物理结构有哪些?

逻辑结构:线性表、树、图、集合
物理结构:顺序存储、链式存储、索引存储、散列存储

  1. 可行性 2.确定性3.有限性 4.输入 5.输出

DFS:使用栈,用于求所有解问题 规模不能太大 n BFS:使用队列,用于求最优解问题 规模可以稍微大点 n

9、用循环比递归效率高吗?

一般来说的话,循环效率要比递归高,因为递归里有很多函数的调用。但是代码简洁、清晰 在编译器优化后,对于多次调用的函数处理会有非常好的效率优化,效率未必低于循环。

10、递归的两个条件?
11、回溯算法的基本思想是?

从一条路往前走,能进则进,不能进则退回来,换一条路再试。

12、数组和链表的区别?

长度:数组长度是固定的;链表长度是可以动态变化的
访问:数组支持随机访问;而链表只支持顺序访问
作用:数组比较适合查询操作;链表比较适合插入删除操作
存储方式:数组是连续存放的;链表是没有要求的

13、简述下迪杰斯特拉(dijkstra)算法、弗洛伊德(Floyd)算法

迪杰斯特拉:使用一个length数组来记录源点到各定点之间的最短距离,每次选出距离最短且还没有被使用过的顶点,来更新源点到其他节点的最短距离。不适用带有负权值边的图
弗洛伊德:使用一个二维方阵来时记录点之间的距离,之后在顶点之间加入中间节点,如果加入后的距离更短,就更新。不适用包含负权值的边组成的回路

14、排序算法总结,包括时间复杂度、空间复杂度、稳定性

1、除了根节点,每个分支节点的子树个数小于等于m,大于等于(m/2)向上取整
2、非叶根节点最少有2棵子树
3、关键字数量为子树数量减1
4、子树的关键子大小位于子树所在两个关键字之间
5、所有叶节点在同一行,且不存储数据,数据都在非页节点中
1、除了根节点,每个分支节点的子树个数小于等于m,大于等于(m/2)向上取整
2、非叶根节点最少有2棵子树
3、关键字数量等于子树数量
4、关键字大小等于它所指节点的最大关键字
5、所有叶节点都在同一行且包含了全部关键字,而且按顺序进行链接

16、简述KMP算法?

当当前字符匹配时,将主串指针和字串指针同时后移一位比较;当当前字符不匹配时,主串不回退,直接将子串向前移动(当前匹配的长度– 当前匹配子串的部分匹配值)位
部分匹配值:字串相等的前后缀的最大长度

17、冒泡排序法的改进

设置一标志性变量pos,用于记录每趟排序中最后一次进行交换的位置。由于pos位置之后的记录均已交换到位,故在进行下一趟排序时只要扫描到pos位置即可

红黑树是一种带有红黑节点的平衡二叉排序树。它必须满足下面性质:
性质1:每个节点要么是黑色,要么是红色。
性质2:根节点是黑色。
性质3:每个叶子节点(NIL)是黑色。
性质4:每个红色结点的两个子结点一定都是黑色。
性质5:任意一结点到每个叶子结点的路径都包含数量相同的黑结点。

红黑树只追求大致平衡,AVL追求完全平衡


2、new无需指定大小,而malloc必须指定大小
3、new返回的是对象类型的指针,而malloc返回的是void型指针
4、new内存分配失败时,会抛出异常;malloc分配内存失败时返回NULL。
5、new会调用构造函数;而malloc不会调用构造函数

1、首先是分配一块内存空间
2、运行构造函数来构造对象,并进行初始化;

2、C和C++的区别是什么?

1、C是面向过程的语言,C++是在C语言的基础上开发的一种面向对象编程语言,应用广泛。C的重点在于算法和数据结构,对输入通过合适的运算得到输出;而C++重点在于狗仔一个对象使之描述一个问题
2、C中函数不能进行重载,C++函数可以重载

struct和class除了默认访问权限外,别的功能几乎都相同。struct的默认访问权限是公有的,class的默认访问权限是私有的

static和const的作用在描述时主要从类内和类外两个方面去讲:

static关键字的作用:
(1)函数体内static变量的作用范围为该函数体,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值;同样,在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;
(2)在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因而只能访问类的static成员变量。
(3)在模块内的static全局变量和函数可以被模块内的函数访问,但不能被模块外其它函数访问;

const关键字的作用:
(1)阻止一个变量被改变
(2)对于指针而言,可以指定指针本身为const,也可以指定指针所指的数据为const
(3)const修饰形参,表明它是一个输入参数,在函数内部不能改变其值
(4)对于类的成员函数,若指定其为const类型,则表明其是一个常函数,不能修改类的成员变量(const成员一般在成员初始化列表处初始化)

extern关键字的作用:
(1)extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。
(2)extern "C"的作用是让 C++ 编译器将extern "C"声明的代码当作 C 语言代码处理,可以避免 C++ 因符号修饰导致代码不能和C语言库中的符号进行链接。

2、sizeof的用法是sizeof(参数),这个参数可以是数组,指针,类型,对象,甚至是函数,其值在编译的时候就计算好了,而strlen的参数必须是字符型指针(char*),其值必须在函数运行的时候才能计算出来;
3、sizeof的功能得到初始建立的对象的长度;而strlen的功能是返回字符串的长度,切记这里的字符串的长度是包括结束符的;

1、指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已。
2、指针的值可以为空,但是引用的值不能为NULL,并且引用在定义的时候必须初始化
3、指针的值在初始化后可以改变,即指向其它的存储单元,而引用初始化后就不会再改变。
4、作为参数传递时,指针传参本质上还是值传递,会在栈中创建一个副本;而引用传参会通过一个间接寻址的方式影响实参

7、指针数组、数组指针

指针数组:一个元素是指针的数组
数组指针:一个数组的指针

C/C++程序编译时内存分为5大存储区
1、栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量值等,其操作方法类似数据结构中的栈。
2、堆区(heap):一般由程序员分配释放,与数据结构中的堆毫无关系,分配方式类似于链表。
3、全局区(static):全局变量和静态变量的存储是放在一起的,在程序编译时分配。
4、文字常量区:存放常量字符串。
5、程序代码区:存放函数体(类的成员函数、全局函数)的二进制代码

9、C/C++内存分配有三种方式:

1、从全局区分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。
2、在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。
栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
3、从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。
动态内存的生存期由程序员决定,使用非常灵活,但如果在堆上分配了空间,就有责任回收它,否则运行的程序会出现内存泄漏。
另外频繁地分配和释放不同大小的堆空间将会产生堆内碎块。

1、分配方式:堆由程序员自己申请;栈由系统分配
2、栈是一块连续的内存空间,空间较小;而堆的空间不连续的,它受限于虚拟内存
3、栈的速度较快;堆的速度较慢

11、常见的内存错误及对策

1、内存尚未分配成功,却使用了它;
解决办法:在使用内存之前检查指针是否为NULL。
2、内存分配虽然成功,但是尚未初始化就引用它;
解决办法:都要赋初值。
3、内存分配成功并初始化,但是超过了内存的边界;
解决办法:这种问题常出现在数组越界,写程序是要仔细。
4、忘记释放内存,造成内存泄露;(程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。)
解决办法:即得释放内存
5、释放了内存却继续使用它
6、使用free或者delete释放了内存后,没有将指针设置为null,导致产生野指针。

11、野指针与垂悬指针的区别:

野指针:访问一个已销毁或者访问受限的内存区域的指针,野指针不能判断是否为NULL来避免。野指针的值并不为null,野指针会指向一段实际的内存,只是它指向哪里我们并不知情
垂悬指针:指针正常初始化,曾指向一个对象,该对象被销毁了,但是指针未制空,那么就成了悬空指针。

避免野指针:在释放空间时将指针设为NULL.

12、内存管理需要遵循的规则

(1)用malloc 或者 new 申请内存之后,应该立即检查指针值是否为 NULL ,防止使用指针值为NULL的内存;
(2)不要忘记数组和动态内存赋初值,防止未被初始化的内存作为右值使用;
(3)避免数组或者指针下标越界
(4)动态内存的申请与释放必须配对,防止内存泄露;
(5)用free或者delete释放了内存之后,立即将指针设置为NULL,防止产生“野指针”;

1、结构体中每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如有需要编译器会填充字节
2、结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要,编译器会填充字节。

1、重载:是指同一可访问区内被声明的几个具有不同参数列表(参数的类型,个数,顺序不同)的同名函数,根据参数列表确定调用哪个函数,重载不关心函数返回类型。
2、覆盖:是指派生类中存在重新定义的函数。其函数名,参数列表,返回值类型,所有都必须同基类中被重写的函数一致,只有函数体不同。

15、C++有哪些性质(面向对象特点)
16、构造函数。析构函数调用顺序

先调用基类的构造函数,再调用子类的构造函数;析构函数顺序相反

17、c++的多态怎么体现?

多态:是对于不同对象接收相同消息时产生不同的动作。
重载:函数名相同,但是函数体不同,根据参数区分
虚函数:使用基类和派生类中通过virtual关键字使得同名同参的函数共存,访问时可以借助基类指针对不同的对象进行访问

18、那些函数不能定义为虚函数?

1、友元函数,它不是类的成员函数
3、静态成员函数,它没有this指针

19、C++是不是类型安全的?

不是。两个不同类型的指针之间可以强制转换(用reinterpret cast)。C#是类型安全的

20、main 函数执行以前,还会执行什么代码?

答案:全局对象的构造函数会在main 函数之前执行

21、函数、虚函数、纯虚函数

虚函数和普通的函数实际上是存储在不同的区域的

22、C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数

虚函数和纯虚函数的区别:
1、在成员函数声明前加个virtual就变成了虚函数。当基类的某个成员方法,在大多数情形下都应该由子类提供个性化实现,但基类也可以提供一个备选方案的时候,请将其设计为虚函数。
2、在虚函数声明后加个=0就变成了纯虚函数。当基类的某个成员方法,必须由子类提供个性化实现的时候,请将其设计为纯虚函数
3、虚函数既有定义,也有实现;纯虚函数只有定义,没有实现
4、纯虚函数类是不能定义对象的,虚函数的类可以定义对象

23、说几个C++11的新特性

1:这个关键字是一个修饰符,可以修饰类,方法,变量。
2:被final修饰的类是一个最终类,不可以被继承。
3:被final修饰的方法是一个最终方法,不可以被覆盖。
4:被final修饰的变量是一个常量,只能赋值一次。

2、抽象类的特点:(使用abstract修饰的类为抽象类)

1:抽象方法只能定义在抽象类中,抽象类和抽象方法必须由abstract关键字修饰(可以描述类和方法,不可以描述变量)。
2:抽象方法只定义方法声明,并不定义方法实现。
3:抽象类不可以被创建对象(实例化)。
4:只有通过子类继承抽象类并覆盖了抽象类中的所有抽象方法后,该子类才可以实例化。否则,该子类还是一个抽象类。

4、抽象类中可不可以不定义抽象方法?可以。抽象方法目的仅仅为了不让该类创建对象。
5、什么是接口,接口的特性?

一个类可以继承多个接口类,这样就能解决继承只能一对一继承的限制

6、匿名对象使用场景:

当对方法只进行一次调用的时候,可以使用匿名对象。

7、成员变量和局部变量的区别:

1:成员变量直接定义在类中。局部变量定义在方法中。
2:成员变量存在于堆内存中,随着对象的产生而存在,消失而消失。局部变量存在于栈内存中,随着所属区域的运行而存在,结束而释放。

8、构造函数和一般函数有什么区别呢?

构造函数是在对象创建时,就被调用,用于初始化,而且初始化动作只执行一次。
一般函数,是对象创建后,需要调用才执行,可以被调用多次。

9、This:代表对象,就是所在函数所属对象的引用。
10、当子父类中出现一样的属性时,子类类型的对象,调用该属性,值是子类的属性值。

如果想要调用父类中的属性值,需要使用一个关键字:super
This:代表是本类类型的对象引用。
Super:代表是子类所属的父类中的内存空间引用。

11、string是最基本的数据类型吗

string的长度和内容不可以改变,stringbuff的长度和内容可以改变

sleep()是当线程执行到这里的时候,会把进程让出,当别的线程执行完之后,它在执行
wait()是当线程执行到这里的时候,会停止,如果还想让它执行,需要使用notify方法唤醒

14、GC是什么,为什么要有GC

GC是java的垃圾自动回收机制
当程序有错误内存时,java会自动启动GC,进行垃圾回收,以保证系统的稳定性

wait():使一个线程处于等待状态,并且释放所持有对象的lock
notify():唤醒一个处于等待的线程

16、多线程有几种实现方法

多线程有两种实现方法,分别是继承thread方法和实现runnable接口

17、运行时多态的三大前提条件

object是所有类的父类
最终类:如果一个类被final修饰,意味着它不可被继承

static是关键字,可以修饰变量,方法,代码块
1.用static修饰的变量,为静态变量,也称为类变量,可以通过类和对象来访问
2.用static修饰的方法,是静态方法,静态方法只能访问其他的静态成员,静态方法里没有this关键字

20、java中如何处理异常的

线程池可以理解为,存放着很多未死亡的线程,当我们要使用线程时,直接去里面取即可,而不用再次创建线程,这样可以节省系统的资源

被virtual修饰的成员函数,在父类中不能实现,而他的实现放到子类中实现(多态,就是重写)。

23、java怎么处理对象分配和释放的?

java把内存分为堆栈空间存储,在堆中new的空间不用自己收回,自动垃圾收回。

接触电脑时间早,感兴趣,小时候跟着各种黑客杂志学了很多杂七杂八的东西,对计算机的感觉比较好。
大学就没怎么努力过,只是跟着课堂走。
工作之后,就是看视频、看书,然后练习。
总体的学习思路就是先看视频学习基本的东西,掌握基础之后看书,然后做大量的练习。

我习惯把读书的方式分为两种:精读和略读。
精读就是根据书中的章节划分,先看一个章节,然后做练习,完全掌握一个章节后再开始下一个章节,全书读完后再整体读一遍,然后用最精炼的语言提炼出书中的核心要点,做成笔记。
略读就是先大致看一遍,有个整体的印象,同时记下书中的要点和不懂的地方,然后逐一解决不懂的问题,精简提炼成笔记后开始根据全书做练习。

精读适合理论性知识强、知识点集中的书。
略读适合注重实用性、知识点分散的书。

但是无论如何,学计算机,最需要的就是做练习。

要在大量的练习和项目中,体会、领略原理性的知识。

——————————————分割线———————————————

最近在转型我的技术栈,梳理和调整自己的知识结构,譬如剔除一些已经淘汰的东西如VB、Delphi……

所以特别忙,忙到都没什么时间写chui知niu乎bi了,所以当我偶然间看到有人给我的这个回答评论时,我特别的诧异,我非常想对那些给我这个回答点过赞的人说一声——你可千万别信这个! 因为当年我写这篇回答,纯粹就是闲着没事干,吹牛逼来着!

故此次更新,为表歉意。

特意奉上正儿八经的干货,以表真诚。

0x00:大学计算机系的同学应该如何学习?

类似的问题,在知乎上有很多,大多数人都会告诉你,大学期间一定要打好基础。

但是怎样打好基础? 相信有些同学就会惆怅,课堂上的知识繁荣难懂,考试全靠记忆,尤其是计组和编译原理,简直看一眼就要犯困!

这里暂且先不讨论那些有的没的,我想让存在这些问题的同学,自问一下,当我们遇到了一个困难的问题时,应该如何解决?

请回忆一下我们高中学到的数学知识,当我们遇到一个看似困难的问题时,应该采用怎样的思路来解决问题,譬如我问你:

假如今天是星期天,那么10^100天后是星期几?

相信这个问题对你来说会是小菜一碟,当然如果得不到答案,那么请按照以下思路来解题:

1、首先从较小数依次开始试算。

2、观察结果,找到规律。

3、对余数进行分组,得到答案。

好了,如果你具备了以上思路,那么你就具备了解决计算机问题的基本能力!

这就是我要说的第一个重点:数学思维。

相信无论你是专业做开发的程序员,还是偷鸡摸狗的脚本小子,当遇到问题时,第一反应都是:

1、从引起问题的最小化条件开始,依次尝试解决问题。

2、观察结果,找到规律。

3、总结规律,解决问题。

当然数学思维可不仅仅上述这一简单的例子,我只是想要告诉你,如果你对数学的认识还停留在“得到答案”上,那么最好从现在开始改变你的思维,把中心放在“如何寻找解决问题的思路”上。

如果你自觉没有“灵光一闪”的花火,那么推荐给你第一本书,它有趣,简单,是帮助你梳理基础数学知识、构建基础数学思维的佳作:《程序员的数学1》

好了,现在已经具备了解决问题的基本思路——把问题分解为一个个小问题,逐个解决小问题,最终解决问题——那么你现在的问题是“如何学习计算机课程?”

我们利用同样的方法,把这个问题分解为一个个小问题,应该如何进行?

首先“如何学习计算机课程?”这一说法过于笼统,因为我们还不知道“要学习什么”,又怎么能知道应该如何学习呢?

这里请你查看一下你的课程表,画出大学期间你都要学习哪些课程,譬如:

大一:C程序设计、Java程序设计、计算机组成原理、高等数学、数据结构、算法导论

大二:离散数学、计算机网络、操作系统、数据库原理

大三:计算机操作系统、编译原理、软件工程、线性代数

大四:概率与数理统计、自算计系统结构、软件安全

此时你会发现,学校给出的课程安排还不够清晰明了,这样就不利于我们继续分析问题,所以你还应该对这些课程安排进行进一步的详细划分(再划分课程的时候请同时思考以下,这种方法是不是和某些我们学过的数学知识比较相似?),譬如:

数学:高等数学、离散数学、线性代数、概率与数理统计

算法与数据结构:数据结构、算法导论

编程语言:C程序设计、Java程序设计

计算机科学基础:计算机组成原理、计算机网络、操作系统、数据库原理、计算机系统结构

软件工程:软件工程、软件安全

好了,这样梳理一遍,问题就会清楚很多了,此时我们就把问题“如何学好计算机课程”划分成了若干个小问题:如何学好数学? 如何学好算法与数据结构?……

但是这样看来,似乎还是太笼统,没关系,我们继续把这些问题依次划分为更小的问题,这里以数学来举例,我们把问题描述为如下形式:

如何学好数学? = {

这样看来,问题就清晰了许多,但是还是过于笼统,没关系,我们继续依次划分问题,先从如何学好高等数学开始,请打开你的《高等数学》教材,观察目录,就可以把问题描述为如下形式:

如何学好高等数学? = {

看到这里,我就不再赘述了,我们可以按照以上思路,不断的对这些问题划分,知道我们可以解决问题为止,在这一不断的划分与解决问题的过程中,看似无法解决的“如何学好计算机课程”这一问题,就被我们“解决”掉了。

0xFFFFFFFF:“小火慢炖法”——我的终极学习方法:

根据前面的步骤,我们可以总结出一套高质量的学习方法:

1、观察某一学科的知识结构划分,必要时进行再次的总结与划分。画出结构目录图。

2、了解该组成高学科的所有知识结构,掌握该学科的核心知识点。记录笔记,只记忆我们已经理解的知识点。

3、详细学习该学科的所有知识结构,掌握该学科的所有知识点。记录、整理笔记,只记忆我们已经理解的知识点。

4、进一步学习该学科的知识点,掌握该学科的所有细节。记录、整理笔记。

5、在前四步骤的每一步中,每当完成了一个最小知识点的学习,就及时的问自己:“我现在可以做什么?” 以这样的方式进行总结与复习。

还是按照惯例,下面以如何学习《计算机网络》为例来详细的说明学习的方法:

1、我们先查看《计算机网络》这本教材,根据目录画出树形图,然后试读这本书,假如你发现读起来一头雾水,且老师讲的东西也难以理解的话,就打开百度,搜索关键字 “什么是计算机网络 视频教程”这样的关键字,找一部最简单、最基础的——重点是能让你看一眼就明白的——来学习,根据视频教程的内容,大略的记笔记,你要了解计算机网络是干吗用的,网络由哪些设备组成即可。这一步的要点是要你对《计算机网络》有一个大致的认识,将前面我们梳理出的树形图形成一种感性的认识。

2、有了前面的知识,我们再次根据《计算机网络》这本教材学习,如果你还是一头雾水,就会想一下你小学时,是不是看过一些简单易懂的科普书?这些书总是图文并茂,用十分口语化的方法,通过讲故事的方式使你了解到了一些“高深”的科学尝试呢? 那么我们就可以以此为突破点,寻找这类书籍进行学习,这里推荐你看《网络是怎样链接的》,我们根据这本书的内容记录笔记,注意,这里我们只记录我们可以理解的知识点。

3、我们再次根据《计算机网络》这本书学习,此时就会发现一些之前无法理解的内容,变得简单起来了,可是如果此时还有较多的知识点无法掌握,我们就在退一步,寻找一本和《计算机网络》这本书类似的,但是没有那么晦涩拗口的书籍来学习,譬如《计算机网络自顶向下方法》就是不错的选择,我们学习这本书的内容,记录知识点的同时,对之前的笔记内容进行梳理。

4、再次学习《计算机网络》这本书,此时就会发现,有了前面两本书的铺垫,《计算机网络》的内容我们就完全看懂啦,这时我们根据《计算机网络》这本书再次记录笔记,同时合并、梳理之前的笔记,至此你会惊奇的发现,你对计算机网络这门课的掌握和理解,已经超过了许多同学。

5、只有学习还是不够的,我们还要及时的复习,但是如何高效的复习呢?这里我推荐你,每当你掌握了一个新知识点,就问自己“我现在可以通过已经学习到的知识做什么?” 譬如你学习了TCP的三次握手,那么你是否会想到,如果一个程序,只是不断的向某台服务器发送SYN,而不继续进行后续的握手过程会怎样? 那么你是否可以尝试编写这样功能的小程序呢? 不要踌躇,马上去做! 无论最后你的程序是否可以正常运行;

又譬如,你学习了C语言的open函数,那么你是否会想到,可以利用这个open函数那些事情呢? ——没关系,只要你想到了,就马上去做,不管结果如何。

这就是以提出问题的主动方式,来替代等待问题的被动方式,用这样的方式进行复习,不仅可以更加高效、生动的复习你学过的知识点,还能让你有更加深入的理解。在不断的提问、尝试、解决问题中,你将会掌握学习的奥秘。

局部性原理:计算机在处理相关的数据及程序时,一般会有某个时段集中的访问某个指令,或者某个时段集中的读取某个空间的数据。

时间局部性:刚刚访问完的指令再次访问;

空间局部性:当程序访问一个空间立即又访问它的临近空间

工作集理论:工作集是进程运行时被频繁访问的页面集合

  随机存取存储器(RAM):动态RAM(DRAM),静态RAM(SRAM)

    内存属于此类,一旦断电所有数据丢失

    存储bios的芯片属于此类,断电后仍能存储数据

8表示8个地址空间,4表示每个地址空间存储了4个bit位的信息

   内存由28片芯片构成,每片的容量为112K*16/28位

磁盘结构:磁头,磁道,扇区(数据存放)

存取时间 = 寻道时间 + 等待时间(平均定位时间+转动延迟)

(寻道时间:磁头定位到对应的磁道上的时间;等待时间:等待读写的扇区转到磁头下方的时间)

(单缓冲区一次只能读取一个物理块,旋转周期33ms则表示每扫描一块耗费3ms,从R0开始并处理完时,磁头会转到R2的位置,但是因为是顺序处理,则继续转动,直到读到下一条记录R1,所以这段时间需花费33+3=36ms,所以从R0到R10开始时需花费36*10=360ms,处理完最后一条需花费3+3=6ms,即总共时间为360+6=366ms)

(只有等磁头完全转过这块物理块才能进入缓冲区进行处理,从R0到下一条R1需花费3+3=6ms,11条记录需花费11*6=66ms)

2.17 (一般选择题)

总线分类(根据位置划分):

  系统总线:微机中各个插件板和系统板之间的总线,属于插件板这一级的,比如PCI接口。

    (   数据总线:用来传输数据,

      地址总线:管理内存空间,

  外部总线:指微机与外部设备的总线

1. 串联系统和并联系统,计算可靠度

 串联系统:只要有一个子系统出问题了,整个系统都不能正常运行

  总系统的可靠度R = 子系统R1 * 子系统R2 * 子系统R3 …… * 子系统Rn

  总系统的失效率 λ = 子系统λ1 + 子系统λ2 + 子系统λ3 …… + 子系统λn

  (失效率是估计值,结果并不是很准确,只是一个近似公式,当子系统比较多且失效率极低的时候可以使用此公式)

 并联系统:只要有一个子系统能正常运行,则整个系统就可以正常运行,也就是当所有子系统都失效时,整个系统才失效

2.横冗余系统和混合系统(考得较少)

(软硬件领域都有应用,面向高可靠性系统的要求时,提高系统的可靠性,可以用冗余的方式来提高)

 在图中,R1、R2等模块是独立的,都做同样的职能和计算,所得的结果通过表决决定,在表决器中少数服从多数,即少数子模块出错不会影响输出结果,实际上通过表决器把一些错误给屏蔽了。

 计算公式R可靠度)

差错控制:CRC 与 海明校验码 (基本原理,操作流程)

检错,纠错(添加冗余信息)

码距:指整个编码系统中任意两个码字的最小距离

(也就是说一个码字变成另外一个码字需要改变的位数,比如A=11,B=00,码距为2)

循环校验码CRC:(可以检错,不能纠错)

  在信息的尾部加入校验信息,即补上多个校验位

模2除法:指在做除法运算的过程中不计其进位的除法 (做除法时每位是做异或操作)

分析:先将生成多项式转变为二进制数,可得11011,即为除数;然后在原始报文后添零,个数为(除数的位数-1),此个数同时也是余数的位数。使用模2除法后,将得到的余数替换掉原始报文后新增的零,即为CRC编码后的结果

海明校验码:(难点,出题频率高,了解编码的基本规则,如何编码,计算多少位信息位需要多少个校验位)

分析:根据2^r >= x+r+1公式,x表示信息位数,r表示校验位数,1011信息位数4,所以校验位数r=3;

   7,6,5,3分别用2的次方表示,可知道分别影响哪几位校验位,因而根据异或计算得到校验位值,填入表中。

如果要进行纠错,则将得到信息的校验位与正确的校验位进行异或操作,判断是哪位出现差错

如下图,收到的信息校验位值为 101,与正确的校验位001异或,得到100,则表示第四位出错,将第四位取反得到正确值。

我要回帖

更多关于 计算机制图 的文章

 

随机推荐