1. 简单描述HTTPS工作原理。
2. UDP用户数据报的部首十六进制表示是:06 9D 00 35 00 1C 77 81,试求源端口、目的端口、用户数据报的总长度、数据部分长度,这个用户数据报是从哪一端发给哪一端?使用UDP这个服务器程序是什么?
源端口:1693 (前4个字节06 9D)
目的端口:53 (00 35)
用户数据报总长度:28 字节(00 1C,其中首部占8字节)
数据部分长度:20 字节
这个用户数据报是:从客户发送给服务器
服务器程序:TFTP
解析
3. SSH加密是什么?
SSH是一种协议标准,用于在网络主机之间进行加密的一种协议,其目的是实现安全远程登录以及其它安全网络服务。
SSH 仅仅是一协议标准,其具体的实现有很多,既有开源实现的 OpenSSH,也有商业实现方案。使用范围最广泛的当然是开源实现 OpenSSH。
- 对称加密:加密和解密使用一套密钥;
- 对称加密加密级别高,但是服务端和客户端的密钥一样的情况下,一方密钥丢失就会导致整个加密系统安全性不复存在。
- 非对称加密,加密和解密使用公钥和私钥;服务端将公钥公布出去,客户端请求时会获取公钥,使用公钥加密后的将数据返回,服务端使用私钥解密,这样私钥就只保存在服务端,增加了安全性。
4. 简述一下网络字节序和主机字节序,并说明为什么要采用不同的字节序?
网络字节序:网络字节序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。网络字节序采用big endian排序方式。
主机字节序:不同的机器主机字节序不相同,与CPU设计有关,数据的顺序是由cpu决定的,而与操作系统无关。我们把某个给定系统所用的字节序称为主机字节序(host byte order)。比如x86系列CPU都是little-endian的字节序。
由于这个原因不同体系结构的机器之间无法通信,所以要转换成一种约定的数序,也就是网络字节顺序。
5. 进程有哪几种状态。
- 就绪状态 当进程已分配到除CPU以外的所有必要的资源,只要获得处理机便可立即执行,这时的进程状态称为就绪状态。
- 执行状态 当进程已获得处理机,其程序正在处理机上执行,此时的进程状态称为执行状态。
- 阻塞状态 正在执行的进程,由于等待某个事件发生而无法执行时,便放弃处理机而处于阻塞状态。引起进程阻塞的事件可有多种,例如,等待I/O完成、申请缓冲区不能满足、等待信件(信号)等。
进程在并发执行时为了保证结果的可再现性,各进程执行序列必须加以限制以保证互斥地使用临界资源,相互合作完成任务。多个相关进程在执行次序上的协调称为进程同步。用于保证多个进程在执行次序上的协调关系的相应机制称为进程同步机制。
所有的进程同步机制应遵循下述四条准则:
- 空闲让进
当无进程进入临界区时,相应的临界资源处于空闲状态,因而允许一个请求进入临界区的进程立即进入自己的临界区。 - 忙则等待
当已有进程进入自己的临界区时,即相应的临界资源正被访问,因而其它试图进入临界区的进程必须等待,以保证进程互斥地访问临界资源。
3、有限等待
对要求访问临界资源的进程,应保证进程能在有限时间进入临界区,以免陷入“饥饿”状态。 - 让权等待
当进程不能进入自己的临界区时,应立即释放处理机,以免进程陷入忙等。
6. 操作系统中进程调度策略有哪几种?
先来先服务调度算法:是一种最简单的调度算法,每次调度是从进程队列中选择一个最先进入该队列的进程,为之分配资源投入运行。该进程一直运行完成或发生某事件而阻塞后才继续处理后面的进程。优先级调度算法:有短进程优先级、高优先权优先级、高响应比优先级等,按照优先级来执行就绪进程队列中的调度。 (高响应比:(等待时间+服务运行时间)/服务运行时间)
时间片轮转调度算法:系统还是按照先来先服务调度就绪进程,但每次调度时,CPU都会为队首进程分配并执行一个时间片(几ms~百ms)。执行时间片用完后计时器即产生时钟中断,停止该进程并将它送到队尾,其他依次执行。这样保证系统能在给定的时间内执行所有用户进程的请求。
多级反馈调度算法:前面都有局限性,综合-> 多级反馈调度算法则不必事先知道各进程所需的执行时间,而且还可以满足各类型进程的需要,因而它是目前被公认的一种较好的进程调度算法。
7. 什么是线程安全?
线程安全是多线程编程时的计算机程序代码中的一个概念。在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况。
8. 什么是死锁?
死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
9. 输入一个整数求该整数的二进制表达式中有多少个1。如10,其二进制表达式为1010,有两个1,因此输出2。
通过模2判断最后一位是否为1,为1则COUNT++,然后除2(相当与将该数右移一位),循环;最终求出结果。 实现如下:(C语言)
#include<stdio.h>
void main() {
int i,count=0;
scanf("%d",&i); //输入一个数i。
do {
//判断末尾是否为1
if((i%2)!=0){
count++; //末尾为1则count++
}
i=i/2; //i除2,相当于右移一位
}while(i>=1);
printf("1的个数为%d\n",count); //输出结果
}
10. 链式存储结构和顺序存储结构的区别?
- 链表存储结构的内存地址不一定是连续的,但顺序存储结构的内存地址一定是连续的;
- 链式存储适用于在较频繁地插入、删除、更新元素时,而顺序存储结构适用于频繁查询时使用。
11. 将字符串进行反序排列,输入 I Love you,输出ouy oveL I。
在这里插入代码片
12. 什么是this指针?有什么作用,具备什么特点?
this指针是C++语言为成员函数提供的一个隐含对象指针,它不能被显式声明。this指针是一个局部量,局于某个对象。不同的对象调用同一个成员函数时,编译器根据this指针来确定应该引用哪一个对象的数据成员。
- 只能在成员函数中使用,在全局函数、静态成员函数中都不能使用 this 。
- this 指针是在成员函数的开始前构造,并在成员函数的结束后清除 。
- this 指针会因编译器不同而有不同的存储位置,可能是械、寄存器或全局变量 。
- this 是类的指针 。
- 因为 this 指针只有在成员函数中才有定义,所以获得一个对象后,不能通过对象使用 this 指针,所以也就无法知道一个对象的 this 指针的位置。 不过,可以在成员函数中指定this 指针的位置 。
- 普通的类函数(不论是非静态成员函数,还是静态成员函数)都不会创建一个函数表来保存函数指针,只有虚函数才会被放到函数表中。
13. 简述使用继承的规则。
- 子类中对父类构造函数的调用规则
- 如果不显式指定,子类中的构造函数会默认调用父类中的无参构造
- 如果父类中有多个构造函数,可以使用“super(参数列表)”的格式显式地调用父类中指定构造函数
- 子类中对父类函数的覆写规则
- 子类覆写父类中的函数时,访问权限只能扩大,不能减小
- 父类中private权限的函数无法被子类覆写
14. 实现一个线程安全的单例模式,Java,C#或者C++,或者任选其一。
public class Singleton {
2 private static Singleton instance;
3 private Singleton (){
4 }
5 public static Singleton getInstance(){ //对获取实例的方法进行同步
6 if (instance == null){
7 synchronized(Singleton.class){
8 if (instance == null)
9 instance = new Singleton();
10 }
11 }
12 return instance;
13 }
14
15 }
public class Singleton {
2 private static Singleton sin=new Singleton(); ///直接初始化一个实例对象
3 private Singleton(){ ///private类型的构造函数,保证其他类对象不能直接new一个该对象的实例
4 }
5 public static Singleton getSin(){ ///该类唯一的一个public方法
6 return sin;
7 }
8 }