1、选择第一题:
Linux进程间通讯方式有以下几种:
1、管道(pipe),流管道(s_pipe)和有名管道(FIFO)
2、信号(signal)
3、消息队列
4、共享内存
5、信号量
6、套接字(socket)
7、文件锁
2、选择第二题:
请问下列代码的输出是多少()
#include <stdio.h> int main() { int m []={1,2,3,4,5,6,7,8,9,0}; int(*p)[4]=(int(*)[4])m; printf(“%”,p[1][2]); return 0; }
考点:
本题出现错误的原因主要是代码int(*p)[4]=(int(*)[4])m;
理解错误。
相关知识点:
代码 | 含义 |
---|---|
int a; | 整型 |
int *a; | 指向整型数的指针 |
int **a; | 指向指针的的指针 |
int a[10]; | 包含10个整型数的数组 |
int *a[10]; | 有10个指针的数组(指针数组) |
int (*a)[10]; | 指向有10个整型数数组的指针 |
(int (*)[4])m; | 表示以数组指针重新组织数组m,将其每4位划为一组 |
题目中声明的是:int(p)[4]=(int()[4])m;
这是一个指向有4个整型数数组的指针。我们理解为该二维数组的列为4。
根据以上理解可知 m 为{1,2,3,4}
5,6,7,8}
{9,0, , }
所以 P[1][2] 指向 m 的第 2 行第 3 列,答案为 7 。
3、选择第三题:
ARP协议实现的功能是:IP地址到物理地址的解析。
4、选择第四题:
死锁简介:
*什么是死锁?互斥锁是保护临界资源被线程间(或进程间)互斥的访问临界资源,当一个线程得到锁不释放时另一个线程申请时必须等待。当多个线程因为竞争资源而造成的一种僵局(互相等待),如果不施以援手,这些进程将永远等待。
*死锁产生的原因:1、系统资源不足:系统中所拥有的资源其数量不足以满足线程运行的需要,使得在运行过程中,因争夺资源而陷入僵局。
2、线程间推进顺序非法:线程间在运行过程中,申请和释放的顺序不合法。
3、资源分配不当。
*死锁产生的四个条件:1、互斥条件:在一段时间内,某资源只能被一个线程所占用,若此时其它线程申请则必须等待,直到当前线程用完释放。
2、不可剥夺条件:线程在已获得的资源未使用完之前不能被抢占,只能自己使用完后自己释放。
3、请求和保持条件:线程已拥有一个资源时它又申请新的资源,若新资源被其它线程占用,当前线程则会阻塞等待,但其会保持不放自己获得的资源。
4、循环等待条件:在发生死锁时,必然存在一个循环链,即线程集合{T0,T1,T2,…,Tn}中T0正在等待T1占用的资源,T1正在等待 T2占用的资源,···,Tn正在等待Tn占用的资源。
*解决死锁问题:1、预防死锁
破坏死锁的必要条件,不能破坏互斥条件,线程之间访问临界资源必须互斥访问。
2、避免死锁
使用银行家算法。 每一个线程进入系统时,它必须声明在运行过程中,所需的每种资源类型最大数目,其数目不应超过系统所拥有每种资源总量,当线程请求一组资源系统必须确定有足够资源分配给该进程,若有在进一步计算这些资源分配给进程后,是否会使系统处于不安全状态,不会(即若能在分配资源时找到一个安全序列),则将资源分配给它,否则等待。
3、死锁检测与恢复
对于资源:抢占资源恢复,回滚到安全状态恢复;对于进程,杀死进程恢复。
5、选择第五题:
Java语言中,如果"xyz"没有被创建过,String s =new String(“xyz”);创建了几个string object?( 2个:一个在堆中,另一个在字符串常量池中 )
6、选择第六题:
定义以下泛型:Internal sealed class DictionaryStringKey:Dictionary{}
哪个选项不会抛出异常( C )
A.Type t=typeof(Dictionary<,>); Object o=Activator.CreateInstance(t);
B.Type t=typeof(DictionaryStringKey<>); Object o=Activator.CreateInstance(t);
C.Type t=typeof(DictionaryStringKey<Guid>); Object o=Activator.CreateInstance(t);
7、选择第七题:
本题为数据库唯一索引问题,相关知识点总结如下:
约束和索引, 前者是用来检查数据的正确性,后者用来实现数据查询的优化,目的不同。
唯一性约束与唯一索引有所不同:
(1)创建唯一约束会在Oracle中创建一个Constraint,同时也会创建一个该约束对应的唯一索引。
(2)创建唯一索引只会创建一个唯一索引,不会创建Constraint。
也就是说其实唯一约束是通过创建唯一索引来实现的。
在删除时这两者也有一定的区别:
删除唯一约束时可以只删除约束而不删除对应的索引,所以对应的列还是必须唯一的,而删除了唯一索引的话就可以插入不唯一的值。
1.主键约束(PRIMARY KEY)1) 主键用于唯一地标识表中的每一条记录,可以定义一列或多列为主键。
2) 是不可能(或很难)更新。
3) 主键列上没有任何两行具有相同值(即重复值),不允许空(NULL)。
4) 主健可作外健,唯一索引不可。
2.唯一性约束(UNIQUE)1) 唯一性约束用来限制不受主键约束的列上的数据的唯一性,用于作为访问某行的可选手段,一个表上可以放置多个唯一性约束。
2) 只要唯一就可以更新。
3) 即表中任意两行在 指定列上都不允许有相同的值,允许空(NULL)。
4) 一个表上可以放置多个唯一性约束。
3.唯一索引(INDEX)
创建唯一索引可以确保任何生成重复键值的尝试都会失败。
唯一性约束和主键约束的区别:
(1)唯一性约束允许在该列上存在NULL值,而主键约束的限制更为严格,不但不允许有重复,而且也不允许有空值。
(2)在创建唯一性约束和主键约束时可以创建聚集索引和非聚集索引,但在 默认情况下主键约束产生聚集索引,而唯一性约束产生非聚集索引
8、选择第八题:
请指出下列代表有几处错误。
#include<stdio.h> class A { public: virtual void f(){} public : A() { f(); } }; class B1:public A() //classB1:publicA { private: char *_s; public: B1() { _s=new char[1024]; } private: void f() { delete _s[]; //delete[] _s; _s=NULL; } } //缺少";" class B2:public A { private: int * _m; public: B2() { _m=new int(2016); } private: virtual void f() { delete _m; _m=NULL; } } //缺少";" int main() { A*a1=new B(); //A*a1 = new B1(); A*a2=new C; //A*a2 = new B2; delete a1; delete a2; return 0; }
9、选择第九题:
TCP相关知识总结:
TCP和UDP的区别:
1.TCP面向链接,面向连接意味着两个使用TCP的应用在彼此交换数据之前必须通过三次握手先建立一个TCP连接。在一个TCP中仅有两方彼此通信,多播和广播不能用于TCP。UDP是不可靠的传输,传输不需要建立链接,可以应用多播和广播实现一对多的通信。
2.可靠性:TCP提供端到端的流量控制,对收到的数据进行确认,采用超时重发,对失序的数据进行重新排序等机制保证数据通信的可靠性。而UDP是一种不可靠的服务,接收方可能不能收到发送方的数据报。
3.TCP是一种流模式的协议,UDP是一种数据报模式的协议。进程的每个输出操作都正好产生一个UDP数据报,并组装成一份待发送的IP数据报。TCP应用程序产生的全体数据与真正发送的单个IP数据报可能没有什么联系。TCP会有粘包和半包的现象。
4.效率上:速度上,一般TCP速度慢,传输过程中需要对数据进行确认,超时重发,还要对数据进行排序。UDP没有这些机制所以速度快。数据比例,TCP头至少20个字节,UDP头8个字节,相对效率高。组装效率上:TCP头至少20个字节,UDP头8个字节,系统组装上TCP相对慢。
5.用途上:用于TCP可靠性,http,ftp使用。而由于UDP速度快,视频,在线游戏多用UDP,保证实时性。
注意!TCP发送的数据是有序的,接收端最后整成有序的,但接受的顺序不一定是有序的,会对其再次排序,从而保证结果的有序性,即有序递交,不是有序到达
。
TCP三次握手:发送方向接受方发送SYN,进入SYN_SENT阶段。接受方收到后若接受连接请求,向发送方发送SYN ACK,进入SYN_RCVD阶段。发送方收到后,向接受方发送ACK,进入ESTABLISHED阶段。接受方收到ACK后进入ESTABLISHED阶段。为什么是三次握手而不是两次或是四次:三次握手是保证连接的最少次数。如果是两次连接:不能有效防止洪范攻击,没有半连接队列,无法连接数量进行控制;假定当前网络状况不佳,A向B发送了SYN请求连接,此时因网络原因阻塞造成超时。A重发SYN,B收到后建立起连接并传输数据后关闭,此时之前阻塞的SYN再次到达B,B会以为A又要建立连接。
四次挥手:发送方向接受方发送FIN,进入FIN_WAIT1阶段。接受方收到后向发送方发送ACK,进入CLOSE_WAIT阶段。发送方收到后进入FIN_WAIT2阶段。此时链路进入到一个半双工阶段,接受方仍可以向发送方发送数据。接受方准备好关闭连接后,向发送方发送FIN,进入LASR_ACK阶段。发送方收到后,向接受方发送ACK,进入TIME_WAIT阶段,等待2MSL后关闭连接。接受方收到ACK后就进入了CLOSED阶段。为什么是四次挥手?TCP协议是一个全双工协议,当收发双方中一方关闭了连接,进入半双工状态,仍能向对方发送数据。为什么要等待2MSL?1.确保最后一个ACK能到达接受方。若发生超时,可以及时补发ACK2.让延时的报文在网络中消失。在2MSL内不允许一个新的连接化身建立,因为这样之前延时的报文会发送到新的连接上,发生混乱。
10、选择第十题:
若一棵二叉树具有10个度为2的结点,5个度为1的结点,则度为0的结点个数是(11)
公式:在任意一棵二叉树中,若终端结点的个数为n0,度为2的结点数为n2,则n0=n2+1
11、选择第十一题:
NumberList是一个顺序容器,以下代码执行后,NumberList里的元素依次是什么?
List<int> NumberList = new List<int>(){2,4,1,3,5}; for(int i = 0;i<NumberList.Count;++i) { int v = NumberList[i]; if(v%2 = = 0) { NumberList.Remove(v);//删除的是元素,而非下标 } }
分析:
初始时{2,4,1,3,5}
,v=NumberList[0]=2;
2是偶数,删除2。
此时数组变为{4,1,3,5}
,所以 v=NumberList[1]=1;
时 1为奇数,NumberList不变。v=NumberList[2]=3
3为奇数,NumberList不变。v=NumberList[3]=5
5为奇数,NumberList不变。
最后NumberList中的元素为{4,1,3,5}
12、选择第十二题:
64位Linux系统里,下面几个sizeof的运行结果是(a=4,b=8,c=8
)
int intValue = 1024; char str[] = “Tencent”; const char* ch = str; sizeof(intValue) = __a__; sizeof(str) = ___b__; sizeof(ch) = __c___;
知识整理:
* | 64位操作系统 | 32位操作系统 |
---|---|---|
数据类型 | 占用字节 | 占用字节 |
char | 1byte | 1byte |
char*(指针变量) | 8byte | 4byte |
short int | 2byte | 2byte |
int | 4byte | 4byte |
unsigned int | 4byte | 4byte |
float | 4byte | 4byte |
double | 8byte | 8byte |
long | 8byte | 4byte |
long long | 8byte | 8byte |
unsigned long | 8byte | 4byte |