名词解释
Bios :基本输入输出系统,basic input output system,是一组固化到计算机内主板上一个ROM芯片上的程序,他保存着计算机最重要的基本输入输出的程序、开机后自检程序和系统自启动程序。
通配符:是一种特殊语句,主要有* 和? ,用来模糊搜索文件,用它来代替一个或多个真正的字符。
Undo(取消)与redo(重做)是Oracle的重要特性。
宏指令:汇编语言程序中的一种伪指令
伪指令:是用于对汇编过程进行控制的指令,该类指令并不是可执行指令,没有机器代码,指用于汇编过程中为汇编程序提供汇编信息。如提供:哪些是指令、哪些是数据及数据的字长、程序的起始地址和结束地址等
RAM与ROM
随机存取存储器(Random Access Memory,RAM)又称作“随机存储器,是与CPU直接交换数据的内部存储器,也叫主存(内存)。它可以随时读写,而且速度很快,当电源关闭时RAM不能保留数据。操作系统相关数据从硬盘加载到RAM中,才能被CPU处理。
只读存储器(Read Only Memory,ROM)。ROM所存的数据一般是装入整机前事先写好的,不像随机存储器那样能快速地、方便地加以改写。例如BIOS就存在ROM中,ROM所存数据稳定,断电后所存数据也不会改变;
RAM和ROM相比,两者的最大区别是RAM在断电以后保存在上面的数据会自动消失,而ROM不会自动消失,可以长时间断电保存。
RAM就是平时所说的运行内存,但对于ROM来说也并不是硬盘,而是内存(硬盘是外存)
EPROM
电可编程序只读存储器,一种特殊的ROM,可以使用电学等物理方式对ROM中的数据擦除或修改
基础知识
-
字符和字节:
-
字节(Byte)是计量单位,表示数据量多少,是计算机信息技术用于计量存储容量的一种计量单位,通常情况下一字节等于八位。
-
字符(Character)计算机中使用的字母、数字、字和符号,比如’A’、‘B’、’$’、’&'等。一般在英文状态下一个字母或字符占用一个字节,一个汉字用两个字节表示。
-
-
int,double等类型在现代计算机中所占字符个数:
和机器字长以及编译器有关系,int,double 等类型的宽度都可能随编译器而异,如16位编译器中,char占1个字节,int 占2个字节,float占4个字节,double占8个字节;而32位编译器中,char占1个字节,int 占4个字节,float占4个字节,double占8个字节,且规定所有的编译器中int至少为16位即2个字节。
64位编译器中,int 也占4个字节
-
32位系统中指针大小是固定的吗
是固定的,指针大小和机器字长相同,即32位机指针长度为4字节。(字长由CPU对外数据通路的数据总线条数决定)
-
堆和栈的区别
- 申请方式不同:栈由系统自动分配,堆是人为申请开辟
- 申请大小不同:栈获得的空间较小,堆获得的空间较大
- 申请效率不同:栈由系统自动分配,速度较快,而堆一般速度比较慢
- 存储内容不同:栈在函数调用时,函数调用语句的下一句可执行语句的地址第一个进栈,然后函数的各个参数进栈,其中静态变量是不入栈的。而堆一般是在头部用用一个字节存放堆的大小,堆中的具体内容是认为安排的
- 底层不同:栈是连续空间,堆是不连续空间
-
缓冲区溢出
为黑客最为常用的攻击手段之一,当计算机向缓冲区填充数据时超出了缓冲区本身的容量,溢出的数据覆盖在合法数据上。而溢出的数据正是攻击者精心设计的,从而破坏程序的堆栈,使程序转而执行其它指令,就有可能获得系统的控制权,达到攻击的目的。
-
中断
早期计算机中各个程序只能串行执行,系统资源利用率很低。人们发明了操作系统,引入了中断技术,实现了多道程序并发执行,发生中断后,由于中断处理需要使用特权指令,CPU会进入内核态,当前运行的程序会暂停执行,操作系统内核会对中断进行处理。
-
物联网
“万物相连的互联网”,物联网的核心和基础仍然是互联网,是在互联网基础上的延伸和扩展的网络,通过射频识别、全球定位系统等信息传感设备,按约定的协议,把任何物品与互联网相连接,进行信息交换和通信,实现物与物、物与人的互联互通。
-
图灵奖
是由美国计算机协会于1966年设立的计算机奖项,名称取自英国数学家、逻辑学家艾伦·麦席森·图灵,旨在奖励对计算机事业作出重要贡献的个人 。图灵奖对获奖条件要求极高,评奖程序极严,一般每年仅授予一名计算机科学家。图灵奖是计算机领域的国际最高奖项,被誉为“计算机界的诺贝尔奖”。
-
摩尔定律
当价格不变时,集成电路上可容纳的晶体管数目,约每隔18个月便会增加一倍,性能也将提升一倍。换言之,每一美元所能买到的电脑性能,将每隔18个月翻两倍以上。这一定律揭示了信息技术进步的速度。
-
3、4、5G(第 代通信技术)
-
3G利用了CDMA高频技术,将通信技术提高了一个档次,不仅可以传输文字和语音,还可以传输图片,将电磁波的频率提高到了高频,使得速度大幅提升
-
4G不仅将电磁波频率提高到了超高频,还有很多传输技术革新,比如MIMO(多进多出)传输技术,可以将天线物理上缩短,这也意味着可以在有限的空间内使用更多的天线,消息传输的质量也得到提升
-
5G引入了一个新概念,就是毫米波,开启了极高频的只能时代,重要技术就是大规模天线技术(massive MIMO)带来了更高的速度,但是频率的提高,会造成传播能力如绕射和穿墙的能力会下降,所以5G基站的覆盖会是一个大问题,铺设的成本会比较大
-
-
Maven
- 一个项目十分庞大,不适合再用backpage来划分模块,就需要借助maven来将一个项目拆分成多个工程,每个模块对应一个工程
- 将jar包放入仓库,当需要使用一个jar包时,只需要引入,不需要再复制粘贴到项目中了
- 使用maven下载jar包,可以保证jar包可靠性
-
代码更新提交工具
是一个管理多人协同开发的技术,方便多人开发进行版本控制,减小代价。
常见版本控制工具:
- SVN:集中版本控制,所有的版本数据都存放在服务器上,协同开发者上传或者更新自己的修改,但是每个用户不联网的话只能看到自己同步的版本,同时,如果服务器损坏,就会失去所有数据
- Git:目前最先进的分布式版本控制,所有版本信息都同步到用户本地,即在本地就可以查看所有的版本信息,不需要联网,可以离线工作。使用中可以直接看到(拉取)其他人修改后的代码。但是每个用户拥有全部代码,所以有代码隐患,如果服务器或本地主机损坏,所有人都有最新的备份,方便数据的恢复
-
计算机体系结构
计算机体系结构是程序员所看到的计算机的属性,即概念性结构和功能特性,计算机体系结构的属性包括,机内数据表示、寻址方式、中断机构、指令系统、存储系统
-
3D打印
3D打印就是在普通的二维打印的基础上再加一维,这是快速成形技术的一种。3D打印是一种以粉末状金属或塑料等粘合剂作为打印材料,以数字模型为基础进行逐层打印。
-
迭代和递归
- 递归:重复调用函数自身实现循环称为递归,递归实际上不断地深层调用函数,直到函数有返回才会逐层的返回,递归是用栈机制实现的,因此,递归涉及到运行时的堆栈开销,参数必须压入堆栈保存,所以有可能导致堆栈溢出的错误;但是递归编程追求简洁、将问题交给计算机,以及将大问题分解为相同小问题从而解决大问题
- 迭代:利用变量的原值推出新值称为迭代,或着说是函数内某段代码的循环; 迭代大部分时候需要人为的对问题进行剖析,分析问题的规律所在,将问题转变为一次次的迭代来逼近答案。迭代不像递归那样对堆栈有一定的要求迭代的效率高,但却不太容易理解,当遇到数据结构的设计时,比如图表、二叉树、网格等问题时,使用就比较困难,而是用递归就能省掉人工思考解法的过程,只需要不断的将问题分解直到返回就可以了。
-
奇偶校验
- 判断传输的一组二进制数据中"1"的个数是奇数还是偶数
-
超级计算机
超级计算机(Super computer)是指能够执行一般个人电脑无法处理的大量资料与高速运算的电脑。就超级计算机和普通计算机的组成而言,构成组件基本相同,但在性能和规模方面却有差异。超级计算机主要特点包含两个方面:极大的数据存储容量和极快速的数据处理速度,因此它可以在多种领域进行一些人们或者普通计算机无法进行的工作。
-
WEB2.0
web2.0就是用户主动获取并产生内容。
web1.0是由系统向用户展示内容。
web3.0是个性化内容的获取。
比如新浪就是1.0,你上它的网站,它放了很多新闻给你看。比如google是2.0,你跟它说我要搜索最近新上映电影的信息,微博是2.0,因为它是是由用户编写的内容。豆瓣fm是3.0,它根据你一贯听歌的口味向你推荐你可能喜欢的歌曲。
-
ACM
国际大学生程序设计竞赛,是由国际计算机协会ACM主办的,一项旨在展示大学生创新能力、团队精神和在压力下编写程序、分析和解决问题能力的年度竞赛。
-
IEEE
电气与电子工程师协会(Institute of Electrical and Electronics Engineers),简称IEEE,总部位于美国纽约,是一个国际性的电子技术与信息科学工程师的协会,也是目前全球最大的非营利性专业技术学会
-
离散数学与计算机的关系
- 离散数学所研究的对象是离散数量关系和离散结构的数学模型,由于计算机本身就是一个离散结构,它只能处理离散的或离散化了的数量关系, 计算机科学及其相关的现代科学领域,都面临着如何对离散结构建立相应的数学模型的问题
- 如:数据结构中将操作对象间的关系分为四类:集合、线性结构、树形结构、网状结构。数据结构研究的主要内容是数据的逻辑结构,物理存储结构以及基本运算操作。其中逻辑结构和基本运算操作来源于离散数学中对离散结构和算法思考。
计算机网络
-
路由器的原理
路由器(router)是互联网的枢纽,为了能够让不同网段之间的设备进行通信,它会根据信道的情况自动选择和设定路由,以最佳路径,按前后顺序发送数据。
路由器主要完成两个功能:
1. 路由选择,即确定哪一条路径,根据特定的路由选择协议构造出路由表,同时定期地和相邻的路由表交换路由信息,从而不断地更新维护路由表,路由器会根据从各相邻的路由器所得到的关于整个网络拓扑的变化情况,动态的选择最佳路由;
- 分组转发,就是路由器会根据转发表将用户的IP数据报从合适的端口发出,路由表是根据路由选择算法得到的,而转发表是从路由表得出的,同时转发表的结构需要使查找过程最优化。
-
路由器和交换机的区别
- 交换机工作在数据链路层,根据MAC地址转发数据帧,用于组建局域网 (MAC地址是决定下一跳将要交给哪一台设备(一般是交换机或者路由器),MAC地址是硬件实现的,每一个网卡在出厂时都会将全世界唯一的MAC地址固化在ROM中,因此MAC不可改,IP可改)
- 路由器工作在网络层,根据IP地址来转发数据报,负责让主机连接外网 (IP地址决定最终数据要到达某一台主机,IP地址是软件实现的,可以描述主机所在的网络)
-
网卡
-
网卡也称网络适配器,是电脑与局域网相互连接的设备。无论是普通电脑还 是高端服务器,只要连接到局域网,就都需要安装一块网卡。
-
网卡的功能主要有两个:
一是将电脑的数据封装为帧,并通过网线将数据发送到网络上去;
二是接收网络上其它设备传过来的帧,并将帧重新组合成数据,发送到所在的电脑中。
-
-
中继器
- 由于信号在线路上传输会衰减,衰减到一定程度会造成信号失真,导致数据传输错误
- 中继器可以将信号进行再生和还原,对衰减的信号进行放大,保持与原数据相同,以增加信号传输距离,延长网络的距离
-
集线器(多端口中继器)
- 对衰减的信号进行再生还原,是星型拓扑结构,一台集线器连接好几台主机,可以增加信号的传输距离
- 一台集线器连接的主机平分带宽
-
网络层、传输层和应用层有哪些协议
-
数据链路层成帧的方法
- 字符计数法:在每帧开头表明该帧的长度
- 字符填充的首尾界定法:在帧的头之前和尾之后加一个特殊的字符flag,只要读到这个字符帧就开始了,再次读到就认为这个帧结束了
- 比特填充的首尾界定法:把flag具体化了,为6个1
-
帧结构、为什么要限制帧的长度?
- 封装成帧就是在一段数据的前后部分添加首部和尾部,这样就构成了一个帧。首部和尾部包含许多控制信息,它们的一个重要作用就是确定帧的界限。
- 以太网中传输的数据帧的长度并不是一个常数,而是一个范围内的,64~1518字节。限制帧的最大长度是为了避免一台设备长时间占用信道,所以在传输过程中一定要有机制强制一个设备停止传输,让出信道的使用。限制最小的帧长度是因为,在一个局域网的物理环境中,想要给远一点的设备传数据帧的时候,帧在发完之后还有设备没有探测到这个帧,于是也开始使用信道,就可能出现同时有两个帧在信道上传播,产生的冲突,造成信道无法传输数据。
-
连通性和共享性是计算机网络的两个基本特点
连通性:互联网用户之间,不管距离有多远,都可以非常便捷、非常经济(大多数情况下免费)地交换各种信息,好像所有的终端都是连接在一起的一样。
共享性(资源共享):信息共享,软件共享,硬件共享等,由于网络的存在,这些资源就好像在用户身边一样可以方便的使用。
-
OSI七层模型,每一层都要对上一次层发送的数据进行处理
1. 应用层:支持各种网络应用 FTP、SMTP、HTTP 2. 表示层: 3. 会话层: 4. 传输层:实现端到端的,进程到进程的数据传输 TCP、UDP 5. 网络层:把数据报拆分成分组,发给任何的网络,实现异构网络互联,实现源主机到目的主机的数据路由选择和分组转发,主机与主机 6. 数据链路层:把网络层传下来的数据报,加上头尾装成帧;主要作用是加强物理层传输原始比特流的功能,将物理层可能出差错的物理连接,改造成逻辑上无差错的数据链路 7. 物理层:比特传输(比特流)
-
TCP/IP四层协议,列举计算机网络的协议(协议簇/协议栈/多个协议的集合)
- 网络接口层
- 网络层:IP协议
- 传输层:TCP、UDP协议
- 应用层:HTTP、FTP、SMTP协议
-
TCP/IP四层协议与OSI七层模型
- OSI定义三点:服务、协议、接口
- OSI参考模型是一个法定的标准,而TCP/IP是一个适时应用的标准;OSI研究出来的时候,TCP/IP已经在市场上开始使用了,OSI只提了一个架构,并没有具体应用,而TCP/IP是先诞生了TCP/IP协议栈,然后总结出的参考模型
- TCP/IP设计之初就考虑到异构网互联的问题,将IP作为重要的层次
-
FTP协议(应用层)
- 文件传输协议,在应用层的一种协议,用来提供不同种类主机系统之间的文件传输能力,可以屏蔽不同操作系统之间的差异性
- 对文件的操作实际就是在客户端和服务器之间的拷贝过程
- 用于有大量用户需要访问服务器拷贝文件的场景,采用匿名登陆方式,不要求取得FTP服务器的授权,可以减少服务器的负荷
- 同时为了保证文件传输的可靠,使用的是TCP传输方式
-
MPLS
-
万维网
- world wide web 是一个大规模的、联机式的信息储藏所,或是一个资料空间,是无数个网站终点和网页的合集,我们可以使用同一资源定位符URL来唯一标识资源,URL不区分大小写
- 用户通过点击链接获取资源,这些资源通过超文本协议HTTP传送给使用者
- 万维网使用超文本标记语言HTML,使得万维网页面设计者可以很方便的从一个页面的链接转到另一个界面,并能在自己的屏幕上显示出来
-
http HyperText Transfer Protocol
-
http协议规定了浏览器(万维网客户进程)怎样向万维网服务器请求万维网文档,以及服务器怎样把文档传送给浏览器
-
访问过程:
- 浏览器分析URL
- 浏览器向DNS请求解析IP地址
- 浏览器与服务器建立TCP链接
- 浏览器发出HTTP请求报文,请求文档
- 服务器响应,发出HTTP响应报文
- 释放TCP链接
- 浏览器显示
-
且客户端不必一次性全部下载所有资源,如点击播放按钮,再下载音乐
-
特点:
-
http协议是无状态的
同一个客户在第二次访问网站与第一次访问事一样的
但在实际工作中,网站希望能识别用户,以提供个性化服务:故引入cookie——存储在客户主机中的文本文件,记录一段时间内某用户的访问记录
-
http虽然采用TCP作为运输协议,但是HTTP协议本身是无连接的,在传输http报文之前不需要先建立HTTP连接
-
-
-
HTTP持久连接和非持久连接
-
非持久连接:每个连接处理一个请求-响应事务。
-
持久连接:每个连接可以处理多个请求-响应事务。
持久连接情况下,服务器发出响应后让TCP连接继续打开着。同一对客户/服务器之间的后续请求和响应可以通过这个连接发送。
-
-
SSL
安全套接字协议,是为网络通信提供安全的一种安全协议。SSL在传输层对网络连接进行加密,已被广泛地用于web浏览器和服务器之间的身份认证和数据加密传输
-
https
- 普通的HTTP传输协议中,数据是明文传输的,没有任何加密,在传输中很容易被窃听,非法获取传输数据
- https使用TLS协议(安全传输层协议),前身是SSL
- 过程:
- 浏览器和服务器建立一个安全的连接通道
- 服务器会发送一个网站的证书信息到浏览器,相当于告诉客户端这是正确的服务器
- 服务器会把没有上锁的箱子和公钥匙发给浏览器,浏览器把数据放入箱子后,拿公钥所上,发给服务器
- 服务器收到后再用自己的私钥打开箱子
-
SMPT Simple Mail Transfer Protocol
- smpt规定了两个相互通信的smpt进程之间如何交换信息
- 负责发送邮件的就是SMPT进程就是smpt客户,负责接收邮件的就是SMPT进程就是smpt服务器
- (发邮件)用于客户代理把邮件发送到邮件服务器,以及不同邮件服务器之间邮件的传送
- (收邮件)而从邮件服务器上接收邮件到客户代理上用的是POP3协议
- 采用TCP传输方式,端口号25,采用客户端/服务器模式
-
DNS服务 Domain Name System
- 将网站的名字,也就是域名,利用DNS服务器解析成IP地址,使用UDP数据报,采用UDP传输面向无连接,DNS域名解析时间更小。使用签名来保证数据来源的可靠性
- 域名:WWW.baidu1奥哼.com,从左到右等级增高,com后面还有个点,为根;顶级域名(cn国家、com企业、net资源网站、org非营利组织);二级域名
- 域名服务器:
- 本地域名服务器:当一个主机发送DNS请求查询时,这个查询请求报文就会发给本地域名服务器(递归查询)
- 递归查询:一级一级,由上一级帮助查询
- 迭代查询:总是由本地域名服务器来查询
-
IP地址
- 我们要在互联网中通信,首先要知道目的主机在哪个网络,第二就是要知道在这个网络中的哪一台主机,IP地址就是给每一个主机或主机接口路由器接口,都赋予一个标识符,能全球唯一化的标识这个主机接口,这样IP地址就可以使我们在因特网中很方便的寻址,以及接下来的通信和资源共享
- 32位,每八位(一个字节)写成一个十进制数
-
IPV6
- 32位IPV4消耗殆尽,将地址扩大到128位,有了更大的地址空间
- IPV6将IPV4的可选首部移除,大大减少了检查首部的时间,提高路由器的处理效率
- IPV6可以自动配置IP地址
- 使用十六进制表示
-
ARP协议(网络层)
地址解析协议,由于在实际网络的链路上传输数据帧时,最终必须使用MAC地址,ARP协议完成主机或路由器IP地址到MAC地址的映射(解决吓一跳走哪的问题)
- ICMP协议(网络层)
网际控制报文协议,处于网络层和传输层之间,就是为了更好地转发ip数据报和提高交互成功的几率,比如ping命令:测试两个主机之间的连通性,就使用了ICMP回送请求和回答报文
-
VLAN(虚拟局域网)
局域网是指在某一个区域内,由多台计算机互联组成的计算机组。而VLAN即虚拟局域网所指的LAN特指使用路由器分割的网络——也就是广播域。
1. 同一个VLAN中的广播只有VLAN中的 成员才能听到,而不会传输到其他的VLAN中去
2. 同时, 若没有路由,不同VLAN之间不能相互通信,从而提高了不同工作组之间的信息安全性。
3. 网络管理员可以通过配置VLAN之间的路由来全面管理网络内部不同工作组之间的信息互访。 -
防火墙技术
-
包过滤技术
是防火墙为系统提供安全保障的主要技术,通过设备对进出网络的数据流进行有选择的控制与操作,达到安全防护的目的。
-
网络地址转换
NAT是一种用于把内部IP地址转换成临时的、外部的 IP地址的技术 -
代理服务技术
应用代理是代理内部网络用户与外部网络服务器行信息交换的程序。代里将内部用户的请求确认后送达外务器,同将外部服务器的响应再回送给用户
-
-
电路交换、报文交换和分组交换的含义和区别
- 电路交换:
- 电话交换机接通电话线的方式称为电路交换
- 三个步骤:
- 建立连接(拨号)
- 通话(一直占用通信资源)
- 释放连接
- 当使用电路交换来传送计算机数据时,其线路的传输效率很低
- 报文交换:
- 交换结点采用存储转发的方式,对每个报文完整的加以处理,报头含有收发双方的地址,以便结点进行路由选择
- 无需建立连接,但报文没有大小限制,每个结点需要较大的存储空间,延迟大
- 分组交换:
- 也采用存储转发的处理方式,将原始信息分成若干等长数据段,也就是包,再加上一些必要的控制信息的首部
- 无需建立连接,且每个结点再发送分组的同时也可以接收分组,减少了转发时延
- 电路交换时延最小,但从信道利用率上看,报文和分组要优于电路
- ‘
- 电路交换:
-
UDP和TCP协议
- UDP用户报文协议,TCP传输控制协议,都是在TCP/IP四层协议中的运输层
- UDP传输前,不需要在两台主机间建立连接,故时延小,适用于小文件;TCP传输前,需要使用三次握手建立连接,数据传输完成后,需要使用四次握手释放连接,这样提供可靠传输,适用于大文件,但是时延大
- 使用UDP可以进行一对一,多对一、多对多的通信,TCP必须建立连接,只能进行一对一通信。
- UDP向上提供无连接不可靠的传输服务,对丢包和误码并不做处理,故常用于实时应用,如qq发送消息,发送失败有感叹号提示,需要我们自己重发。TCP向上提供有连接的可靠服务,出现丢包和误码现象时,由于发送方得不到接收方的确认信息,就会延时重发,可以用于文件传输
-
TCP三次握手建立连接
- 有件事不知当讲不当讲:客户端发送连接请求报文段
- 当讲,你说吧:服务器端为该TCP连接分配缓存和变量,并向客户端返回确认报文段
- 好的,。。。。。:客户端为该TCP连接分配缓存和变量,并向服务器端返回确认的确认,接着就可以传输数据了
-
TCP四次握手释放连接
- 我说完了:客户端发送链接释放报文段,停止发送数据,主动关闭TCP连接
- 好的,我想说:服务器返回一个确认报文段,这时处于半关闭状态:客户到服务器这个方向的连接就释放了
- 我说完了:服务器发完数据,就发出释放报文段,主动关闭TCP连接
- 好吧:客户端送回一个确认报文段,在等待两个最长报文段寿命(服务器没有收到,则会重新发送3)之后,确认服务器收到了,连接彻底关闭
-
网络层和数据链路层的区别
- 网络层是指把分组从源端传送到目的端,传输单位是数据报;数据链路层的基本服务是将来源于网络层的数据可靠地传输到相邻节点的目标机网络层,实现具体的传输,传输单位是数据帧。
- 协议不同,数据链路层的协议有HDLC、PPP等,网络层的协议为IP协议
-
多路复用技术(数据链路层)
- 把多个信号组合在一条物理信道上进行传输,使得多个计算机或终端设备共享信道资源,提高信道利用率
- 把一条广播信道,逻辑上分成几条用于两个节点之间通信的互不干扰的子信道,实际就是把广播信道转变为点对点的信道
- 发送端使用复用器将信号组合到一条信道上,接收端使用分用器,把这些信号区分开
- 静态划分信道的方式
- 频分复用:(并行)所有用户在同样的时间占用不同的频段资源,互不干扰,实现比较容易
- 时分复用:(并发)多个用户轮流的占用信道,每人依次占用一段时间的信道
- 波分复用:利用光的频分多路复用,在光纤中传输不同波长的光信号
- 码分复用:将一个比特分成多个码片,将各路数据在信道中线性相加
-
局域网与城域网的区别
局域网就是在同一个区域内,把多台计算机互连起来的小范围计算机网络;城域网是覆盖一个城市的地理范围,可以将同一区域内的多个局域网互相连接起来的中等范围的计算机网络
-
身边的无线网络
- 无线个人区域网WPAN,协议标准是IEEE802.15,其中蓝牙是IEEE802.15.1
- 无线局域网LAN,协议标准是IEEE802.11,其中wifi是IEEE802.11n
-
路由协议
- 根据应用的场景不同分类
- IGP:内部网关路由协议,承载的路由条目较少,有路由信息协议RIP、开放最短路径优先OSPF
- EGP:外部网关路由协议,承载的路由条目较多,有边界网关协议BGP
- 根据路由算法分类
- 距离向量路由协议:RIP、BGP
- 链路状态路由协议(可以计算出整个网络拓扑长啥样,来决定哪条路是最优先的):OSPF
- 根据应用的场景不同分类
-
p2p
即对等计算机网络(peer to peer),通过直接交换来共享计算机资源和服务,每个主机既可以提供服务,也可以请求服务,任意节点之间可以直接通讯,有着很好的可扩展性和健壮性,可以应对大量主机涌入的场景,主机多了,意味着可以提供服务的也多了
-
物联网协议
现在的物联网的通信架构也是构建在传统互联网基础架构之上。在当前的互联网通信协议中,HTTP协议由于开发成本低,开放程度高,所以很多厂商在构建物联网系统时也基于http协议进行开发。
软件工程
-
软件工程
应用计算机科学、工程学、管理学的原则、方法用到软件开发、运行和维护的过程中,他对指导软件开发,质量控制以及开发过程的管理起着十分重要的作用
-
软件
- 软件不是程序,而是计算机程序、方法、规则、相关的文档以及在计算机上运行程序时所必须的数据,
-
程序是为了解决某个特定问题而用程序设计语言描述的适合计算机处理的语句序列,他是由软件开发人员设计编码的
- 文档则是软件开发活动的记录,主要供人们阅读,既可以用于专业人员和用户之间的交流,也可以用于软件开发阶段的管理和运行阶段的维护
-
软件危机
- 软件危机是指在计算机软件的开发和维护过程中所遇到的一系列严重问题
-
软件危机包含两方面问题
- 如何开发软件以满足软件日益增长的需求
- 如何维护数量不断增长的已有的软件
- 表现形式
- 对软件开发成本估计常常很不精准
- “已完成“的软件不能满足用户的要求
- 软件产品质量差,可靠性得不到保障
- 软件的可维护性差,开发人员之间不遵守统一的规范和完整规范的文档
- 如何开发软件以满足软件日益增长的需求
-
软件的生命周期
又称为系统开发生命周期,是软件的定义、开发、运行维护直到淘汰的周期
- 问题定义:弄清楚用户需要计算机解决什么样的问题,提出系统目的和范围的说明
- 可行性研究:再提出问题的基础上,寻找一种在技术上可行,且在经济上有较高效益的操作解决方案
- 需求分析:弄清楚用户对于软件系统的全部要求,编写需求规格说明书
- 概要设计:明确目标系统应该怎样实现,将需求转化为软件的表示形式,设计系统中各个模块的结构和关系
- 详细设计:把功能描述转化为更加精确的过程描述,如具体的算法、数据结构等
- 编码:按照选定的语言,完成源程序的编写
- 测试:开发时期的最后一个阶段,保证软件的质量
- 维护:改正性维护(开发的不完全)、适应性维护(适应环境变化)、完善性维护(在使用过程中提出的建议)
-
软件开发模型
- 瀑布模型:又称生命周期模型,是将软件生命周期中的各个活动 规定为依线性顺序连接的若干阶段,包括问题定义、可行性研究、需求分析、概要设计、详细设计、编码、测试、维护,每个阶段的次序固定,如同瀑布流水一样,逐级下落。缺点是线性的开发模式,太理想化了,只有才开放后期才能看到预期的结果,风险很大
- 快速原型模型:首先快速建立一个能够反映用户主要需求的原型系统,让用户在计算机上使用它,通过实践让用户了解未来目标系统的概貌,以便判断哪个功能是需要的,哪个是需要改进的,开发人员根据意见修改原型系统,这样反复改进,直到得到完全符合用户要求的新系统
- 增量模型:结合了瀑布模型和快速原型模型的优点,在整体上按照瀑布模型的流程实施开发,以方便对项目进行管理,但在软件的实际实现中,将软件按功能分为若干个构件,开发出一部分,向用户展示一部分,直到将所有完成的构件集成起来
- 螺旋模型:引入风险分析的模型,可以看作是在每一个阶段开始之前都增加了风险分析的快速原型模型
- 喷泉模型:是专门针对面向对象软件开发的,喷泉形容面向对象软件开发过程中的迭代和无缝过渡
-
可行性研究
可行性研究目的就是用最小的代价在尽可能短的时间内确定问题是否能够解决,不是解决用户提出的问题,而是确定问题是否值得去解决:经济可行性、技术可行性、操作可行性、法律可行性
-
需求分析
- 需求分析的主要任务是回答系统必须做什么,确定系统必须完成哪些工作,对目标系统提出完整、准确、清晰具体的需求
- 过程:需求获取、需求分析、需求规格说明书、需求验证、需求管理
-
黑盒白盒
- 黑盒测试:黑盒技术注重测试软件的功能,在设计测试用例时,需要研究需求说明和总体设计说明中的有关程序功能,从而与测试后的结果进行比较。方法:等价类划分(用少部分数据代替整体)、边界值分析法(实践表明,程序在处理边界情况时最容易发生错误)、错误推测法(测试人员根据经验和直觉判断程序中可能出现的错误)
- 白盒测试:白盒技术以程序的结构为依据,所以被测的对象基本时源程序,以程序内部逻辑结构为基础设计测试用例。主要有:语句覆盖(设计足够多的测试用例,使程序的每条可执行语句至少执行一次)、判断覆盖(设计足够多的测试用例,使得每条语句至少执行一次,且每个判定表达式至少得到一次真值和假值)、条件覆盖(设计足够多的测试用例,使得每条语句至少执行一次,且每个判定表达式中的每个条件都能获得所有可能的结果)、条件组合覆盖(设计足够多的测试用例,使得每条语句至少执行一次,且每个判定表达式中的每个条件获得所有可能互相组合的所有结果)。
-
软件测试方法
- 按测试原理分:白盒、黑盒
- 按测试过程分:静态测试(不在机器上执行,只研读源代码代码)、动态测试(通过运行程序发现错误)
-
软件测试的作用
是为了发现程序错误而执行的过程,使用最少的代价,发现软件中潜在的错误和缺陷,保证软件质量,一般不可能发现程序中的所有错误,软件测试只能证明程序中存在错误,但不能确定程序中不存在错误
-
软件测试过程
软件产品在交付使用之前一般要经过单元测试、集成测试、确认测试、和系统测试4个阶段
- 单元测试:单元测试的对象是具有明确功能的单元模块,一般以白盒测试为主,一般在编码阶段进行
- 集成测试:集成测试是在单元测试的基础上,将所有模块按要求组装成一个完整的系统而进行的测试。有渐增式测试和非渐增式测试,以黑盒测试为主,有自顶向下和自底向上(需要驱动模块,作为底层模块的上层)两种集成方法
- 渐增式测试:把下一个要测试的模块同已经测试好的模块结合起来进行测试,增加一个测试一个,边组装边测试
- 自顶向下:不需要驱动模块,步骤是从顶层模块开始,向下移动,逐步把各个模块结合起来,在组装的过程中又有两种结合方式
- 深度优先:首先把软件结构的一条主控制路径上的模块一个个结合起来进行测试
- 宽度优先:逐层将直接下属的所有模块都结合起来
- 自底向上:把底层模块组合成一个实现子功能的模块组,在为这个模块组设计一个驱动模块,作为测试驱动程序,然后逐层向上集合
- 自顶向下:不需要驱动模块,步骤是从顶层模块开始,向下移动,逐步把各个模块结合起来,在组装的过程中又有两种结合方式
- 非渐增式测试:先分别测试各个模块,再把所有模块按设计要求组装在一起进行测试
- 渐增式测试:把下一个要测试的模块同已经测试好的模块结合起来进行测试,增加一个测试一个,边组装边测试
- 确认测试:他和验收比较接近,是在集成测试的基础上,从软件质量的角度,对软件的功能、性能、可靠性、易用性等方面,对软件做全面的质量检测
- 系统测试:在前面三个测试完成后,将软件放入实际的运行环境中进行测试
-
UML
统一建模语言(Unified Modeling Language,UML)是 一种为面向对象系统的产品进行说明、可视化和编制文档的一种标准语言。UML包括的图有:
- 用例图(用例图是从用户角度描述系统功能,用例是系统中的一个功能单元)需求分析阶段
- 类图(描述静态结构,描述类的属性和操作,以及类之间的关系)
- 对象图(类图的实例)
- 顺序图、活动图、状态图(描述动态行为)
- 组件图(描述系统的物理结构及相互间的关系)
- 部署图(构建系统中软件和硬件的物理架构)
-
CMM(Capability Maturity Model for Software)
软件能力成熟度模型,将软件过程成熟度分为五个过程
- 初始级:未加定义的过程
- 可重复级:规则化的过程
- 定义级:标准的、一致的过程
- 管理级:可预测的过程
- 优化级:持续改进的过程
-
高内聚低耦合
软件模块设计准则,高内聚就是一个模块中各个元素彼此结合的紧密程度高,低耦合是指一个系统中,各个模块之间尽可能的独立存在
数据库
-
数据库操作类型
- 数据 查询(DQL)语言:基本构成 SELECT… FROM… WHERE… 这些语句构成的查询块
- 数据 操纵(DML)语言:用于操作数据库的各种对象,如对表的插入、修改、删除操作
- 数据 定义(DDL) 语言:对数据库及其中各种对象,如表、视图的创建、删除、修改等操作
- 数据 控制 (DCL) 语言:主要是对数据库进行安全管理,确定哪些用户可以查看或修改数据库中的数据
-
数据库
是长期存储的、有组织的、可共享的相关数据的集合,是存储在计算机设备(包括PC、服务器、手机)上的有组织、可共享、持久性的数据空间,其数据按照一定的数据模型进行组织、描述和存储
-
Oracle
Oracle数据库是一种关系数据库管理系统,关系型数据库是按照二维表结构方式组织的数据集合,其模型中每个实体和实体之间的联系都可以直接转换为对应的二维表形式,每个二维表就称为一个关系,除了表头,表中的每一行为关系的值,每一行为一个元组,每一列为属性
-
数据库管理系统DBMS
是指建立、运用、管理和维护数据库,并对数据进行统一管理和控制的系统软件,主要用于用户定义、操作、管理和维护数据库和数据,并保证数据的安全性、完整性。是整个数据库系统的核心
-
数据库系统的组成
数据库系统是指在计算机系统引入数据库后的系统,一般由数据库、数据管理系统、应用系统和数据管理员组成
-
数据冗余,如何解决
一个数据集合中重复的数据称为数据冗余,如表的重复、属性的重复、元组的重复、属性值的重复。造成存储空间的浪费和数据库访问执行效率降低。有的数据冗余用于数据间建立联系、数据安全或为了数据使用的便利,是必需的数据冗余,而其余的数据冗余为非必需的数据冗余应尽量予以消除
使用范式可以避免数据的冗余,减少数据库空间,大大降低了数据库维护的复杂度
-
数据库范式
-
三范式:
-
第一范式:主键不能拆分
-
第二范式:非主属性必须完全依赖于主键,而不能部分依赖于主键:如主键为(姓名,课程),但教程属性只依赖于主键的部分,即只依赖于课程,所以必须再拆出一个表,包含课程和教材属性。因此往往将主键设置为一个属性就可以满足第二范式
-
第三范式:非主属性之间不能相互依赖,如姓名,课程,老师,职称,职称依赖于老师,但他俩都是非主属性,故不满足第三范式,所以将老师和职称再拆出一个表来,在第二范式的基础上消除了非主属性对键的部分函数依赖和传递函数依赖
-
BC范式:在第三范式的基础上消除主属性对主键的部分依赖和传递依赖
已知函数依赖集:仓库名 → 管理员,管理员 → 仓库名,(仓库名,物品名)→ 数量
码:(管理员,物品名),(仓库名,物品名)
主属性:仓库名、管理员、物品名
非主属性:数量
∵ 不存在非主属性对码的部分函数依赖和传递函数依赖。∴ 此关系模式属于3NF。问题来了:增加一个仓库,但尚未存放任何物品,是否可以为该仓库指派管理员?——不可以,因为物品名也是主属性,根据实体完整性的要求,主属性不能为空。
原因:存在着主属性对于码的部分函数依赖与传递函数依赖。(在此例中就是存在主属性【仓库名】对于码【(管理员,物品名)】的部分函数依赖。
-
-
数据库范式并不是越多越好,满足的范式越高,意味着拆分出来的表越多
-
-
数据库的完整性约束
- 数据库的完整性约束是指对关系的某种约束条件,就是是关系(关系型数据库中的表)操作在不断更新数据的过程中需要遵守的规则,否则数据库中会存在大量无意义的垃圾数据
- 有三类完整性约束
- 实体完整性:要求每个关系中有且仅有一个主键,每个主键的值必须唯一,不能有空值或重复
- 参照完整性:如果一个关系中的外键,必须是另一个关系中的有效值或者为空值,R(学生,课程,课程编号),S(课程编号,教材),课程编号是关系R中的主键,他要么是控制,即还没分配课程,要么是关系S中的一个具体的值
- 用户定义的完整性:要求属性值必须满足语义要求,保证在规定的范围内取值,比如百分制成绩,只能在0~100内取值
-
数据库数据独立性
- 数据独立性表示应用程序与数据库中存储的数据不存在依赖关系,包括逻辑数据独立性和物理数据独立性。
- 数据独立性的好处是,数据的物理存储设备更新了,物理表示及存取方法改变了,但数据的逻辑模式可以不改变。数据的逻辑模式改变了,但用户的模式可以不改变,因此应用程序也可以不变。这将使程序维护容易
-
事务
事务相当于工作中的一个执行单元,它由一系列的SQL语句组成,这个单元中的每个SQL语句都是互相依赖的,且单元作为一个整体是不可分割的。如果事务中有一个语句执行不下去,则整个事务会回滚到执行前的状态,因此,只有事务中所有语句都成功地执行后,才能说这个事务被成功地执行
ACID:
-
原子性:每个事务都必须是不可分割的单元
-
一致性:如果从系统中删除了一个雇员,那么这个雇员相关的信息也需要全部删除
-
隔离性:一个系统中可能同时有多个事务,隔离性原则保证某个特定事务在完全完成之前,它的结果是不会被看到的
-
持久性:一个事务如果被成功执行,那他所带了的变化在系统中是永久的
-
索引
- 索引是一种提供在表中快速查找到一行的数据库结构,就像书的目录一样,查询数据时,首先在索引中找到符合条件的索引值,再通过保存在索引中的位置信息找到对应的元组
- 使用索引可以快速存取数据、改善数据库的性能、保证列值的唯一性、实现表与表之间的参照完整性
-
视图
- 视图是由一个或多个表导出的表,例如一个学校中,其学生情况存在于数据库的一个或多个表中,而学校的不同部门所关心的学生的信息是不同的,所以就需要根据用户的要求来定义一个新的数据结构,也就是视图
- 视图与表不同他是一个虚表,即视图对应的数据并不会实际存储,对视图的数据进行操作时,系统会根据视图的定义,去操作与视图相关联的基表
- 对视图也可以增删改查,它将数据集中,可以使用户更加方便的操作数据库
-
游标
- 对一个表的sql语句通常都会产生一组记录,称为结果集,但是许多应用程序并不能把整个结果集作为一个单元来处理,因此需要提供游标机制来保证每次可以处理结果集中的一行或几行,
- 游标类似于特殊的指针,可以指向结果集中的任意位置(显示游标和隐式游标:不必声明和打开关闭)
-
闪回
闪回操作使数据库中的实体显示闪回倒过去某一时间点,这样可以实现对历史数据的恢复。闪回数据库功能也可以将Oracle数据库恢复到以前的时间点
-
回滚
指的是程序或数据处理错误,将程序或数据恢复到上一次正确状态的行为
-
存储过程
存储过程就是在数据库中定义的子程序,在客户端和服务器端可以直接调用,可以在不同用户和应用程序之间共享,优化数据库的使用
-
触发器
是关联到一个表的数据对象,他不需要调用,当对一个表的特别事件出现时,他就会被激活,是一类特殊的存储过程
-
Armstrong公理的推论阿姆斯特朗
合并规则:若A→B,A→C同时在R上成立,则A→B C在R上也成立。
分解规则:若A→B在R上成立,C是B的子集,则A→C在R上也成立。
伪传递规则:若A→B在R上成立,且BC→D,则AC→D。
操作系统
-
什么是并发
并发运行就是让计算机同时运行几个程序或同时运行同一程序多个进程或线程。早期的计算机只具有一个中央处理器,单核的计算机的操作系统采用并发技术实现并发运行,在操作系统的管理下,所有正在运行的进程轮流使用CPU,每个进程允许占用CPU的时间非常短,这样用户根本感觉不出来CPU是在轮流为多个进程服务,就好象所有的进程都在不间断地运行一样。但实际上在任何一个时间内有且仅有一个进程占有CPU。
-
操作系统的作用
- 系统资源的管理者:处理机管理,内存管理,文件管理,设备管理
- 作为用户和硬件之间的接口:提供了命令接口,程序接口,GUI图形用户界面
- 作为最接近硬件的层次,能对硬件机器实现扩展
-
文件系统
- 操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统,一方面文件系统对磁盘空间进行统一规划,另外一方面文件系统提供给普通用户人性化的接口。
- 常见的文件系统有:FAT32(文件分配表采用32位二进制数记录管理的磁盘文件管理方式)、RAM(用RAM来作为他们的存储空间的操作系统,存取速度很快)、EXT
- windows常见用的文件系统类型为:NTFS(New Technology File System)
- Linux常用的文件系统类型为:EXT2、XFS
- U盘:FAT32
-
Linux文件系统
- Linux文件系统中的文件是数据的集合,文件系统不仅包含着文件中的数据而且还有文件系统的结构,所有Linux用户和程序看到的文件、目录、软链接及文件的保护线性等都存储在其中。Linux文件主要分为目录和普通文件,以树的形式进行组织
- 第一个专门为Linux设计的文件系统是EXT(Extended file system),但目前流行的是EXT4
-
分布式文件系统
数据量越大,在一个操作系统存不下所有的数据,那么就要分配到更多的操作系统管理的磁盘当中,故使用分布式文件系统来管理多台机器上的文件。是一种允许文件透过网络在多台主机上分享的文件系统,可让多机器上的多用户分享文件和存储空间。常见的有谷歌开发的GFS,该文件系统的服务端通过一个集群来实现,客户端可以并发的访问该集群的多达数万个节点、以及GFS的开源实现HDFS,基本架构是一样的
-
原语
由若干指令组成的程序段,在执行的过程中,只能连续的、一气呵成,不能被中断。通过关中断、开中断指令实现,应用于PV操作等
计算机组成原理
-
计算机硬件主要包括:CPU、主存、外存、输入输出设备、总线和输入输出接口电路,CPU和主存合称主机,此外还有主板、机箱、风扇等辅助设备
-
计算机工作的过程就是执行程序的过程:将预编制好的程序放到存储器中,在控制器的控制下自动、连续地执行程序中的指令,完成程序所要实现的功能
-
计算机的性能指标
- 基本字长:指计算机的CPU一次可以处理的一组二进制数的位数
- 存储容量:计算机存储器系统可以存放的二进制的位数或字节数,位是计算机中表示数据的最小单位,指一位二进制数
- 运算速度:
- 平均每秒执行的指令条数
- CPU主频:CPU使用的时间脉冲的频率,其倒数是CPU的时钟周期,CPU的主频越高,时钟周期就越短,运算速度也越快
- CPU执行一条指令平均用的时钟周期数
-
机器码
- 机器码是为了解决负数在计算机中的表示问题而提出的,机器码的最高位时符号位,一般用0表示正数,1表示负数
- 原码:正数:本身;负数:2n - 本身
- 补码:正数:本身;负数:2n + 本身
- 反码:正数:本身;负数:2n - 1+ 本身
- 移码:正数:符号位用1,其他一样;负数:与补码符号位相反,其他一样
-
CPU
-
CPU芯片采用超大规模集成电路技术制成,是计算机的硬件核心
-
CPU主要由运算器、控制器和寄存器组组成,其功能是执行程序中的指令序列
-
运算器:是计算机的数据处理中心,主要由算术逻辑单元、通用寄存器组、多路选择器构成
-
控制器:计算机对信息进行处理是通过程序的执行实现的,程序是完成某个确定算法的指令序列,预先存放在存储器当中,控制器要控制程序的执行
-
寄存器组实际上就是CPU内部的一组高速存储单元,可以用来临时保存操作数、运算结果或地址指针等信息
寄存器相当于存储器中的一个存储单元,但其存取的速度要比存储器快得多,用来存放计算过程中所需要的信息
-
-
8086CPU
- 8086CPU由两个独立的工作单元组成,一个是执行单元,另一个是总线接口单元,两个单元并行工作,同时进行指令的执行和对总线的操作
- 执行过程:
- 从总线接口单元的指令队列中取出预先读入的指令代码
- 由执行单元控制对该指令译码,并指出本次操作的性质及操作对象
- 将操作数取出送到逻辑运算单元进行指定的操作
- 运算的结果通过内部数据总线保存在寄存器或者通过总线接口输出到存储单元
- 最后,将本次运算的状态标志位保存在标志寄存器中
- 总线接口的主要作用是完成CPU与存储器或I/O设备之间的数据传送
-
奔腾系列CPU
CPU芯片内部集成的晶体管数量高达几百万到几千万,时钟频率也大幅提升,故相比之前的CPU性能得到大幅提高
-
-
指令系统
指令是计算机执行某种操作的指令,计算机的全部指令集合成为指令系统,反映了计算机硬件能够完成的功能
-
8086寻址方式
寻址就是通过地址访问指令或数据
-
指令寻址:寻找下一条将要执行的指令所在的存储器地址
- 相对寻址:提供目标地址相对于当前指令地址的偏移量
- 直接寻址:指令中直接给出
- 间接寻址:目标地址存放在寄存器或存储单元中
-
数据寻址:寻找指令需要的操作数
-
立即数寻址:指令中的操作数即为立即数,直接存放在指令的操作数字段中,如MOV AL, 80L;
只允许源操作数作为立即数,目标操作数必须存放在寄存器或存储器中,其作用使给寄存器或存储单元赋值
-
寄存器寻址:操作数在指令所指示的寄存器中,如:INC BX (寄存器)
-
直接寻址:操作数存放在内存中,在指令中直接表示操作数的偏移地址,通过偏移地址获取到实际内存的地址,如:MOV AL,[1064H]
-
-
-
8086CPU常用指令
- 数据传送指令:MOV传送、XCHG交换、PUSH进栈、POP出栈、IN OUT输入输出
- 算术运算指令:ADD加法、ADC带进位加法、SUB减法、IMUI乘法
- 逻辑运算指令:AND与、OR或、NOT非
-
存储系统
-
存储器是计算机的记忆部件,用来存放程序和数据。将不同类型的存储器按一定方法组织起来,就构成了存储系统
-
按存取方式分
- 随机存储器:CPU可以按存储单元的地址随机访问存储器的任意一个单元,但断电后随机存储器中的数据会全部丢失,计算机的内存条就是由随机存储器构成的
- 只读存储器:正常工作时只能读,不能写,且断电之后存储的信息不会丢失
- 直接存取存储器:信息是按块存放的,读写也是按块进行的,磁盘和光盘就属于直接存取存储器
-
按存储器作用分
- 高速缓存:介于CPU和主存之间的一个容量小,速度高的随机存储器,作用是存放CPU在一小段时间内立刻要使用的程序或数据
- 主存:存放当前CPU运行需要使用的程序和数据
- 辅助存储器:CPU不可以直接编程访问,由磁盘、u盘、光盘等外部存储器组成,存放CPU当前不用的大量程序和数据
-
总线
1. 总线是计算机多个部件之间传送信息的公共通路,由一组传输线和相应的总线控制部件组成。现代计算机中大多采用总线结构,用一组传输线将多个功能部件连接起来,结构简单、灵活、易扩展。
2. 分类:
1. 按总线所处的位置分类:CPU内总线(CPU芯片内部,用于运算器和寄存器之间传送信息)、系统总线(用于连接系统内部的各大部件)、外总线(连接不同的计算机系统,用于通信)
2. 按传送的信息分类:数据总线、地址总线、控制总线(传输控制信号)
3. 常见总线:ISA(工业标准总线)、PCI(外围部件互联总线) -
RS-232
RS-232串口是最常用的一种串行通讯接口,也称标准串口。其全名是“数据终端设备(DTE)和数据通讯设备(DCE)之间串行二进制数据交换接口技术标准”。
-
接口与端口的概念与区别
-
接口是 CPU 与资源通进行连接的逻辑部件
-
端口:CPU要和设备数据传送,在接口中必须设置特定寄存器供给 CPU 直接存取访问
-
区别:
- 接口是是调用资源的出入口,所以接口对应的是资源;端口是计算机与外界交流的出入口,所以端口对应的是协议和服务
- 接口必须通过端口才能实现资源调用,而端口可以不通过接口来进行数据交互
- 可以通过一个端口调用无数个接口。
-
电路与电子技术基础
-
电路的基本概念
-
电路的基本元件:电阻元件、电容元件、电感元件
-
基尔霍夫电流定律:
对于电路的任意节点,在任意时刻流出该节点的电流值和等于流入该节点的电流之和
-
基尔霍夫电流定律:
对于电路的任意节点,在任意时刻各段电路的电压和恒为0
-
直流电路分析方法
- 网孔电流法(方程)
- 节点电压法(方程)
-
数字逻辑基础
-
逻辑运算:
-
与:多个输入全是高电平,输出才全是高电平
-
或:有一个高就是高
-
非:一个输入一个输出,低变高,高变低
-
符合逻辑运算:与非门电路、或非、与或非、异或
-
三态门电路
-
在普通电路上增加控制电路构成的,在计算机中广泛使用
-
有三种输出状态:高电平、低电平、高阻状态,前两种是工作状态,后一种是禁止状态
-
三态门在计算机中可用于总线传输,多路数据通过三态门共享总线分时传输
-
三态非门:用于双向数据总线
-
三态缓冲门:用于可以起到开关的作用
-
逻辑电路按照逻辑功能和电路结构不同分为
-
组合逻辑电路
全部由门电路构成,在任意时刻电路的输出状态取决于当前电路的输入状态
有:
1. 译码器:由多个输入,多个输出,可以将一组给定的代码翻译成对应得输出信号 2. 编码器:和译码器相反,是将输入信号编码后输出 3. 加法器:是计算机中运算器得核心,基本功能是实现两个二进制数的加法运算 2. 时序逻辑电路
由具有记忆功能的触发器及组合电路构成,在任意时刻电路的输出状态,不仅取决于当前电路的输入状态,还取决于电路原来的状态
有:
1. 触发器:最简单的时序逻辑电路,是寄存器和计数器的重要组成 2. 寄存器:基本部件,用来存放地址、命令和数据 3. 计数器:基本部件,用来记录脉冲的个数
-
-
数据结构
-
冒泡排序
它重复地遍历要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。遍历直到没有相邻元素需要交换,也就是说该元素列已经排序完成。
冒泡排序中越小的元素会经由交换慢慢“浮”到数列的顶端,每进过一趟排序,就可以确定被排序列中一个元素的最终位置。
-
拓扑排序
对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边<u,v>∈E(G),则u在线性序列中出现在v之前。选择一个入度=0的点开始,从网中删除此顶点,以及它的所有出边。
-
排序算法比较
最坏时间复杂度 最好时间复杂度 平均时间复杂度 稳定性 空间复杂度 直接插入排序 O(n2) O(n) O(n2) O(1) 冒泡排序 O(n2) O(n) O(n2) O(1) 希尔排序 不 O(1) 简单选择排序 O(n2) O(n2) O(n2) 不 O(1) 堆排序 O(nlog2n) O(nlog2n) O(nlog2n) 不 O(1) 快速排序 O(n2) O(nlog2n) O(nlog2n) 不 O(log2n)~O(n) 归并排序 O(nlog2n) O(nlog2n) O(nlog2n) O(n) 时间复杂度:
1. 待排数组有序,会导致冒泡和直接插入变优,但会使快速排序变差(快速排序中枢分的越均匀,速度越好,最大递归深度为n,最小递归深度为log2n)
空间复杂度:
- 快速排序最坏情况下,所有元素都需要入栈,即O(n)的空间复杂度,平均空间复杂度为O(log2n)
- 归并排序需要使用长度为n 的辅助数组,故空间复杂度固定为O(n)
-
最小生成树的两种方法及时空复杂度
- prim算法(O(V2),适用于边稠密图):从一个根节点开始,一个个的添加节点到最小生成树上。添加的过程中,要满足以下几个条件
- 添加的节点一定是和当前的生成树有相连边的节点
- 一定是离当前树距离最近的节点
- 不能有回路
- Kruskal算法(O(elog2e),适用于边稀疏图):初始时看作有v 个树的森林,将一颗颗小树合并成一棵大树,即将边按权值排序,从权值最小的边开始收录,将两个节点合并到一起,慢慢合并直到所有的小树合并在一起,要满足以下几个条件
- 收录的边一定是当前能收录的最小值
- 当一条边所连的两个节点若已经在一棵树上,这条边就不能收录,不能有回路
- prim算法(O(V2),适用于边稠密图):从一个根节点开始,一个个的添加节点到最小生成树上。添加的过程中,要满足以下几个条件
-
数组和链表区别
- 数组:
- 在内存中,数组是一块连续的区域。
- 数组需要预留空间,在使用前要先申请占内存的大小,可能会浪费内存空间。
- 插入数据和删除数据效率低,插入数据时,这个位置后面的数据在内存中都要向后移。删除数据时,这个数据后面的数据都要往前移动。
- 随机读取效率很高,可以随机存取。
- 并且不利于扩展,数组定义的空间不够时要重新定义数组。
- 链表:
- 在内存中离散存储,不要求连续。
- 每一个数据都保存了下一个数据的内存地址,通过这个地址找到下一个数据。
- 增加数据和删除数据很方便。
- 查找数据时效率低,因为不具有随机访问性,只能依次访问
- 不指定大小,扩展方便。
- 数组:
算法设计
-
贪心策略——迪杰斯特拉求单源最短路径
常用于求解最优化问题,其核心思想是:总是选择当前状态下最优的策略,并不是以整体最优进行考虑,而是只考虑当前这一步,因此,可以找到局部最优解,某些问题的特性决定了使用贪心策略
-
递归——斐波那契数列问题
递归是指函数调用自身或者间接调用自身的一种方法,可以把一个复杂的大型问题层层更转化为与原问题相似但是规模较小的问题来求解,递归问题只需要少量的程序就可以描述解题过程中所需要的多次重复的计算
-
分治——归并排序、快速排序、折半查找
将大规模的问题,通过分解为多个相互独立小规模问题,每个小规模问题与原问题结构相同,通过递归解决这些小问题,然后对各个小问题进行合并得到原问题的解,递归就是分治的实现手段
-
动态规划——佛洛依德求单源最短路径
动态规划算法通常与分治思想类似,也是将大规模的问题,通过分解为多个小规模问题,但不同的是,分解后的小问题并不是相互独立的,而是相互联系的,通常用于分阶段最优解问题,不会做相同的重复计算,可以将之前子问题的解保存下来,用于后面问题的求解
-
回溯算法
将解空间看作树形结构,然后在解空间中搜索最优解
编程语言
-
什么是指针
指针在C语言中被看作是一种用以表示计算机内存地址的数据类型。利用指针变量可以表示各种动态数据结构,能很方便的使用数组和字符串,而且能方便地处理内存地址,可以提高程序的效率。总而言之,指针就是地址,指针变量就是存储地址的变量。
定义:数据类型 *指针变量名
如果p是一个指针变量,*p 表示了以 p 的内容为地址的变量,就是p指向的变量
-
指针和引用区别
- 引用相当于一个变量的别名,既不是本身的拷贝,也不是它的指针,就是被引用的本身,对这个变量引用的操作,就是对变量本身进行操作
- 指针可以为空,但是引用不可以为空
- 指针可以改变所指对象,但引用一旦被初始化后就不可以改变所指对象了
- 引用的主要功能是传递函数的参数和返回值
-
多级指针
- 指针就是地址,指针变量是存储地址的变量,指针变量也需要分配内存空间,指针变量的地址就称为指针的指针
- 可以使用两个* 来定义一个二级指针
- 再往上的指针就很少用了,这样会降低程序的可读性
-
面向过程和面向对象的区别
- 面向过程:先分析出解决问题的步骤,然后用函数把这些步骤一步一步地实现,解决问题的时候就是一个一个函数地调用。
- 面向对象:是一种对现实世界的理解和抽象的思想方法,不同于面向过程,面向对象是以功能来划分问题的,而不是步骤。将问题的各个事务抽象为对象,从而描述一个事物在整个解决问题的步骤中的行为,实现对象之间的交互,从而解决问题,易于维护、易扩展、可以设计出低耦合的系统
-
对象
现实世界中有各种各样的对象,对象具有特定的属性和操作,对象之间互相作用。不同于面向过程的分析方法,面向对象是人们认识世界的一种直观方法,人们通过认识特定领域的对象,抽象形成类,并生成对象,采用对象封装特定的属性和操作,来解决实际问题
-
面向对象的三大特征
- 封装性:是面向对象程序设计一个重要的特征,他是将事物的属性和行为包装到对象内部,形成一个独立模块单位,对象内部对用户是隐藏的,使用者不必知道内部的实现细节,只需要使用设计者提供的信息来访问该对象,可以增加系统的安全性
- 继承性:是子类自动共享父类的数据和方法的机制。父对象拥有的属性和行为 ,其子对象通过继承也可以拥有这些属性和行为,一个类直接继承其他类的全部描述,同时可以修改和扩充,增加了代码的复用性
- 多态性:对象根据所接受的消息而做出动作。同一个消息被不同类的对象接受时,可以产生完全不同的动作,这种现象称为多态性。C++中使用重载和虚函数来实现多态
-
泛型
即“参数化类型”。就是将类型由原来具体确定的类型参数化,类似于方法中的变量参数,在调用时传入具体的类型
-
重载
函数的重载是指,在同一个类中,有两个以上的函数具有相同的函数名,可以对应着多个函数的实现。每种实现对应着一个函数体,但是形参的个数或者类型不同,编译器根据实参和形参的类型和个数自动选择调用哪一个函数,是多态的一种表现
-
重写(覆盖)
- 参数列表必须完全与被重写的方法相同,否则不能称其为重写而是重载。
- 返回的类型必须一直与被重写的方法的返回类型相同,否则不能称其为重写而是重载。
-
类和接口的区别
-
接口是JAVA提供的一种重要的结构,接口是一种特殊的类,但是与类又有着本质区别
-
类有成员变量和成员方法,而接口只有常量和抽象方法
-
接口的成员变量必须初始化,同时接口中的所有方法必须声明为abstract方法
-
类与类之间的关系(对象之间)
-
继承(泛化):一个类继承另外一个类,并可以增加自己的新功能
-
依赖:一个类A使用到了另一个类B,一方的变化会导致另一个类的变化,比如一个类中使用到另一个类的对象作为参数
-
关联:代表对象之间的某种连接,比如人员和公司之间存在雇佣的关联
-
实现:一个class类实现一个接口,最常见的关系
接口:是一个描述类或构件必须实现的操作的集合
-
-
函数指针和指针函数
1. 指针函数:是一个函数,和一般函数的区分是它的返回值是一个指针,调用时要注意返回的类型指针。
int* f ( int , int ) ; // 返回的是一个整形指针
int f ( int, int);// 返回的是一个整形数
上面两个区别的仅仅是返回值得不同,(返回值不同可不是重载函数,重载函数只根据形参的类型和个数)1. 函数指针:本质是一个指针,只不过这个指针比较特殊,他和其他函数名一样,具有(返回值类型,形参个数和类型),代表的是一个函数入口地址
int (*pFunc) (int , float) ; // 定义了一个函数指针pFunc,该函数指针具有 返回int类型,同时带有两个形参,一个是int, 另一个是float;
-
函数间参数传递的3种方式
- 值传递:主调函数的实参将值传递给被调函数的形参,形参单独分配内存,形参的值改变不会影响到实参的值
- 引用传递:被调函数使用引用类型的形参引用主调函数的实参值。间接访问,使用引用形参和实参指向同一内存,一个改变,另一个也会变
- 指针传递:被调函数使用指针类型的形参接收主调函数实参的内存地址。也是一种间接访问
-
c++中的虚基类
为了解决多重继承(一个派生类可以有多个基类)时的命名冲突和冗余数据问题,如类 A 派生出类 B 和类 C,类 D 继承自类 B 和类 C,这个时候类 A 中的成员变量和成员函数继承到类 D 中变成了两份。于是,C++提出了虚继承,将共同基类设置为虚基类,这样从不同的途径继承过来的同名成员只有一个副本,本例中的 A 就是一个虚基类。在这种机制下,各个子类的对象中,只存在一个虚基类对象
-
虚函数
- 可以在基类中将某个成员函数设置成虚函数,虚函数可以在派生类中重新定义,派生类中对虚函数重新定义的函数与基类中的虚函数具有相同的形参个数和类型
- 如果在派生类中没有对虚函数重新定义,则派生类继承基类的虚函数
- 静态成员函数和构造函数不能定义为虚函数
- 程序可以在运行阶段自动的选择合适的成员函数
-
纯虚函数
- 在基类中只给出函数的声明而没有给出实现的虚函数,因此,纯虚函数只为各个派生类提供一个公共界面
- 含有纯虚函数的类叫抽象类(相当于Java中的interface接口)
- 抽象类不能实例化,不能构造对象
-
命名空间
为了避免在大规模程序设计中,不同模块或者函数库中相同标识符命名冲突的问题,使用关键字namespace定义命名空间,用来控制标识符的作用域
-
c和c++的区别
- c语言面向过程,c程序设计中首要考虑的就是如何通过一个过程,对输入进行运算得到输出,而c++是面向对象语言,首要考虑的是如何构造一个对象模型,通过获取对象的信息,来得到输出
- c++是c语言的继承,语法上c++兼容c,既可以进行c语言的过程化程序设计,又可以进行以继承、多态为特点的面向对象编程
-
透明调用
CAD使用中,在执行其他命令的过程中嵌套执行而不必退出该命令,在不中断当前命令的前提下临时插入一个新的命令
-
Java有多继承码?
-
多继承:指一个子类同时继承多个父类,从而具备多个父类的特征
多继承会造成
- 若子类继承的父类中拥有相同的成员变量,子类在引用该变量时将无法判别使用哪个父类的成员变量
- 若一个子类继承的多个父类拥有相同方法,同时子类并未覆盖该方法(若覆盖,则直接使用子类中该方法),那么调用该方法时将无法确定调用哪个父类的方法。
Java为了简单,废弃了C++中非常容易混淆的多继承等特性。
-
如何实现“多继承”?
-
内部类:
class Call { } class SendMessage { } public class Phone { private class MyCall extends Call{ } private class MySendMessage extends SendMessage{ } }
-
-
死代码
死代码主要是指
-
执行不到的代码.
-
执行得到, 但没有任何作用的代码。
总而言之一句话: 死代码就是“不产生实际作用”的代码
-
Linux
-
shell
shell是系统的用户命令界面,提供了用户与内核进程交互操作的一种接口,也就是命令解释器,它接收用户的命令,并把它送到内核去执行,bash是大多数Linux系统默认的shell,其中用户在bash会有命令补全机制,输入命令时不必把命令输全,按下tab键,shell就会判断出用户想要输入的命令,同时bash也会记录一定数量的之前输入的命令历史
shell命令分为内部命令和外部命令,内部命令是shell命令自身包含的一些命令,这些内部命令的代码是整个shell代码的一个组成部分,通过shell执行自己的代码中的相应部分来完成;外部命令则存放在一些二进制可执行文件或shell脚本中,执行时会首先在指定目录找到相应文件,再调入内存执行
-
shell命令
- shell提示符:超级用户#,普通用户$
-
Linux文件系统
-
没有windows中磁盘分区的概念,而是将分区当成目录来使用,Linux 下的硬件设备全部存放在 /dev 目录中
-
Windows 系统常用的文件系统类型为 FAT32、NTFS。
Linux 下常用的文件系统类型为:ext2/3/4、XFS、JFS、ReiserFS 等
-
-
Linux系统常用命令
-
cat 查看文件内容
-
cd 切换工作目录
-
pwd 显示当前工作目录
-
chown 改变文件属权
-
touch 创建一个空白的文件 # touch /home/test
-
cp 拷贝文件
-
Is 显示文件和目录列表 # ls -a
-
makdir/rmdir 创建/删除目录
-
find 查找文件
-
ps 显示用户所在终端的全部进程
ps aux | head -N
head:-N可以指定显示的行数,默认显示10行
ps:参数a指代all—所有的进程,u指代userid——执行该进程的用户id,x指代显示所有程序,不以终端机来区分。 -
top 显示系统中各个进程的资源占用状况,类似于Windows的任务管理器
-
-
Linux编辑器
文本界面下常用的文本编辑器有,
-
unix类操作系统通用的vi编辑器,有三种基本工作模式:普通模式、插入模式、命令行模式。
- vi 文件名:进入vi编辑器普通模式
- 键入i :进入插入模式,按esc退出到普通模式
- 键入:开头的命令:进入命令行模式
- 键入ZZ:退出vi
-
以及vim编辑器,是vi的增强版本
-
-
Linux中的用户包括三种:
- 普通用户:在系统中的工作是进行普通工作,由系统管理员创建分配
- 超级用户:在系统中对普通用户和整个系统进行管理
- 系统用户:系统工作内建了的用户,供内核使用
- 每个用户都被分配了一个唯一的用户ID:超级用户UID=0,普通用户UID>=1000,中间的为系统用户UID
-
用户和组管理工具
- 用户管理:
- 添加用户账号 # useradd [选项]<用户名>
- 修改用户账号 # usermod [选项]<用户名>
- 组管理:
- 添加组账号 # groupadd [选项]<用户名>
- 修改组账号 # groupmod [选项]<用户名>
- 删除组账号 # groupdel [选项]<用户名>
- 用户管理:
-
三种基本权限
- r 读权限:
- 对文件:可以读出文件的内容
- 对目录:可以列出目录中文件列表
- w 写权限:
- 对文件:可以修改或删除文件
- 对目录:可以在该目录中创建或删除文件或子目录
- x 执行权限:
- 对文件:可以执行该文件
- 对目录:可以使用cd命令进入该目录
- 查看文件权限命令:$ Is -l
- 修改文件权限命令:chmod u+rw 文件名
- 三个字符一组:前三个为所有者u权限、中间三个为同组用户g权限、最后三个为其他o用户权限
- r 读权限:
系统分析与设计
系统分析的任务就是了解现有的业务系统,理解其中的问题,定义改进目标,并确定后续技术方案必须实现的详细业务要求
- 系统静态分析建模
- 类图:元素:对象、类、类之间的关系
- 用例图:元素:参与者、用例、关系
- 包图:用来对模型元素分组
- 构件图:描述了系统各个构件(可重用的块,包装成可代替性的物理单元)之间的关系
- 部署图:唯一可以描述硬件的图,表示系统硬件的物理拓扑结构
- 系统动态分析建模
- 活动图:描述了对象或系统为达到某一目标所实施的一系列活动的过程
- 状态图:通过状态与状态之间的转换来描述系统中对象随时间变化的动态行为
- 顺序图:描述参与交互的对象之间消息交换的顺序,从时间角度分析交互
- 通信图:与顺序图都是描述对象间的交互,但通信图更侧重于空间的角度来分析
- 数据建模
- 实体间关系:1:1、1:n、n:n
- 实体关系图 e-r
- 实体:系统中存在的客观事物,矩形
- 联系:两个实体存在的关系,菱形
- 属性:椭圆,可以与实体或关系相连,表示系统需要存储的数据
- 界面设计
大数据
-
《大数据时代》
-
全样而非抽样
过去,数据存储和处理能力有限,在科学分析中,通常采用抽样的方法来研究,但大数据技术的核心就是海量数据的存储与处理,分布式文件系统与分布式数据库理论上为数据提供了近乎无限的存储能力,分布式并行编程框架mapreduce提供了强大的数据处理能力,因此,如今的科学分析完全可以针对全集数据,而非抽样数据
-
效率而非精确
数据高精度不再是首要目标,目前很多大数据服务要求在几秒内就针对海量数据做出实时的分析结果,所以数据分析的效率成为关注核心
-
相关而非因果
过去对数据的分析,需要解释事物现象背后的原因,同时对未来可能发生的事情做出预测,而大数据时代更追求相关性,如电商推荐算法中,当购买了一件商品,会为你推送其他相关的产品,并不是告诉你为什么其他人买了你买的东西,又买了别的相关东西
-
-
信息科技为大数据时代提供支撑
- 存储设备的容量不断增加
- CPU处理能力的大幅度提升
- 网络带宽不断增加
-
大数据概念 4v
-
数据量大volume
人类社会产生的数据以每年50%的速度增长,每两年就增长一倍,这被称为大数据摩尔定律
-
数据种类繁多variety
大数据的数据来源众多,各行各业不断产生新的数据
- 结构化数据:存储在关系型数据库中的数据,占10%
- 非结构化数据:种类繁多,占90%
如此类型繁多的异构数据,对大数据处理和分析技术提出了很大挑战
-
处理速度块velocity
大数据时代的很多应用都需要基于快速生成的数据给出实时的分析结果,用于指导生产和生活
-
价值密度低value
大数据时代有价值的数据分散在海量数据中,如小区的监控设备,没有意外事件发生时,很大一部分的数据是没有价值的
-
-
大数据的不同技术层面
- 数据采集与预处理:将数据源中的数据采集,并清洗、转换
- 数据的存储管理:使用分布式文件系统、数据仓库、关系型数据库来对数据进行存储
- 数据处理与分析:使用分布式并行编程模型,结合机器学习和数据挖掘算法对海量数据处理和分析
- 数据安全:对挖掘出的有价值的数据,建立相应的安全体系
-
大数据计算模式
- 批处理计算:针对大规模数据的批量处理,mapreduce、spark
- 流计算:针对流数据的实时计算,storm
- 图计算:针对大规模图结构的数据的处理,graphx
- 查询分析计算:大规模数据的存储管理和查询分析,hive
-
大数据、云计算和物联网
- 云计算
- 云计算实现了通过网络提供的可伸缩的、廉价的分布式计算能力,用户只需要在具备网络连接条件的地方,就可以随时随地获得所需要的各种IT资源
- 关键技术:虚拟化、分布式存储、分布式计算、多租户
- 物联网
- 物物相连的互联网,是互联网的延申,利用局部网络或互联网的通信技术,把传感器、控制器、机器、人员和物等连接在一起,进行信息交换和通信,实现物与物、物与人的互联互通。
- 三者关系,相辅相成
- 云计算为大数据提供技术支持,大数据为云计算提供用武之地
- 物联网的传感器不断产生数据,是大数据的重要来源、大数据技术为物联网数据分析提供支撑
- 云计算为物联网提供海量数据存储能力
- 云计算
-
Hadoop
- 是一个开源的分布式计算平台,核心是分布式文件系统HDFS和mapreduce
- 特性
- 高可靠性:采用冗余数据存储的方式,即使一个副本发生故障,其它副本也可以保证正常对外提供服务
- 高效性:作为并行分布式计算平台,Hadoop采用分布式存储和分布式处理,能有效处理PB级别的数据
- 高可扩展性:设计目标是可以高效稳定的运行在廉价的计算机集群上,可以不断的往集群中加节点(机器)
- 成本低:采用廉价的计算机集群
- Hadoop是基于Java语言开发的,可以很好的运行在Linux平台上
- 两个版本:第二代增加了yarn
-
分布式文件系统HDFS
-
大数据时代必须解决海量数据的高效存储问题,为此谷歌开发了分布式文件系统GFS,而hdfs就是gfs的开源实现,可以通过网络实现文件在多台机器上的分布式存储,采用客户机/服务器的模式
-
和常见的文件系统一样,分布式操作系统也采用块为数据读写的基本单元,只不过要大很多,大小为64MB,且如果一个文件填不满一个块,但他并不占用整个数据块
-
物理结构由集群上的多个节点构成,这些节点分为两类,名称节点和数据节点
-
名称节点namenode:负责文件和目录的创建、删除和重命名,同时管理着数据节点和文件块的映射关系,所以客户端只有访问名称节点,才能找到请求的文件块所在的位置,进而到相应的位置读取数据块
-
数据节点datanode:负责数据的存储和读取
存储时:由namenode分配存储位置,然后客户端直接把数据写入相应的namenode;
读取时:客户端访问namenode,获得数据与数据节点的映射关系,就可以去相应的位置读取数据了
-
-
特点:
- 廉价的硬件设备
- 流数据读写:有很高的数据吞吐率,从而能够以流式的方式来访问文件系统
- 大数据集:hdfs中的文件可以达到GB甚至TB级别
- 一次写入,多次读取:一旦被写入,只允许追加内容,不允许修改
- 强大的跨平台性:基于Java开发,兼容性强
-
名称节点NameNode保存了两个核心的数据结构,即FsImage和EditLog
- FsImage用于维护文件系统树以及文件树中所有的文件和文件夹的元数据
- 操作日志文件EditLog中记录了所有针对文件的创建、删除、重命名等操作
-
SecondaryNameNode第二名称节点
-
在名称节点运行期间,HDFS的所有更新操作都是直接写到EditLog中,久 而久之, EditLog文件将会变得很大,会导致名称节点启动操作非常慢,而在这段时间内无法对外提供写操作
-
第二名称节点用来保存名称节点中对HDFS 元数据信息的备份,并减少名称节点重启的时间。SecondaryNameNode一般是 单独运行在一台机器上,相当于代替namenode整合两个文件
-
namenode 的冷备份,不是热备,故障发生后,不能直接顶上去,而是需要一段时间的恢复
- SecondaryNameNode会定期和 NameNode通信,请求其停止使用EditLog 文件,暂时将新的写操作写到一个新的文件 edit.new上来,这个操作是瞬间完成
- SecondaryNameNode通过HTTP GET方式从NameNode上获取到FsImage和 EditLog文件,并下载到本地的相应目录下
- SecondaryNameNode将下载下 来的FsImage载入到内存,然后一条一条地 执行EditLog文件中的各项更新操作,使得 EditLog和FsImage文件合并
- SecondaryNameNode执行完(3 )操作之后,会通过post方式将新的 FsImage文件发送到NameNode节点上
- NameNode将从 SecondaryNameNode接收到的新的 FsImage替换旧的FsImage文件,同时将 edit.new替换EditLog文件,通过这个过程 EditLog就变小了
-
-
HDFS存储原理
-
数据的冗余存储:为了保证系统的容错性和可用性,hdfs会将一个数据块的多个副本分别存到不同的数据节点上,即使某个节点发生故障,也不会造成数据丢失
-
数据读取策略
-
HDFS提供了一个API可以确定一个数据节点所属的机架ID,客户端也可以获取自己所属的机架ID
-
当客户端读取数据时,从名称节点获得数据块不同副本的存放位置列表, 列表中包含了副本所在的数据节点,可以调用API来确定客户端和这些数据节点所属的机架ID
-
当发现某个数据块副本对应的机架ID和客户端 对应的机架ID相同时,就优先选择该副本读取数据,如果没有发现,就随机选择一个副本读取数据
-
-
数据错误与恢复
-
名称节点出错
名称节点保存了所有的元数据信息,其中,最核心的两大数据 结构是FsImage和Editlog,如果这两个文件发生损坏,那么整个 HDFS实例将失效。所以,当namenode故障时,可以根据备份服务器SecondaryNameNode中的FsImage和Editlog 数据进行恢复。
-
数据节点出错
- 每个数据节点会定期向名称节点发送“心跳”信息,向名称节点报告自己的状态
- 当数据节点发生故障,或者网络发生断网时,名称节点就无法收到来自 一些数据节点的心跳信息
- 这时,这些数据节点就会被标记为“宕机”, 名称节点不会再给它们发送任何I/O请求
-
-
-
HDFS常用命令
- hadoop fs -ls
显示该文件的详细信息 - hadoop fs -cat
查看该文件的内容 - hadoop fs -mkdir
创建指定的文件夹
- hadoop fs -ls
-
-
HBase分布式数据库
-
hbase是谷歌bigtable的开源实现,是一个高可靠、高性能、面向列的分布式数据库,主要用来存储非结构化和半结构化的松散数据。它的目标是处理非常庞大的表
-
为什么要使用Hbase
- Hadoop可以很好地解决大规模数据的离线批量处理问题,但是, 受限于Hadoop MapReduce编程框架的高延迟数据处理机制,使得Hadoop无法满足大规模数据实时处理应用的需求
- 传统的通用关系型数据库无法应对在数据规模剧增时导致的系统 扩展性和性能问题(分库分表也不能很好解决)
-
与传统关系型数据库的区别
- 数据类型:关系数据库采用关系模型,具有丰富的数据类型和存储方式,HBase则采用了更加简单的数据模型,它把数据存储为未经解释的字符串,没有数据类型,需要程序员自己分析
- 数据操作:关系数据库中包含了丰富的操作,其中会涉及复杂的多表连接。HBase操作则不存在复杂的表与表之间的关系,只有简 单的插入、查询、删除、清空等
- 存储模式:关系数据库是基于行模式存储的。HBase是基于列存储的
- 数据维护:在关系数据库中,更新操作会用最新的当前值去替换记录中原来的旧值,旧值被覆盖后就不会存在。而在HBase中执行更新操作时,并不会删除数据旧的版本,而是生成一个新的版本,旧有的版本仍然保留
-
数据结构
- 表:HBase采用表来组织数据,表由行 和列组成,列划分为若干个列族
- 行:每个HBase表都由若干行组成,每 个行由行键(row key)来标识。
- 列族:一个HBase表被分组成许多“列 族”的集合,它是 基本的访问控制单元
- 列限定符:列族里的数据通过列限定符 (或列)来定位
- 单元格:在HBase表中,通过行、列族 和列限定符确定一个“单元格”(cell ),单元格中存储的数据没有数据类型 ,总被视为字节数组byte[]
- 时间戳:每个单元格都保存着同一份数 据的多个版本,这些版本采用时间戳进行索引
-
数据坐标
HBase中需要根据行键、列族、列限定符和时间戳来确定一个单元格,因此 ,可以视为一个“四维坐标”,即[行键, 列族, 列限定符, 时间戳]
-
基于列存储
- 一个具有n个属性的关系会被划分成n个子关系,每个子关系会单独存储
- 列式数据库适合于批量数据的处理,可以支持大量并发用户查询
- 因为当需要某属性值时,仅需要查询某一列即可,不需要像行存储那样,查出一个元组,但里面包含着很多不需要的属性值
-
HBase原理实现
- HBase的实现包括三个主要的功能组件
- 库函数:链接到每个客户端
- 一个Master主服务器 :负责管理和维护HBase表的分区信息,维护Region服 务器列表,分配Region
- 许多个Region服务器 :一个表会被划分成多个分区,每个分区服务器责存储和维护分配给自己的Region,处理来自客户端的读写请求,每个region都有一个ID,方便实现定位
- 客户端并不是直接从Master主服务器上读取数据,而是在获得Region 的存储位置信息后,直接从Region服务器上读取数据
- 客户端并不依赖Master,而是通过Zookeeper来获得Region位置信息 ,大多数客户端甚至从来不和Master通信,这种设计方式使得Master 负载很小
- HBase的实现包括三个主要的功能组件
-
zookeeper
相当于一个管家,维护和管理整个Hbase集群
-
Hbase常用的shell命令
- habase>create ‘t1’ ,{name=>‘f1’}创建表t1,列族为f1
- habase>put ‘t1’ ,‘row1’ ‘f1:c1’ ,‘value’,142424545 向表、行、列指定的单元格添加数据、时间戳
- get:通过表名、行、列、时间戳、时间范围和版本号来获得相应单元格的值
- enable/disable:使表有效或无效
- drop:删除表
-
-
NOSQL
- 是对非关系型数据库的统称,没有固定的表结构
- 数据规模超大、查询高效、扩展性好
- 四大类型
- 键值数据库,使用哈希表,使用key value键值对确定一个数据
- 列族数据库
- 文档数据库
- 图数据库
- 缺点
- 复杂查询不如关系型数据库
- 不支持事务的ACID四性
-
mapreduce
-
分布式并行编程
- 大规模集成电路的制作工艺达到一个极限,摩尔定律逐渐失效 ,但需要处理的数据量快速增加,人 们开始借助于分布式并行编程来提高程序性能
- 分布式程序运行在大规模计算机集群上,可以并行执行大规模数据处理任务,从而获得海量的计算能力,同时可以往集群中增加计算节点,就可以很容易地实现集群计算能力的扩充
-
mapreduce模型
- MapReduce将复杂的、运行于大规模集群上的并行计算过程高度地抽 象到了两个函数:Map和Reduce
- 编程容易
- MapReduce采用“分而治之”策略,一个存储在分布式文件系统中的大规模数据集,会被切分成许多独立的分片(split),这些分片可以被 多个Map任务并行处理
- MapReduce设计的一个理念就是“计算向数据靠拢”,而不是“数据 向计算靠拢”,因为,移动数据需要大量的网络传输开销
- MapReduce框架采用了Master/Slave架构,包括一个Master和若干个Slave。
- Master上运行JobTracker
- Slave上运行TaskTracker
- Hadoop框架是用Java实现的,但是,MapReduce应用程序则不一定 要用Java来写
-
MapReduce主要有以下4个部分组成
- Client
- 用户编写的MapReduce程序通过Client提交到JobTracker端
- 用户可通过Client提供的一些接口查看作业运行状态
- JobTracker
- JobTracker负责资源监控和作业调度
- JobTracker 监控所有TaskTracker与Job的健康状况,一旦发现失败,就 将相应的任务转移到其他节点
- TaskTracker
- TaskTracker 会周期性地通过“心跳”将本节点上资源的使用情况和任 务的运行进度汇报给JobTracker,同时接收JobTracker 发送过来的命令 并执行相应的操作(如启动新任务、杀死任务等)
- Task
- Task 分为Map Task 和Reduce Task 两种,均由TaskTracker 启动
- Client
-
mapreduce工作流程
-
思想:分而治之,也就是将大规模的数据集拆分成很多个小数据块在多台机器上并行处理
-
步骤
- 一个大的mapreduce作业,首先会被拆分成很多个小的map任务在多台机器上并行执行,每个map任务通常运行在数据存储节点上,实现计算向数据靠拢
- map任务结束后会生成很多个以<key,value>形式的中间结果
- 这些中间结果会被发送到多个reduce任务中,具有相同key值得中间结果会被发送到同一个reduce任务里,这个过程也叫shuffle(洗牌)
- reduce任务会对中间结果进行汇总计算出最后得结果,并输出到分布式文件系统中
-
只有全部得map任务结束后,reduce任务才能开始
-
shuffle
- map输出得结果放入缓冲区,进行分区、排序、合并
- 到达reduce后进行归并
-
-
-
MapReduce1.0的缺陷
- JobTracker“大包大揽”导致任务过重
- YARN设计思路:
- MapReduce1.0既是一个 计算框架,也是一个资源 管理调度框架
- 到了Hadoop2.0以后, MapReduce1.0中的资源 管理调度功能,被单独分离出来形成了YARN,它是一个纯粹的资源管理调 度框架,而不是一个计算框架,以容器作为资源分配得单元
- YARN体系结构
- ResourceManager:一个全局的资源管理器,负责整个系统的资源管理 和分配
- NodeManager:单个节点上的资源管理
- ApplicationMaster:当用户作业提交时,ApplicationMaster与ResourceManager协商获取资源
- 1和3相当于原来得JobTracker,2相当于原来得TaskTracker
-
Pig
- 是Hadoop生态系统的一个组件
- Pig会自动把用户编写的脚本转换成MapReduce作业在Hadoop集群 上运行
-
Kafka
是一种高吞吐量的分布式发布订阅消息系统,用户通过Kafka系统可以发 布大量的消息,同时也能实时订阅消费消息
-
Hive
是一个构建于Hadoop顶层的数据仓库工具
-
Spark
-
Apache软件基金会最重要的三大分布式计算系统开源 项目之一(Hadoop、Spark、Storm)
-
Spark具有如下几个主要特点:
- 快速:比hadoop快出100倍,hadoop框架mapreduce计算需要落地。map任务结束后将结果输出到磁盘或者hdfs,reduce从hdfs读取数据,计算结果又放到 hdfs上,涉及到i/o。伴随数据迁移。耗费时间。
- spark相对而言,将mapreduce的计算过程需要的数据尽量的放到内存,当达到一定阈值才往磁盘里写;
- 另外spark计算引擎会根据RDD的依赖关系,生成DAG,由于对RDD的计算是惰性的,在Spark实际执行任务的时候,才会去加载数据,就能做到数据在被需要时加载。
-
Spark原理:
master:负责资源的调度和分配
worker:负责资源分配和Executor的启动执行任务及对executor的监控
Executor:负责创建线程启动任务,执行。
Driver;就是一个驱动类,这个驱动类是启动main进程(main是整个程序的入口) -
Spark生态圈:
- Spark Core:实现内存管理、任务调度、DGA解析等功能
- Spark SQL:操作结构化数据
- graphx:用于图计算
- sparkr:适用于r语言得数据分析
- 资源调度有两种
- yarn:hadoop核心组件
- mesos:也是资源调度器,与yarn不同得是:资源需要多少就给多少
-
spark部署方式
- spark on yarn
- spark on mesos
-
Scala
- 是一门现代的多范式编程语言,运行于Java平台,并兼容现有的Java程序
- Scala的特性:
- Scala具备强大的并发性,可以更好地支持分布式系统
- Scala语法简洁,兼容Java,运行速度快,且能融合到Hadoop生态圈中
- Scala是Spark的主要编程语言
-
Hadoop存在如下一些缺点:
- 表达能力有限
- 延迟高
- 任务之间的衔接涉及IO开销
- 在前一个任务执行完成之前,其他任务就无法开始
-
相比于Hadoop MapReduce,Spark主要具有如下优点:
- Spark的计算模式也属于MapReduce,但不局限于Map和Reduce操作
- 比Hadoop MapReduce更灵活
- Spark提供了内存计算,可将中间结果放到内存中,避免了I/O操作运算效率更高
- Spark基于DAG的任务调度执行机制,要优于Hadoop MapReduce
-
-
Spark运行架构
- 基本概念
- RDD:是Resillient Distributed Dataset(弹性分布式数据集)的简称,是分布 式内存的一个抽象概念,提供了一种高度受限的共享内存模型
- DAG:是Directed Acyclic Graph(有向无环图)的简称,反映RDD之间的依 赖关系
- Executor:是运行在工作节点(WorkerNode)的一个进程,负责运行Task
- Application:用户编写的Spark应用程序
- Task:运行在Executor上的工作单元
- Job:一个Job包含多个RDD及作用于相应RDD上的各种操作
- Stage:是Job的基本调度单位,一个Job会分为多组Task,每组Task被称为 Stage,或者也被称为TaskSet
- 过程
- 一个Application由一个Driver和若干个Job构成,一个Job由多个Stage构 成,一个Stage由多个没有Shuffle关系的Task组成
- 当执行一个Application时,Driver会向集群管理器申请资源,启动 Executor,并向Executor发送应用程序代码和文件
- 然后在Executor上执行 Task,运行结束后,执行结果会返回给Driver,或者写到HDFS中
- 基本概念
-
Spark命令
- $ ./bin/spark-shell
-
RDD
-
产生原因
- 许多迭代式算法和交互式数据挖掘工具,共同之处是,不同计算阶段之间会重用中间结果 ,但是目前的MapReduce框架都是把中间结果写入到HDFS 中,带来了大量的磁盘IO开销
- RDD就是为了满足这种需求而出现的,它的中间结果持久化在内存中
- 同时,RDD有很高的容错性,DGA中记录着每个RDD的依赖关系,和方便的就可以实现数据的回退
-
什么是RDD
- 是一个分布式的,弹性的数据集,是spark应用中最基本的统一的数据格式单位
- 不同的数据格式如txt、excel、word,要放到spark上运算要统一格式,而这个统一的格式就是RDD
- RDD是可以读取的,RDD是不可以修改的,只能对RDD进行转换,转换成新的RDD。
- RDD有两种类型的操作:转换和行动
- 转换操作–>用于描述RDD之间的依赖关系,懒操作,只是将RDD转换成新的RDD,接收一个RDD,输出一个RDD
- textFile():读取数据
- map(func):将每个元素传递到函数func中,并将结果返回为一个新的数据集
- 行动操作–>Action操作或触发操作,生成结果。接收一个RDD,输出一个非RDD
- count():返回数据集中的元素个数
- collect():以数组的形式返回数据集中的所有元素
- first():返回数据集中的第一个元素
- 转换操作–>用于描述RDD之间的依赖关系,懒操作,只是将RDD转换成新的RDD,接收一个RDD,输出一个RDD
-
spark的计算
就是RDD的转换过程。在转换的过程中,计算并没有发生,Spark只是记录了RDD之间得生成和依赖关系,当最后转换形成的RDD要输出时,也就是执行行动操作的时候,Spark才会根据记录了依赖关系形成有向无环图,并从起点开始真正计算
-
-
流计算
-
静态数据
很多企业为了支持决策分析而构建的数据仓库系统,其中存放的大量 历史数据就是静态数据。技术人员可以利用数据挖掘和OLAP(OnLine Analytical Processing)分析工具从静态数据中找到对企业有价值的信息
-
流数据
在Web应用、网络监控、传感监测等领域,兴起了一种新的数据密集型应用——流数据
即数据以大量、快速、时变的流形式 持续到达
如电子商务网站用户点击流
-
流数据具有如下特征:
- 数据快速持续到达
- 数据来源众多,格式复杂
- 数据量大,但是不十分关注存储,一旦经过处理,要么被丢弃, 要么被归档存储
- 注重数据的整体价值,不过分关注个别数据
-
流计算
- 批量计算:充裕时间处理静态数据, 如Hadoop ,但流数据不适合采用批量计算
- 流数据必须采用实时计算,响应时间为秒级,但是,在大数据时代,数据格式复杂、来源众多 、数据量巨大,对实时计算提出了很 大的挑战。
- 因此,产生了针对流数据的实时计算——流计算
- 流计算:实时获取来自不同数据源的海量数据,经过实时分析处理,获得有价值的信息
-
常见的是开源流计算框架
- Twitter Storm:免费、开源的分布式实时计算系统,可简单、高效、可靠
- Yahoo! S4(Simple Scalable Streaming System)
-
流计算的处理流程一般包含三个阶段
- 数据实时采集
- 数据实时计算
- 实时查询服务
-
应用
Web 服务、机器翻译、广告投放、自然语言处理、气候模拟预测
实时个性化内容推荐
-
-
storm
- Twitter Storm:免费、开源的分布式实时计算系统,可简单、高效、可靠
- Storm可用于许多领域中,如实时分析、在线机器学习等
- 原理
- Storm将流数据Stream描述成一个无限的Tuple序列,这 些Tuple序列会以分布式的方式并行地创建和处理
- Storm认为每个Stream都有一个源头,并把这个源头抽象为 Spout
- 通常Spout会不停调用nextTuple函数,从外部数据源读取数据,然后封装 成Tuple形式,发送到Stream中
- 一个个tuple流经Bolt(中间处理站),Bolt在接收到消息之后会调用执行函数,用户可以在执行函数中写自己的处理逻辑
-
Spark Streaming
- 另一个开源的流计算框架
- Spark Streaming和Storm最大的区别在于
- Spark Streaming无 法实现毫秒级的流计算,而Storm可以实现毫秒级响应
- Spark Streaming构建在Spark上,RDD 数据集更容易做高效的容错处理
毕业设计
-
概要
我的毕业设计题目是《新零售商业数据分析系统的设计与实现》,主要包括新零售业的统计报表、顾客画像、商品关系的相似性推荐等功能模块。旨在帮助客户从海量的数据中发现商机、利用数据分析后的信息优化营销策略。
-
所做工作
- 本零售商业数据分析系统运用Scrapy爬虫框架,爬取了近6万条零售业的相关数据
- 对数据进行预处理,清洗数据,对这些不合理的数据做合理的修改
- 并使用Spark计算引擎、编写相应MapReduce函数对获取到的数据集进行处理
- 将原始数据集TXT文件中的数据集封装到RDD中,在编写MapReduce计算框架对RDD进行切分、转换操作,将原始数据处理为带有业务逻辑的数据,然后持久化到MySQL关系数据库当中
- 其中在商品关系模块中,使用python语言,编写基于物品的协同过滤推荐算法,计算不同商品之间的相似度。
- 最后使用python轻量级web框架Flask和apache echars将处理数据可视化,以大屏的形式展示。
-
Scrapy爬虫框架
-
Scrapy是用Python实现的一个应用框架,程序员可以使用他来爬取目标网站的各类数据数据、分析网页结构爬取数据。
-
流程
- 解析网页数据结构,分析目标网页元素的Xpath,找到其逻辑,然后编写爬虫代码
- 将目标网站的域名和目标页面的URL配置在爬虫代码中
- 创建item实例,使用xpath.extract_first()提取各个字段内容到item中
- 爬多个数据时使用的yield,而不是return:parse函数将会被当做一个生成器使用,Scrapy会逐一获取生成的结果
- 启用管道,使用format将各个字段设计成想要的输出顺序和格式,传输到空白的TXT文件中
-
scrapy 常用命令
-
scrapy view
view可以将网页下载到本地,这个网页就是爬虫看到的页面。注意:爬虫看到的页面与直接到目标网站看到的页面有些是不相同的,因为有反爬虫处理。
-
scrapy shell
shell是一个调试工具
-
-
-
Spark RDD编程
-
流程
-
通过SparkSession创建一个spark的入口,同时可以定义spark的名字和启动的进程数量
spark = SparkSession.builder.appName("wordcount").master("local[2]").getOrCreate()
-
创建spark上下文对象sparkcontext,通过sparkcontext可以调用spark api,利用api创建RDD算子、转换算子、触发计算、转存计算结果。
-
通过textFile()读取外部数据创建RDD:
三种方式:1.parallelize测试时使用 2. 通过textFile()读取外部数据创建RDD 3. 读取json文件
local_file = r"G:\数据集\stock_original_data\taiyuan_gequ_xiaoliang.txt" gong_zu_fang_rdd = sc.textFile(local_file)
-
数据预处理
采集到的原生数据中有许多不合理的数据,需要对其进行预处理。例如:在收集到的价格的原始数据中,有的价格的表示方法是1000-1500,这样的范围性的数据来表示,但是我们再数据计算中是需要单个的数据,因此我们将数据再次进行切分,只取最小的数据,作为计算所用的数据
-
然后编写RDD算子,如:
-
**map(func):**将每个元素传递到函数func中,并将结果返回为一个新的数据集
gong_zu_fang_rdd.map(lambda x: to_pair(x)) //参数是一个函数 //lambda:匿名函数
-
**reduceByKey(func):**应用于(K,V)键值对的数据集时,返回一个新的(K, V)形式的数据集,其中的每个值是将每个key传递到函数func中进行聚合(hello,1),(hello,1),(hello,1)----->(hello,3)
gong_zu_fang_rdd.map(lambda x: to_pair(x)). reduceByKey(lambda x, y: (x[0] + y[0], x[1] + y[1]))
-
**groupByKey():**应用于(K,V)键值对的数据集时,返回一个新的(K, Iterable)形式的数据集 hello,word,hello,beijing----->(hello,1),(hello,1),(word,1),(beijing,1)------>(hello,1,1)(word,1)(beijing,1)
-
**count():**返回数据集中的元素个数
-
**collect():**以数组的形式返回数据集中的所有元素
-
**first():**返回数据集中的第一个元素
-
**take(n):**以数组的形式返回数据集中的前n个元素
-
-
对原始数据的每一行,切分,转换成键值对,再对键值对,进行聚合、归并、分组、统计、提取单个元素等操作,最后将计算结果保存为一个行数据类型
-
与mysql数据库建立连接,将处理好的数据持久化到关系型数据库中
-
-
-
可视化部分
-
flask框架
核心思想就是,前端的所有页面通过ajax调用后台的api结构,并且将需要再前后端交互的数据包装成json文件。这项可以大大降低整个项目各个系统功能模块之间的耦合性,大大的提高了后期代码维护的成本。
-
ajax
AJAX = 异步 JavaScript 和 XML。
AJAX 是一种用于创建快速动态网页的技术。
通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。
-
过程
- 编写JavaScript文件,在apache echars 官网上,得到想实现的可视化js模板,从数据库中读出数据,将对应的数据传入
- 将整个echars的数据和样式,封装成json文件,传到前端,实现数据的可视化
-
-
协同过滤算法(Collaborative Filtering, 简称 CF)
-
协同过滤就是借鉴和你相关人群的观点来进行推荐。如果你现在想看个电影,但你不知道具体看哪部,大部分的人会问问周围的朋友,看看最近有什么好看的电影推荐,而我们一般更倾向于从口味比较类似的朋友那里得到推荐。这就是协同过滤的核心思想。
-
在协同过滤中,有两种主流方法:
-
基于用户的协同过滤:
当目标用户需要个性化推荐时,可以先找到和目标用户相似兴趣的用户群体,然后将这个用户群体喜欢的,但是目标用户还没有听说过的物品推荐给目标用户
-
基于物品的协同过滤
- 在计算邻居时从物品的角度,而不是从用户的角度。给用户推荐那些和他们之前喜欢的物品相似的物品
- 算法实现步骤
- 设置权重:如用户不同行为对应不同权重:喜欢为1,收藏为2,购买为3
- 根据用户的行为列表计算出用户、物品的评分矩阵
- 每个物品为一个向量,它的n维分量就是n各用户对此物品行为的权重
- 计算所有物品两两之间的余弦相似度,得到物品与物品的相似度矩阵
- 再用物品与物品的相似度矩阵乘上物品、用户的评分矩阵,得到推荐列表
- 最后将推荐列表中,某用户已经了解过的物品除去,剩下的就是需要向该用户推荐的物品了
-
-
由于毕设要实现的功能是,相似物品的计算,故得出物品与物品的相似度矩阵后,就停止了
-
电路与电子技术基础
-
电路的基本概念
-
电路的基本元件:电阻元件、电容元件、电感元件
-
基尔霍夫电流定律:
对于电路的任意节点,在任意时刻流出该节点的电流值和等于流入该节点的电流之和
3. 基尔霍夫电流定律:
对于电路的任意节点,在任意时刻各段电路的电压和恒为0
-
直流电路分析方法
- 网孔电流法(方程)
- 节点电压法(方程)
-
数字逻辑基础
-
逻辑运算:
-
与:多个输入全是高电平,输出才全是高电平
-
或:有一个高就是高
-
非:一个输入一个输出,低变高,高变低
-
符合逻辑运算:与非门电路、或非、与或非、异或
-
三态门电路
-
在普通电路上增加控制电路构成的,在计算机中广泛使用
-
有三种输出状态:高电平、低电平、高阻状态,前两种是工作状态,后一种是禁止状态
-
三态门在计算机中可用于总线传输,多路数据通过三态门共享总线分时传输
-
三态非门:用于双向数据总线
-
三态缓冲门:用于可以起到开关的作用
-
逻辑电路按照逻辑功能和电路结构不同分为
-
组合逻辑电路
全部由门电路构成,在任意时刻电路的输出状态取决于当前电路的输入状态
有:
1. 译码器:由多个输入,多个输出,可以将一组给定的代码翻译成对应得输出信号 2. 编码器:和译码器相反,是将输入信号编码后输出 3. 加法器:是计算机中运算器得核心,基本功能是实现两个二进制数的加法运算 2. 时序逻辑电路
由具有记忆功能的触发器及组合电路构成,在任意时刻电路的输出状态,不仅取决于当前电路的输入状态,还取决于电路原来的状态
有:
1. 触发器:最简单的时序逻辑电路,是寄存器和计数器的重要组成 2. 寄存器:基本部件,用来存放地址、命令和数据 3. 计数器:基本部件,用来记录脉冲的个数
-
-
数据挖掘
-
数据挖掘
利用一种或多种计算机学习技术,从数据中自动分析并提取信息的处理过程,目的是:寻找和发现数据中潜在的有价值的信息、知识和规律
-
机器学习
-
机器学习是模拟人类的学习方法,来解决计算机获取知识问题的方法,机器学习是人工智能的核心,是使计算机具有只能的根本途径,通过大量的实例进行训练,从中发现经验化规律的过程
-
机器学习的结果通常表现形式为概念,概念是具有某些共同特征的对象、符号的集合
-
机器学习的方式是基于归纳的学习,从归纳中获取知识,并以概念的形式表现出来的学习
-
机器学习的方法
-
有指导的学习
-
通过大量已知分类或输出结果值的实例进行训练,建立分类或预测模型,用来分类未知实例,是一个归纳演绎的过程
-
常见算法
-
决策树
- 是一颗倒立的树,非叶子节点表示在一个属性上的分类检查,非叶子节点表示决策判断结果
- C4.5算法
- 给定一个表示为“属性-值”格式的由多个实例构成的数据集,数据集具有多个输入属性和一个输出属性,输入属性表示实例的某个方面的特征或行为,输出属性表示每个实例属于且仅属于的那个类
- C4.5选择的基本思想:选择具有最大增益率的属性作为分支节点来分类实例数据
- 信息熵是信息的不确定程度的度量,信息增益值越大,表示对信息熵的抑制作用越强,也就越适合用该属性进行分类
- 过程
- 首先选择增益值最大的属性,来作为当前分类的标准
- 再从第一个分类后,各类剩余属性中计算出增益值最大的属性,作为第二次分类的标准
- 直到没有属性为止,或者分类后其中一类的输出达到某一个比例,比如全是yes
-
产生式规则
决策树一般都会被翻译成一个产生式规则合集:产生式规则的格式为 if 前提条件 then 结论
-
神经网络
-
-
-
无指导的聚类
-
在学习训练之前,无法预先定义好分类的实例,数据实例按照某种相似性度量,计算各个实例之间的相似度,将最为相似的实例聚类在一个组——簇中,再解释和理解每个簇的含义,从中发现聚类的意义
-
常见算法
-
k-均值算法
-
初始时指定一个初始的簇的个数如2,结果聚类为两个簇,每个簇的概念结构可以表示为一个产生式规则
-
步骤
-
随机选择一个K值,用以确定簇的总数
-
在数据集中任意选择K个实例,将它们作为初始的簇中心
-
算这K个簇中心与其他剩余实例的简单欧氏距离,用这个距离作为实例之间相似性的度量,将与某个簇中心相似度高的实例划分到该簇中
-
再使用每个簇中的实例来重新计算新得到的簇的簇中心
-
如果计算得到新的簇中心等于上次迭代的簇中心,终止算法过程。否则,用新的簇中心作为簇中心并重复步骤
-
-
-
-
-
-
数据查询:通过数据查询语言在数据中找到所需要的数据或信息
-
专家系统:具有某种智能呢个的计算机软件系统,能够模拟某个领域的人类专家的决策过程,解决那些需要人类专家才能解决的问题
-
数据挖掘的过程
- 准备数据,包括准备训练数据和检验数据
- 选择数据挖掘技术和算法
- 解释和评估结果:数据挖掘是一个迭代过程,如果结果不理想,重复12
- 模型应用:数据挖掘的最终目标是将所发现的知识用于解决实际的问题
- 分类模型:用于诊断疾病
- 聚类模型:用于对顾客分类
- 关联分析模型:找出顾客购买商品之间的联系,对货架摆放、商品促销提供决策支持
-
数据挖掘的作用
- 建立有指导的学习模型:输出的值依赖于输入的值
- 建立无指导的聚类模型:不存在输出属性,数据集的所有属性都是输入属性
- 用于分类、估计(商品估价)、预测
-
关联分析
- 一种关联规则挖掘技术,用于发现数据中属性之间的有价值的联系
- 关联规则可以有多个输出属性,一个规则的输出属性可以在另一规则中作为输入属性
- 关联分析用来发现潜在的令人感兴趣的商品购买组合,是购物篮分析的常用技术
- Apriori关联分析算法
- 置信度:if 买a then 买 b——所有买了a的人中又买了b的人在所有买了a的人中的占比,衡量关联规则的可信程度
- 支持度:if 买a then 买 b——所有买了a的人中又买了b的人在所有顾客中占比,衡量关联规则的是否具有普遍性
- 步骤
- 设置一个支持度的阈值,条目集中只放一个条目,将低于阈值的数据删除
- 将之前的支持度阈值降低,条目集中放两个条目,再将低于阈值的数据删除
- 再将之前的支持度阈值降低,条目集中放三个条目,再将低于阈值的数据删除
- 直到筛选不出符合支持度阈值的条目后
- 再设置一个置信度阈值,分别从之前刷选出来的两条目集、三条目集中筛选出置信度高的关系
- 也就完成了数据集中的关联分析
-
数据挖掘的应用
- 购物篮分析:啤酒与尿布” 可以帮助零售商在销售过程中找到具有销售关联的商品,并以此指导货架的组织,促进销售收益的增长
- 广告精准投放:搜索潜在客户和传播对象,将分散的目标受众精准地聚集在一起,精确地把广告投放给目标客户
- 客户流失分析:分析出流失顾客的特征,对有流失倾向的用户开展挽留工作,
-
缺陷
数据挖掘得到的预测模型可以告诉你会如何(what will happen),但不能说明为什么会发生(why)
-
-
数据仓库
- 信息的处理类型主要有事务型和分析型两大类
- 事务型处理,主要是对管理信息进行日常的操作,对信息进行查询和修改,目的是满足组织特定的日常管理需要。
- 分析型处理是指分析数据背后的关联和规律,为管理人员提供决策支持。
- 数据仓库
- 建立数据仓库的主要目的是为决策支持,它用于支持企业或组织的决策分析处理,而不是日常事务处理
- 特征
- 面向主题的:按照需要支持的决策主题组织数据,将同一主题的数据集成存储
- 集成的:将分散存储的各个企业和部门的、异构的、类型多样的的数据,进行收集、整合,解决数据的分布性和异构性
- 相对稳定的:数据很少需要被修改,具有相对稳定性
- 反映历史变化:数据仓库中数据往往被打上时间戳,表达数据的历史变化
- 联机分析处理(On-line analytical processing,OLAP)——数据仓库
通过一套多维数据分析和统计计算方法,产生集成性决策信息的过程 - 联机事务处理(On-line transactional processing,OLTP)——对应数据库
在线的业务交易,用户通过终端或应用系统以在线交易的方式自动化地处理实时性数据的过程
- 信息的处理类型主要有事务型和分析型两大类
-
神经网络
- 人工神经网络(Artificial Neural Networks,ANN)简称神经网络(Neural Networks,NN)
- 以计算机网络模拟生物神经网络的智能计算系统, 是对人脑神经网络的抽象和模拟。
- 神经元:神经网络中的知识,表示为处理单元节点的集合。
- 突触:每个节点与邻近层节点之间的加权连接。
- 权重:连接间的权值,相当于神经网络的记忆。
- 激励函数:每个节点的输出由一个输出函数计算所得。
- 反向传播(Back Propagation )训练算法
- BP算法的步骤
- 从训练样本集中取某一样本,把它的输入信息输入到网络中
- 由网络正向计算出各层节点的输出。
- 计算网络的实际输出和期望输出的误差。
- 从输出层开始反向计算到第一个隐藏层,按一定的原则向减少误差方向调整整个网络的各个连接权值
- 对训练样本集中的每一个样本重复上述步骤,直到对整个网络训练样本集的误差达到要求为止。
- BP算法的步骤
-
统计技术
- 回归分析:按照自变量的多少,分为一元回归分析和多元回归分析
- 步骤
- 确定回归方程中的自变量和因变量
- 从收集到的样本数据出发确定自变量和因变量之间的数学关系式,即确定回归方程
- 对回归方程进行各种统计检验。
- 利用回归方程进行预测。
- 步骤
- 贝叶斯分析
- 一种参数估计方法
- 将关于未知参数的先验信息与样本信息相结合,根据贝叶斯公式,得出后验信息,然后根据后验信息去推断未知参数。
- 在决策支持、风险评估、模式识别等方面都得到了很广泛的应用,被用来建立分类模型,就是著名的贝叶斯分类器。
- 先验信息
- P(Y)表示Y发生的概率,而不考虑X
- P(X)表示X发生的概率,而不考虑Y
- 后验信息
- P(Y|X)表示在X已经发生的情况下,Y发生的概率
- P(X|Y)表示在Y已经发生的情况下,X发生的概率
- 贝叶斯公式
- 用先验信息与样本信息相结合,根据贝叶斯公式,得出后验信息
- 已知篮子中苹果的概率、梨的概率,又知道苹果为黄色的概率、梨为黄色的概率,可以计算出从篮子里任意拿一个黄色水果,最有可能是梨还是苹果
- 也可以根据购物记录,判断具有什么条件的用户购买某个物品的概率最大
- 回归分析:按照自变量的多少,分为一元回归分析和多元回归分析
Java web
-
html:超文本标记语言,主要通过HTML标记语言对网页的文本、图片、声音等内容进行描述
html></html>标记,根标记,标志着 文档的开始和结束。 <head></head>标记,头部标记,定义HTML文档的头部信息,用来封装其他位于文档头部的标记 <title>文档的标题 <meta>标记可以提供有关页面的元信息 <link>定义文档与外部资源的关系 <style>用于为HTML文档定义样式信息 <body></body>标记,主体标记,定义文档所要显示的内容。
-
CSS是cascading style sheet 层叠样式表,是用于(增强)控制网页样式并允许将样式信息与网页内用分离的一种标记性语言
-
HTTP请求行
-
GET方式 裸奔
- 将数据作为URL的 参数进行传递,参数部分将附加在请求行中的资源路径后面。
- 需要注意的是,使用GET方式传送的数据量有限,最多不能超过2KB
-
POST方式(长度无限制,更安全)隐藏在实体中。
- 如果网页上表单的mtd属性设置为POST当用户提交表单时,浏流器将使用POST方式提交表单内容
- 把各个表单元素及数据作为HTTP消息的实体内容发送给服务器,而不是作为UR地址的参数传速
- 没有数据大小限制,且比get更安全
-
-
HTTP响应行
- 1xx:表示请求已接收,需要继续处理。
- 2xx:表示请求已成功被服务器接收、理解并接受。
- 3xx;为完成请求,客户端需进一步细化请求。
- 4xx:客户端的请求有错误。
- 5xx;服务器端出现错误。
-
Cookie
- Cookie是由服务端生成再发送给客户端保存。相当于本地缓存的作用
- 用来提高访问服务端的效率,比如使用cookie实现记住用户名功能,可以在客户端多个浏览器共享
-
JDBC原理
Java DataBase Connectivity ,可以为多种关系型数据库DBMS提供统一的访问方式,用Java来操作数据库。
步骤:
- 导入数据库驱动,每种数据库有自己专门的数据库驱动类
- 使用drivermanager与数据库建立连接
- 使用connection产生操作数据库的对象pstmt,执行sql语句,如增删改和查询,在这里推荐使用预编译preparedstatement,因为sql语句中可能存在占位符?,避免字符串的拼接,且预编译只执行一次,可以提高性能
- 返回处理结果,即结果集resultset
- 操作结果集,使用getint()、getstring() 等方法对结果集处理获取具体字段的值
-
MVC
- m:模型:具体的功能dao层
- v:视图:jsp前端页面中的各种表单表格
- c:控制:相应前端jsp页面的请求,同时控制调用底层的功能,实现业务逻辑
-
项目步骤:
- dao层:使用JDBC对底层数据库进行操作,如按ID查询数据,查询全部数据、增加数据、删除数据、检查数据存在、修改数据等
- service业务逻辑层:逻辑性的增删改查,对dao层的组装,比如需要增加数据,就需要先调用dao层的检查数据存在的功能,如果要插入的数据不存在,再使用dao层的添加数据的功能,这样将dao层的功能呢块组装成业务逻辑功能
- Servlet层:系统中的每个功能模块对应一个Servlet
- 比如添加数据,将从前端jsp页面中返回的数据,封装到对应的实体中,再将该实体通过调用service层的函数,传入service层,进行添加数据的业务逻辑
- 要查询数据,使用getParameter()获取到前端传回的查询关键字,在Servlet调用service的查询逻辑,将获得的关键字作为参数传入service层,将查询出来的结果返回到实体中,再将这个实体通过request.setAttribute()放入request域中
- 前端的jsp代码中通过request.getAttribute(),可以获取到request域中的实体,将实体中的各个数据字段,通过实体内实现的set、get方法,传送到前端页面相应的位置
-
JSP
- 就是在html中嵌套的java代码,因此 java代码可以写在jsp中(<% … %>)