面试题1

1.CentOS7和CentOS6的区别

1)初始化(init)系统不同

系统功能 CentOS6 CentOS7
init系统 Sysvinit Systemd

Linux操作系统的系统首先会从BIOS开始,接下来进入boot loader,由bootloader载入内核,进行内核初始化。内核初始化的最后一步就是启动pid为1的init进程,这个进程是系统的第一个进程,它负责产生其他所有用户进程。
Init系统能够定义、管理和控制init进程的行为,它负责组织和运行许多独立或相关的初始化工作(因此被成为init系统),从而让计算机系统进入某种用户预定的运行模式。
预定的运行模式:通常有8种运行模式,即运行模式0-7和S、s
0:关机
1:单用户模式
6:重启
SysVinit运行非常良好,概念简单清晰,它主要依赖于Shell脚本,这决定了它的最大弱点:启动太慢

Systemd主要的设计目标是克服sysvinit固有的缺点,提高系统启动速度

2)文件系统不同

系统功能 CentOS6 CentOS7
文件系统 ext3\ext4 xfs

ext3支持的最大16TB文件系统和最大2TB文件,支持32,000个子目录
ext4分别支持1EB的文件系统,以及16TB的文件,支持无限数量的子目录

1EB = 1024PB,1PB = 1024TB,1TB = 1024GB
3)防火墙不同

系统功能 CentOS6 CentOS7
防火墙 iptabls firewalld

iptables防火墙模型是静态的,每次修改都要求防火墙完全重启
firewalld提供了支持网络/防火墙区域定义网络连接以及接口安全等级的动态防火墙管理工具
4)其他

系统功能 CentOS6 CentOS7
桌面系统 GNOME 2.x GNOME 3.X
内核版本 2.6.x-x 3.10.x-x
文件结构 /bin,/sbin,/lib,/lib64在根目录下 /bin,/sbin,/lib,/lib64移到/usr下
主机名 /etc/sysconfig/network /etc/hostname

参考网站:CenOS6与CentOS7的区别

2.栈和队列的区别

栈是后进先出,栈的插入和删除都是在尾部进行的
队列是先进先出,队列的插入在尾部,删除在头部

3.什么场景用过栈

1)逆序输出
2)语法检查,符号成对出现
3)数制转换
    将十进制的数转换成2-9的任意进制的数

参考博客:栈的使用场景

4.归并排序的时间复杂度

分治算法的应用,无论是最坏,最佳还是平均情况下,归并排序的时间复杂度都是O(nlogn)

总时间=分解时间+解决问题时间+合并时间 分解时间就是把一个待排序序列分解成两序列,时间为一常数,时间复杂度o(1).
解决问题时间是两个递归式,把一个规模为n的问题分成两个规模分别为n/2的子问题,时间为2T(n/2).
合并时间复杂度为o(n)。总时间T(n)=2T(n/2)+o(n).这个递归式可以用递归树来解,其解是o(nlogn)
引用自:归并排序时间复杂度

5.大O是什么意思?

大O是一种渐进符号,用来表示渐进复杂度

6.除了大O,还有其他的符号吗?

(1)Θ(西塔):紧确界。 相当于”=”,给定了一个确界

(2)O (大欧):上界。 相当于”<=”,表示最坏的情况

(3)o(小欧):非紧的上界。 相当于”<”

(4)Ω(大欧米伽):下界。 相当于”>=”,表示最好的情况

(5)ω(小欧米伽):非紧的下界。 相当于”>”

参考博客:渐进符号

7.有哪些哈希函数?

1)RS

public long RSHash(String str)  
   {  
      int b     = 378551;  
      int a     = 63689;  
      long hash = 0;  
      for(int i = 0; i < str.length(); i++)  
      {  
         hash = hash * a + str.charAt(i);  
         a    = a * b;  
      }  
      return hash;  
   }  

字符值加上a乘上之前的哈希值,再改变a=a*b

2)JS,位操作的哈希函数

public long JSHash(String str)  
   {  
      long hash = 1315423911;  
      for(int i = 0; i < str.length(); i++)  
      {  
         hash ^= ((hash << 5) + str.charAt(i) + (hash >> 2));  
      }  
      return hash;  
   }  

3)DBJ,目前公布的最有效的哈希函数

public long DJBHash(String str)  
   {  
      long hash = 5381;  
      for(int i = 0; i < str.length(); i++)  
      {  
         hash = ((hash << 5) + hash) + str.charAt(i);  
      }  
      return hash;  
   }  

想知道更多哈希函数,见:常见的哈希函数

8.位图

1)位图概念:采用比特位表示对应的元素存在或者不存在

2))用位图实现数据库索引
如果用户查询的列的基数非常的小, 即只有的几个固定值,如性别、婚姻状况、行政区等等。要为这些基数值比较小的列建索引,就需要建立位图索引。

对于性别这个列,位图索引形成两个向量,男向量为10100…,向量的每一位表示该行是否是男,如果是则位1,否为0,同理,女向量位01011。

RowId 1 2 3 4 5
1 0 1 0 0
0 1 0 1 1

对于婚姻状况这一列,位图索引生成三个向量,已婚为11000…,未婚为00100…,离婚为00010…。

RowId 1 2 3 4 5
已婚 1 1 0 0 0
未婚 0 0 1 0 1
离婚 0 0 0 1 0

  当我们使用查询语句“select * from table where Gender=‘男’ andMarital=“未婚”;”的时候 首先取出男向量10100…,然后取出未婚向量00100…,将两个向量做and操作,这时生成新向量00100…,可以发现第三位为1,表示该表的第三行数据就是我们需要查询的结果。

RowId 1 2 3 4 5
1 0 1 0 0
and
未婚 0 0 1 0 1
结果 0 0 1 0 0

3)位图索引适合场景
1.位图索引适合只有几个固定值的列,如性别、婚姻状况、行政区等等,而身份证号这种类型不适合用位图索引。
2。位图索引适合静态数据,而不适合索引频繁更新的列。

参考博客:数据库常见索引解析

9.布隆过滤器的缺点

布隆过滤器不一定能表示存在,但一定能表示不存在
因为有一个字符串经过多个哈希函数映射哈希值,一个没有插入到布隆过滤器的字符串映射的所有哈希值可能被已经插入的字符串映射过了,它并并没有被插入到布隆过滤器里,但是却能查到它存在,所以布隆过滤器表示存在是不准准确的;但它表示不存在是确定的

10.进程和线程

10.1 进程和线程的区别

1)进程是资源分配的最小单位,线程是程序执行的最小单位
2)进程由自己独立的地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段,堆栈段和数据段
线程是共享进程中的数据的,使用相同的地址空间,CPU切换一个进程的花费远比进程要小的多,同时创建一个线程的开销也比进程要小
3)线程之间的通信更方便,同一进程下的线程共享全局变量,静态变量等数据,而进程之间的通信需要以IPC方式
4)多进程程序更健壮,多线程程序只要有一个线程挂掉,整个进程也就挂掉了,而一个进程挂掉并不会对另一个进程造成影响,因为进程有自己独立的地址空间

10.2 进程间通信方式

1)匿名管道

管道是一种半双工的通信方式,数据只能单向流动,而且智能在具有亲缘关系的进程间使用

2)命名管道

命名管道也是半双工的通信方式,但是它允许无亲缘关系进程间通信

3)信号量

信号量是一个计数器,可以用来控制多个进程对共享资源的访问,它通常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段

4)消息队列

消息队列是由消息组成的链表,存放在内核中并由消息队列标识符标识,消息队列克服了信号传递信息少,管道智能承载无格式字节流以及缓冲区大小受限等缺点

5)信号

信号用于通知接收进程某一事件发生

6)共享内存

共享内存就是映射某一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问,共享内存是最快的IPC方式,它是针对其他进程间的通信方式运行效率低而专门设计的,它往往与其他通信机制,如信号量配合使用,来实现进程间的同步和通信

7)套接字

套接口也是一种进程间的通信机制,与其他通信机制不同的是它可以用于不同机器间的进程通信

10.3 线程间通信方式

1)锁机制

1.1 互斥锁:提供了以排它方式阻止数据结构被并发修改的方法
1.2 读写锁:允许多个线程同时读共享数据,而对写操作互斥
1.3条件变量:可以以原子的方式阻塞进程,直到某个特定条件为真为止,对条件测试是在互斥锁的保护下进行的,条件变量始终与互斥锁一起使用

2)信号量机制

包括无名线程信号量与有名线程信号量

3)信号机制

类似于进程间的信号处理

线程间通信的主要目的是用于线程同步,所以线程没有进程通信中用于数据交换的通信机制

11.内核态与用户态

内核态:控制计算机的硬件资源,并提供上层应用程序运行的环境
CPU可以访问内存所有数据,包括外围设备,硬盘,网卡,CPU也可以将自己从一个程序切换到另一个程序

用户态:上层应用程序的活动空间,应用程序的执行必须依托于内核提供的资源
只有受限的访问内存,且不允许访问外围设备,占用CPU的能力被剥夺,CPU资源可以被其他程序获取

系统调用:为了使上层应用能够访问到这些资源,内核为上层应用提供访问的接口

12.http响应结构

响应报文
状态行 版本号 状态码 状态码描述
响应头部
响应正文

13.HTTP协议版本

HTTP/0.9:只接受GET一种请求方法,没有在通信中指定版本号,且不支持请求头,由于该版本不支持POST方法,因此客户端无法向服务器传递太多信息。
HTTP/1.0:第一个在通信中指定的版本好,至今被广泛采用,特别是代理服务器中
HTTP/1.1:当前版本号,持久连接被默认采用,并能很好的配合代理服务器工作,还支持以管道方式在同时发送多个请求,以便降低线路负载,提高传输速度。

1.1与1.0的区别

1.长连接短连接

HTTP/1.0默认使用短连接,每对请求/响应都使用一个新的连接

短连接是由服务器主动断开连接,当服务器发送完数据之后会发送FIN数据包,此时客户端发送ACK对FIN进行回应,等客户端发送FIN给服务器,服务器发送ACK给客户端,到此TCP才断开,客户端TCP连接释放,但是服务器端TCP会进入Time_wait状态,进入Time_wait原因是不能保证对方收到最后的ACK(主动关闭连接的一方会进入TIME_WAIT状态)
建立连接——数据传输——关闭连接……建立连接——数据传输——关闭连接

短连接优点
管理起来比较简单,存在的连接都是有用的连接,不需要额外的控制手段
短连接缺点
如果客户端请求频繁,将会在TCP建立连接和释放连接操作上耗费太多实践和带宽

time_wait状态存在的原因
1.可靠地实现TCP全双工连接的终止
主动关闭连接的一端发送FIN后进入time_wait,是为了等待接收对方的ACK,如果ACK丢失了,对方将重新发送FIN
2.允许老的重复segment在网络中消逝
TCP segment 可能由于路由器异常而“迷途”,在迷途期间,TCP发送端可能因确认超时而重发这个segment,迷途的segment在路由器修复后也会被送到最终目的地,这个迟到的迷途segment到达时可能会引起问题。

HTTP/1.1默认使用长连接
建立连接——数据传输……(保持连接)……数据传输——关闭连接

长连接优点
1.减少CPU及内存的使用,因为不需要经常的建立及关闭连接,当然高峰并发时CPU及内存也是比较多的;
2.减少网络的堵塞,因为减少了TCP请求;
3.减少后续请求的响应时间,因为此时不需要建立TCP,也不需要TCP握手等过程;
4.当发生错误时,可以在不关闭连接的情况下进行提示;
长连接的缺点
1.可能会损害服务器的整体性能,如apache的长连接时间的长短,直接影响到服务器的并发数
2.安全性较差

14.路由机制

常见的路由算法
1.LS算法
原理:当前节点向与自己直接相连的路由器发送数据,其他相连的路由器在接受的数据后做出相应,当前路由器通关计算来回的时间来判断出最佳路由,路由后判断是否为目标路由。
2.距离向量算法
路由器周期性地向其相邻路由器广播自己知道的路由信息,用以通知相邻路由器自己可以到达的网络以及到达该网络的距离。相邻路由器可以根据收到的路由信息修改和刷新自己的路由表。 优点是算法简单容易实现。缺点是慢收敛问题,路由器的路径变化需要像波浪一样从相邻路由器传播出去,过程缓慢。

你可能感兴趣的:(Linux)