面试全记录1 —— 东北大学

Q1:我的简历上写了一个小项目,Java+Apache 实现建议的QQ聊天工具,然后老师问我应用层是用的什么协议?

聊天软件哪有什么应用层协议,在这个聊天软件中的每一个用户,就像是记得之前看到一个博客说微信TCP和UDP协议都用了,然后我就这么说了,然后老师就问我,你这是传输层的协议,那你应用层呢????应用层?啥协议?HTTP?不对啊,我这不是网页啊,SMTP?这不是扯吗,我是聊天软件,反正这时候我就在那里跟老师猜起来了,但是后来出来查资料我才想到,哪有什么应用层协议,有应用层服务的才需要用到应用层协议,而我的聊天软件只是相当于两个不同的客户打电话,我所要做的事情,就是让他们俩能够连接起来,这就足够了,所以用Socket编程,把IP地址和端口拼接在一起,这两个就能进行会话了

Q2:在你的这个聊天软件中,你是怎么创建线程的,能说说你的编程过程吗?

这个问题真是问的有点无厘头啊,

Socket为什么要放在SocketThread里面来操作?为什么还需要专门给Socket创建一个线程?

Socket本身和thread没有关系,但是我们的主线程是一直在等待接收信息和等待登录用户连接的,所以为了防止创建Socket啥的阻塞我们的线程。

面试全记录1 —— 东北大学_第1张图片

每有一个新用户登录,我们就会给这个用户创建一个线程,分配其相应的内存及其他东西,

Q3:你学过密码学啊,那你说说椭圆曲线解决了数论里的什么问题

现代密码学协议的安全性多数是建立在数学难题基础之上,比如:大整数因子分解、有限域上的离散对数问题。通常情况下,这些算法不存在多项式时间问题,但随着攻击算法地不断改进,要求使用这些安全协议的算法密钥不断的加大,才得保证其使用的安全性。但密钥的加大增加了算法的复杂性,因此,找到一种能抵抗各种常见攻算法,运算量小,速度快的离散对数密码算法非常重要,椭圆曲线密码算法正好满足这种需要。论文回顾了常用公钥密码体制协议,相对于目前应用的其它密码体制,椭圆曲线密码体制有很大的优势

Q4:你C++跟Java都学过啊,那你能说说这二者的区别吗?

现代密码学协议的安全性多数是建立在数学难题基础之上,比如:大整数因子分解、有限域上的离散对数问题。通常情况下,这些算法不存在多项式时间问题,但随着攻击算法地不断改进,要求使用这些安全协议的算法密钥不断的加大,才得保证其使用的安全性。但密钥的加大增加了算法的复杂性,因此,找到一种能抵抗各种常见攻算法,运算量小,速度快的离散对数密码算法非常重要,椭圆曲线密码算法正好满足这种需要。论文回顾了常用公钥密码体制协议,相对于目前应用的其它密码体制,椭圆曲线密码体制有很大的优势

补充:c++为什么比Java快?

因为JIT编译器运行占用的是用户程序运行时间,具有很大的时间压力,它能提供的优化手段也严重受制于编译成本。如果编译速度不能达到要求,那用户将在启动程序或程序的某部分察觉到重大延迟,这点使得JIT编译器不敢随便引入大规模的优化技术,而编译的时间成本在静态优化编译器中并不是主要的关注点。

其次,Java语言是动态的类型安全语言,这意味着需要由虚拟机来确保程序不会违反语言语义或访问非结构化内存。在实现层面上看,这就意味着虚拟机必须频繁进行动态检查,如对象实例访问时检查空指针、数组元素访问时检查上下界范围、类型转换时检查继承关系等等。对于这类程序代码没有明确写出的检查行为,尽管编译器会努力进行优化,但是总体上仍然要消耗着不少的运行时间。

Java语言中虽然没有virutal关键字,但是使用虚方法的频率却远远大于C/C++语言,这意味着运行时对方法接收者进行多态选择的频率要远远大于C/C++语言,也意味着JIT编译器在进行一些优化,如方法内联时难度要远大于C/C++的静态优化编译器。

Java语言是可以动态扩展的语言,运行时加载新的类可能改变程序类型继承关系,这使得很多全局的优化都难以进行,因为编译器无法看见程序的全貌,许多全局优化措施都只能以激进优化的方式来完成,编译器不得不时刻注意并随着类型变化而在运行是撤消或重新进行一些优化。

Java语言中的对象内存分配都是堆上进行,只有方法中的局部变量才在栈上分配。而C/C++的对象则有多种内存分配方式,既可能在堆上分配,也可能在栈上分配,如果可以把线程私有的对象在栈上分配,将可以减轻内存回收的压力,也不需要考虑内存屏障方面的问题。另外,C/C++中主要由用户程序代码来回收分配的内存,这就不存在无用对象筛选的过程,因此效率上(仅指运行效率,排除了开发效率)也垃圾收集机制要高。

你可能感兴趣的:(面试)