笔试题总结

  1. 云栖社区>
  2. 博客>
  3. 正文

笔试题总结

迎着风 2018-09-28 21:29:00 浏览791
展开阅读全文

32位机器上,以下结构的sizeof(P)为

struct A {

 int a;

 char b;

 int c;

 char d;

}

struct P {

 struct A w[2];

 short b;

 struct A* p;

} 

/*考察结构体对齐和填充:

结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如果不是,编译器会自动在成员间填充。*/

- struct A { 
  int a;                            //4 bytes 
  char b;                        //1 bytes 
  //char pad[3]               //3 bytes 

int c;                           //4 bytes

  char d;                       //1 bytes 

  //char pad[3]              //3 bytes 

  }                            // total = 16 bytes 

  

  /* P中有结构体A的成员,但是计算时按照A中数据类型确定的*/ 

  

struct P {

struct A w[2];    // 2 * 16 bytes

  short b;            //2 bytes 

  //char pad[2]    //2 bytes 

struct A* p;      //4 bytes

}  // total = 40 bytes

下列关于const和#define定义常量的区别,说法不正确的有?

  • define宏是在预处理阶段展开。const常量是编译运行阶段使用
    
  • 宏没有类型,不做任何类型检查,仅仅是展开。const常量有具体的类型,在编译阶段会执行类型检查
    
  • define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存。const常量会在内存中分配(可以是堆中也可以是栈中)
    
  • const定义和#define定义的常量在程序运行过程中只有一份拷贝
    

    A,正确,#define定义的宏是在预处理阶段进行替换的,const常量是在编译、运行阶段进行使用的。

    注意是仅仅的字符串替换,并不会检查其合法性。

    预处理阶段做了的任务:
    1:将头文件中的内容(源文件之外的文件)插入到源文件中
    2:进行了宏替换的过程(简单的字符串替换),定义和替换了由#define指令定义的符号
    3:删除掉注释的过程,注释是不会带入到编译阶段
    4:条件编译

    B,正确,所有的宏替换只是简单的字符串替换,注意是字符串替换,所以并不会检查其合法性,而const定义的常量依然是内置类型等,所以会对其进行类型安全检查。

    C,正确,宏定义在程序中使用了几次在预处理阶段就会被展开几次,并不会增加内存占用,但是宏定义每展开一次,代码的长度就要发生变化(所以有利必有弊啊!),而const常量也会为其分配内存(如果是动态申请空间肯定就是堆中了)。

    D,错误,const定义的常量只有一次拷贝没毛病,而define定义的变量在内存中并没有拷贝,因为所有的预处理指令都在预处理时进行了替换。

img_023de640ea6d686ac035f74cdf131c04.png
01.png

考点:栈空间内存是从高地址向低地址值分配的。

s3,s4是堆内存地址,与s1,s2无法作对比。

除非s1,s2,s3,s4都取地址,那么s1的地址值是最大的。此地址值对应于虚拟内存地址,非实际物理地址。


img_29a0dfcf60f9fdb3a7c62e056b17fd8e.png
02.png

解答:


img_9ce848580587807e417d44df6303d13b.png
03.png

题目:


img_1cf0285a80b7c7b079b6698305d8cfdf.png
04.png

解析:


img_fefebc5cb727c3b71156a808d0485b4c.png
05.png

题目:

img_c29e19e7b21d2ffa3f8f4f023dfe5c2b.png
06.png

解析:


img_9a009c7fbbd3e47b081e8c2f7a0cd855.png
07.png

在TCP/IP中,ICMP属于哪一层协议?**

答:ICMP协议是IP层的附属协议,是介于IP层和TCP层之间的协议,一般认为属于IP层协议。IP协议用它来与其他主机或路由器交换错误报文和其他的一些网络情况。在ICMP包重携带了控制信息和故障恢复信息。

ICMP报文有两种类型,即ICMP差错报告报文和ICMP询问报文。

灰度等级为256级,分辨率为1024*1024的显示器,至少需要的帧缓存容量为()

1024*1024*8/8=1M
第一个8是因为256是2的8次方 除以8是因为要转换字节和二进制位

设在一棵度数为3的树中,度数为3的结点数有2个,度数为2的结点数有1个,度数为1的结点数有2个,那么度数为0的结点数有( )个。

答:根据图论中树的公式:顶点数 - 1 = 边数,设出度为0的结点有y个,列方程求解。其中顶点数为2+1+2+x,边数为2 x 3+1 x 2+2 x 1。解出来得 y = 6

500张骨牌整齐地排成一行,按顺序编号为1、2、3、……、499、500。第一次拿走所有奇数位置上的骨牌,第二次再从剩余骨牌中拿走奇数位置上的骨牌,以此类推。请问最后剩下的一张骨牌的编号是?

答:

第一次后剩下250个偶数:2,4,6,8......498,500(2的倍数留下,2的一次方)

第二次后剩下125个偶数:4,8,12,16......496,500(4的倍数留下,2的二次方)

第三次后剩下62个偶数:8,16,24....488,496(8的倍数留下,2的三次方)

..........................................................................

第八次后留下的1个偶数:256(2的八次方倍数留下)

所以答案选C

Linux 文件权限一共 10 位长度,从前数第 5-7 位表示的内容是

答:第一位表示是文件或者目录,2~4是用户权限, 5~7是组权限 ,8~10是其他用户权限

关于TCP可靠数据传输服务的论述,正确的是

答:

A.错误。不一定需要超时才重传,出错了也可以重传;      

B.错误。错在于这个时间间隔不是固定的。超时时间间隔 RTO,如果太短可能导致大量不必要的重传,如果太长则会导致性能下降;所以超时时间间隔 RTO是通过往返时间RTT算出来的。TCP 采用了一个高度动态的算法,来不断的调整时间间隔,总之超时时间间隔不是固定的~      

C.错误。TCP是面向连接的,提供可靠服务的,所以需要对乱序到达的分组进行确认以及重排。      

D.正确。如果发送方收到连续3条的同一个序列号的ACK,那么就会启动快速重传机制,不需要等到timeout,把这个ACK对应的发送包重新发送一次。

引入二叉线索树的目的是()

答:加快查找结点的前驱或后继的速度。

用邻接表表示图进行广度优先遍历时,通常是采用()来实现算法的

答:记得广度优先用队列,深度优先用栈。

下面有关内核线程和用户线程说法错误的是?

  • 用户线程因 I/O 而处于等待状态时,整个进程就会被调度程序切换为等待状态,其他线程得不到运行的机会
    
  • 内核线程只运行在内核态,不受用户态上下文的影响。
    
  • 用户线程和内核线程的调度都需要经过内核态。
    
  • 内核线程有利于发挥多处理器的并发优势,但却占用了更多的系统开支。
    

解析:

线程通常被定义为一个进程中代码的不同执行路线。从实现方式上划分,线程有两种类型:“用户级线程”和“内核级线程”。 用户线程指不需要内核支持而在用户程序中实现的线程,其不依赖于操作系统核心,应用进程利用线程库提供创建、同步、调度和管理线程的函数来控制用户线程。这种线程甚至在象 DOS 这样的操作系统中也可实现,但线程的调度需要用户程序完成,这有些类似 Windows 3.x 的协作式多任务。另外一种则需要内核的参与,由内核完成线程的调度。其依赖于操作系统核心,由内核的内部需求进行创建和撤销,这两种模型各有其好处和缺点。用户线程不需要额外的内核开支,并且用户态线程的实现方式可以被定制或修改以适应特殊应用的要求,但是当一个线程因 I/O 而处于等待状态时,整个进程就会被调度程序切换为等待状态敏感词线程得不到运行的机会;而内核线程则没有各个限制,有利于发挥多处理器的并发优势,但却占用了更多的系统开支。 Windows NT和OS/2支持内核线程。Linux 支持内核级的多线程 。

大整数845678992357836701转化成16进制表示,最后两位字符是?

  • AB
    
  • EF
    
  • 8B
    
  • 9D
    

答: 利用同余关系做。845678992357836701除以4余数为1( 845678992357836700能被4整除 ),在16进制数中,决定除以4后余数的只有最后一位(前面位都是16的倍数,自然被4整除),算算也只有D(13)除以4余1,所以选D.

Java中用正则表达式截取字符串中第一个出现的英文左括号之前的字符串。比如:北京市(海淀区)(朝阳区)(西城区),截取结果为:北京市。正则表达式为()

答:

(?=Expression)

顺序肯定环视,表示所在位置右侧能够匹配Expression

(?=()*就是匹配正括号, 因为(需要转义, 所以要再前面加斜线

前面的.*?是非贪婪匹配的意思, 表示找到最小的这样的匹配即可。

否则, 因为后面也有括号, 会匹配到 北京市(海淀区)(朝阳区)

编程:今年的第几天?输入年,月,日,计算该天是本年的第几天。

tips:这里的重点主要就是有关闰年的判断?在二月的天数 + 1;

img_87f104d1314afa527ed981b79139e71a.png
04.png

以下代码执行后输出结果为:

public class Test {
 
        public static Test t1 = new Test();
 
        {
 
             System.out.println("blockA");
 
        }
 
        static
 
        {
 
            System.out.println("blockB");
 
        }
 
        public static void main(String[]
args)
 
        {
 
            Test t2 = new Test();
 
        }
 
 }

截图部分:


img_6bffb297be63c9b0c55fd1433eaa4730.png
07.png

当mian方法中运行到Test t2 = newTest();时, 首先是执行静态变量和静态代码块,然后才会到新建对象的构造代码块和构造方法(且构造代码块要优先于构造方法)。即执行顺序为:静态变量>静态代码块>构造代码块>构造方法。
静态变量就是 public static Test t1 = new Test(); 此时这行代码会调用构造代码块,即输出blockA; 注意构造代码块只有新建对象 Test() 才会执行。
接着执行静态代码块,输出 blockB; 注意静态代码块之会执行一次。
然后继续就到了新建对象 t2 了,此时是先执行构造代码块,输出 blockA; 接着再执行构造方法,无输出。
综上,选 A。

输出:blockA blockB blockA

问:计算机系统中判别是否有中断事件发生应是在()

答:应该发生在执行完一条指令后。

问:某系统中有 3 个并发进程,都需要同类资源 4 个,试问该系统不会发生死锁的最少资源数是:

答:注意极限情况问题,极限情况是每个并发进程都已经有了三个资源,此时一共有9个,那么只需要再有一个资源就可以使一个进程完成操作任务,释放资源之后循环。所以需要的最少资源数是 10 个。

问:下面有关共享内存,说法不正确的是?

答:共享内存不提供同步 参考 JMM java内存模型

尽管每个进程都有自己的内存地址,不同的进程可以同时将同一个内存页面映射到自己的地址空间中,从而达到共享内存的目的。(这句话是正确的)

问:假设如下代码中,若t1线程在t2线程启动之前已经完成启动。代码的输出是()

public static void main(String[]args)throws Exception {
 
        final Object obj = new Object();
 
        Thread t1 = new Thread() {
 
            public void run() {
 
                synchronized (obj) {
 
                    try {
 
                        obj.wait();
 
                        System.out.println("Thread 1 wake up.");
 
                    } catch (InterruptedException e) {
 
                    }
 
                }
 
            }
 
        };
 
        t1.start();
 
        Thread.sleep(1000);//We assume thread 1 must start up within 1 sec.
 
        Thread t2 = new Thread() {
 
            public void run() {
 
                synchronized (obj) {
 
                    obj.notifyAll();
 
                    System.out.println("Thread 2 sent notify.");
 
                }
 
            }
 
        };
 
        t2.start();
 
}

以下 A 代表 t1,B 代表 t2。
当B调用 obj.notify/notifyAll 的时候,B 正持有 obj 锁,因此,A1,A2,A3 虽被唤醒,但是仍无法获得 obj 锁。直到B退出 synchronized 块,释放 obj 锁后,A1,A2,A3 中的一个才有机会获得锁继续执行。当B调用obj.notify/notifyAll 的时候,B正持有 obj 锁,因此,A1,A2,A3虽被唤醒,但是仍无法获得 obj 锁。直到 B 退出 synchronized 块,释放 obj 锁后,A1,A2,A3 中的一个才有机会获得锁继续执行。

tips :

因为T1中调用了obj.wait(),线程T1进入阻塞状态,释放了锁,所以T2就拿到了锁

问:在java类设计中,类的成员变量要求仅仅能够被同一package下的类访问,请问应该使用下列哪个修饰词()

答:tips:当只要求类成员变量要求只是在同一个 package 包下的时候,不需要任何修饰符,注意被 protected 修饰的属性和方法只能被类本身的方法和子类访问,即使子类在不同的包中也可以访问。

问:下面有关forward和redirect的描述,错误的是()

答:redirect默认将产生301 Permanently moved的HTTP响应。注意这里需要了解的是回答错误的条目。

301 是永久跳转,302 是暂时跳转。 redirect 默认是 302 暂时性跳转。

问:如果您想列出当前目录以及子目录下所有扩展名为“.txt”的文件,那么您可以使用的命令是()

答:find -name “*.txt”

一个类中含有抽象方法,则这个类为抽象类,一个类为抽象类,可以没有抽象方法。

问:在使用mkdir命令创建新的目录时,在其父目录不存在时先创建父目录的选项是

答:- p

问:在HTTP协议的网络编程中,经常会涉及到『长连接』、『短连接』、『长轮询』等概念,关于这些以下哪种说法不正确:

答:tips:注意回答的答案是不正确的部分。此处回答应是 在网络调用量很大的时候,短连接因为资源占用少,因而相对长连接性能更好。

频繁创建 Socket 性能并不好

网友评论

登录后评论
0/500
评论
迎着风
+ 关注