Q:0、Linux的五种IO模型?
在Linux(UNIX)操做系统中,共有五种IO模型,分别是:阻塞IO模型、非阻塞IO模型、IO复用模型、信号驱动IO模型以及异步IO模型linux
Q:1 Shell脚本是什么、它是必需的吗?web
答:一个Shell脚本是一个文本文件,包含一个或多个命令。做为系统管理员,咱们常常须要使用多个命令来完成一项任务,咱们能够添加这些全部命令在一个文本文件(Shell脚本)来完成这些平常工做任务。面试
Q:2 什么是默认登陆shell,如何改变指定用户的登陆shell算法
答:在Linux操做系统,“/bin/bash”是默认登陆shell,是在建立用户时分配的。使用chsh命令能够改变默认的shell。示例以下所示:shell
# chsh <用户名> -s <新shell> # chsh linuxtechi -s /bin/sh
Q:3 能够在shell脚本中使用哪些类型的变量?后端
答:在shell脚本,咱们可使用两种类型的变量:浏览器
系统变量是由系统系统本身建立的。这些变量一般由大写字母组成,能够经过“set”命令查看。安全
用户变量由系统用户来生成和定义,变量的值能够经过命令“echo $ <变量名> ”查看。 bash
Q:4 如何将标准输出和错误输出同时重定向到同一位置?
答:这里有两个方法来实现:
方法一:
2>&1 (如# ls /usr/share/doc > out.txt 2>&1 )
方法二:
&> (如# ls /usr/share/doc &> out.txt )
Q:5 shell脚本中“if”语法如何嵌套?
答:基础语法以下:
if [ 条件 ] then 命令1 命令2 ….. else if [ 条件 ] then 命令1 命令2 …. else 命令1 命令2 ….. fi fi
Q:6 shell脚本中“$?”标记的用途是什么?
答:在写一个shell脚本时,若是你想要检查前一命令是否执行成功,在if条件中使用“$?”能够来检查前一命令的结束状态。简单的例子以下:
root@localhost:~# ls /usr/bin/shar /usr/bin/shar root@localhost:~# echo $? 0
若是结束状态是0,说明前一个命令执行成功。
root@localhost:~# ls /usr/bin/share ls: cannot access /usr/bin/share: No such file or directory root@localhost:~# echo $? 2
若是结束状态不是0,说明命令执行失败。
Q:7 在shell脚本中如何比较两个数字 ?
答:在if-then中使用测试命令( -gt 等)来比较两个数字,例子以下:
#!/bin/bash x=10 y=20 if [ $x -gt $y ] then echo “x is greater than y” else echo “y is greater than x” fi
Q:8 shell脚本中break命令的做用 ?
答:break命令一个简单的用途是退出执行中的循环。咱们能够在while和until循环中使用break命令跳出循环。
Q:9 shell脚本中continue命令的做用 ?
答:continue命令不一样于break命令,它只跳出当前循环的迭代,而不是整个循环。continue命令不少时候是颇有用的,例如错误发生,但咱们依然但愿继续执行大循环的时候。
Q:10 告诉我shell脚本中Case语句的语法 ?
答:基础语法以下:
case 变量 in 值1) 命令1 命令2 ….. 最后命令 !! 值2) 命令1 命令2 …… 最后命令 ;; esac
Q:11 shell脚本中while循环语法 ?
答:如同for循环,while循环只要条件成立就重复它的命令块。不一样于for循环,while循环会不断迭代,直到它的条件不为真。基础语法:
while [ 条件 ] do 命令… done
答:使用chmod命令来使脚本可执行。例子以下:
# chmod a+x myscript.sh
Q:13 “#!/bin/bash”的做用 ?
答:#!/bin/bash是shell脚本的第一行,称为释伴(shebang)行。这里#符号叫作hash,而! 叫作 bang。它的意思是命令经过 /bin/bash 来执行。
Q:14 shell脚本中for循环语法 ?
答:for循环的基础语法:
for 变量 in 循环列表 do 命令1 命令2 …. 最后命令 done
Q:15 如何调试shell脚本 ?
答:使用'-x'参数(sh -x myscript.sh)能够调试shell脚本。另外一个种方法是使用‘-nv’参数( sh -nv myscript.sh)。
Q:16 shell脚本如何比较字符串?
答:test命令能够用来比较字符串。测试命令会经过比较字符串中的每个字符来比较。
Q:17 Bourne shell(bash) 中有哪些特殊的变量 ?
答:下面的表列出了Bourne shell为命令行设置的特殊变量。
内建变量 解释 $0 命令行中的脚本名字 $1 第一个命令行参数 $2 第二个命令行参数 ….. ……. $9 第九个命令行参数 $# 命令行参数的数量 $* 全部命令行参数,以空格隔开
Q:18 在shell脚本中,如何测试文件 ?
答:test命令能够用来测试文件。基础用法以下表格:
Test 用法 -d 文件名 若是文件存在而且是目录,返回true -e 文件名 若是文件存在,返回true -f 文件名 若是文件存在而且是普通文件,返回true -r 文件名 若是文件存在并可读,返回true -s 文件名 若是文件存在而且不为空,返回true -w 文件名 若是文件存在并可写,返回true -x 文件名 若是文件存在并可执行,返回true
Q:19 在shell脚本中,如何写入注释 ?
答:注释能够用来描述一个脚本能够作什么和它是如何工做的。每一行注释以#开头。例子以下:
#!/bin/bash # This is a command echo “I am logged in as $USER”
Q:20 如何让 shell 就脚本获得来自终端的输入?
答:read命令能够读取来自终端(使用键盘)的数据。read命令获得用户的输入并置于你给出的变量中。例子以下:
# vi /tmp/test.sh #!/bin/bash echo ‘Please enter your name’ read name echo “My Name is $name” # ./test.sh Please enter your name LinuxTechi My Name is LinuxTechi
Q:21 如何取消变量或取消变量赋值 ?
答:“unset”命令用于取消变量或取消变量赋值。语法以下所示:
# unset <变量名>
Q:22 如何执行算术运算 ?
答:有两种方法来执行算术运算:
1.使用expr命令
# expr 5 + 2
2.用一个美圆符号和方括号($[ 表达式 ])例如:
test=$[16 + 4] ; test=$[16 + 4]
Q:23 do-while语句的基本格式 ?
答:do-while语句相似于while语句,但检查条件语句以前先执行命令(LCTT 译注:意即至少执行一次。)。下面是用do-while语句的语法
do { 命令 } while (条件)
Q:24 在shell脚本如何定义函数呢 ?
答:函数是拥有名字的代码块。当咱们定义代码块,咱们就能够在咱们的脚本调用函数名字,该块就会被执行。示例以下所示:
$ diskusage () { df -h ; } 译注:下面是我给的shell函数语法,原文没有 [ function ] 函数名 [()] { 命令; [return int;] }
Q:25 为何 TCP 创建链接是三次握手,关闭链接确是四次挥手呢
Q:26 常见的压缩测试工具
Q:27 为何 Redis 中要使用 I/O 多路复用这种技术呢?
Q:28 Linux Shell 中各类括号的做用()、(())、[]、[[]]、{}
Q:29 能不能简单介绍一下你理解的并发和并行,并说明一下他们之间的关系?
并发,在操做系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行。
并行,当系统有一个以上CPU时,当一个CPU执行一个进程时,另外一个CPU能够执行另外一个进程,两个进程互不抢占CPU资源,能够同时进行,这种方式咱们称之为并行(Parallel)
并发,指的是多个事情,在同一时间段内同时发生了。 并发的多个任务之间是互相抢占资源的。
并行,指的是多个事情,在同一时间点上同时发生了。并行的多个任务之间是不互相抢占资源的。
Q:30 Linux设置环境变量
暂时的:
export MYNAME=”new name”
echo $MYNAME
new name
永久的:
经过改变/etc/profile实现
EG: export CLASSPATH=./java_HOME/lib;$JAVA_HOME/jre/lib
更改文件后执行 source /etc/profile
Q:31 TCP链接的特色
(1)面向链接:
采用C/S模型
(2)全双工;
(3)安全可靠:
①流量控制:解决接收方不能不及时处理数据的问题
②拥塞控制:解决因网络通讯延迟带来的数据丢失问题
③差错控制:解决数据被破坏、重复、时序和丢失的问题
(4)基于字节流。
Q:32 为何TCP链接须要三次握手,两次不能够吗?为何?
两次不能够。
三次握手链接过程:
(1)创建链接时,客户端发送SYN(SYN=j)包到服务器,并进入SYN_SEND状态,等待服务器响应、、确认;
(2)服务器收到SYN包,必须确认客户端的SYN(ACK=j+1),同时本身也发送一个SYN包,即SYN+ACK包此时服务器进入SYN_RECV状态;
(3)客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕客户端和服务器端进入ESTABLISHED状态,完成三次握手。
为了保证服务端能收到客户端的信息并能作出正确的响应而进行前两次握手,为了保证客户端可以收到服务端的信息并能作出正确的响应而进行后两次响应
Q:33 代理的实现原理
代理服务器有不少种,大致分为三类:HTTP、FTP、SOCKS,其中又分为透明代理和不透明代理,透明代理通常是网关,为硬件。
过程:
(1)客户端先和代理服务器通信,创建TCP链接,目的IP是代理服务器的IP
(2)客户端发出GET命令,GET命令中包含URL或IP地址、明文
(3)代理服务器将其中的URL转换为IP地址,可能会有DNS,将源数据包中的数据拷贝下来,去掉URL,从新组包再发出去
(4)代理服务器和真实服务器通信,源IP是代理服务器的IP
Q:34 TCP和UDP分别有什么优缺点
TCP:
优势:可靠、稳定
TCP的可靠体如今TCP在传输数据以前,会有三次握手来创建链接,并且在数据传递时,有确认、窗口、重传、拥塞控制机制,在数据传完以后,还会断开链接用来节约系统资源
缺点:慢,效率低,占用系统资源高,易被攻击
在传递数据以前要先创建链接,这会消耗时间,并且在数据传递时,确认机制、重传机制、拥塞机制等都会消耗大量时间,并且要在每台设备上维护全部的传输链接。然而,每一个连接都会占用系统的CPU、内存等硬件资源。由于TCP有确认机制、三次握手机制,这些也致使TCP容易被利用,实现DOS、DDOS、CC等攻击
UDP:
优势:快,比TCP稍安全
UDPm没有TCP拥有的各类机制,是一个无状态的传输协议,因此传递数据很是快,没有TCP的这些机制,被攻击利用的机制就少一些,可是也没法避免被攻击
缺点:不可靠,不稳定
由于没有TCP的那些机制,UDP在传输数据时,若是网络质量很差,就会很容易丢包,形成数据的缺失
适用场景:
TCP:当对网络通信质量有要求时,好比HTTP、HTTPS、FTP等传输文件的协议, POP、SMTP等邮件传输的协议。
UDP:对网络通信质量要求不高时,要求网络通信速度要快的场景。
Q:35 面向对象和面向过程的区别
面向过程:就是分析出解决问题所须要的步骤,而后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就行。
面向对象:是把构成问题事物分解成各个对象,创建对象的目的不是为了完成一个步骤,而是为了描述某个事物在整个解决问题的步骤中的行为。面向对象是以功能来划分问题,而不是步骤
Q:36 HTTP请求的过程与原理
HTTP是一种无状态的,指的是协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。也就是说,打开一个服务器上的网页和你以前打开这个服务器上的网页之间没有任何联系。
HTTP遵循请求/应答模型:
(1)创建TCP链接;
(2)Web浏览器向Web服务器发送请求命令;
(3)Web浏览器发送请求头信息;
(4)Web服务器应答;
(5)Web服务器发送应答头信息;
(6)Web服务器向浏览器发送数据;
(7)Web服务器关闭TCP链接。
HTTP的长链接与短链接:
在HTTP/1.0中,默认使用的是短链接。也就是说,浏览器和服务器每进行一次HTTP操做,就创建一次链接,但任务结束就中断链接,在服务端不保留链接的有关信息。
从 HTTP/1.1起,默认使用长链接,用以保持链接特性。使用长链接的HTTP协议,会在响应头有加入这行代码:
Connection:keep-alive
在使用长链接的状况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的 TCP链接不会关闭,若是客户端再次访问这个服务器上的网页,会继续使用这一条已经创建的链接。Keep-Alive不会永久保持链接,它有一个保持时间,能够在不一样的服务器软件(如Apache)中设定这个时间。实现长链接要客户端和服务端都支持长链接。
HTTP协议的长链接和短链接,实质上是TCP协议的长链接和短链接。
长链接短链接操做过程
短链接的操做步骤:
创建链接----数据传输-----关闭链接。。。创建链接-----数据传输----关闭链接
长链接的操做步骤:
创建链接---数据传输。。(保持链接)。。数据传输---关闭链接
长链接和短链接的优势和缺点
长链接能够省去较多的TCP创建和关闭的操做,减小浪费,节约时间。对于频繁请求资源的客户来讲,较适用长链接。可是会存在一个问题,随着客户端链接愈来愈多,server迟早有扛不住的时候,这时候server端须要采起一些策略,如关闭一些长时间没有读写事件发生的链接,这样能够避免一些恶意链接致使server端服务受损;若是条件再容许就能够以客户端机器为颗粒度,限制每一个客户端的最大长链接数,这样能够彻底避免某一个客户端连累后端服务。
短链接对于服务器来讲管理较为简单,存在的链接都是有用的链接,不须要额外的控制手段。但若是客户请求频繁,将在TCP的创建和关闭操做上浪费时间和带宽。
HTTP报文格式:
请求消息格式:
响应消息格式:
Q:37 常见HTTP状态码
成功的状态码(基本以2开头):这一类型的状态码,表明请求已成功被服务器接收、理解、并接受
200--请求已成功,请求所但愿的响应头或数据体将随此响应返回
202--服务器已接受请求,但还没有处理
205--服务器成功处理了请求,且没有返回任何内容
内容被重定向(基本以3开头):须要客户端采起进一步的操做才能完成请求
301--被请求的资源已永久移动到新位置
302--请求的资源临时从不一样的 URI响应请求
303--对应当前请求的响应能够在另外一个 URI 上被找到,并且客户端应当采用 GET 的方式访问那个资源
305--被请求的资源必须经过指定的代理才能被访问
307--请求的资源临时从不一样的URI 响应请求
请求失败的状态码(基本以4开头):
400--语义有误,当前请求没法被服务器理解。除非进行修改,不然客户端不该该重复提交这个请求或者请求参数有误
401--当前请求须要用户验证
403--服务器已经理解请求,可是拒绝执行
404--请求的网页不存在
405--请求行中指定的请求方法不能被用于请求相应的资源
408--请求超时
服务器端的错误(基本以5开头):了服务器在处理请求的过程当中有错误或者异常状态发生
500--服务器内部错误
503--服务器暂时不可用
Q:38什么是死锁
进程死锁,它是操做系统或系统软件运行的一种状态:在多任务系统下,当一个或多个进程等待系统资源,而资源又被进程自己或其余进程占用时,就造成了死锁。
产生死锁的缘由:
①系统资源不足
②进程运行推动的顺序不合适
③资源分配不当等
产生死锁的四个必要条件:
①互斥条件:一个资源每次只能被一个进程使用
②请求与保持条件:一个进程因请求资源而阻塞时,对已得到的资源保持不放
③不剥夺条件:进程已得到的资源,在未使用完以前,不能强行剥夺
④循环等待条件:若干进程之间造成一种头尾相连的循环等待资源关系
避免死锁的方法:
①有序的资源分配法
②银行家算法
解决死锁:
①进行系统的从新启动(最简单粗暴)
②撤销进程,剥夺资源
银行家算法
银行家算法是一种最有表明性的避免死锁的算法
咱们能够把操做系统看做是银行家,操做系统管理的资源至关于银行家管理的资金,进程向操做系统请求分配资源至关于用户向银行家贷款。操做系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,若是系统现存的资源能够知足它的最大需求量则按当前的申请量分配资源,不然就推迟分配。当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。若超过则拒绝分配资源,若没有超过则再测试系统现存的资源可否知足该进程尚需的最大资源量,若能知足则按当前的申请量分配资源,不然也要推迟分配。
Q:39 close_wait
在被动关闭链接的状况下,在已经接收到FIN,可是尚未发送本身FIN的时刻,链接处于close_wait状态。一般来说,close_wait状态持续的时间应该很短,如SYN_RECV状态,可是在一些特殊状况下,就会出现链接长时间处于close_wait状态的状况。出现大量close_wait的现象,主要缘由是某种状况下对方关闭了socket链接,可是我方忙于读或者写。没有关闭链接,代码须要判断socket,一旦读到0,断开链接,read返回负,检查一下errno,若是不是AGAIN,就断开链接。
Q:40 time_wait
主动关闭的socket端会进入此状态,而且持续2MSL(最大分节生命期)时间长度,这是一个IP数据包能在互联网上生存的最长时间,超过这个时间将在网络消失。
做用:
a:可靠的实现TCP全双工链接的终止
b:容许老的重复分节在网络中消失
Q:41 进程间通讯机制
管道、消息队列、共享内存(速度最快)、信号量、文件映射、匿名/命名管道