首页 文章 精选 留言 我的

精选列表

搜索[面试],共4912篇文章
优秀的个人博客,低调大师

java面试-Java并发编程(六)——线程间的通信

多条线程之间有时需要数据交互,下面介绍五种线程间数据交互的方式,他们的使用场景各有不同。 1. volatile、synchronized关键字 PS:关于volatile的详细介绍请移步至:Java并发编程的艺术(三)——volatile 1.1 如何实现通信? 这两种方式都采用了同步机制实现多条线程间的数据通信。与其说是“通信”,倒不如说是“共享变量”来的恰当。当一个共享变量被volatile修饰 或 被同步块包裹后,他们的读写操作都会直接操作共享内存,从而各个线程都能看到共享变量最新的值,也就是实现了内存的可见性。 1.2 特点 这种方式本质上是“共享数据”,而非“传递数据”;只是从结果来看,数据好像是从写线程传递到了读线程; 这种通信方式无法指定特定的接收线程。当数据被修改后究竟哪条线程最先访问到,这由操作系统随机决定。 总的来说,这种方式并不是真正意义上的“通信”,而是“共享”。 1.3 使用场景 这种方式能“传递”变量。当需要传递一些公用的变量时就可以使用这种方式。如:传递boolean flag,用于表示状态、传递一个存储所有任务的队列等。 1.4 例子 用这种方式实现线程的开关控制。 // 用于控制线程当前的执行状态 private volatile boolean running = false; // 开启一条线程 Thread thread = new Thread(new Runnable(){ void run(){ // 开关 while(!running){ Thread.sleep(1000); } // 执行线程任务 doSometing(); } }).start(); // 开始执行 public void start(){ running = true; } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 2. 等待/通知机制 2.1 如何实现? 等待/通知机制的实现由Java完成,我们只需调用Object类的几个方法即可。 wait():将当前线程的状态改为“等待态”,加入等待队列,释放锁;直到当前线程发生中断或调用了notify方法,这条线程才会被从等待队列转移到同步队列,此时可以开始竞争锁。 wait(long):和wait()功能一样,只不过多了个超时动作。一旦超时,就会继续执行wait之后的代码,它不会抛超时异常! notify():将等待队列中的一条线程转移到同步队列中去。 notifyAll():将等待队列中的所有线程都转移到同步队列中去。 2.2 注意点 以上方法都必须放在同步块中; 并且以上方法都只能由所处同步块的锁对象调用; 锁对象A.notify()/notifyAll()只能唤醒由锁对象A wait的线程; 调用notify/notifyAll函数后仅仅是将线程从等待队列转移到阻塞队列,只有当该线程竞争到锁后,才能从wait方法中返回,继续执行接下来的代码; 2.3 QA 为什么wait必须放在同步块中调用?因为等待/通知机制需要和共享状态变量配合使用,一般是先检查状态,若状态为true则执行wait,即包含“先检查后执行”,因此需要把这一过程加锁,确保其原子执行。举个例子: // 共享的状态变量 boolean flag = false; // 线程1 Thread t1 = new Thread(new Runnable(){ public void run(){ while(!flag){ wait(); } } }).start(); // 线程2 Thread t2 = new Thread(new Runnable(){ public void run(){ flag = true; notifyAll(); } }).start(); 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 上述例子thread1未加同步。当thread1执行到while那行后,判断其状态为true,此时若发生上下文切换,线程2开始执行,并一口气执行完了;此时flag已经是true,然而thread1继续执行,遇到wait后便进入等待态;但此时已经没有线程能唤醒它了,因此就一直等待下去。 为什么notify需要加锁?且必须和wait使用同一把锁?首先,加锁是为了保证共享变量的内存可见性,让它发生修改后能直接写入共享内存,好让wait所处的线程立即看见。其次,和wait使用同一把锁是为了确保wait、notify之间的互斥,即:同一时刻,只能有其中一条线程执行。 为什么必须使用同步块的锁对象调用wait函数?首先,由于wait会释放锁,因此通过锁对象调用wait就是告诉wait释放哪个锁。其次,告诉线程,你是在哪个锁对象上等待的,只有当该锁对象调用notify时你才能被唤醒。 为什么必须使用同步块的锁对象调用notify函数?告诉notify,只唤醒在该锁对象上等待的线程。 2.4 代码实现 等待/通知机制用于实现生产者和消费者模式。 生产者 synchronized(锁A){ flag = true;// 或者:list.add(xx); 锁A.notify(); } 1 2 3 4 消费者 synchronized(锁A){ // 不满足条件 while(!flag){ // 或者:list.isEmpty() 锁A.wait(); } // doSometing…… } 1 2 3 4 5 6 7 8 2.5 超时等待模式 在之前的生产者-消费者模式中,如果生产者没有发出通知,那么消费者将永远等待下去。为了避免这种情况,我们可以给消费者增加超时等待功能。该功能依托于wait(long)方法,只需在wait前的检查条件中增加超时标识位,实现如下: public void get(long mills){ synchronized( list ){ // 不加超时功能 if ( mills <= 0 ) { while( list.isEmpty() ){ list.wait(); } } // 添加超时功能 else { boolean isTimeout = false; while(list.isEmpty() && isTimeout){ list.wait(mills); isTimeout = true; } // doSometing…… } } } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 3. 管道流 3.1 作用 管道流用于在两个线程之间进行字节流或字符流的传递。 3.2 特点 管道流的实现依靠PipedOutputStream、PipedInputStream、PipedWriter、PipedReader。分别对应字节流和字符流。 他们与IO流的区别是:IO流是在硬盘、内存、Socket之间流动,而管道流仅在内存中的两条线程间流动。 3.3 实现 步骤如下:1. 在一条线程中分别创建输入流和输出流;2. 将输入流和输出流连接起来;3. 将输入流和输出流分别传递给两条线程;4. 调用read和write方法就可以实现线程间通信。 // 创建输入流与输出流对象 PipedWriter out = new PipedWriter(); PipedReader in = new PipedReader(); // 连接输入输出流 out.connect(in); // 创建写线程 class WriteThread extends Thread{ private PipedWriter out; public WriteThread(PipedWriter out){ this.out = out; } public void run(){ out.write("hello concurrent world!"); } } // 创建读线程 class ReaderThread extends Thread{ private PipedReader in; public ReaderThread(PipedReader in){ this.in = in; } public void run(){ in.read(); } } // 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 4. join 4.1 作用 join能将并发执行的多条线程串行执行; join函数属于Thread类,通过一个thread对象调用。当在线程B中执行threadA.join()时,线程B将会被阻塞(底层调用wait方法),等到threadA线程运行结束后才会返回join方法。 被等待的那条线程可能会执行很长时间,因此join函数会抛出InterruptedException。当调用threadA.interrupt()后,join函数就会抛出该异常。 4.2 实现 public static void main(String[] args){ // 开启一条线程 Thread t = new Thread(new Runnable(){ public void run(){ // doSometing } }).start(); // 调用join,等待t线程执行完毕 try{ t.join(); }catch(InterruptedException e){ // 中断处理…… } }

优秀的个人博客,低调大师

春节跳槽最新Java面试题及答案整理

今天大部分码农同学已经上班了吧,最近也是跳槽人才流动的高峰期,拿了年终奖,找找更好的机会。 小编也面了几家公司了,回来整理下面经分享给大家做个参考。有很多,暂时先分享20道,后续更多会陆续整理分享出来。 1.Mybatis与Ibatis的区别 2.Http1与Http2的区别 3.SpringMVC的执行流程 4.JVM内存溢出具体指哪些内存区域?都会抛出什么异常? 5.谈谈对AJAX的理解 6.谈谈对事务的理解 7.String能被继承吗?为什么? 8.谈谈继承和聚合 9.什么是深拷贝和浅拷贝? 10.说说常见的几个运行时异常 11.JDK引入泛型是解决什么问题的? 12.谈谈hashCode与equals之间的关系 13.谈谈反射机制 14.常用的JVM设置参数都有哪些? 15.Spring Boot是什么? 16.谈谈Spring事物传播特性 17.Spring有哪几种事物管理机制? 18.ACID是指什么? 19.谈谈Mysql中的Btree和B+Tree算法 20.谈谈Mysql中in和exists的应用场景 关注下方公众号回复"答案"获取以上全部答案。

优秀的个人博客,低调大师

2017年经典运维面试题28例

1、Linux如何挂载windows下的共享目录? mount.cifs //IP地址/server /mnt/server -o user=administrator,password=123456 linux 下的server需要自己手动建一个 后面的user与pass 是windows主机的账号和密码 注意空格 和逗号。 2、如何查看http的并发请求数与其TCP连接状态? netstat -n | awk ‘/^tcp/ {++b[$NF]}’ END {for(a in b) print a,b[a]}’ 还有ulimit -n 查看linux系统打开最大的文件描述符,这里默认1024,不修改这里web服务器修改再大也没用。若要用就修改很几个办法,这里说其中一个: 修改/etc/security/limits.conf * soft nofile 10240 * hard nofile 10240 重启后生效 3、如何用tcpdump嗅探80端口的访问看看谁最高? tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F”.” ‘{print $1″.”$2″.”$3″.”$4″.”}’ | sort |uniq -c | sort -nr | head-5 4、如何查看/var/log目录下的文件数? ls /var/log/ -1R | grep “-” | wc -l 5、如何查看Linux系统每个ip的连接数? netstat -n | awk ‘/^tcp/ {print $5}’ | awk -F: ‘{print $1}’ | sort | uniq -c | sort -rn 6、shell下生成32位随机密码 cat /dev/urandom | head -1 | md5sum | head -c 32 >> /pass 7、统计出apache的access.log中访问量最多的5个ip cat access.log | awk ‘{print $1}’ | sort | uniq -c | sort -n -r | head -5 8、如何查看二进制文件的内容? 我们一般通过hexdump命令 来查看二进制文件的内容。 hexdump -C XXX(文件名) -C是参数 不同的参数有不同的意义 -C 是比较规范的 十六进制和ASCII码显示 -c 是单字节字符显示 -b 单字节八进制显示 -o 是双字节八进制显示 -d 是双字节十进制显示 -x 是双字节十六进制显示 9、ps aux 中的VSZ代表什么意思,RSS代表什么意思? VSZ:虚拟内存集,进程占用的虚拟内存空间 RSS:物理内存集,进程战用实际物理内存空间 10、如何检测并修复/dev/hda5? fsck用来检查和维护不一致的文件系统。若系统掉电或磁盘发生问题,可利用fsck命令对文件系统进行检查 11、介绍下Linux系统的开机启动顺序 加载BIOS–>读取MBR–>Boot Loader–>加载内核–>用户层init一句inittab文件来设定系统运行的等级(一般3或者 5,3是多用户命令行,5是界面)–>init进程执行rc.syninit–>启动内核模块–>执行不同级别运行的脚本程序–>执行/etc/rc.d/rc.local(本地运行服务)–>执行/bin/login,就可以登录了。 12、符号链接与硬链接的区别 我们可以把符号链接,也就是软连接 当做是 windows系统里的 快捷方式。 硬链接 就好像是 又复制了一份,举例说明: ln 3.txt 4.txt 这是硬链接,相当于复制,不可以跨分区,但修改3,4会跟着变,若删除3,4不受任何影响。 ln -s 3.txt 4.txt 这是软连接,相当于快捷方式。修改4,3也会跟着变,若删除3,4就坏掉了。不可以用了。 13、保存当前磁盘分区的分区表 dd 命令是以个强大的命令,在复制的同时进行转换 dd if=/dev/sda of=./mbr.txt bs=1 count=512 14、如何在文本里面进行复制、粘贴,删除行,删除全部,按行查找和按字母查找? 以下操作全部在命令行状态操作,不要在编辑状态操作。 在文本里 移动到想要复制的行 按yy 想复制到哪就移动到哪,然后按P 就黏贴了 删除行 移动到改行 按dd 删除全部 dG 这里注意G一定要大写 按行查找 :90 这样就是找到第90行 按字母查找 /path 这样就是 找到path这个单词所在的位置,文本里可能存在多个,多次查找会显示在不同的位置。 15、手动安装grub grub-install /dev/sda 16、修改内核参数 vi /etc/sysctl.conf 这里修改参数 sysctl -p 刷新后可用 17、在1-39内取随机数 expr $[RANDOM%39] +1 RANDOM随机数 %39取余数范围0-38 18、限制apache每秒新建连接数为1,峰值为3 每秒新建连接数 一般都是由防火墙来做,apache本身好像无法设置每秒新建连接数,只能设置最大连接: iptables -A INPUT -d 172.16.100.1 -p tcp –dport 80 -m limit –limit 1/second -j ACCEPT 19、FTP的主动模式和被动模式 FTP协议有两种工作方式:PORT方式和PASV方式,中文意思为主动式和被动式。 PORT(主动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请 求,服务器接受连接,建立一条命令链路。当需要传送数据时,客户端在命令链路上用PORT 命令告诉服务器:“我打开了XX端口,你过来连接我”。于是服务器从20端口向客户端的 XX端口发送连接请求,建立一条数据链路来传送数据。 PASV(被动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请 求,服务器接受连接,建立一条命令链路。当需要传送数据时,服务器在命令链路上用PASV 命令告诉客户端:“我打开了XX端口,你过来连接我”。于是客户端向服务器的XX端口 发送连接请求,建立一条数据链路来传送数据。 从上面可以看出,两种方式的命令链路连接方法是一样的,而数据链路的建立方法就完 全不同。 20、显示/etc/inittab中以#开头,且后面跟了一个或者多个空白字符,而后又跟了任意非空白字符的行 grep “^#\{1,\}[^]” /etc/inittab 21、显示/etc/inittab中包含了:一个数字:(即两个冒号中间一个数字)的行 grep “\:[0-9]\{1\}:” /etc/inittab 22、怎么把脚本添加到系统服务里,即用service来调用? 在脚本里加入 #!/bin/bash # chkconfig: 345 85 15 # description: httpd 然后保存 chkconfig httpd –add 创建系统服务 现在就可以使用service 来 start or restart 23、写一个脚本,实现批量添加20个用户 用户名为user01-20,密码为user后面跟5个随机字符 #!/bin/bash #description: useradd for i in `seq -f”%02g” 1 20`;do useradd user$i echo “user$i-`echo $RANDOM|md5sum|cut -c 1-5`”|passwd –stdinuser$i >/dev/null 2>&1 done 24、写一个脚本,实现判断192.168.1.0/24网络里,当前在线的IP有哪些,能ping通则认为在线 #!/bin/bash for ip in `seq 1 255` do ping -c 1 192.168.1.$ip > /dev/null 2>&1 if [ $? -eq 0 ]; then echo 192.168.1.$ip UP else echo 192.168.1.$ip DOWN fi }& done wait 25、写一个脚本,判断一个指定的脚本是否是语法错误 如果有错误,则提醒用户键入Q或者q无视错误并退出其它任何键可以通过vim打开这个指定的脚本 [root@localhost tmp]# cat checksh.sh #!/bin/bash read -p “please input check script-> ” file if [ -f $file ]; then sh -n $file > /dev/null 2>&1 if [ $? -ne 0 ]; then read -p “You input $file syntax error,[Type q to exit or Type vim to edit]” answer case $answer in q | Q) exit 0 ;; vim ) vim $file ;; *) exit 0 ;; esac fi else echo “$file not exist” exit 1 fi 26、写一个脚本,要求如何: 创建一个函数,能接受两个参数: 1)第一个参数为URL,即可下载的文件;第二个参数为目录,即下载后保存的位置; 2)如果用户给的目录不存在,则提示用户是否创建;如果创建就继续执行,否则,函数返回一个51的错误值给调用脚本; 3)如果给的目录存在,则下载文件;下载命令执行结束后测试文件下载成功与否;如果成功,则返回0给调用脚本,否则,返回52给调用脚本; [root@localhost tmp]# cat downfile.sh #!/bin/bash url=$1 dir=$2 download() { cd $dir >> /dev/null 2>&1 if [ $? -ne 0 ];then read -p “$dir No such file or directory,create?(y/n)” answer if [ “$answer” == “y” ];then mkdir -p $dir cd $dir wget $url 1> /dev/null 2>&1 else return “51” fi fi if [ $? -ne 0 ]; then return “52” fi } download $url $dir echo $? 27、写一个脚本,详细需求如下: 1、创建一个函数 可以接受一个磁盘设备路径(如/dev/sdb)作为参数;在真正开始后面步骤之前提醒用户有危险,并让用户选择是否继续;而后将此磁盘设备上的所有分区清空(提示,使用命令dd if=/dev/zero of=/dev/sdb bs=512 count=1实现,注意其中的设备路径不要写错了; 如果此步骤失败,返回67给主程序; 接着在此磁盘设备上创建两个主分区,一个大小为100M,一个大小为1G;如果此步骤失败,返回68给主程序; 格式化此两分区,文件系统类型为ext3;如果此步骤失败,返回69给主程序; 如果上述过程都正常,返回0给主程序; 2、调用此函数 并通过接收函数执行的返回值来判断其执行情况,并将信息显示出来; local Darray=(`ls /dev/sd[a-z]`) for i in ${Darray};do [[ “$i” == “$1” ]] && Sd=$i &&break done else return66 fi #当匹配成功,进入选择,告诉用户,是否继续,输错的话进入无限循环,当用户选择Y,则清空目标分区,且跳出while循环 while :;do read -p “Warning!!!This operation will clean $Sd data.Next=y,Quit=n [y|n]:” Choice case $Choice in y) dd if=/dev/zero of=$Sd bs=512 count=1 &> /dev/null &&break || return 67 ;; n) exit 88 ;; *) echo “Invalid choice,please choice again.” ;; esac done #使用echo传递给fdisk进行分区,如果此命令失败,则跳转出去,错误值68,需要注意的是,有时候这个返回值很诡异,笔者之前成功与否都是返回的1,后来重启之后,就好了,如果慎重的话,可以对创建的分区,进行判断,不过就需要使用其他工具截取相关字段了,虽有些小麻烦,但无大碍 echo-e “n\np\n1\n\n+100M\nn\np\n2\n\n+1024M\nw\n”|fdisk /dev/sdb&> /dev/null || || return 68 #格式化之前,让内核重新读取磁盘分区表,值得注意的是,有的系统版本,使用partprobe无效,譬如笔者的环境是rhel5.8,而rhel6.0以后,这个命令就很危险了,而使用partx -a /dev/sdb则效果更好…此项需慎重,如果格式化失败,则告知把失败的分区定义成变量,且跳出函数,并带出错误值69 `partprobe` Part=`fdisk -l /dev/$Sd|tail -2|cut -d” ” -f1` for M in ${Part};do mke2fs -j $M &> /dev/null && ErrorPart=$M &&return 69 done return 0 } #下面代码,调用函数,接收函数返回值,根据返回值进行判断哪里出错。 Disk_Mod $1 Res=$? [ $Res-eq 0 ] && exit 0 [ $Res-eq 66 ] && echo “Error! Invalid input.” [ $Res-eq 67 ] && echo “Error! Command -> dd fdisk mke2fs 28、如何让history命令显示具体时间? HISTTIMEFORMAT=”%Y-%m-%d %H:%M:%S” export HISTTIMEFORMAT 重新开机后会还原,可以写/etc/profile 原文来自: http://www.yunweipai.com/archives/18798.html

优秀的个人博客,低调大师

常用linux面试笔试题及参考答案

一.填空题: 1. 在Linux系统中,以文件方式访问设备 . 2. Linux内核引导时,从文件/etc/fstab中读取要加载的文件系统. 3. Linux文件系统中每个文件用i节点来标识. 4. 全部磁盘块由四个部分组成,分别为引导块 、专用块 、 i节点表块 和数据存储块. 5. 链接分为:硬链接 和 符号链接. 6. 超级块包含了i节点表 和 空闲块表等重要的文件系统信息. 7. 某文件的权限为:d-rw-_r--_r--,用数值形式表示该权限,则该八进制数为:644,该文件属性是目录. 8. 前台起动的进程使用Ctrl c终止. 9. 静态路由设定后,若网络拓扑结构发生变化,需由系统管理员修改路由的设置. 10. 网络管理的重要任务是:控制 和 监控. 11. 安装Linux系统对硬盘分区时,有两种分区类型:文件系统分区 和 交换分区. 13. 编写的Shell程序运行前赋予该脚本文件执行权限. 14. 系统管理的任务之一是能够在分布式环境中实现对程序和数据的安全保护、备份、恢复和更新. 15. 系统交换分区是作为系统虚拟存储器的一块区域. 16. 内核分为进程管理系统 、 内存管理系统 、 I/O管理系统 和文件管理系统等四个子系统. 17. 内核配置是系统管理员在改变系统配置硬件时要进行的重要操作. 18. 在安装Linux系统中,使用netconfig程序对网络进行配置,该安装程序会一步步提示用户输入主机名、域名、域名服务器、IP地址、网关地址 和 子网掩码等必要信息. 19. 唯一标识每一个用户的是用户 ID 和用户名. 20 .RIP协议是最为普遍的一种内部协议,一般称为动态路由信息协议. 21. 在Linux系统中所有内容都被表示为文件,组织文件的各种方法称为文件系统. 22. DHCP可以实现动态 IP 地址分配. 23. 系统网络管理员的管理对象是服务器、 用户 和服务器的进程 以及系统的各种资源. 24. 网络管理通常由监测、传输和管理三部分组成,其中管理部分是整个网络管理的中心. 25. 当想删除本系统用不上的 设备驱动程序 时编译内核,当内核不支持系统上的 设备驱动程序 时,对内核 升级 . 26 Ping命令可以测试网络中本机系统是否能到达 一台远程主机 ,常常用于测试网络的 连通性 . 27. vi编辑器具有两种工作模式: 命令模式 和 输入模式 . 28. 可以用ls &ndash;al命令来观察文件的权限,每个文件的权限都用10位表示,并分为四段,其中第一段占 1 位,表示 文件类型 ,第二段占3位,表示 文件所有者 对该文件的权限. 29. 进程与程序的区别在于其动态性,动态的产生和终止,从产生到终止进程可以具有的基本状态为: 运行态 、 就绪态 和 等待态(阻塞态) . 30. DNS实际上是分布在internet上的主机信息的数据库,其作用是实现 IP地址和主机名 之间的转换. 31. Apache是实现WWW服务器功能的应用程序,即通常所说的"浏览web服务器",在服务器端 为用户提供浏览 web服务 的就是apache应用程序. 32. 在Linux系统上做备份可以有两种类型:系统备份 和 用户备份 .其中前者是指对 操作系统 的备份,后者是指对 应用程序和用户文件的备份. 33. CD-ROM标准的文件系统类型是 iso9660 . 34. 当lilo.conf配置完毕后,使之生效,应运行的命令及参数是 lilo . 35. 在使用ls命令时,用八进制形式显示非打印字符应使用参数 -b . 36. Linux使用支持Windows 9.x/2000长文件名的文件系统的类型是 vfat . 37. 设定限制用户使用磁盘空间的命令是 quota . 38 在Linux系统中,用来存放系统所需要的配置文件和子目录的目录是 /etc . 39. 硬连接只能建立对 文件 链接.符号链接可以跨不同文件系统创建. 40. 套接字文件的属性位是 s . 41. 结束后台进程的命令是 kill . 42. 进程的运行有两种方式,即 独立运行和使用父进程运行 . 43. Links分为 硬链接和符号链接 . 44. 在超级用户下显示Linux系统中正在运行的全部进程,应使用的命令及参数是 ps -aux . 45. 管道文件的属性位是 p . 46. 将前一个命令的标准输出作为后一个命令的标准输入,称之为 管道 . 47. 为脚本程序指定执行权的命令及参数是 chmod a x filename . 48. 进行远程登录的命令是 telnet . 49. 欲发送10个分组报文测试与主机abc.tuu.edu.cn的连通性,应使用的命令和参数是: ping abc.tuu.edu.cn &ndash;c 10 . 50. DNS服务器的进程命名为named,当其启动时,自动装载 /etc目录下的 named.conf 文件中定义的DNS分区数据库文件. 51. Apache服务器进程配置文件是 httpd.conf .52.在 Linux系统中,压缩文件后生成后缀为.gz文件的命令是 gzip . 53. 在用vi编辑文件时,将文件内容存入test.txt文件中,应在命令模式下键入 :w test.txt . 54 可以在标准输出上显示整年日历的命令及参数是 cal -y . 55. 在shell编程时,使用方括号表示测试条件的规则是:方括号两边有 空格 . 56. 检查已安装的文件系统/dev/had5是否正常,若检查有错,则自动修复,其命令及参数是 fsck &ndash;a /dev/had5 . 57. 在Windows9.x环境下共享Unix/Linux中的用户目录的一个工具是 Samba服务器 . 58. 系统管理员的职责是进行系统资源管理、系统性能管理、设备管理、安全管理和 系统性能监测 . 59 在Linux系统中,测试DNS服务器是否能够正确解析域名的的客户端命令,使用命令 nslookup . 60. 在Linux系统下,第二个IDE通道的硬盘(从盘)被标识为 hdb . 61. 当系统管理员需升级内核版本和改变系统硬件配置时,应 重新编译内核 . 62. 如果只是要修改系统的IP地址,应修改 /etc/rc.d/rc.inet1 配置文件. 63. 当LAN内没有条件建立DNS服务器,但又想让局域网内的用户可以使用计算机名互相访问时,应配置 /etc/hosts 文件. 64. 在vi编辑环境下,使用 Esc键 进行模式转换. 65. Slackware Linux 9.0通常使用 ext3 文件系统,系统的全部磁盘块由 四 部分组成. 66. 将/home/stud1/wang目录做归档压缩,压缩后生成wang.tar.gz文件,并将此文件保存到/home目录下,实现此任务的tar命令格式 tar zcvf /home/wang.tar.gz /home/stud1/wang . 67. 管道就是将前一个命令的 标准输出 作为后一个命令的 标准输入 . 68. 在使用手工的方法配置网络时,可通过修改 /etc/HOSTNAME 文件来改变主机名,若要配置该计算机的域名解析客户端,需配置 /etc/resolv.conf 文件. 69. 启动进程有手动启动和调度启动两种方法,其中调度启动常用的命令为 at 、 batch 和 crontab . 70. test.bns.com.cn的域名是 bns.com.cn ,如果要配置一域名服务器,应在 named.conf 文件中定义DNS数据库的工作目录. 71. Sendmail邮件系统使用的两个主要协议是: SMTP 和 POP ,前者用来发送邮件,后者用来接收邮件. 72. DHCP是动态主机配置协议的简称,其作用是:为网络中的主机分配IP地址 . 73. 目前代理服务器使用的软件包有很多种,教材中使用的是 squid . 74. rm命令可删除文件或目录,其主要差别就是是否使用递归开关 -r或-R . 75. mv 命令可以移动文件和目录,还可以为文件和目录重新命名. 76. 路由选择协议(RIP)的跳数表示到达目的地之前通过的 网关 数,RIP接受的最长距离是 15跳 . 77. ping命令用于测试网络的连通性,ping命令通过 ICMP 协议(internet控制信息协议)来实现. 78. nfs 协议用于实现Unix(/linux)主机之间的文件系统共享. 79. 在Linux操作系统中,设备都是通过特殊的 文件 来访问. 80. shell不仅是 用户命令的解释器 ,它同时也是一种功能强大的编程语言. bash是Linux的缺省shell. 81. 用 〉;〉; 符号将输出重定向内容附加在原文的后面. 82. 增加一个用户的命令是:adduser 或useradd . 83 进行字符串查找,使用grep命令. 84. 使用 * 每次匹配若干个字符. 85. /sbin 目录用来存放系统管理员使用的管理程序. 二.单项选择题: 1. 下面的网络协议中,面向连接的的协议是: A . A 传输控制协议 B 用户数据报协议 C 网际协议 D 网际控制报文协议 2. 在/etc/fstab文件中指定的文件系统加载参数中, D 参数一般用于CD-ROM等移动设备. A defaults B sw C rw和ro D noauto 3. Linux文件权限一共10位长度,分成四段,第三段表示的内容是 C . A 文件类型 B 文件所有者的权限 C 文件所有者所在组的权限 D 其他用户的权限 4. 终止一个前台进程可能用到的命令和操作 B . A kill B 〈CTRL〉; C C shut down D halt 5.在使用mkdir命令创建新的目录时,在其父目录不存在时先创建父目录的选项是 D . A -m B -d C -f D -p 6. 下面关于i节点描述错误的是 A.(inode是一种数据结构,vfs中描述文件的相关参数??) A i节点和文件是一一对应的 B i节点能描述文件占用的块数 C i节点描述了文件大小和指向数据块的指针 D 通过i节点实现文件的逻辑结构和物理结构的转换 7. 一个文件名字为rr.Z,可以用来解压缩的命令是: D . A tar B gzip C compress D uncompress 8. 具有很多C语言的功能,又称过滤器的是 C . A csh B tcsh C awk (awk详解) D sed 9. 一台主机要实现通过局域网与另一个局域网通信,需要做的工作是 C .A 配置域名服务器 B 定义一条本机指向所在网络的路由 C 定义一条本机指向所在网络网关的路由 D 定义一条本机指向目标网络网关的路由 10. 建立动态路由需要用到的文件有 D . A /etc/hosts B /etc/HOSTNAME C /etc/resolv.conf D /etc/gateways 11. 局域网的网络地址192.168.1.0/24,局域网络连接其它网络的网关地址是192.168.1.1.主机192.168.1.20访问172.16.1.0/24网络时,其路由设置正确的是 B . A route add &ndash;net 192.168.1.0 gw 192.168.1.1 netmask 255.255.255.0 metric 1 B route add &ndash;net 172.16.1.0 gw 192.168.1.1 netmask 255.255.255.255 metric 1 C route add &ndash;net 172.16.1.0 gw 172.16.1.1 netmask 255.255.255.0 metric 1 D route add default 192.168.1.0 netmask 172.168.1.1 metric 1 12. 下列提法中,不属于ifconfig命令作用范围的是 D . A 配置本地回环地址 B 配置网卡的IP地址 C 激活网络适配器 D 加载网卡到内核中 13. 下列关于链接描述,错误的是 B . A 硬链接就是让链接文件的i节点号指向被链接文件的i节点 B 硬链接和符号连接都是产生一个新的i节点 C 链接分为硬链接和符号链接 D 硬连接不能链接目录文件 14. 在局域网络内的某台主机用ping命令测试网络连接时发现网络内部的主机都可以连同,而不能与公网连通,问题可能是 C. A 主机IP设置有误 B 没有设置连接局域网的网关 C 局域网的网关或主机的网关设置有误 D 局域网DNS服务器设置有误 15. 下列文件中,包含了主机名到IP地址的映射关系的文件是: B . A /etc/HOSTNAME B /etc/hosts C /etc/resolv.conf D /etc/networks 16. 不需要编译内核的情况是 D . A 删除系统不用的设备驱动程序时 B 升级内核时 C 添加新硬件时 D 将网卡激活 17. 在shell中变量的赋值有四种方法,其中,采用name=12的方法称 A . A 直接赋值 B使用read命令 C 使用命令行参数 D使用命令的输出 18. D 命令可以从文本文件的每一行中截取指定内容的数据. A cp B dd C fmt D cut 19. 下列不是Linux系统进程类型的是 D . A 交互进程 B 批处理进程 C 守护进程 D 就绪进程(进程状态) 20.配置Apache 1.3.19服务器需要修改的配置文件为___A______ A httpd.conf B access.conf C srm.conf D named.conf 21. 内核不包括的子系统是 D . A 进程管理系统 B 内存管理系统 C I/O管理系统 D硬件管理系统 22. 在日常管理中,通常CPU会影响系统性能的情况是: A . A CPU已满负荷地运转 B CPU的运行效率为30% C CPU的运行效率为50% D CPU的运行效率为80% 23. 若一台计算机的内存为128MB,则交换分区的大小通常是 C . A 64MB B 128MB C 256MB D 512MB 24. 在安装Linux的过程中的第五步是让用户选择安装方式,如果用户希望安装部分组件(软件程序),并在选择好后让系统自动安装,应该选择的选项是 D . A full B expert C newbie D menu 25. Linux有三个查看文件的命令,若希望在查看文件内容过程中可以用光标上下移动来查看文件内容,应使用 C 命令. A cat B more C less D menu 26. 下列信息是某系统用ps &ndash;ef命令列出的正在运行的进程, D 进程是运行Internet超级服务器,它负责监听Internet sockets上的连接,并调用合适的服务器来处理接收的信息. A root 1 4.0 0.0 344 204? S 17:09 0:00 init B root 2 0.0 0.1 2916 1520? S 17:09 0:00 /sbin/getty C root 3 0.0 0.2 1364 632? S 17:09 0:00 /usr/sbin/syslogd D root 4 0.0 1344 1204? S 17:09 0:10 /usr/sbin/inetd 27.在TCP/IP模型中,应用层包含了所有的高层协议,在下列的一些应用协议中, B 是能够实现本地与远程主机之间的文件传输工作. A telnet B FTP C SNMP D NFS 28.当我们与某远程网络连接不上时,就需要跟踪路由查看,以便了解在网络的什么位置出现了问题,满足该目的的命令是 C . A ping B ifconfig C traceroute D netstat 29.对名为fido的文件用chmod 551 fido 进行了修改,则它的许可权是 D . A -rwxr-xr-x B -rwxr--r-- C -r--r--r-- D -r-xr-x-x 30. 在i节点表中的磁盘地址表中,若一个文件的长度是从磁盘地址表的第1块到第11块,则该文件共占有 B 块号. A 256 B 266 C 11 D 256&times;10 (??)31. 用ls &ndash;al 命令列出下面的文件列表, D 文件是符号连接文件. A -rw-rw-rw- 2 hel-s users 56 Sep 09 11:05 hello B -rwxrwxrwx 2 hel-s users 56 Sep 09 11:05 goodbey C drwxr--r-- 1 hel users 1024 Sep 10 08:10 zhangD lrwxr--r-- 1 hel users 2024 Sep 12 08:12 cheng 32. DNS域名系统主要负责主机名和 A 之间的解析. A IP地址 B MAC地址 C 网络地址 D 主机别名 33. WWW服务器是在Internet上使用最为广泛,它采用的是 B 结构. A 服务器/工作站 B B/S C 集中式 D 分布式 34.Linux系统通过 C 命令给其他用户发消息. A less B mesg y C write D echo to[ 注:mesg [y|n] 所有使用者 决定是否允许其他人传讯息到自己的终端机介面 ] 35.NFS是 C 系统. A 文件 B 磁盘 C 网络文件 D 操作 36. B 命令可以在Linux的安全系统中完成文件向磁带备份的工作. A cp B tr C dir D cpio[注:如果用 echo $PATH 或者 echo $LD_LIBRARY_PATH 等类似的命令来显示路径信息的话,我们看到的将会是一大堆用冒号连接在一起的路径, tr 命令可以把这些冒号转换为回车,这样,这些路径就具有很好的可读性了: echo $PATH | tr &quot;:&quot; &quot;&#92;n&quot;] 37.Linux文件系统的文件都按其作用分门别类地放在相关的目录中,对于外部设备文件,一般应将其放在 C 目录中. A /bin B /etc C /dev D /lib 38.在重新启动Linux系统的同时把内存中的信息写入硬盘,应使用 D 命令实现. A # reboot B # halt C # reboot D # shutdown &ndash;r now 39.网络管理具备以下几大功能:配置管理、 A 、性能管理、安全管理和计费管理等. A 故障管理 B 日常备份管理 C 升级管理 D 发送邮件 40.关于代理服务器的论述,正确的是 A . A 使用internet上已有的公开代理服务器,只需配置客户端. B 代理服务器只能代理客户端http的请求. C 设置好的代理服务器可以被网络上任何主机使用. D 使用代理服务器的客户端没有自己的ip地址. 41.关闭linux系统(不重新启动)可使用命令 B . A Ctrl Alt Del B halt C shutdown -r now D reboot 42.实现从IP地址到以太网MAC地址转换的命令为: C . A ping B ifconfig C arp D traceroute 43.在vi编辑器中的命令模式下,键入 B 可在光标当前所在行下添加一新行. A 〈a〉; B 〈o〉; C 〈I〉; D A 44.在vi编辑器中的命令模式下,删除当前光标处的字符使用 A 命令. A 〈x〉; B 〈d〉;〈w〉; C 〈D〉; D 〈d〉;〈d〉; 45.在vi编辑器中的命令模式下,重复上一次对编辑的文本进行的操作,可使用 C 命令. A 上箭头 B 下箭头 C 〈.〉; D 〈*〉; 46.用命令ls -al显示出文件ff的描述如下所示,由此可知文件ff的类型为 A . -rwxr-xr-- 1 root root 599 Cec 10 17:12 ff A 普通文件 B 硬链接 C 目录 D 符号链接 47.删除文件命令为: D . A mkdir B rmdir C mv D rm 48.在下列的名称中,不属于DNS服务器类型的是:____C_____ A Primary Master Server B Secondary Master Server C samba D Cache_only Server 49.网络管理员对WWW服务器进行访问、控制存取和运行等控制,这些控制可在 A 文件中体现. A httpd.conf B lilo.conf C inetd.conf D resolv.conf 50.邮件转发代理也称邮件转发服务器,它可以使用SMTP协议,也可以使用 C 协议. A FTP B TCP C UUCP D POP 51.启动samba服务器进程,可以有两种方式:独立启动方式和父进程启动方式,其中前者是在 C 文件中以独立进程方式启动. A /usr/sbin/smbd B /usr/sbin/nmbd Crc.sambaD /etc/inetd.conf 52.DHCP是动态主机配置协议的简称,其作用是可以使网络管理员通过一台服务器来管理一个网络系统,自动地为一个网络中的主机分配___D______地址. A 网络 B MAC C TCP D IP 53.为了保证在启动服务器时自动启动DHCP进程,应将 A文件中的dhcpd=no改为dhcpd=yes. Arc.inet1B lilo.conf C inetd.conf D httpd.conf[注: 英文原义:RC中文释义:含有程序(应用程序甚至操作系统)启动指令的脚本文件注解:这一文件在操作系统启动时会自动执行,它含有要运行的指令(命令或其它脚本)列表.] 54.对文件进行归档的命令为 D . A dd B cpio C gzip D tar 55.改变文件所有者的命令为 C . A chmod B touch C chown D cat 56.在给定文件中查找与设定条件相符字符串的命令为: A . A grep B gzip C find D sort 57.建立一个新文件可以使用的命令为 D . A chmod B more C cp Dtouch(指令改变档案的时间记录.) 58.在下列命令中,不能显示文本文件内容的命令是: D . A more B less C tail D join 59.在使用匿名登录ftp时,用户名为 B . A users B anonymous C root D guest 60.在实际操作中,想了解命令logname 的用法,可以键入 D 得到帮助. A logname --man B logname/? C help logname D logname --help 61.如果LILO被安装在MBR,使用 A 命令即可卸载LILO. A lilo &ndash;u B lilo &ndash;c C lilo &ndash;v D lilo -V 62.当用命令ls &ndash;al查看文件和目录时,欲观看卷过屏幕的内容,应使用组合键 D . A Shift Home B Ctrl PgUp C Alt PgDn D Shift PgUp 63.mc是UNIX风格操作系统的 C . A 文件编辑器/程序编译器 B 配置网络的窗口工具 C 目录浏览器/文件管理器 D Samba服务器管理工具 64.i节点是一个 D 长的表,表中包含了文件的相关信息.A 8字节 B 16字节 C 32字节 D 64字节 65.文件权限读、写、执行的三种标志符号依次是 A . A rwx B xrw C rdx D srw 66.Linux 文件名的长度不得超过 C 个字符. A 64 B 128 C 256 D 512 67.进程有三种状态: C . A 准备态、执行态和退出态 B 精确态、模糊态和随机态 C 运行态、就绪态和等待态 D 手工态、自动态和自由态 68. 从后台启动进程,应在命令的结尾加上符号 A . A &amp; B @ C # D $ 69. B 不是邮件系统的组成部分. A 用户代理B 代理服务器C 传输代理 D 投递代理 70.在Shell脚本中,用来读取文件内各个域的内容并将其赋值给Shell变量的命令是 D . A fold B join C tr D read 71.crontab文件由六个域组成,每个域之间用空格分割,其排列如下: B . A MIN HOUR DAY MONTH YEAR COMMAND B MIN HOUR DAY MONTH DAYOFWEEK COMMAND C COMMAND HOUR DAY MONTH DAYOFWEEK D COMMAND YEAR MONTH DAY HOUR MINcrontab命令:实现程序定时运行 72.用ftp进行文件传输时,有两种模式: C . A Word和binary B .txt和Word Document C ASCII和binary D ASCII和Rich Text Format 73.某文件的组外成员的权限为只读;所有者有全部权限;组内的权限为读与写,则该文件的权限为 D . A 467 B 674 C 476 D 764 74.在DNS系统测试时,设named进程号是53,命令 D 通知进程重读配置文件. A kill &ndash;USR2 53 B kill &ndash;USR1 53 C kill -INT 63 D kill &ndash;HUP 53 75.Apache服务器默认的接听连接端口号是 C . A 1024 B 800 C 80 (http)D 8 76.PHP和MySQL的联合使用解决了 C . A 在Proxy上处理数据库的访问问题 B 在WWW服务器上处理黑客的非法访问问题 C 在WWW服务器上处理数据库的访问问题 D 在Sendmail邮件系统上处理数据库的访问问题 77.OpenSSL是一个 A . A 加密软件 B 邮件系统 C 数据库管理系统 D 嵌入式脚本编程语言 78.Samba服务器的配置文件是 D . A httpd.conf B inetd.conf C rc.samba D smb.conf 79.关于DNS服务器,叙述正确的是 D . A DNS服务器配置不需要配置客户端 B 建立某个分区的DNS服务器时只需要建立一个主DNS服务器 C 主DNS服务器需要启动named进程,而辅DNS服务器不需要 D DNS服务器的root.cache文件包含了根名字服务器的有关信息 80.退出交互模式的shell,应键入 C . A 〈Esc〉; B ^q C exit D quit 81.将Windows C:盘(hda1)安装在Linux文件系统的/winsys目录下,命令是 B . Aroot@l04.edu.cn:~#mountdev/had1 /winsys Broot@l04.edu.cn:~#mount/dev/had1 /winsys Croot@l04.edu.cn:~#mount/dev/had1 winsys Droot@l04.edu.cn:~#mountdev/had1 winsys 82.设超级用户root当前所在目录为:/usr/local,键入cd命令后,用户当前所在目录为 B . A /home B /root C /home/root D /usr/local 83.字符设备文件类型的标志是 B . A p B c C s D l 84.将光盘CD-ROM(hdc)安装到文件系统的/mnt/cdrom目录下的命令是 C . A mount /mnt/cdrom B mount /mnt/cdrom /dev/hdc C mount /dev/hdc /mnt/cdromD mount /dev/hdc 85.将光盘/dev/hdc卸载的命令是 C . A umount /dev/hdc B unmount /dev/hdc C umount /mnt/cdrom /dev/hdc D unmount /mnt/cdrom /dev/hdc 86.在/home/stud1/wang目录下有一文件file,使用 D 可实现在后台执行命令,此命令将file文件中的内容输出到file.copy文件中. A cat file 〉;file.copy B cat 〉;file.copy C cat file file.copy &amp; D cat file 〉;file.copy &amp; 87.在DNS配置文件中,用于表示某主机别名的是: B . A NS B CNAME C NAME D CN 88.可以完成主机名与IP地址的正向解析和反向解析任务的命令是: A . AnslookupB arp C ifconfig D dnslook 89.下列变量名中有效的shell变量名是: C . A -2-time B _2$3 C trust_no_1 D 2004file 90.qmail是 B . A 收取邮件的协议 B 邮件服务器的一种 C 发送邮件的协议 D 邮件队列 92.已知某用户stud1,其用户目录为/home/stud1.分页显示当前目录下的所有文件的文件或目录名、用户组、用户、文件大小、文件或目录权限、文件创建时间等信息的命令是 D . A more ls &ndash;al B more &ndash;al ls C more 〈 ls &ndash;al D ls &ndash;al | more 93.关于进程调度命令, B 是不正确的.at--定期执行程序的调度命令 A 当日晚11点执行clear命令,使用at命令:at 23:00 today clearB 每年1月1日早上6点执行date命令,使用at命令:at 6am Jan 1 date C 每日晚11点执行date命令,crontab文件中应为:0 23 * * * date D 每小时执行一次clear命令,crontab文件中应为:0 */1 * * * clear 94.系统中有用户user1和user2,同属于users组.在user1用户目录下有一文件file1,它拥有644的权限,如果user2用户想修改user1用户目录下的file1文件,应拥有 B 权限. A 744 B 664 C 646 D 746 95.如果想配置一台匿名ftp服务器,应修改 C 文件. A /etc/gateway B /etc/ftpservers C /etc/ftpusers D /etc/inetd.conf 96.Samba服务器的进程由B 两部分组成 . A named和sendmail Bsmbd和nmbdC bootp和dhcpd D httpd和squid 97.要配置NFS服务器,在服务器端主要配置 C 文件. A /etc/rc.d/rc.inet1 B /etc/rc.d/rc.MC /etc/exportsD /etc/rc.d/rc.S 98.为保证在启动服务器时自动启动DHCP进程,应对 B 文件进行编辑. A /etc/rc.d/rc.inet2B /etc/rc.d/rc.inet1C /etc/dhcpd.conf D /etc/rc.d/rc.S 99.在配置代理服务器时,若设置代理服务器的工作缓存为64MB,配置行应为 D . A cache 64MB B cache_dir ufs /usr/local/squid/cache 10000 16 256 C cache_ mgr 64MB Dcache_ mem 64MB 100.安全管理涉及的问题包括保证网络管理工作可靠进行的安全问题和保护网络用户及网络管理对象问题. C 属于安全管理的内容. A 配置设备的工作参数 B 收集与网络性能有关的数据 C 控制和维护访问权限 D 监测故障 101.以下命令对中,正确的是: B . A ls和sl B cat和tac C more和erom D exit和tixecat是显示文件夹的命令,这个大家都知道,tac是cat的倒写,意思也和它是相反的.cat是从第一行显示到一行,而tac是从一行显示到第一行,而rev 则是从一个字符显示到第一个字符 102. B 命令是在vi编辑器中执行存盘退出. A :q B ZZ C :q! D :WQ 103.下列关于/etc/fstab文件描述,正确的是 D . A fstab文件只能描述属于linux的文件系统 B CD_ROM和软盘是自动加载的 C fstab文件中描述的文件系统不能被卸载 D 启动时按fstab文件描述内容加载文件系统 104.通过文件名存取文件时,文件系统内部的操作过程是通过 C . A 文件在目录中查找文件数据存取位置.B 文件名直接找到文件的数据,进行存取操作. C 文件名在目录中查找对应的I节点,通过I节点存取文件数据. D 文件名在中查找对应的超级块,在超级块查找对应i节点,通过i节点存取文件数据 105.Linux将存储设备和输入/输出设备均看做文件来操作, C 不是以文件的形式出现. A 目录 B 软链接 C i节点表 D 网络适配器 106.关于i节点和超级块,下列论述不正确的是 B . A i节点是一个长度固定的表 B 超级块在文件系统的个数是唯一的 C i节点包含了描述一个文件所必需的全部信息 D 超级块记录了i节点表和空闲块表信息在磁盘中存放的位置 107. D 设备是字符设备. A hdc B fd0 C hda1 D tty1(A,B,C为块设备) 108. B 目录存放着Linux的源代码. A /etc B /usr/src C /usr D /home 109.关于文件系统的安装和卸载,下面描述正确的是 A . A 如果光盘未经卸载,光驱是打不开的 B 安装文件系统的安装点只能是/mnt下 C 不管光驱中是否有光盘,系统都可以安装CD-ROM设备 D mount /dev/fd0 /floppy 此命令中目录/floppy是自动生成的 110. B 不是进程和程序的区别. A 程序是一组有序的静态指令,进程是一次程序的执行过程 B 程序只能在前台运行,而进程可以在前台或后台运行 C 程序可以长期保存,进程是暂时的 D 程序没有状态,而进程是有状态的 111.文件exer1的访问权限为rw-r--r--,现要增加所有用户的执行权限和同组用户的写权限,下列命令正确的是 A . A chmod a x g w exer1B chmod 765 exer1 C chmod o x exer1 D chmod g w exer1 112.有关归档和压缩命令,下面描述正确的是 C . A 用uncompress命令解压缩由compress命令生成的后缀为.zip的压缩文件 B unzip命令和gzip命令可以解压缩相同类型的文件 C tar归档且压缩的文件可以由gzip命令解压缩 D tar命令归档后的文件也是一种压缩文件 113.不是shell具有的功能和特点的是 C . A 管道 B 输入输出重定向 C 执行后台进程 D 处理程序命令 114.下列对shell变量FRUIT操作,正确的是: C . A 为变量赋值:$FRUIT=apple B 显示变量的值:fruit=apple C 显示变量的值:echo $FRUIT D 判断变量是否有值:[ -f "$FRUIT" ] 三.简答题: 1.简述Linux文件系统通过i节点把文件的逻辑结构和物理结构转换的工作过程. 参考答案: Linux通过i节点表将文件的逻辑结构和物理结构进行转换. i 节点是一个64字节长的表,表中包含了文件的相关信息,其中有文件的大小、文件所有者、文件的存取许可方式以及文件的类型等重要信息.在i节点表中最重要 的内容是磁盘地址表.在磁盘地址表中有13个块号,文件将以块号在磁盘地址表中出现的顺序依次读取相应的块.Linux文件系统通过把i节点和文件名进行 连接,当需要读取该文件时,文件系统在当前目录表中查找该文件名对应的项,由此得到该文件相对应的i节点号,通过该i节点的磁盘地址表把分散存放的文件物 理块连接成文件的逻辑结构.2.简述进程的启动、终止的方式以及如何进行进程的查看. 参考答案: 在Linux中启动一个进程有手工启动和调度启动两种方式: (1)手工启动 用户在输入端发出命令,直接启动一个进程的启动方式.可以分为: ①前台启动:直接在SHELL中输入命令进行启动. ②后台启动:启动一个目前并不紧急的进程,如打印进程. (2)调度启动 系统管理员根据系统资源和进程占用资源的情况,事先进行调度安排,指定任务运行的时间和场合,到时候系统会自动完成该任务. 经常使用的进程调度命令为:at、batch、crontab. 3. 简述DNS进行域名解析的过程. 参考答案: ,客户端发出DNS请求翻译IP地址或主机名.DNS服务器在收到客户机的请求后: (1)检查DNS服务器的缓存,若查到请求的地址或名字,即向客户机发出应答信息; (2)若没有查到,则在数据库中查找,若查到请求的地址或名字,即向客户机发出应答信息; (3)若没有查到,则将请求发给根域DNS服务器,并依序从根域查找顶级域,由顶级查找二级域,二级域查找三级,直至找到要解析的地址或名字,即向客户机所在网络的DNS服务器发出应答信息,DNS服务器收到应答后现在缓存中存储,然后,将解析结果发给客户机. (4)若没有找到,则返回错误信息.4.系统管理员的职责包括那些?管理的对象是什么? 参考答案: 系统管理员的职责是进行系统资源管理、设备管理、系统性能管理、安全管理和系统性能监测.管理的对象是服务器、用户、服务器的进程及系统的各种资源等. 5.简述安装Slackware Linux系统的过程. 参考答案: (1)对硬盘重新分区. (2)启动Linux系统(用光盘、软盘等). (3)建立Linux主分区和交换分区.(4)用setup命令安装Linux系统. (5)格式化Linux主分区和交换分区(6)安装Linux软件包 (7)安装完毕,建立从硬盘启动Linux系统的LILO启动程序,或者制作一张启动Linux系统的软盘.重新启动Linux系统. 6.什么是静态路由,其特点是什么?什么是动态路由,其特点是什么? 参考答案: 静态路由是由系统管理员设计与构建的路由表规定的路由.适用于网关数量有限的场合,且网络拓朴结构不经常变化的网络.其缺点是不能动态地适用网络状况的变化,当网络状况变化后由网络管理员修改路由表. 动态路由是由路由选择协议而动态构建的,路由协议之间通过交换各自所拥有的路由信息实时更新路由表的内容.动态路由可以自动学习网络的拓朴结构,并更新路由表.其缺点是路由广播更新信息将占据大量的网络带宽. 87.进程的查看和调度分别使用什么命令? 参考答案: 进程查看的命令是ps和top. 进程调度的命令有at,crontab,batch,kill. 8.当文件系统受到破坏时,如何检查和修复系统? 参考答案: 成功修复文件系统的前提是要有两个以上的主文件系统,并保证在修复之前卸载将被修复的文件系统. 使用命令fsck对受到破坏的文件系统进行修复.fsck检查文件系统分为5步,每一步检查系统不同部分的连接特性并对上一步进行验证和修改.在执行 fsck命令时,检查从超级块开始,然后是分配的磁盘块、路径名、目录的连接性、链接数目以及空闲块链表、i-node. 9.解释i节点在文件系统中的作用. 参考答案: 在linux文件系统中,是以块为单位存储信息的,为了找到某一个文件在存储空间中存放的位置,用i节点对一个文件进行索引.I节点包含了描述一个文件所的全部信息.i节点是文件系统管理的一个数据结构. 10.什么是符号链接,什么是硬链接?符号链接与硬链接的区别是什么? 参考答案: 链接分硬链接和符号链接. 符号链接可以建立对于文件和目录的链接.符号链接可以跨文件系统,即可以跨磁盘分区.符号链接的文件类型位是l,链接文件具有新的i节点. 硬链接不可以跨文件系统.它只能建立对文件的链接,硬链接的文件类型位是-,且硬链接文件的i节点同被链接文件的i节点相同. 11.在对linux系统分区进行格式化时需要对磁盘簇(或i节点密度)的大小进行选择,请说明选择的原则. 参考答案: 磁盘簇(或i节点密度)是文件系统调度文件的基本单元.磁盘簇的大小,直接影响系统调度磁盘空间效率.当磁盘分区较大时,磁盘簇也应选得大些;当分区较小时,磁盘簇应选得小些.通常使用经验值. 12.简述网络文件系统NFS,并说明其作用. 参考答案: 网络文件系统是应用层的一种应用服务,它主要应用于Linux和Linux系统、Linux和Unix系统之间的文件或目录的共享.对于用户而言可以通过 NFS方便的访问远地的文件系统,使之成为本地文件系统的一部分.采用NFS之后省去了登录的过程,方便了用户访问系统资源.13.某/etc /fstab文件中的某行如下: /dev/had5 /mnt/dosdata msdos defaults,usrquota 1 2 请解释其含义. 参考答案: (1)第一列:将被加载的文件系统名;(2)第二列:该文件系统的安装点; (3)第三列:文件系统的类型;(4)第四列:设置参数; (5)第五列:供备份程序确定上次备份距现在的天数; (6)第六列:在系统引导时检测文件系统的顺序. 14.Apache服务器的配置文件httpd.conf中有很多内容,请解释如下配置项: (1)MaxKeepAliveRequests 200 (2)UserDir public_html 3)DefaultType text/plain (4)AddLanguare en.en (5)DocumentRoot"/usr/local/httpd/htdocs" (6)AddType application/x-httpd-php.php.php.php4 参考答案: (1)允许每次连接的最大请求数目,此为200;(2)设定用户放置网页的目录; (3)设置服务器对于不认识的文件类型的预设格式; (4)设置可传送语言的文件给浏览器;(5)该目录为Apache放置网页的地方; (6)服务器选择使用php4. 15.某Linux主机的/etc/rc.d/rc.inet1文件中有如下语句,请修正错误,并解释其内容. /etc/rc.d/rc.inet1: &hellip;&hellip; ROUTE add &ndash;net default gw 192.168.0.101 netmask 255.255.0.0 metric 1 ROUTE add &ndash;net 192.168.1.0 gw 192.168.0.250 netmask 255.255.0.0 metric 1 参考答案: 修正错误: (1)ROUTE应改为小写:route;(2)netmask 255.255.0.0应改为:netmask 255.255.255.0; (3)缺省路由的子网掩码应改为:netmask 0.0.0.0; (4)缺省路由在设定,否则其后的路由将无效. 解释内容: (1)route:建立静态路由表的命令;(2)add:增加一条新路由; (3)-net 192.168.1.0:到达一个目标网络的网络地址; (4)default:建立一条缺省路由;(5)gw 192.168.0.101:网关地址; (6)metric 1:到达目标网络经过的路由器数(跳数).16.试解释apache服务器以下配置的含义: (1)port 1080 (2)UserDir userdoc (3)DocumentRoot "/home/htdocs" (4)〈Directory /home/htdocs/inside〉; Options Indexes FollowSymLinks AllowOverride None Order deny,allow deny from all allow from 192.168.1.5 〈/Directory〉; (5)Server Type Standlone Apache服务器配置行含义如下: (1)将apache服务器的端口号设定为1080; (2)设定用户网页目录为userdoc; (3)设定apache服务器的网页根目录:/home/htdocs; (4)在此apache服务器上设定一个目录/home/htdocs/inside,且此目录只允许IP地址为192.168.1.5的主机访问; (5)定义apache服务器以独立进程的方式运行. 17.简述使用ftp进行文件传输时的两种登录方式?它们的区别是什么?常用的ftp文件传输命令是什么? 参考答案: (1)ftp有两种登录方式:匿名登录和授权登录.使用匿名登录时,用户名为:anonymous,密码为:任何合法email地址;使用授权登录时,用户名为用户在远程系统中的用户帐号,密码为用户在远程系统中的用户密码. 区别:使用匿名登录只能访问ftp目录下的资源,默认配置下只能下载;而授权登录访问的权限大于匿名登录,且上载、下载均可. (2)ftp文件传输有两种文件传输模式:ASCII模式和binary模式.ASCII模式用来传输文本文件,其他文件的传输使用binary模式. (3)常用的ftp文件传输命令为:bin、asc、put、get、mput、mget、prompt、bye

优秀的个人博客,低调大师

面试题:如何解决Spring 的循环依赖问题

Spring 的循环依赖问题 什么是循环依赖 什么是循环依赖呢?可以把它拆分成循环和依赖两个部分来看,循环是指计算机领域中的循环,执行流程形成闭合回路;依赖就是完成这个动作的前提准备条件,和我们平常说的依赖大体上含义一致。放到 Spring 中来看就一个或多个 Bean 实例之间存在直接或间接的依赖关系,构成循环调用,循环依赖可以分为直接循环依赖和间接循环依赖,直接循环依赖的简单依赖场景:Bean A 依赖于 Bean B,然后 Bean B 又反过来依赖于 Bean A(Bean A -> Bean B -> Bean A),间接循环依赖的一个依赖场景:Bean A 依赖于 Bean B,Bean B 依赖于 Bean C,Bean C 依赖于 Bean A,中间多了一层,但是最终还是形成循环(Bean A -> Bean B -> Bean C -> Bean A)。 循环依赖的类型 第一种是自依赖,自己依赖自己从而形成循环依赖,一般情况下不会发生这种循环依赖,因为它很容易被我们发现。 第二种是直接依赖,发生在两个对象之间,比如:Bean A 依赖于 Bean B,然后 Bean B 又反过来依赖于 Bean A,如果比较细心的话肉眼也不难发现。 第三种是间接依赖,这种依赖类型发生在 3 个或者以上的对象依赖的场景,间接依赖最简单的场景:Bean A 依赖于 Bean B,Bean B 依赖于 Bean C,Bean C 依赖于 Bean A,可以想象当中间依赖的对象很多时,是很难发现这种循环依赖的,一般都是借助一些工具排查。 Spring 对几种循环依赖场景支持情况 在介绍 Spring 对几种循环依赖场景的处理方式之前,先来看看在 Spring 中循环依赖会有哪些场景,大部分常见的场景总结如下图所示: 有句话说得好,源码之下无秘密,下面就通过源码探究这些场景 Spring 是否支持,以及支持的原因或者不支持的原因,话不多说,下面进入正题。 第 ① 种场景——单例 Bean 的 setter 注入 这种使用方式也是最常用的方式之一,假设有两个 Service 分别为 OrderService(订单相关业务逻辑)和 TradeService(交易相关业务逻辑),代码如下: /** * @author mghio * @since 2021-07-17 */ @Service public class OrderService { @Autowired private TradeService tradeService; public void testCreateOrder() { // omit business logic ... } } /** * @author mghio * @since 2021-07-17 */ @Service public class TradeService { @Autowired private OrderService orderService; public void testCreateTrade() { // omit business logic ... } } 这种循环依赖场景,程序是可以正常运行的,从代码上看确实是有循环依赖了,也就是说 Spring 是支持这种循环依赖场景的,这里我们察觉不到循环依赖的原因是 Spring 已经默默地解决了。 假设没有做任何处理,按照正常的创建逻辑来执行的话,流程是这样的:容器先创建 OrderService,发现依赖于 TradeService,再创建 OrderService,又发现依赖于 TradeService ... ,发生无限死循环,最后发生栈溢出错误,程序停止。为了支持这种常见的循环依赖场景,Spring 将创建对象分为如下几个步骤: 实例化一个新对象(在堆中),但此时尚未给对象属性赋值 给对象赋值 调用 BeanPostProcessor 的一些实现类的方法,在这个阶段,Bean 已经创建并赋值属性完成。这时候容器中所有实现 BeanPostProcessor 接口的类都会被调用(e.g. AOP) 初始化(如果实现了 InitializingBean,就会调用这个类的方法来完成类的初始化) 返回创建出来的实例 为此,Spring 引入了三级缓存来处理这个问题(三级缓存定义在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry 中),第一级缓存 singletonObjects 用于存放完全初始化好的 Bean,从该缓存中取出的 Bean 可以直接使用,第二级缓存 earlySingletonObjects 用于存放提前暴露的单例对象的缓存,存放原始的 Bean 对象(属性尚未赋值),用于解决循环依赖,第三级缓存 singletonFactories 用于存放单例对象工厂的缓存,存放 Bean 工厂对象,用于解决循环依赖。上述实例使用三级缓存的处理流程如下所示: 如果你看过三级缓存的定义源码的话,可能也有这样的疑问:为什么第三级的缓存的要定义成 Map<String, ObjectFactory<?>>,不能直接缓存对象吗?这里不能直接保存对象实例,因为这样就无法对其做增强处理了。详情可见类 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean 方法部分源码如下: 第 ② 种场景——多例 Bean 的 setter 注入 这种方式平常使用得相对较少,还是使用前文的两个 Service 作为示例,唯一不同的地方是现在都声明为多例了,示例代码如下: /** * @author mghio * @since 2021-07-17 */ @Service @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class OrderService { @Autowired private TradeService tradeService; public void testCreateOrder() { // omit business logic ... } } /** * @author mghio * @since 2021-07-17 */ @Service @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class TradeService { @Autowired private OrderService orderService; public void testCreateTrade() { // omit business logic ... } } 如果你在 Spring 中运行以上代码,是可以正常启动成功的,原因是在类 org.springframework.beans.factory.support.DefaultListableBeanFactory 的 preInstantiateSingletons() 方法预实例化处理时,过滤掉了多例类型的 Bean,方法部分代码如下: 但是如果此时有其它单例类型的 Bean 依赖到这些多例类型的 Bean 的时候,就会报如下所示的循环依赖错误了。 第 ③ 种场景——代理对象的 setter 注入 这种场景也会经常碰到,有时候为了实现异步调用会在 XXXXService 类的方法上添加 @Async 注解,让方法对外部变成异步调用(前提要是要在启用类上添加启用注解哦 @EnableAsync),示例代码如下: /** * @author mghio * @since 2021-07-17 */ @EnableAsync @SpringBootApplication public class BlogMghioCodeApplication { public static void main(String[] args) { SpringApplication.run(BlogMghioCodeApplication.class, args); } } /** * @author mghio * @since 2021-07-17 */ @Service @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class OrderService { @Autowired private TradeService tradeService; @Async public void testCreateOrder() { // omit business logic ... } } /** * @author mghio * @since 2021-07-17 */ @Service @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class TradeService { @Autowired private OrderService orderService; public void testCreateTrade() { // omit business logic ... } } 在标有 @Async 注解的场景下,在添加启用异步注解(@EnableAsync)后,代理对象会通过 AOP 自动生成。以上代码运行会抛出 BeanCurrentlyInCreationException 异常。运行的大致流程如下图所示: 源码在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory 类的方法 doCreateBean 中,会判断第二级缓存 earlySingletonObjects 中的对象是否等于原始对象,方法判断部分的源码如下: 二级缓存存放的对象是 AOP 生成出来的代理对象,和原始对象不相等,所以抛出了循环依赖错误。如果细看源码的话,会发现如果二级缓存是空的话会直接返回(因为比较的对象都没有,根本无法校验了),就不会报循环依赖的错误了,默认情况下,Spring 是按照文件全路径递归搜索,按路径 + 文件名 排序,排序靠前先加载,所以我们只要调整这两个类名称,让方法标有 @Async 注解的类排序在后面即可。 第 ④ 种场景——构造器注入 构造器注入的场景很少,到目前为止我所接触过的公司项目和开源项目中还没遇到使用构造器注入的,虽然用得不多,但是需要知道 Spring 为什么不支持这种场景的循环依赖,构造器注入的示例代码如下: /** * @author mghio * @since 2021-07-17 */ @Service public class OrderService { private TradeService tradeService; public OrderService(TradeService tradeService) { this.tradeService = tradeService; } public void testCreateOrder() { // omit business logic ... } } /** * @author mghio * @since 2021-07-17 */ @Service public class TradeService { private OrderService orderService; public TradeService(OrderService orderService) { this.orderService = orderService; } public void testCreateTrade() { // omit business logic ... } } 构造器注入无法加入到第三级缓存当中,Spring 框架中的三级缓存在此场景下无用武之地,所以只能抛出异常,整体流程如下(虚线表示无法执行,为了直观也把下一步画出来了): 第 ⑤ 种场景——DependsOn 循环依赖 这种 DependsOn 循环依赖场景很少,一般情况下不怎么使用,了解一下会导致循环依赖的问题即可,@DependsOn 注解主要是用来指定实例化顺序的,示例代码如下: /** * @author mghio * @since 2021-07-17 */ @Service @DependsOn("tradeService") public class OrderService { @Autowired private TradeService tradeService; public void testCreateOrder() { // omit business logic ... } } /** * @author mghio * @since 2021-07-17 */ @Service @DependsOn("orderService") public class TradeService { @Autowired private OrderService orderService; public void testCreateTrade() { // omit business logic ... } } 通过上文,我们知道,如果这里的类没有标注 @DependsOn 注解的话是可以正常运行的,因为 Spring 支持单例 setter 注入,但是加了示例代码的 @DependsOn 注解后会报循环依赖错误,原因是在类 org.springframework.beans.factory.support.AbstractBeanFactory 的方法 doGetBean() 中检查了 dependsOn 的实例是否有循环依赖,如果有循环依赖则抛出循环依赖异常,方法判断部分代码如下: 总结 本文主要介绍了什么是循环依赖以及 Spring 对各种循环依赖场景的处理,文中只列出了部分涉及到的源码,都标了所在源码中的位置,感兴趣的朋友可以去看看完整源码,最后 Spring 对各种循环依赖场景的支持情况如下图所示(P.S. Spring 版本:5.1.9.RELEASE):

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。