CS基础 数据结构/网络/操作系统/数据库/设计模式

!数据结构

两个很大的数据集存着url 找到两个数据集共有的url

step1:遍历文件a,对每个url求取hash(url)%1000,然后根据所取得的值将url分别存储到1000个小文件(记为a0,a1,…,a999,每个小文件约300M),为什么是1000?主要根据内存大小和要分治的文件大小来计算,我们就大致可以把320G大小分为1000份,每份大约300M(当然,到底能不能分布尽量均匀,得看hash函数的设计)

step2:遍历文件b,采取和a相同的方式将url分别存储到1000个小文件(记为b0,b1,…,b999)(为什么要这样做? 文件a的hash映射和文件b的hash映射函数要保持一致,这样的话相同的url就会保存在对应的小文件中,比如,如果a中有一个url记录data1被hash到了a99文件中,那么如果b中也有相同url,则一定被hash到了b99中)

所以现在问题转换成了:找出1000对小文件中每一对相同的url(不对应的小文件不可能有相同的url)

step3:因为每个hash大约300M,所以我们再可以采用(1)中的想法

!计算机网络

OSI,TCP/IP,五层协议的体系结构,以及各层协议

OSI分层 (7层):物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
TCP/IP分层(4层):网络接口层、 网际层、运输层、 应用层。
五层协议 (5层):物理层、数据链路层、网络层、运输层、 应用层。
每一层的协议如下:
物理层:RJ45、CLOCK、IEEE802.3 (中继器,集线器)
数据链路:PPP、FR、HDLC、VLAN、MAC (网桥,交换机)
网络层:IP、ICMP、ARP、RARP、OSPF、IPX、RIP、IGRP、 (路由器)
传输层:TCP、UDP、SPX
会话层:NFS、SQL、NETBIOS、RPC
表示层:JPEG、MPEG、ASII
应用层:FTP、DNS、Telnet、SMTP、HTTP、WWW、NFS
每一层的作用如下:
物理层:通过媒介传输比特,确定机械及电气规范(比特Bit)
数据链路层:将比特组装成帧和点到点的传递(帧Frame)
网络层:负责数据包从源到宿的传递和网际互连(包PackeT)
传输层:提供端到端的可靠报文传递和错误恢复(段Segment)
会话层:建立、管理和终止会话(会话协议数据单元SPDU)
表示层:对数据进行翻译、加密和压缩(表示协议数据单元PPDU)
应用层:允许访问OSI环境的手段(应用协议数据单元APDU)

TCP和UDP的区别?

TCP提供面向连接的、可靠的数据流传输,而UDP提供的是非面向连接的、不可靠的数据流传输。
TCP传输单位称为TCP报文段,UDP传输单位称为用户数据报。
TCP注重数据安全性,UDP数据传输快,因为不需要连接等待,少了许多操作,但是其安全性却一般。
TCP对应的协议和UDP对应的协议
TCP对应的协议:
(1) FTP:定义了文件传输协议,使用21端口。
(2) Telnet:一种用于远程登陆的端口,使用23端口,用户可以以自己的身份远程连接到计算机上,可提供基于DOS模式下的通信服务。
(3) SMTP:邮件传送协议,用于发送邮件。服务器开放的是25号端口。
(4) POP3:它是和SMTP对应,POP3用于接收邮件。POP3协议所用的是110端口。
(5)HTTP:是从Web服务器传输超文本到本地浏览器的传送协议。
UDP对应的协议:
(1) DNS:用于域名解析服务,将域名地址转换为IP地址。DNS用的是53号端口。
(2) SNMP:简单网络管理协议,使用161号端口,是用来管理网络设备的。由于网络设备很多,无连接的服务就体现出其优势。
(3) TFTP(Trivial File Transfer Protocal),简单文件传输协议,该协议在熟知端口69上使用UDP服务。

  • TCP优缺点:

优点: 1.TCP提供以认可的方式显式地创建和终止连接。
2.TCP保证可靠的、顺序的(数据包以发送的顺序接收)以及不会重复的数据传输。
3.TCP处理流控制。
4.允许数据优先
5.如果数据没有传送到,则TCP套接口返回一个出错状态条件。
6.TCP通过保持连续并将数据块分成更小的分片来处理大数据块。—无需程序员知道

缺点: TCP在转移数据时必须创建(并保持)一个连接。这个连接给通信进程增加了开销,让它比UDP速度要慢。

UDP优缺点: 1.UDP不要求保持一个连接
2.UDP没有因接收方认可收到数据包(或者当数据包没有正确抵达而自动重传)而带来的开销。
3.设计UDP的目的是用于短应用和控制消息
4.在一个数据包连接一个数据包的基础上,UDP要求的网络带宽比TCP更小。

TCP三次握手和四次挥手的全过程

三次握手:
第一次握手:客户端发送syn包(syn=x)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。

四次挥手:
与建立连接的“三次握手”类似,断开一个TCP连接则需要“四次握手”。
第一次挥手:主动关闭方发送一个FIN,用来关闭主动方到被动关闭方的数据传送,也就是主动关闭方告诉被动关闭方:我已经不 会再给你发数据了(当然,在fin包之前发送出去的数据,如果没有收到对应的ack确认报文,主动关闭方依然会重发这些数据),但是,此时主动关闭方还可 以接受数据。
第二次挥手:被动关闭方收到FIN包后,发送一个ACK给对方,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号)。
第三次挥手:被动关闭方发送一个FIN,用来关闭被动关闭方到主动关闭方的数据传送,也就是告诉主动关闭方,我的数据也发送完了,不会再给你发数据了。
第四次挥手:主动关闭方收到FIN后,发送一个ACK给被动关闭方,确认序号为收到序号+1,至此,完成四次挥手。

TCP的三次握手过程?为什么会采用三次握手,若采用二次握手可以吗?

建立连接的过程是利用客户服务器模式,假设主机A为客户端,主机B为服务器端。
(1)TCP的三次握手过程:主机A向B发送连接请求;主机B对收到的主机A的报文段进行确认;主机A再次对主机B的确认进行确认。
(2)采用三次握手是为了防止失效的连接请求报文段突然又传送到主机B,因而产生错误。失效的连接请求报文段是指:主机A发出的连接请求没有收到主机B的确认,于是经过一段时间后,主机A又重新向主机B发送连接请求,且建立成功,顺序完成数据传输。考虑这样一种特殊情况,主机A第一次发送的连接请求并没有丢失,而是因为网络节点导致延迟达到主机B,主机B以为是主机A又发起的新连接,于是主机B同意连接,并向主机A发回确认,但是此时主机A根本不会理会,主机B就一直在等待主机A发送数据,导致主机B的资源浪费。
(3)采用两次握手不行,原因就是上面说的失效的连接请求的特殊情况。

在浏览器中输入www.baidu.com后执行的全部过程

1、客户端浏览器通过DNS解析到www.baidu.com 的IP地址220.181.27.48,通过这个IP地址找到客户端到服务器的路径。客户端浏览器发起一个HTTP会话到220.181.27.48,然后通过TCP进行封装数据包,输入到网络层。
2、在客户端的传输层,把HTTP会话请求分成报文段,添加源和目的端口,如服务器使用80端口监听客户端的请求,客户端由系统随机选择一个端口如5000,与服务器进行交换,服务器把相应的请求返回给客户端的5000端口。然后使用IP层的IP地址查找目的端。
3、客户端的网络层不用关心应用层或者传输层的东西,主要做的是通过查找路由表确定如何到达服务器,期间可能经过多个路由器,这些都是由路由器来完成的工作,我不作过多的描述,无非就是通过查找路由表决定通过那个路径到达服务器。
4、客户端的链路层,包通过链路层发送到路由器,通过邻居协议查找给定IP地址的MAC地址,然后发送ARP请求查找目的地址,如果得到回应后就可以使用ARP的请求应答交换的IP数据包现在就可以传输了,然后发送IP数据包到达服务器的地址。

ARP是地址解析协议,简单语言解释一下工作原理。

1:首先,每个主机都会在自己的ARP缓冲区中建立一个ARP列表,以表示IP地址和MAC地址之间的对应关系。
2:当源主机要发送数据时,首先检查ARP列表中是否有对应IP地址的目的主机的MAC地址,如果有,则直接发送数据,如果没有,就向本网段的所有主机发送ARP数据包,该数据包包括的内容有:源主机 IP地址,源主机MAC地址,目的主机的IP 地址。
3:当本网络的所有主机收到该ARP数据包时,首先检查数据包中的IP地址是否是自己的IP地址,如果不是,则忽略该数据包,如果是,则首先从数据包中取出源主机的IP和MAC地址写入到ARP列表中,如果已经存在,则覆盖,然后将自己的MAC地址写入ARP响应包中,告诉源主机自己是它想要找的MAC地址。
4:源主机收到ARP响应包后。将目的主机的IP和MAC地址写入ARP列表,并利用此信息发送数据。如果源主机一直没有收到ARP响应数据包,表示ARP查询失败。
广播发送ARP请求,单播发送ARP响应。

描述RARP协议

RARP是逆地址解析协议,作用是完成硬件地址到IP地址的映射,主要用于无盘工作站,因为给无盘工作站配置的IP地址不能保存。工作流程:在网络中配置一台RARP服务器,里面保存着IP地址和MAC地址的映射关系,当无盘工作站启动后,就封装一个RARP数据包,里面有其MAC地址,然后广播到网络上去,当服务器收到请求包后,就查找对应的MAC地址的IP地址装入响应报文中发回给请求者。因为需要广播请求报文,因此RARP只能用于具有广播能力的网络。

滑动窗口

校招面试知识点复习之计算机网络

socket 的基本操作

  • socket()函数
int socket(int domain, int type, int protocal);

socket 函数在成功时返回一个小的非负整数值,称为套接口描述字,简称套接字。
socket 函数的三个参数分别是:

  1. domain:即协议域,又称为协议族。常用的协议族有:AF_INET、AF_INET6 AF_LOCAL (或称AF_UNIX,UNIX域socket)、AF_ROUTE.

!操作系统

进程、线程的区别

(from:王道程序员宝典)

  • 调度:在传统操作系统中,拥有资源和独立调度的基本单元都是进程。引入线程后,线程是独立调度的基本单元,进程是拥有资源的基本单元。在同一进程中,线程的切换不会引起进程切换。在不同进程中进行的线程切换,则会引起进程切换。
  • 拥有资源:不论是传统的还是引入线程即操作系统,进程都是拥有资源的基本单位,新城不拥有资源(也有一点必不可少的资源),但是线程可以共享其隶属进程的系统资源。
  • 并发性:在引入线程的操作系统中,不仅进程可以并发执行,而且同一进程内的多个线程也可以并发执行,从而是的操作系统具有更好的并发性,大大提高了系统的吞吐量。
  • 系统开销:创建和撤销进程时,系统都要位置分配或者回收资源,如内存空间、I/O设备等,因此操作系统所付出的开销大于创建或撤销线程的开销。类似地,在进程切换时,涉及当前执行进程CPU环境所保存以及新调度的进程CPU环境的设置,而线程切换时只需要保存和设置少量寄存器内容,因此开销很小。另外,由于同一进程内的多个线程共享进程的地址空间,因此这些进程之间的同步与通信比较容易实现,甚至无需操作系统的干预。
  • 地址空间和其他资源(如打开的文件):进程的地址空间相互独立,同一进程的各线程间共享进程的资源,某进程内的线程对于其他的进程不可见。
  • 通信方面:进程间通信需要借助操作系统,而线程间可以直接读/写进程数据段(如全局变量)来进行通信

进程通信的几种手段

  • 管道(pipe)及有名管道(named pipe):管道可以用于有亲缘关系进程间的通信,有名管道克服了管道没有信命的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信;
  • 信号(signal):信号是比较复杂的通信方式,用户同志接收进程有某种事情发生,除了用于进程间通信外,进程还可以发信号给进程本身;
  • 消息队列(message):消息队列是消息的链表。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓存区大小受限等缺点。
  • 共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其他通信机制,如信号量结合使用,来达到进程间的同步与互斥。
  • 信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。
  • 套接口(socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是有UNIX系统的BSD分支开发出来的,但现在一般可以一直到其他类UNIX系统上。

调度算法

调度及基本准则包括CPU利用率、系统吞吐量、周转时间、等待时间、响应时间等。
系统吞吐量表示单位时间内CPU完成作业的数量。
周转时间为作业完成时刻减去作业到达的时刻。
等待时间是指进程处于等处理器状态的时间和,等待时间越长,用户满意度越低。
响应时间是指从用户提交请求到系统首次产生响应所用的时间。
典型调度算法包括:先来先服务(FCFS)、短作业有限算法(SJF)、优先级雕塑算法、高响应比优先调度算法、时间片轮转算法、多级反馈队列调度算法。其中SJF平均等待时间、平均周转时间最少。

死锁

所谓死锁是指多个进程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都无法向前推进。
死锁产生的原因:

  • 系统资源的竞争
  • 进程推进顺序非法
    死锁产生的必要条件(必须同时满足才会产生)
  • 互斥条件:进程要求对多分配的资源进行排他性控制,即在一段时间内某资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待。
  • 不剥夺条件:进程所获得的资源在为使用完毕之前,不能被其他进程强行夺走,即只能由获得该资源的进程自己来释放。
  • 请求和保持条件:进程每次申请它所需要的一部分资源,在等待新资源的时候,进程继续占有已分配的资源。
  • 循环等待条件:存在一种进程资源的循环等待链,链中的每一个已经获得的资源同时被链中下一个进程所请求。
    死锁处理策略:
    1)预防死锁:设置某种限制条件,破坏产生死锁的四个必要条件中的一个或几个。
    2)避免死锁:在资源的动态分配中,用某种方法防止系统进入不安全状态。银行家算法是著名的死锁避免算法。
    3)死锁的检测与接触:无需采取任何限制性措施,允许进程在云从过程中发生死锁,通过系统的检测机制及时地检测出死锁的发生,然后采取某种措施接触死锁。死锁的检测可以利用资源分配图来描述。(首先为每个进程和每个资源指定一个唯一的号码; 然后建立资源分配表和进程等待表)死锁的解除主要方法:
    (1)资源剥夺法
    (2)撤销进程法
    (3)进程回退法

!数据库

数据库理论

数据模型

数据库系统的核心和基础是数据模型。数据模型是对现实世界数据特征的抽象,是用来描述数据、组织数据和对数据进行操作的。第一类是概念模型,第二类是逻辑模型和物理模型。

关系模型是目前最重要的一种数据模型。关系数据库系统采用关系模型作为数据的组织方式。在这些关系中,关系模型中数据的逻辑结构就是一张二维表,或者说关系的数据结构就是一张表。

关系数据模型的数据操作主要包含查找、插入、删除和更新数据。
关系模型的完整性约束包含三大类:实体完整性、参照完整性和用户自定义的完整性。

主键与外键

若关系(二维表)中的某一属性组的值能唯一识别一个元组,则该属性组为候选码。若一个表中有多个候选码,则可选定其中一个为主键。

候选码的诸属性成为主属性。不包含在任何候选码中的属性成为非主属性或非码属性。

若关系模式R中的某属性不是R的主键,而是另一个关系R1的主键,则该属性集是关系模式R的外键。由此可见,外键表示了两个关系(表)的联系。以另一个关系的外键作主键的表被称为主表,具有此外键的表被成为从表。外键又称为外关键字。

关系模型的实体完整性规则:若属性(指一个或者一组属性)A是基本关系R的主属性,则A不取空值,由此规则可得一直接结论:主键不能为空。
关系模型的参照完整性规则:若属性(或属性组)F是某基本关系R的外键,且它与基本关系R1的逐渐相对应,则对于R中,每个F上的值或为空值或者为R1中的主键值。

事务

所谓事务,是指用户定义的一个数据库操作系列,这些操作要么全做要么全不做,是一个不可分割的工作单位。

事务的四个特征:原子性、一致性、隔离性和持续性。这四个特性简称为ACID特征。

索引

索引是对数据表中的一列或者多列的值进行排序的一种结构,使用索引可以快速访问数据表中的特定信息。

为表设置索引是要付出代价的,一是增加了数据库的存储空间,二是插入和修改数据时要花费较多的时间(因为索引也要随之变动)。

在表Student上按Sno降序键唯一索引:

CREATE UNIQUE INDEX Stusno ON Student(Sno desc)

删除Student表的Stusno索引

ALTER TABLE Student Drop INDEX Stusno

数据库索引的作用是什么?什么情况下适合建立索引以及什么情况下不适合建立索引?

创建索引可以大大提高系统的性能。
(待补充)

视图

视图是从一个或者几个基本表(或者视图)导出的表。它与基本表不同,是一个虚表。数据库中只存放视图的定义,而不存放视图对应的数据,这些数据仍存放在原来的基本表中。所以基本表中的数据发生变化,从视图中查询出的数据也就随之改变了。从这个意义上,视图就像一个窗口,透过它可以看到数据库中自己感兴趣的数据及其变化。

创建视图:

CREATE VIEW CS_Student
AS
SELECT sno, sname
FROM Student
WHERE Sdept='CS'

视图一经定义,就可以和基本表一样本查询、被删除。
若要求进行修改和插入操作时,仍需保证该视图只有计算机系的学生。

CREATE VIEW CS_Student
AS
SELECT sno, sname
FROM Student
WHERE Sdept='CS'
WITH CHECK OPTION;

删除视图

DROP view CS_Student

SQL 语句

SQL语句功能极强,包括数据查询(selct)、数据定义(create、drop、alter)、数据操纵(insert、update、delete)、数据控制(grant、revoke)

数据定义

  • 定义基本表
    SQL语言使用CREATE TABLE 语句定义基本表,其基本格式如下:
CREATE TABLE <表名>
(<列名> <数据基本类型> [列级完整性约束条件],
<列名> <数据基本类型> [列级完整性约束条件],
<列名> <数据基本类型> [列级完整性约束条件],
);

例:

CREATE TABLE Student
(Sno ChAR(9) PRIMARY KEY,
Sname CHAR(20) UNIQUE,
Ssex CHAR(2),
Sage SMALLINT,
Sdept CHAR(20)
);
  • 修改基本表

一般格式:

ALTER TABLE <表名>
[ADD <新列名> <数据类型> [完整性约束]]
[DROP <完整性约束>]
[MODIFY COLUMN <列名> <数据类型>]

例如:

向Student表增加“入学时间”列,其数据类型为日期型
ALTER TABLE Student ADD S_entrance DATE;

要求将年龄的数据类型改为整数
ALTER TABLE Student MODIFY COLUMN Sage INT;

增加Student表Sname必须取唯一值的约束
ALTER TABLE Student ADD UNIQUE(Sname)
  • 删除基本表
DROP TABLE <> [RESTRICTCASCADE]

若选择RESTRICT,则该表的删除是有限制条件的:欲删除的基本表不能被其他表的约束所引用(如check,foreign key等),不能有视图,不能有触发器,不能有存储过程或函数等。如果有这些依赖该表的对象,则该表不能被删除。
若选择CASCADE,则表述该表的删除没有限制条件。在删除该表的同时,相关的依赖对象,例如视图,都将被一起删除。
例如:

DROP TABLE Student CASVADE

数据查询

一般格式:

SELECT [ALL|DISTINCT] <目标表达式> [,<目标表达式>]...
FROM <表名或视图名> [, <表名或视图名>]...
[WHERE <条件表达式>]
[GROUP BY <列名> [HAVING <条件表达式>]]
[ORDER BY <列名> [ASC|DESC]];
  • 选择表中的若干列
查询名为Bill Gates的学生信息
SELECT * from Student WHERE Sname = 'Bill Gates';

查询名字中有Bill的学生信息
SELECT * from Student WHERE Sname like '%Bill%';

查询年龄在2023岁之间的学生信息
SELECT * from Student WHERE Sage BETWEEN 20 AND 23;

查询CS、MA、IS系的学生姓名和性别
SELECT Sname,Ssex from Student WHERE Sdept IN ('CS', 'IS', 'MA');

查询没有年龄信息的学生
SELECT * FROM Student WHERE Sage IS NULL;
  • order by
SELECT * FROM Student ORDER BY Sage;

按专业升序,年龄降序排列
SELECT * FROM Student ORDER BY Sdept, Sage desc;
  • limit
    主要用于查询之后要现实返回的前几条或者中间几条数据
SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset


SELECT * FROM Student LIMIT 5, 10;//检索6-15行
SELECT * FROM Student LIMIT 5;//检索前五个记录行
  • 聚集函数
总数:select count(*) as totalcount from table1;
求和:select sum(*) as sumvalue from table1;
平均:select avg(*) as avgvalue from table1;
最大:select max(*) as maxvalue from table1;
最小:select min(*) as minvalue from table1;
  • group by
查询具有相同年龄的每组人的个数
SELECT Sage, count(*) from Student group by Sage;

SELECT Sage, count(*) from Student group by Sage having count(*) >1
  • 连接查询

只有在两个表中都有相同Sno时菜返回,否则丢弃这些学生信息

SELECT Student.*, SC.*
FROM Student, SC
WHERE Student.Sno = SC.Sno

左外连接列出左边表中的所有元祖,右连接列出右表关系中的所有元祖。

SELECT Student.*, SC.*
FROM Student LEFT JOIN SC ON (Student.Sno=SC.Sno);

数据操纵

  • 插入元祖

一般格式:

INSERT 
INTO table1(field1, field2, filed3...)
VALUES(value1, value2, value3...);

例如:

INSERT INTO Student(Sno, Sname, Ssex, Sdept, Sage)
VALUES('20100913', '王明', 'M', 'CS', 23);
  • 修改数据

一般格式:

UPDATE table1
SET filed1=value1, filed2=value2
WHERE 范围;

例如:

UPDATE Student
SET Sage=22
WHERE Sno='20100913';
  • 删除数据

一般格式:

DELETE 
FROM table1
WHERE 范围;

例如:

DELETE 
FROM Student
WHERE Sno='20100913';

!设计模式

猜你喜欢

转载自blog.csdn.net/ming6383/article/details/107576519