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