您的位置 首页 java

Java面试大全(十二)

第七章 JavaWeb 高级

1、Listener、Filter 和Interceptor

 web.xml的加载顺序是:【Context-Param】->【Listener】->【Filter】->【Servlet】,而同个类型之间的实际程序调用的时候的顺序是根据对应的Mapping的顺序进行调用。

1. Servlet
①init () 方法进行初始化:
在Servlet的生命周期中,仅执行一次init()方法,它是在服务器装入Servlet时执行的,可以配置服务器,以在启动服务器或客户机首次访问Servlet 时装入Servlet。无论有多少客户机访问Servlet,都不会重复执行init();
②Servlet 调用 service() 方法来处理客户端的请求:
它是Servlet的核心,每当一个客户请求一个HttpServlet 对象,该对象的Service() 方法就要调用,而且传递给这个方法一个“请求”(ServletRequest)对象和一个“响应”(ServletResponse)对象作为参数。在HttpServlet 中已存在Service()方法。默认的服务功能是调用与HTTP请求的方法相应的do功能。
③Servlet 通过调用 destroy() 方法终止(结束):
仅执行一次,在服务器端停止且卸载Servlet 时执行该方法,有点类似于C++ delete 方法。一个Servlet 在运行service() 方法时可能会产生其他的线程,因此需要确认在调用destroy() 方法时,这些线程已经终止或完成。
Servlet 的生命周期的话还需要加上在init() 之前有一个加载和实例化Servlet(反射机制)的过程。

2、Listener 
监听器,从字面上可以看出listener 主要用来监听时用。通过listener 可以监听web 服务器中某一个执行动作,并根据其要求作出相应的响应。通俗的语言说就是在application,session,request三个对象创建消亡或者往其中添加修改删除属性时自动执行代码的功能组件。

3.Filter
过滤器,是一个可以复用的代码片段,可以用来转换HTTP请求、响应和头信息。Filter不像Servlet,它不能产生一个请求或者响应,它只是修改对某一资源的请求,或者修改从某一的响应。

4.Interceptor
拦截器,是在面向切面编程的,就是在你的service 或者一个方法,前调用一个方法,或者在方法后调用一个方法。比如动态代理就是拦截器的简单实现,在你调用方法前打印出字符串(或者做其它业务逻辑的操作),也可以在你调用方法后打印出字符串,甚至在你抛出异常的时候做业务逻辑的操作。

5.配置方式
servlet、filter、listener是配置到web.xml中,interceptor不配置到web.xml中,struts的拦截器配置到struts.xml中,spring的拦截器配置到spring.xml中。

生命周期:
1、servlet:servlet的生命周期始于它被装入web服务器的内存时,并在web服务器终止或重新装入servlet时结束。servlet一旦被装入web服务器,一般不会从web服务器内存中删除,直至web服务器关闭或重新结束。
(1)、装入:启动服务器时加载Servlet的实例; 
(2)、初始化:web服务器启动时或web服务器接收到请求时,或者两者之间的某个时刻启动。初始化工作有init()方法负责执行完成; 
(3)、调用:从第一次到以后的多次访问,都是只调用doGet()或doPost()方法; 
(4)、销毁:停止服务器时调用destroy()方法,销毁实例。 

2、filter:(一定要实现javax.servlet包的Filter接口的三个方法init()、doFilter()、destroy(),空实现也行) 
(1)、启动服务器时加载过滤器的实例,并调用init()方法来初始化实例; 
(2)、每一次请求时都只调用方法doFilter()进行处理; 
(3)、停止服务器时调用destroy()方法,销毁实例。

3、listener:类似于servlet和filter
web.xml 的加载顺序是:context- param -> listener -> filter -> servlet 

4、interceptor:以struts的拦截器为例,加载了struts.xml以后,初始化相应拦截器。当action请求来时调用intercept方法,服务器停止销毁interceptor。  

2、谈谈你对 ajax 的认识?

 Ajax全称Asynchronous javascript and XML,既异步的js 和 XML。Ajax是不是编程语言,是一种常见交互式网页的网页开发技术,异步刷新技术,用来在当前页面响应不同的请求。
同步机制:请求发出方需等到接收方给出响应后,才能处理其他业务;
异步机制:请求发出方在发出请求后,不需要等到接收方给出响应,就可以处理其他业务;
(同步机制是为了保持数据的一致性;异步为了提高效率,减少等待时间,从而提高用户体验)

ajax包含的技术(基于一下技术的组合):
1.基于web标准,HTML和CSS;
2.使用DOM进行动态展示和交互;
3.使用XMLHttpRrequest进行来和服务器进行异步通信(异步查询、检索)
4.使用javascript绑定和调用

Ajax的原理:
简单来说通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,然后用javascript来操作DOM而更新页面。  

 Ajax的优点:
1.页面无刷新,用户体验好;
2.异步通信,具有更加迅速的响应能力;
3.Ajax的原则是"按需所取",可以最大程度的减少冗余请求和相应对服务器造成的负担;
4.基于标准化的被广泛支持的技术,不需要下载插件和小程序。

Ajax的缺点:
1.Ajax不支持浏览器返回按钮;
2.安全问题,Ajax暴露了与服务器交互的细节;
3.对搜索引擎(浏览器)的支持较弱;
4.破坏了程序的异常机制;
6.一些手持设备(如手机、PDA等)现在还不能很好的支持ajax;
7.如果用户禁用了JS,网站就取不到数据;
8.不易于调试.  

3、jsonp 原理

 jsonp 的最基本的原理是:动态添加一个<script>标签, 使用 script 标签的 src 属性没有跨域的限制的特点实现跨域。首先在客户端注册一个 callback, 然后把 callback 的名字传给服务器。此时,服务器先生成 json 数据。然后以 javascript 语法的方式,生成一个function , function 名字就是传递上来的参数 jsonp。最后将json 数据直接以入参的方式,放置到 function 中,这样就生成了一段 js 语法的文档,返回给客户端。客户端浏览器,解析 script 标签,并执行返回的 javascript 文档,此时数据作为参数,传入到了客户端预先定义好的 callback 函数里。  

4、说说你对 JSON 的理解

 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于标准 JavaScript 的一个子集,是一个 Js 对象或数组结构的字符串。

JSON 有三类数据
1. 单个数据
有 number, string, boolean 和 null 四种类型数据
2. 多个有序的数据: 数组
用[]包含起来, 其元素可以是三类数据中的任意一种, 元素之间用,号隔开
3. 多个无序的数据: 对象
用{}包含起来, 其元素必须由 key-value 组成, key 是一个字符串, value 可以是
任意类型数据, key 与 value 之间用:号隔开, 两个 key-value 之间用,号隔开  

第七章 Linux

1、说一下常用的 Linux 命令

1.1 cd命令

 这是一个非常基本,也是大家经常需要使用的命令,它用于切换当前目录,它的参数是要切换到的目录的路径,可以是绝对路径,也可以是相对路径。
cd /root/Docements # 切换到目录/root/Docements
cd ./path          # 切换到当前目录下的path目录中,“.”表示当前目录  
cd ../path         # 切换到上层目录中的path目录中,“..”表示上一层目录  

1.2 ls命令

 这是一个非常有用的查看文件与目录的命令,list之意,它的参数非常多,下面就列出一些我常用的参数吧,如下:
-l :列出长数据串,包含文件的属性与权限数据等
-a :列出全部的文件,连同隐藏文件(开头为.的文件)一起列出来(常用)
-d :仅列出目录本身,而不是列出目录的文件数据
-h :将文件容量以较易读的方式(GB,kB等)列出来
-R :连同子目录的内容一起列出(递归列出),等于该目录下的所有文件都会示出来

注:这些参数也可以组合使用,下面举两个例子:
ls -l #以长数据串的形式列出当前目录下的数据文件和目录
ls -lR #以长数据串的形式列出当前目录下的所有文件  

1.3 grep命令

 该命令常用于分析一行的信息,若当中有我们所需要的信息,就将该行显示出来,该命令通常与管道命令一起使用,用于对一些命令的输出进行筛选加工等等,它的简单语法为
grep [-acinv] [--color=auto] '查找字符串' filename
它的常用参数如下:

-a :将binary文件以text文件的方式查找数据
-c :计算找到‘查找字符串’的次数
-i :忽略大小写的区别,即把大小写视为相同
-v :反向选择,即显示出没有‘查找字符串’内容的那一行
# 例如:
# 取出文件/etc/man.config中包含MANPATH的行,并把找到的关键字加上颜色
grep --color=auto 'MANPATH' /etc/man.config
# 把ls -l的输出中包含字母file(不区分大小写)的内容输出
ls -l | grep -i file  

1.4 find命令

 find是一个基于查找的功能非常强大的命令,相对而言,它的使用也相对较为复杂,参数也比较多,所以在这里将给把它们分类列出,它的基本语法如下:
find [PATH] [option] [action]

# 与时间有关的参数:
-mtime n : n为数字,意思为在n天之前的“一天内”被更改过的文件;
-mtime +n : 列出在n天之前(不含n天本身)被更改过的文件名;
-mtime -n : 列出在n天之内(含n天本身)被更改过的文件名;
-newer file : 列出比file还要新的文件名
# 例如:
find /root -mtime 0 # 在当前目录下查找今天之内有改动的文件

# 与用户或用户组名有关的参数:
-user name : 列出文件所有者为name的文件
-group name : 列出文件所属用户组为name的文件
-uid n : 列出文件所有者为用户ID为n的文件
-gid n : 列出文件所属用户组为用户组ID为n的文件
# 例如:
find /home/ljianhui -user ljianhui # 在目录/home/ljianhui中找出所有者为ljianhui的文件

# 与文件权限及名称有关的参数:
-name filename :找出文件名为filename的文件
-size [+-]SIZE :找出比SIZE还要大(+)或小(-)的文件
-tpye TYPE :查找文件的类型为TYPE的文件,TYPE的值主要有:一般文件(f)、设备文件(b、c)、
             目录(d)、连接文件(l)、socket(s)、FIFO管道文件(p);
-perm mode :查找文件权限刚好等于mode的文件,mode用数字表示,如0755;
-perm -mode :查找文件权限必须要全部包括mode权限的文件,mode用数字表示
-perm +mode :查找文件权限包含任一mode的权限的文件,mode用数字表示
# 例如:
find / -name passwd # 查找文件名为passwd的文件
find . -perm 0755 # 查找当前目录中文件权限的0755的文件
find . -size +12k # 查找当前目录中大于12KB的文件,注意c表示byte  

1.5 cp命令

 该命令用于复制文件,copy之意,它还可以把多个文件一次性地复制到一个目录下,它的常用参数如下:
-a :将文件的特性一起复制
-p :连同文件的属性一起复制,而非使用默认方式,与-a相似,常用于备份
-i :若目标文件已经存在时,在覆盖时会先询问操作的进行
-r :递归持续复制,用于目录的复制行为
-u :目标文件与源文件有差异时才会复制
例如 :
cp -a file1 file2 #连同文件的所有特性把文件file1复制成文件file2
cp file1 file2 file3 dir #把文件file1、file2、file3复制到目录dir中  

1.6 mv命令

 该命令用于移动文件、目录或更名,move之意,它的常用参数如下:
-f :force强制的意思,如果目标文件已经存在,不会询问而直接覆盖
-i :若目标文件已经存在,就会询问是否覆盖
-u :若目标文件已经存在,且比目标文件新,才会更新
注:该命令可以把一个文件或多个文件一次移动一个文件夹中,但是最后一个目标文件一定要是“目录”。

例如:
mv file1 file2 file3 dir # 把文件file1、file2、file3移动到目录dir中
mv file1 file2 # 把文件file1重命名为file2  

1.7 rm命令

 该命令用于删除文件或目录,remove之间,它的常用参数如下:
-f :就是force的意思,忽略不存在的文件,不会出现警告消息
-i :互动模式,在删除前会询问用户是否操作
-r :递归删除,最常用于目录删除,它是一个非常危险的参数
例如:
rm -i file # 删除文件file,在删除之前会询问是否进行该操作
rm -fr dir # 强制删除目录dir中的所有文件  

1.8 ps命令

 该命令用于将某个时间点的进程运行情况选取下来并输出,process之意,它的常用参数如下:
-A :所有的进程均显示出来
-a :不与terminal有关的所有进程
-u :有效用户的相关进程
-x :一般与a参数一起使用,可列出较完整的信息
-l :较长,较详细地将PID的信息列出
其实我们只要记住ps一般使用的命令参数搭配即可,它们并不多,如下:
ps aux # 查看系统所有的进程数据
ps ax # 查看不与terminal有关的所有进程
ps -lA # 查看系统所有的进程数据
ps axjf # 查看连同一部分进程树状态  

1.9 kill命令

 该命令用于向某个工作(%jobnumber)或者是某个PID(数字)传送一个信号,它通常与ps和jobs命令一起使用,它的基本语法如下:
kill -signal PID
signal的常用参数如下:
注:最前面的数字为信号的代号,使用时可以用代号代替相应的信号。
1:SIGHUP,启动被终止的进程
2:SIGINT,相当于输入ctrl+c,中断一个程序的进行
9:SIGKILL,强制中断一个进程的进行
15:SIGTERM,以正常的结束进程方式来终止进程
17:SIGSTOP,相当于输入ctrl+z,暂停一个进程的进行
例如:
# 以正常的结束进程方式来终于第一个后台工作,可用jobs命令查看后台中的第一个工作进程
kill -SIGTERM %1 
# 重新改动进程ID为PID的进程,PID可用ps命令通过管道命令加上grep命令进行筛选获得
kill -SIGHUP PID  

1.10 killall命令

 该命令用于向一个命令启动的进程发送一个信号,它的一般语法如下:
killall [-iIe] [command name]
它的参数如下:
-i :交互式的意思,若需要删除时,会询问用户
-e :表示后面接的command name要一致,但command name不能超过15个字符
-I :命令名称忽略大小写
# 例如:
killall -SIGHUP syslogd # 重新启动syslogd  

1.11 file命令

 该命令用于判断接在file命令后的文件的基本数据,因为在Linux下文件的类型并不是以后缀为分的,所以这个命令对我们来说就很有用了,它的用法非常简单,基本语法如下:
file filename
#例如:
file ./test  

1.12 tar命令

 该命令用于对文件进行打包,默认情况并不会压缩,如果指定了相应的参数,它还会调用相应的压缩程序(如gzip和bzip等)进行压缩和解压。它的常用参数如下:
-c :新建打包文件
-t :查看打包文件的内容含有哪些文件名
-x :解打包或解压缩的功能,可以搭配-C(大写)指定解压的目录,注意-c,-t,-x不能同时出现在同一条命令中
-j :通过bzip2的支持进行压缩/解压缩
-z :通过gzip的支持进行压缩/解压缩
-v :在压缩/解压缩过程中,将正在处理的文件名显示出来
-f filename :filename为要处理的文件
-C dir :指定压缩/解压缩的目录dir
上面的解说可以已经让你晕过去了,但是通常我们只需要记住下面三条命令即可:
压缩:tar -jcv -f filename.tar.bz2 要被处理的文件或目录名称
查询:tar -jtv -f filename.tar.bz2
解压:tar -jxv -f filename.tar.bz2 -C 欲解压缩的目录
注:文件名并不定要以后缀tar.bz2结尾,这里主要是为了说明使用的压缩程序为bzip2  

1.13 cat命令

 该命令用于查看文本文件的内容,后接要查看的文件名,通常可用管道与more和less一起使用,从而可以一页页地查看数据。例如:
cat text | less # 查看text文件中的内容
# 注:这条命令也可以使用less text来代替  

1.14 chgrp命令

 该命令用于改变文件所属用户组,它的使用非常简单,它的基本用法如下:
chgrp [-R] dirname/filename
-R :进行递归的持续对所有文件和子目录更改
# 例如:
chgrp users -R ./dir # 递归地把dir目录下中的所有文件和子目录下所有文件的用户组修改为users  

1.15 chown命令

 该命令用于改变文件的所有者,与chgrp命令的使用方法相同,只是修改的文件属性不同,不再详述。  

1.16 chmod命令

 该命令用于改变文件的权限,一般的用法如下:
chmod [-R] xyz 文件或目录
-R:进行递归的持续更改,即连同子目录下的所有文件都会更改
同时,chmod还可以使用u(user)、g(group)、o(other)、a(all)和+(加入)、-(删除)、=(设置)跟rwx搭配来对文件的权限进行更改。

# 例如:
chmod 0755 file # 把file的文件权限改变为-rxwr-xr-x
chmod g+w file # 向file的文件权限中加入用户组可写权限  

1.17 vim命令

 该命令主要用于文本编辑,它接一个或多个文件名作为参数,如果文件存在就打开,如果文件不存在就以该文件名创建一个文件。vim是一个非常好用的文本编辑器,它里面有很多非常好用的命令,在这里不再多说。你可以从这里下载vim常用操作的详细说明。  

1.18 gcc命令

 对于一个用Linux开发C程序的人来说,这个命令就非常重要了,它用于把C语言的源程序文件,编译成可执行程序,由于g++的很多参数跟它非常相似,所以这里只介绍gcc的参数,它的常用参数如下:
-o :output之意,用于指定生成一个可执行文件的文件名
-c :用于把源文件生成目标文件(.o),并阻止编译器创建一个完整的程序
-I :增加编译时搜索头文件的路径
-L :增加编译时搜索静态连接库的路径
-S :把源文件生成汇编代码文件
-lm:表示标准库的目录中名为libm.a的函数库
-lpthread :连接NPTL实现的线程库
-std= :用于指定把使用的C语言的版本

# 例如:
# 把源文件test.c按照c99标准编译成可执行程序test
gcc -o test test.c -lm -std=c99
#把源文件test.c转换为相应的汇编程序源文件test.s
gcc -S test.c  

1.19 time命令

 该命令用于测算一个命令(即程序)的执行时间。它的使用非常简单,就像平时输入命令一样,不过在命令的前面加入一个time即可,例如:
time ./process
time ps aux
在程序或命令运行结束后,在最后输出了三个时间,它们分别是:
user:用户CPU时间,命令执行完成花费的用户CPU时间,即命令在用户态中执行时间总和;
system:系统CPU时间,命令执行完成花费的系统CPU时间,即命令在核心态中执行时间总和;
real:实际时间,从command命令行开始执行到运行终止的消逝时间;

注:用户CPU时间和系统CPU时间之和为CPU时间,即命令占用CPU执行的时间总和。实际时间要大于CPU时间,因为Linux是多任务操作系统,往往在执行一条命令时,系统还要处理其它任务。另一个需要注意的问题是即使每次执行相同命令,但所花费的时间也是不一样,其花费时间是与系统运行相关的。  

1.20 date命令

 date 可以用来显示或设定系统的日期与时间。

命令参数
-d<字符串>:显示字符串所指的日期与时间。字符串前后必须加上双引号; 
-s<字符串>:根据字符串来设置日期与时间。字符串前后必须加上双引号; 
-u:显示GMT; 
--help:在线帮助; 
--version:显示版本信息
```

```
%H 小时(以00-23来表示)。 
%I 小时(以01-12来表示)。 
%K 小时(以0-23来表示)。 
%l 小时(以0-12来表示)。 
%M 分钟(以00-59来表示)。 
%P AM或PM。 
%r 时间(含时分秒,小时以12小时AM/PM来表示)。 
%s 总秒数。起算时间为1970-01-01 00:00:00 UTC。 
%S 秒(以本地的惯用法来表示)。 
%T 时间(含时分秒,小时以24小时制来表示)。 
%X 时间(以本地的惯用法来表示)。 
%Z 市区。 
%a 星期的缩写。 
%A 星期的完整名称。 
%b 月份英文名的缩写。 
%B 月份的完整英文名称。 
%c 日期与时间。只输入date指令也会显示同样的结果。 
%d 日期(以01-31来表示)。 
%D 日期(含年月日)。 
%j 该年中的第几天。 
%m 月份(以01-12来表示)。 
%U 该年中的周数。 
%w 该周的天数,0代表周日,1代表周一,异词类推。 
%x 日期(以本地的惯用法来表示)。 
%y 年份(以00-99来表示)。 
%Y 年份(以四位数来表示)。 
%n 在显示时,插入新的一行。 
%t 在显示时,插入tab。 
MM 月份(必要) 
DD 日期(必要) 
hh 小时(必要) 
mm 分钟(必要)
ss 秒(选择性)

系统时间格式化显示:date "+%F %T" ======> 2018-09-18 23:38:45
输出昨天日期:date -d "1 day ago" +"%Y-%m-%d" ======> 2015-11-19
2秒后输出:date -d "2 second" +"%Y-%m-%d %H:%M.%S" ======> 2015-11-20 14:21.31
修改当前系统时间:date -s "2018-2-22 19:10:30"
查看硬件时间:hwclock --show  

1.21 netstat命令

 -a (all)显示所有选项,netstat默认不显示LISTEN相关
-t (tcp)仅显示tcp相关选项
-u (udp)仅显示udp相关选项
-n 拒绝显示别名,能显示数字的全部转化成数字。(重要)
-l 仅列出有在 Listen (监听) 的服務状态

-p 显示建立相关链接的程序名(macOS中表示协议 -p protocol)
-r 显示路由信息,路由表
-e 显示扩展信息,例如uid等
-s 按各个协议进行统计 (重要)
-c 每隔一个固定时间,执行该netstat命令。

netstat -ntlp                   //查看当前所有tcp端口·
netstat -ntulp |grep 80         //查看所有80端口使用情况·
netstat -an | grep 3306         //查看所有3306端口使用情况
netstat  -lanp                  //查看一台服务器上面哪些服务及端口
ps -ef |grep mysqld             //查看一个服务有几个端口。比如要查看mysqld
netstat -pnt |grep :3306 |wc    //查看某一端口的连接客户端IP 比如3306端口     

2、Linux 中如何查看日志?

 动态打印日志信息: tail –f 日志文件
cat  

3、Linux 怎么关闭进程

 通常用 ps 查看进程 PID ,用 kill 命令终止进程。
ps 命令用于查看当前正在运行的进程。
grep 是搜索

例如: ps -ef | grep java
表示查看所有进程里 CMD 是 java 的进程信息。

ps -aux | grep java
-aux 显示所有状态

kill 命令用于终止进程。
例如: kill -9 [PID]
-9 表示强迫进程立即停止。  

4、Linux中如何让命令在后台运行

 1. 在下达的命令后面加上&,就可以使该命令在后台进行工作,这样做最大的好处就是不怕被ctrl+c这个中断指令所中断。
2. 在后台执行的程序使它恢复到前台来运行,只用执行fg这个命令就可以了。
3. 在前台运行的命令,把它放到后台去运行,只要执行ctrl+z就可以了。  

5、常见的 linux 系统日志

 /var/log/message:记录Linux操作系统常见的系统和服务错误信息;
/var/log/boot.log:录了系统在引导过程中发生的事件,就是Linux系统开机自检过程显示的信息;
/var/log/lastlog :记录最后一次用户成功登陆的时间、登陆IP等信息(一般通过命令 lastlog 查看);
/var/log/secure :Linux系统安全日志,记录用户和工作组变坏情况、用户登陆认证情况l
/var/log/btmp :记录Linux登陆失败的用户、时间以及远程IP地址l
/var/log/wtmp:该日志文件永久记录每个用户登录、注销及系统的启动、停机的事件,使用last命令查看;
/var/log/secure:记录登录系统存取数据的文件;例如pop3,ssh,telnet,ftp等都会记录在此;
/var/log/maillog:记录邮件的存取和往来;
/var/log/cron:用来记录crontab这个服务的内容;
/var/log/httpd,/var/log/mysqld.log等等文件,记录几个不同的网络服务的记录文件;
/var/run/utmp 记录着现在登录的用户;
/var/log/dmesg内核日志;
/var/log/cpus CPU的处理信息;
/var/log/syslog 事件记录监控程序日志;
/var/log/auth.log 用户认证日志;
/var/log/daemon.log 系统进程日志;
/var/log/mail.err 邮件错误信息;
/var/log/access-log 纪录 HTTP/web 的传输;
/var/log/acct/pacct 纪录用户命令;
/var/log/aculog 纪录 MODEM 的活动;
/var/log/sudolog 纪录使用 sudo 发出的命令;
/var/log/sulog 纪录使用 su 命令的使用;
/var/log/xferlog 纪录 FTP 会话;  

6、Linux网络模型

 1、阻塞I/O模型:最常用的I/O模型就是阻塞I/O模型,缺省情形下,所有文件操作都是阻塞的。我们以套接字接口为例来讲解此模型:在进程空间中调用 recvfrom,其系统调用直到数据包到达且被复制到应用进程的缓冲区中或者发生错误时才返回,在此期间直会等待,进程在从调用 recvfrom开始到它返回的整段时间内都是被阻塞的,因此被称为阻塞I/O模型,如图1-1所示。

2、非阻塞I/O模型: recvfrom从应用层到内核的时候,如果该缓冲区没有数据的话,就直接返回一个 EWOULDBLOCK错误,一般都对非阻塞IO模型进行轮询检查这个状态,看内核是不是有数据到来,如图1-2所示。

3、I/O复用模型: Linux提供 select/poll,进程通过将一个或多个fd传递给 select或poll系统调用,阻塞在 select操作上,这样 select/poll可以帮我们侦测多个fd是否处于就绪状态。 select/poll是顺序扫描fd是否就绪,而且支持的fd数量有限,因此它的使用受到了一些制约。 Linux还提供了一个epoll系统调用, epoll使用基于事件驱动方式代替顺序扫描,因此性能更高。当有fd就绪时,立即回调函数 rollback,如图1-3所示。

4、信号驱动I/O模型:首先开启套接口信号驱动I/O功能,并通过系统调用 sigaction执行一个信号处理函数(此系统调用立即返回,进程继续工作,它是非阻塞的)。当数据准备就绪时,就为该进程生成一个 SIGIO信号,通过信号回调通知应用程序调用 recvfrom来读取数据,并通知主循环函数处理数据,如图1-4所示。

5、异步I/O:告知内核启动某个操作,并让内核在整个操作完成后(包括将数据从内核复制到用户自己的缓冲区)通知我们。这种模型与信号驱动模型的主要区别是:信号驱动I/O由内核通知我们何时可以开始一个I/O操作;异步I/O模型由内核通知我们I/O操作何时已经完成,如图1-5所示。

I/O多路复用技术
在I/O编程过程中,当需要同时处理多个客户端接入请求时,可以利用多线程或者I/O多路复用技术进行处理。I/O多路复用技术通过把多个I/O的阻塞复用到同一个 select的阻塞上,从而使得系统在单线程的情况下可以同时处理多个客户端请求。与传统的多线程多进程模型比,I/O多路复用的最大优势是系统开销小,系统不需要创建新的额外进程或者线程,也不需要维护这些进程和线程的运行,降低了系统的维护工作量,节省了系统资源,I/O多路复用的主要应用场景如下
◎服务器需要同时处理多个处于监听状态或者多个连接状态的套接字;
◎服务器需要同时处理多种网络协议的套接字。
目前支持I/O多路复用的系统调用有 select、 pselect、poll、epoll,在 Linux网络编程过程中,很长一段时间都使用 select做轮询和网络事件通知,然而 select的一些固有缺陷导致了它的应用受到了很大的限制,最终 Linux不得不在新的内核版本中寻找 select的替代方案,最终选择了 epoll。 epoll与 select的原理比较类似,为了克服 select的缺点, epoll作了很多重大改进,现总结如下。
1.支持一个进程打开的 socket描述符(FD)不受限制(仅受限于操作系统的最大文件句柄数)。
select最大的缺陷就是单个进程所打开的FD是有一定限制的,它由 FD SETSIZE设置,默认值是1024。epoll并没有这个限制,它所支持的FD上限是操作系统的最大文件句柄数,这个数字远远大于1024。例如,在1GB内存的机器上大约是10万个句柄左右,具体的值可以通过cat proc/sys/fs/file-max察看,通常情况下这个值跟系统的内存关系比较大。
2.I/O效率不会随着FD数目的增加而线性下降。
传统 select/poll的另一个致命弱点,就是当你拥有一个很大的 socket集合时,由于网络延时或者链路空闲,任一时刻只有少部分的socket是“活跃”的,但是 select/poll每次调用都会线性扫描全部的集合,导致效率呈现线性下降。 epoll不存在这个问题,它只会对“活跃”的 socket进行操作—这是因为在内核实现中, epoll是根据每个fd上面的 callback函数实现的。那么,只有“活跃”的 socket才会去主动调用 callback函数,其他idle状态的 socket则不会。在这点上,epoll实现了一个伪AlO。针对 epoll和 select性能对比的benchmark测试表明:如果所有的 socket都处于活跃态—例如一个高速LAN环境,epoll并不比 select/pol效率高太多;相反,如果过多使用 epoll_ctI,效率相比还有稍微地降低但是一旦使用 idle connections模拟WAN环境,epoll的效率就远在 select/poll之上了。
3.使用mmap加速内核与用户空间的消息传递。
无论是 select、poll还是 epoll都需要内核把FD消息通知给用户空间,如何避免不必要的内存复制就显得非常重要, epoll是通过内核和用户空间mmap同一块内存来实现的。
4.epoll的AP|更加简单。
包括创建一个epoll描述符、添加监听事件、阻塞等待所监听的事件发生、关闭 epoll描述符等。  

7、文件属性

 -rw-r--r--. 1 root root 44575 Mar 28  2019 1.out

1、第一栏代表这个文件的类型与权限
1.1 第一个字符代表这个文件是“目录、文件或链接文件等等”:
当为[ d ]则是目录,例如上表文件名为“.config”的那一行;
当为[ - ]则是文件,例如上表文件名为“initial-setup-ks.cfg”那一行;
若是[ l ]则表示为链接文件(link file) ;
若是[ b ]则表示为设备文件里面的可供储存的周边设备(可随机存取设备) ;
若是[ c ]则表示为设备文件里面的序列埠设备,例如键盘、鼠标(一次性读取设备)。

1.2 接下来的字符中,以三个为一组,且均为“rwx” 的三个参数的组合。其中,[ r ]代表可读(read) 、[ w ]代表可写(write) 、[ x ]代表可执行(execute) 。 要注意的是,这三个权限的位置不会改变,如果没有权限,就会出现减号[ - ]而已。
第一组为“文件拥有者可具备的权限”,以“initial-setup-ks.cfg”那个文件为例,该文件的拥有者可以读写,但不可执行;
第二组为“加入此群组之帐号的权限”;
第三组为“非本人且没有加入本群组之其他帐号的权限”。

2、第二栏表示有多少文件名链接到此节点(i-node) :
每个文件都会将他的权限与属性记录到文件系统的i-node中,不过,我们使用的目录树却是使用文件名来记录, 因此每个文件名就会链接到一个i-node啰!这个属性记录的,就是有多少不同的文件名链接到相同的一个i-node号码去就是了。
3、第三栏表示这个文件(或目录) 的“拥有者帐号”;
4、第四栏表示这个文件的所属群组;  

文章来源:智云一二三科技

文章标题:Java面试大全(十二)

文章地址:https://www.zhihuclub.com/200029.shtml

关于作者: 智云科技

热门文章

发表回复

您的电子邮箱地址不会被公开。

网站地图