牛客网练习知识点笔记——综合

来源:互联网 发布:嗨推学院知乎 编辑:程序博客网 时间:2024/05/17 06:56

数据结构

  1. 首先要明确前序,中序和后序的遍历顺序:  前序:父节点,左子节点,右子节点;  后序:左子节点,右子结点,父节点; 
  2. 一个5*4的矩阵,有多少个长方形?长任取两个点C(6,2)*宽任取两个点C(5,2) = 15* 10 = 150
  3. hash索引仅满足“=”、“IN”和“<=>”查询,不能使用范围查询 。因为hash索引比较的是经常hash运算之后的hash值,因此只能进行等值的过滤,不能基于范围的查找,因为经过hash算法处理后的hash值的大小关系,并不能保证与处理前的hash大小关系对应。 
  4. hash索引无法被用来进行数据的排序操作 。由于hash索引中存放的都是经过hash计算之后的值,而hash值的大小关系不一定与hash计算之前的值一样,所以数据库无法利用hash索引中的值进行排序操作。 
  5. 对于组合索引,Hash 索引在计算 Hash 值的时候是组合索引键合并后再一起计算 Hash 值,而不是单独计算 Hash 值,所以通过组合索引的前面一个或几个索引键进行查询的时候,Hash 索引也无法被利用。
  6. Hash 索引遇到大量Hash值相等的情况后性能并不一定就会比B-Tree索引高。 对于选择性比较低的索引键,如果创建 Hash 索引,那么将会存在大量记录指针信息存于同一个 Hash 值相关联。这样要定位某一条记录时就会非常麻烦,会浪费多次表数据的访问,而造成整体性能低下。
  7. next数组的求解方法是:第一位的next值为0,第二位的next值为1,后面求解每一位的next值时,根据前一位进行比较。首先将前一位与其next值对应的内容进行比较,如果相等,则该位的next值就是前一位的next值加上1;如果不等,向前继续寻找next值对应的内容来与前一位进行比较,直到找到某个位上内容的next值对应的内容与前一位相等为止,则这个位对应的值加上1即为需求的next值;如果找到第一位都没有找到与前一位相等的内容,那么需求的位上的next值即为1。
  8. .对于一个基本有序的数组,插入排序比快速排序效率更高
  9. .我们可以从给定的整齐的并且前序遍历序列创建一个二叉树
  10. 数组是将元素在内存中连续存放,由于每个元素占用内存相同,可以通过下标迅速访问数组中任何元素。但是如果要在数组中增加一个元素,需要移动大量元素,在内存中空出一个元素的空间,然后将要增加的元素放在其中。同样的道理,如果想删除一个元素,同样需要移动大量元素去填掉被移动的元素。如果应用需要快速访问数据,很少或不插入和删除元素,就应该用数组。
  11. 链表恰好相反,链表中的元素在内存中不是顺序存储的,而是通过存在元素中的指针联系到一起。比如:上一个元素有个指针指到下一个元素,以此类推,直到最后一个元素。如果要访问链表中一个元素,需要从第一个元素开始,一直找到需要的元素位置。但是增加和删除一个元素对于链表数据结构就非常简单了,只要修改元素中的指针就可以了。如果应用需要经常插入和删除元素你就需要用链表数据结构了。
  12. 三元组转置: (1)将数组的行列值相互交换 (2)将每个三元组的i和j相互交换 (3)重排三元组的之间的次序便可实现矩阵的转置
  13. Dijkstra算法用于求解图中两点间最短路径,其时间复杂度O(n^2);
  14. Floyd-Warshall算法用于求解图中所有点对之间最短路径,其时间复杂度为O(n^3);
  15. 二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。 它的算法要求是必须是顺序存储结构,必须有序排列
  16. 最短路径算法要求网中弧的权值必须为正数,但是在Dijsktra算法中,权值 不能为负的,并不是因为在实际应用中无意义,而是算法本身的适应条件不允许权值为负数。
  17. 重复利用Dijsktra算法n次即可求得每一对不同顶点间的最短路径,Dijsktra 算法的时 间复杂度为O(n 2 ),那么对此算法执行n次的时间复杂度为O(n 3 )
  18. 二叉查找数的查找速度取决于树的深度 相同节点数深度最小的是平衡二叉树
  19. 完全二叉树: 二叉树除最后一层外,每一层上的节点数均达到最大值;在最后一层上只缺少右边的若干结点。 
  20. 平衡二叉树(Balanced Binary Tree): 又被称为AVL树(有别于AVL算法),且具有以下性质:它是一 棵空树或它的左右两个 子树 的高度差的 绝对值 不超过1,并且左右两个子树都是一棵平衡二叉树。
  21. 二叉树的顺序存储就是利用数组实现的。也就是用一组连续的存储单元存放二叉树中的结点。依据二叉树的性质,完全二叉树和满二叉树采用顺序存储比较合适,树中结点的序号可以唯一地反映出结点之间的逻辑关系,这样既能够最大可能地节省存储空间,又可以利用数组元素的下标值确定结点在二叉树中的位置,以及结点之间的关系。
  22. 两个栈共享一片连续内存空间时,为提高内存利用率,减少溢出机会,应把两个栈的栈底分别设在这片内存空间的两端
  23. 前序遍历确定根节点,中序遍历确定左右子树。
  24. 我们所说的堆一般指二叉堆。二叉堆是完全二叉树或者是近似完全二叉树。
  25. 二叉堆满足二个特性: 
    1.父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值。 
    2.每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆)。
  26. B-树都是树高平衡的,任何一个结点的左右子树的高度都是相等的。
  27. 以边表示活动,以顶点表示事件的有向网称为AOE(activity on edge)网.AOE网是一个有向无环图,权值表示活动持续的时间。可以用AOE网来估计工程完成的时间。由于工程只有一个开始点和一个完成点,所以在无环路的条件下,网中只有一个入度为0的点和一个出度为0的点。路径长度是指路径上各个活动的持续时间之和,路径长度最长的路径称为关键路径
  28. n个节点则有2n个链域,除了根节点没有被lchild和rchild指向,其余的节点必然会被指到.所以 
    空链域公有2n-(n-1)=n+1; 
    非空链域有2n-(n+1)=n-1;
  29. 在定义的链表中,若只含有一个指针域来存放下一个元素地址,称这样的链表为单链表或线性链表。带链的栈可以用收集计算机存储空间所有的空闲的存储结点,是线性表。在单链表中的结点中增加一个指针域指向它的直接前件,这样的链表,就称为双向链表(一个结点中含有两个指针),也使线性链表。循环链表具有单链表的特征,但又不需要增加额外的存储空间,仅对表的链接方式稍作改变,使得对表的处理更加方便灵活,属于线性链表。二叉链表是二叉树的物理实现,是一个存储结构,不属于线性结构。
  30. 哈希查找, 就是避免比较, 直接找到位置。 比较操作只在hash冲突的时候发生, 应该挑选合适的hash算法尽量避免这种情况。
  31. 如果有向图的拓扑排序序列是唯一的时候,说明各个顶点已经排在一个线性有序的序列中,每个顶点都有唯一的前驱后继关系。这就说明有首有尾,第一个顶点入度为0,最后一个顶点出度为0。
  32. 非连通的图没有生成树。这是由生成树的定义决定的: 生成树是连通图的包含图中的所有顶点的极小连通子图。 如果原图不连通,则不可能存在包含原图中所有顶点的连通子图。
  33. 定义了数组a[4],其中a,&a,&a[0]都是数组的起始地址。但是步长有区别,也就是指向的类型不同
  34. a等同于a+0等同于&a[0],是指向数组第一个元素的指针,步长为指向的元素所占用的地址空间为sizeof(int) 。 &a也是指向数组第一个元素的指针,但其意义是指向整个数组的首地址,指向的类型为整个数组,所以其步长为4*sizeof(int)
  35. 二叉堆满足二个特性: 
    1.父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值。 
    2.每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆)

计算机网络

  1. 四种情况会发送RST包:
    1、端口未打开
    2、请求超时
    3、提前关闭
    4、在一个已关闭的socket上收到数据
  2. 其实 big endian 是指低地址存放最高有效字节( MSB ),而 little endian 则是低地址存放最低有效字节( LSB )。 所有网络协议也都是采用 big endian 的方式来传输数据的。所以有时我们也会把 big endian 方式称之为网络字节序。当两台采用不同字节序的主机通信时,在发送数据之前都必须经过字节序的转换成为网络字节序后再进 行传输。
  3. ICMP是(Internet Control Message Protocol)Internet控制报文 协议。它是TCP\IP 的一个子协议,用于在IP主机、路由 器之间传递控制消息。
  4. QoS(Quality of Service)服务质量,是网络的一种安全机制, 是用来解决网络延迟和阻塞等问题的一种技术。 在正常情况下,如果网络只用于特定的无时间限制的应用系统,并不需要QoS,比如Web应用,或E-mail设置等。但是对关键应用和多媒体应用就十分必要。当网络过载或拥塞时,QoS 能确保重要业务量不受延迟或丢弃,同时保证网络的高效运行。 
  5. MAC(Media Access Control,介质访问控制)地址,也叫硬件地址,长度是48比特(6字节),由16进制的数字组成,分为前24位和后24位: 前24位叫做组织唯一标志符(Organizationally Unique Identifier,即OUI),是由IEEE的注册管理机构给不同厂家分配的代码,区分了不同的厂家。 后24位是由厂家自己分配的,称为扩展标识符。同一个厂家生产的网卡中MAC地址后24位是不同的。
  6. cookie附带于http请求中,cookie有大小限制,用户可以主动禁止cookie
  7. 802.1Q协议和ISL区别:
    两者的功能都是实验交换机之间传输多个vlan信息的
    ISL是Cisco的一个私有协议,与EIGRP一样,只有Cisco的设备才能够使用,与其他厂商不兼容
    它们的封装方式不一样。802.1Q是在不破坏原数据帧的情况下在中间插入了区分Vlan的信息;而ISL相当于在外面再打了一层包.在原数据帧的头尾都加了东西
  8. Host: HTTP服务器的IP地址或者域名
    User-Agent: 告诉HTTP服务器, 客户端使用的操作系统和浏览器的名称和版本.
    Accept-Charset:浏览器申明自己接收的字符集,这就是本文前面介绍的各种字符集和字符编码,如gb2312,utf-8
    Referer: 提供了Request的上下文信息的服务器,告诉服务器我是从哪个链接过来的
    cookie:用来记录用户信息,表明用户身份的。
  9. 500-内部服务器错误 
    400-bad request(错误请求) 
    301-永久重定向 
    302 暂时重定向
    403- IP address rejected (IP地址被拒绝) 
    404-Not  found(没有找到)
  10. 每一层的协议如下: 
    物理层: 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
  11. IPX网络的地址长度为80位 ,由两部分构成,第一部分是32位的网络号,第二部分是48位的节点号。
  12. SMTP英文全称是Simple Mail Transfer Protocol即简单邮件传输协议,用于邮件的发送
  13. NAT是英文“网络地址转换”的缩写,址转换又称地址翻译,用来实现私有地址和公用网络地址之间的转换,地址转换的提出为解决IP地址紧张的问题提供了一个有效途径
  14. 在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
  15. IP地址类型  
    最初设计互联网络时,为了便于寻址以及层次化构造网络,每个IP地址包括两个标识码(ID),即网络ID和主机ID。同一个物理网络上的所有主机都使用同一个网络ID,网络上的一个主机(包括网络上工作站,服务器和路由器等)有一个主机ID与其对应。IP地址根据网络ID的不同分为5种类型,A类地址、B类地址、C类地址、D类地址和E类地址。   
    1. A类IP地址   
    一个A类IP地址由1字节的网络地址和3字节主机地址组成,网络地址的最高位必须是“0”, 地址范围从1.0.0.0 到126.0.0.0。可用的A类网络有126个,每个网络能容纳1亿多个主机。   
    2. B类IP地址   
    一个B类IP地址由2个字节的网络地址和2个字节的主机地址组成,网络地址的最高位必须是“10”,地址范围从128.0.0.0到191.255.255.255。可用的B类网络有16382个,每个网络能容纳6万多个主机 。   
    3. C类IP地址   
    一个C类IP地址由3字节的网络地址和1字节的主机地址组成,网络地址的最高位必须是“110”。范围从192.0.0.0到223.255.255.255。C类网络可达209万余个,每个网络能容纳254个主机。   
    4. D类地址用于多点广播(Multicast)。   
    D类IP地址第一个字节以“lll0”开始,它是一个专门保留的地址。它并不指向特定的网络,目前这一类地址被用在多点广播(Multicast)中。多点广播地址用来一次寻址一组计算机,它标识共享同一协议的一组计算机。   
    5. E类IP地址   
    以“llll0”开始,为将来使用保留。 
  16. 物理层中继系统:转发器(repeater)。 
    数据链路层中继系统:网桥或桥接器(bridge)。 
    网络层中继系统:路由器(router)。 
    网桥和路由器的混合物:桥路器(brouter)。 
    网络层以上的中继系统:网关(gateway)。
  17. SSL(Secure Sockets Layer 安全套接层),是https采用的加密通道 ,IPSec(InternetProtocolSecurity)用以提供公用和专用网络的端对端加密和验证服务。 PGP(Pretty Good Privacy),是一个基于RSA公钥加密体系的邮件加密系统 ,SET是安全电子交易协议,是为了在互联网上进行在线交易时保证信用卡支付的安全而设立的一个开放的规范。
  18. 在A类地址中,10.0.0.0到10.255.255.255是私有地址(所谓的私有地址就是在互联网上不使用,而被用在 局域网络 中的地址)。 
    在B类地址中,172.16.0.0到172.31.255.255是私有地址。 
    在C类地址中,192.168.0.0到192.168.255.255是私有地址。 
  19. 我国对独立型STP设备要求其信令链路数不得小于 512
  20. TCP是面向连接的服务;三次握手(建立连接)和四次挥手(关闭连接);使用滑动窗口机制进行流量控制;TCP要保证在所有可能的情况下使得所有的数据都能够被投递,当你关闭一个socket时,主动关闭一端的socket将进入TIME_WAIT状态,而被动关闭一方则转入CLOSED状态,这的确能够保证所有的数据都被传输。  
    1)首先A B端的TCP进程都处于established状态, 当A的应用程序传送完报文段,就会去 主动关闭 连接。A 会停止发送报文段(但是还会接收),并向B发送[FIN = 1,seq=u]数据,之后进入FIN-WAIT-1状态; 
    2)B接收到A发送的请求之后,会通知应用进程A已经不再发送数据,B会向A发送ACK确认数据[ACK=1,seq=v,ack=u+1 ],B进入  CLOSE-WAIT状态,  A接收到B发送的数据之后,A进入FIN-WAIT-2状态;此时A到B方的连接已经关闭了。 
    3)当B的应用进程发现自己也没有数据需要传送,B应用进程就会发出 被动关闭 的请求,B此时向A发送[FIN=1,ACK=1,seq=w,ack=u+1]数据,并且进入LAST-ACK状态;【所以D不对】 
    4)A接收到B发送的数据之后,向B发送确认数据[ACK =1,seq=u+1,ack=w+1],进入TIME-WAIT状态,等待2MSL之后关闭连接进入CLOSED状态;B接收到A发送的确认之后进入CLOSED状态。B到A方的连接关闭
  21. 路由算法修改路由表的基本目的是将最好路由信息添加到路由表中,路由的 好坏是由路由算法根据自己获得的路由信息计算出来的。对于每一条路由, 路由算法产生一种权值来表示路由的好坏。通常情况下,这种权值越小,该路径越好。 路由权的计算可能基于路径某单一特性计算,也可能基于路径多种属性进行计算。 
  22. IEEE 802.3u (100Base-T)是100兆比特每秒以太网的标准。100Base-T技术中可采用3类传输介质,即100Base-T4、100Base-TX和100Base-FX,它采用4B/5B编码方式。
  23. DNS域名劫持:
    如果dns把你想要解析的地方,解析为错误的另一个地方,这种现象叫做dns劫持
    如果知道该域名的真实IP地址,则可以直接用此IP代替域名后进行访问
    可以通过更换其它DNS解决域名劫持问题
  24.  在帧中继网络中,帧中继通过LMI协议监控PVC的状态
  25. POP3协议用于接收或下载邮件,默认端口110 ;DNS是域名解析的系统,默认端口53 ;DHCP是动态主机配置协议,默认端口67(服务器);SMTP协议用于传输或发送邮件,默认端口25
  26. 网络交换机的主要功能包括物理编址、网络拓扑结构、错误校验、帧序列以及流控。目前交换机还具备了一些新的功能,如对VLAN(虚拟局域网)的支持、对链路汇聚的支持,甚至有的还具有防火墙的功能。交换机工作在数据链路层,属于2层设备,工作在3层的路由器具备路由转发功能
  27. cookie和session:
    cookie数据存放在客户的浏览器上,session数据放在服务器上;
    session是针对每一个用户的,变量的值保存在服务器上,用一个sessionID来区分是哪个用户session变量;
    保存这个session id的方式可以采用cookie;
  28. 网络延迟:指从报文开始进入网络到它开始离开网络之间的时间
  29. http协议是无状态的,因此需要cookie,session等对客户端浏览器做标明

操作系统

  1. 库函数

    九大类

    (1)I/O 函数。包括各种控制台I/O、缓冲型文件I/O和UNIX式非缓冲型文件I/O操作。
    需要的包含文件:stdio.h
    例如: getchar,putchar,printf,scanf,fopen,fclose,fgetc,fgets,fprintf,fsacnf,fputc,fputs,fseek,fread,fwrite等。
    (2)字符串、内存和字符函数。包括对字符串进行各种操作和对字符进行操作的函数。
    需要的包含文件:string.h、mem.h、ctype.h或string.h
    例如:用于检查字符的函数:isalnum,isalpha,isdigit,islower,isspace等。用于字符串操作函数:strcat,strchr,strcmp,strcpy,strlen,strstr等。
    (3)数学函数。包括各种常用的三角函数、双曲线函数、指数和对数函数等。
    需要的包含文件:math.h
    例如:sin,cos,exp(e的x次方),log,sqrt(开平方),pow(x的y次方)等。
    (4)时间、日期和与系统有关的函数。对时间、日期的操作和设置计算机系统状态等。
    需要的包含文件:time.h
    例如:time返回系统的时间;asctime返回以字符串形式表示的日期和时间。
    (5)动态存储分配。包括"申请分配"和"释放"内存空间的函数。
    需要的包含文件:alloc.h或stdlib.h
    例如:calloc,free,malloc,realloc等。
    (6)目录管理。包括磁盘目录建立、查询、改变等操作的函数。
    (7)过程控制。包括最基本的过程控制函数。
    (8)字符屏幕和图形功能。包括各种绘制点、线、圆、方和填色等的函数。
    (9)其它函数。
  2. 32位系统中short占 2 字节,int 、float、long 都占 4 字节,double 和long long 占8 字节
  3. 并发进程执行的相对速度是与进程度策略有关
  4. 引用和指针的区别:

    c++中的引用与指针的区别

        ★ 相同点:

        1. 都是地址的概念;

        指针指向一块内存,它的内容是所指内存的地址;引用是某块内存的别名。

        ★ 区别:

        1. 指针是一个实体,而引用仅是个别名;

        2. 引用使用时无需解引用(*),指针需要解引用;

        3. 引用只能在定义时被初始化一次,之后不可变;指针可变;

        引用“从一而终”

        4. 引用没有 const,指针有 const,const 的指针不可变;

        5. 引用不能为空,指针可以为空;

        6. “sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身(所指向的变量或对象的地址)的大小;

        typeid(T) == typeid(T&) 恒为真,sizeof(T) == sizeof(T&) 恒为真,但是当引用作为成员时,其占用空间与指针相同(没找到标准的规定)。

        7. 指针和引用的自增(++)运算意义不一样;

        8.引用必须初始化,指针不必
  5. 线程调度的叙述:
    1)调用线程的sleep()方法,可以使比当前线程优先级低的线程获得运行机会
    2)当有比当前线程的优先级高的线程出现时,高优先级线程将抢占CPU并运行
    3)一个线程由于某些原因进入阻塞状态,会放弃CPU
    4)分时调度模型是让所有线程轮流获得CPU使用权
  6. yield()暂时交出 cpu 控制权,从 running 状态转为 runnalbe 状态,但是仍有 可能被调度,sleep()线程指定休眠一段时间,wait()在其他线程调用此对 象的 notify()或 notifyAll()方法时才能继续执行 线程中 sleep()方法和 yeild()方法的主要区别: 
    1.sleep()方法会给其他线程运行的机会,而不管其他线程的优先级,因此会给较 低优先级的线程运行的机会;yeild()方法只会给优先 级相同的或者比自己高的线程运行的机会.  
    2.sleep()方法声明抛出 InterruptionException 异常,而 yeild()方法没有声明 抛出任何异常.  
    3.sleep()方法比 yeild()方法具有更高的可移植性.  
    4.sleep()方法使线程进入阻塞状态,而 yeild()方法使线程进入就绪状态. 当前运行的线程可以调用另一个线程的 join()方法,当前运行的线程将转到阻 塞状态,直到另一个线程运行结束,它才会恢复运行. join()有两种形式:public void join()和 public void join(long timeout)可 以设置阻塞的时间
  7. 常用的精简指令集 RISC 微处理器包括 DECAlpha 、 ARC 、 ARM 、 AVR 、 MIPS 、 PA-RISC 、 PowerArchitecture( 包括 PowerPC) 和 SPARC 等。 复杂指令 CISC如X86
  8. 创建进程步骤:申请进程块、为进程分配内存资源 、初始化进程块 、将进程块链入就绪队列
  9. 最短寻道时间优先算法(SSTF) Shortest Seek Time First 。该算法选择这样的进程,其要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短,该算法可以得到比较好的吞吐量,但却不能保证平均寻道时间最短。其缺点是对用户的服务请求的响应机会不是均等的,因而导致响应时间的变化幅度很大。在服务请求很多的情况下,对内外边缘磁道的请求将会无限期的被延迟,有些请求的响应时间将不可预期。
  10. 批处理系统主要指多道批处理系统,由于多道程序能交替使用CPU,提高了CPU及其他系统资源的利用率,同时也提高了系统的效率。多道批处理系统的缺点是延长了作业的周转时间,用户不能进行直接干预,缺少交互性,不利于程序的开发与调试。
  11. ThreadLocal主要作用是数据的独立,保证了并发时线程的安全性,因为每个线程都会创建一个独立的副本,它并不继承Thread类也不实现Runnable接口。
  12. 硬盘的存取访问时间分为三个部分: 寻道时间Ts,旋转延迟时间Tr和传送时间Tt
  13. 缓冲区技术用到了缓冲区,而缓冲区的引入是为了缓和CPU和I/O设备的不匹配,减少对CPU的中断频率,提高CPU和I/O设备的并行性。  
  14. 固态硬盘读写速度更快、固态硬盘的功耗上要低于传统硬盘、固态硬盘的寿命没有传统硬盘长
  15. 在请求分页式存储管理中,页面的调入、调出只能在内存和对换区之间进行。
  16. block越大,inode越少,适合存储文件多而小的文件系统
  17. 多道程序的特点:(1)多道;(2)宏观上并行;(3)微观上串行。 
    多道程序的优点:(1)CPU利用率高;(2)设备利用率高;(3)系统吞吐量大。
  18. Linux进程间通信:管道、信号、消息队列、共享内存、信号量、套接字(socket) 
    Linux线程间通信:互斥量(mutex),信号量,条件变量 
    Windows进程间通信:管道、消息队列、共享内存、信号量   (semaphore)   、套接字(socket)
    Windows线程间通信:互斥量(mutex),信号量(semaphore)、临界区(critical section)、事件(event)
  19. 僵尸进程:一个子进程在其父进程还没有调用wait()或waitpid()的情况下退出。这个子进程就是僵尸进程。 
    孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。 
    僵尸进程将会导致资源浪费,而孤儿则不会。
  20. 批处理操作系统的目的是提高系统资源利用率
  21. 自动机是   有限状态机   (FSM)的数学模型。   逐个读取输入中的符号,直到被完全耗尽(把它当作有一个字写在其上的   磁带   ,通过自动机的读磁头来读取它;磁头在磁带上前行移动,一次读一个符号)。一旦输入被耗尽,自动机被称为“停止”了。 
    依赖自动机停止时的状态,称呼这个自动机要么是“接受”要么“拒绝”这个输入。如果停止于“接受状态”,则自动机“接受”了这个字。在另一方面,如果它停止于“拒绝状态”,则这个字被“拒绝”。自动机接受的所有字的集合被称为“这个自动机接受的语言”。

问答

1、数据库以及线程发生死锁的原理及必要条件,如何避免死锁
产生死锁的原因主要是:
(1) 因为系统资源不足。
(2) 进程运行推进的顺序不合适。
(3) 资源分配不当等。
产生死锁的四个必要条件:
(1)互斥条件:一个资源每次只能被一个进程使用。
(2)请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3)不可剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4)循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
避免死锁:
  死锁的预防是通过破坏产生条件来阻止死锁的产生,但这种方法破坏了系统的并行性和并发性。
  死锁产生的前三个条件是死锁产生的必要条件,也就是说要产生死锁必须具备的条件,而不是存在这3个条件就一定产生死锁,那么只要在逻辑上回避了第四个条件就可以避免死锁。
  避免死锁采用的是允许前三个条件存在,但通过合理的资源分配算法来确保永远不会形成环形等待的封闭进程链,从而避免死锁。该方法支持多个进程的并行执行,为了避免死锁,系统动态的确定是否分配一个资源给请求的进程。
  预防死锁:具体的做法是破坏产生死锁的四个必要条件之一。

2、面向对象的三个基本元素,五个基本原则
三个基本元素:
1. 封装: 封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。
2. 继承: 继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。
3. 多态: 多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。
C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。
五个基本原则:
单一职责原则(Single-Resposibility Principle):一个类,最好只做一件事,只有一个引起它的变化。单一职责原则可以看做是低耦合、高内聚在面向对象原则上的引申,将职责定义为引起变化的原因,以提高内聚性来减少引起变化的原因。
开放封闭原则(Open-Closed principle):软件实体应该是可扩展的,而不可修改的。也就是,对扩展开放,对修改封闭的。
Liskov替换原则(Liskov-Substituion Principle):子类必须能够替换其基类。这一思想体现为对继承机制的约束规范,只有子类能够替换基类时,才能保证系统在运行期内识别子类,这是保证继承复用的基础。
依赖倒置原则(Dependecy-Inversion Principle):依赖于抽象。具体而言就是高层模块不依赖于底层模块,二者都同依赖于抽象;抽象不依赖于具体,具体依赖于抽象。
接口隔离原则(Interface-Segregation Principle):使用多个小的专门的接口,而不要使用一个大的总接口。

3、windows内存管理的机制以及优缺点
分页存储管理基本思想:
用户程序的地址空间被划分成若干固定大小的区域,称为“页”,相应地,内存空间分成若干个物理块,页和块的大小相等。可将用户程序的任一页放在内存的任一块中,实现了离散分配。
分段存储管理基本思想:
将用户程序地址空间分成若干个大小不等的段,每段可以定义一组相对完整的逻辑信息。存储分配时,以段为单位,段与段在内存中可以不相邻接,也实现了离散分配。
段页式存储管理基本思想:
分页系统能有效地提高内存的利用率,而分段系统能反映程序的逻辑结构,便于段的共享与保护,将分页与分段两种存储方式结合起来,就形成了段页式存储管理方式。
在段页式存储管理系统中,作业的地址空间首先被分成若干个逻辑分段,每段都有自己的段号,然后再将每段分成若干个大小相等的页。对于主存空间也分成大小相等的页,主存的分配以页为单位。
段页式系统中,作业的地址结构包含三部分的内容:段号      页号       页内位移量
程序员按照分段系统的地址结构将地址分为段号与段内位移量,地址变换机构将段内位移量分解为页号和页内位移量。
为实现段页式存储管理,系统应为每个进程设置一个段表,包括每段的段号,该段的页表始址和页表长度。每个段有自己的页表,记录段中的每一页的页号和存放在主存中的物理块号。

4、C++有哪些数据类型?为什么long和int都是4字节?
C++的数据类型有字符型(char)、布尔型(bool)、短整型(short)、整型(int)、长整型(long)、浮点型(float)、双精度型(double)等类型
首先并不是所有的long和int都是4字节的,在C++中规定int的长度是大于等于short的长度,小于等于long的长度,并且要大于2字节,在16位CPU以及单片机中,int是2字节的,而在32位CPU及以上的CPU中int是4字节的;
在C++中long的长度应该是大于等于int的长度,且最小为4字节,在32位CPU中long为4字节,在64位机上long为8字节长度

5、JAVA和C++的区别是什么?分别用在什么情景比较好?
1.C++ 和java相比,只有标准的容器和算法,它的标准里没有网络,GUI以及应用框架这些内容,因此需要第三方的库来支持。而java的标准库包含的内容很丰富,有GUI支持,网络支持,多线程支持,以及完整的应用框架。从 功能上讲:
                       MFC + C++=java (windows)
                 或:
                       Qt + C++=java(linux)
2.C++中有指针可以直接操纵内存,这点是java做不到的,c++中的引用和java中的引用不同。C++中的引用是编译时的一种隔离措施,也就是说,C++程序运行时,并没有引用存在。而java中的引用在程序运行期间,执行栈中存储引用,而堆中存储引用所执行的对象。因此java中的引用更像C++中的指向动态内存的指针。java中有垃圾回收机制,C++需要显式的释放。但是C++本省完备的机制和强大的功能可以让程序员编写出自动释放动态内存的程序。
3.C++比java强大,灵活,快速。C++的执行需要借助C运行时,而java执行需要借助JVM,而jvm要借助C运行时。当然.net 的C++ 和java的理念一致。

0 0