首页 文章 精选 留言 我的

精选列表

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

爱奇艺面试

JMM,高并发高吞吐各自适应使用的GC方法,如何造成OOM,解决OOM 手动回收对象 栈中new的对象生存时间 聊聊集合hashmap,ArrayList,concurrenthashmap java锁的分类 java中队列,树数据结构的实现 并发的JVM模型 springboot分布式 redis基本数据结构,跳表 mysql验证所用索引类型 linux java查看进程号方法 sql一个组工资前三的人 线程池满时发生情况 redis前缀树能否判断空格,""等 关注新的技术行业信息

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

Linux运维面试

一、填空题 1.在Linux系统 中,以文件方式访问设备 。 2. Linux内核引导时,从文件/etc/fstab中读取要加载的文件系统 。 3. Linux文件系统中每个文件用indoe节点来标识。 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.当想删除本系统用不上的设备驱动程序 时必须编译内核,当内核不支持系统上的设备驱动程序 时,必须对内核升级。 26Ping命令可以测试网络中本机系统是否能到达一台远程主机 ,所以常常用于测试网络的 连通性。 27. vi编辑器具有两种工作模式:命令 模式和输入模式。 28.可以用ls–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–c 10。 50. DNS服务器的进程命名为named,当其启动时,自动装载/etc目录下的named.conf文件中定义的DNS分区数据库文件。 51. Apache服务器进程配置文件是httpd.conf。 52.在Linux系统中,压缩文件后生成后缀为.gz文件的命令是gzip。 53.在用vi编辑文件时,将文件内容存入test.txt文件中,应在命令模式下键入 :wtest.txt。 54可以在标准输出上显示整年日历的命令及参数是cal -y。 55.在shell编程时,使用方括号表示测试条件的规则是:方括号两边必须有空格。 56.检查已安装的文件系统/dev/sda5是否正常,若检查有错,则自动修复,其命令及参数是fsck–a /dev/sda5。 57.在Windows9.x环境下共享Unix/Linux中的用户目录的一个工具是Samba服务器 。 58.系统管理员的职责是进行系统资源管理、系统性能管理、设备管理、安全管理和系统性能监测。 59在Linux系统中,测试DNS服务器是否能够正确解析 域名的的客户端命令,使用命令nslookup。 60.在Linux系统下,第二个IDE通道的硬盘(从盘)被标识为sdb。 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。 75.mv命令可以移动文件和目录,还可以为文件和目录重新命名。 76.路由选择 协议(RIP)的跳数表示到达目的地之前必须通过的网关 数,RIP接受的最长距离是15跳 。 77. ping命令用于测试网络的连通性,ping命令通过ICMP协议(internet控制信息协议)来实现。 78.nfs协议 用于实现Unix(/linux)主机之间的文件系统共享。 79. shell不仅是用户命令的解释器 ,它同时也是一种功能强大的编程语言。bash是Linux的缺省shell。 80.用>>符号将输出重定向内容附加在原文的后面。 81.增加一个用户的命令是:adduser或useradd。 82进行字符串查找,使用grep命令。 83.使用*每次匹配若干个字符。 84./sbin目录用来存放系统管理员使用的管理程序。 二、选择题 shell部分 1.在shell中变量的赋值有四种方法,其中,采用name=12的方法称A。 A直接赋值 B使用read命令 C使用命令行参数 D使用命令的输出 2.D命令可以从文本文件的每一行中截取指定内容的数据。 A cp B dd C fmt D cut 3.在Shell脚本中,用来读取文件内各个域的内容并将其赋值给Shell变量的命令是D。 A fold B join C tr D read 4.退出交互模式的shell,应键入C。 A ; B ^q C exit D quit 5.下列变量名中有效的shell变量名是:C。 A -2-time B _2$3 C trust_no_1 D 2004file 6.是shell具有的功能和特点的是C。 A管道B输入输出重定向C执行后台进程D处理程序命令 7.下列对shell变量FRUIT操作,正确的是:C。 A为变量赋值:$FRUIT=apple B显示变量的值:fruit=apple C显示变量的值:echo $FRUIT D判断变量是否有值:[ -f―$FRUIT‖] 网络部分 1.下面的网络协议中,面向连接的的协议是:A。 A传输控制协议 B用户数据报协议 C网际协议 D网际控制报文协议 2.一台主机要实现通过局域网与另一个局域网通信,需要做的工作是C。 A配置域名服务器 B定义一条本机指向所在网络的路由 C定义一条本机指向所在网络网关的路由 D定义一条本机指向目标网络网关的路由 服务器管理 1.在/etc/fstab文件中指定的文件系统加载参数中,D参数一般用于CD-ROM等移动设备。 A defaults B sw C rw和ro D noauto #noauto只在命令下挂载 2.Linux文件权限一共10位长度,分成四段,第三段表示的内容是C。 A文件类型 B文件所有者的权限 C文件所有者所在组的权限 D其他用户的权限 3.终止一个前台进程可能用到的命令和操作B。 A kill B ;+C C shut down D halt 4.在使用mkdir命令创建新的目录时,在其父目录不存在时先创建父目录的选项是D。 A -m B -d C -f D –p 5.下面关于i节点描述错误的是A。(inode是一种数据结构,vfs中描述文件的相关参数??) A i节点和文件是一一对应的 B i节点能描述文件占用的块数 C i节点描述了文件大小和指向数据块的指针 D通过i节点实现文件的逻辑结构和物理结构的转换 6.具有很多C语言的功能,又称过滤器的是C。 A csh B tcsh C awk(awk详解 ) D sed 7.建立动态路由需要用到的文件有D。 A /etc/hosts B /etc/HOSTNAME C /etc/resolv.conf D /etc/gateways 8.局域网的网络地址192.168.1.0/24,局域网络连接其它网络的网关地址是192.168.1.1。主机192.168.1.20访问172.16.1.0/24网络时,其路由设置正确的是B。 A route add –net 192.168.1.0 gw 192.168.1.1 netmask 255.255.255.0 metric1 B route add –net 172.16.1.0 gw 192.168.1.1 netmask 255.255.255.255 metric1 C route add –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 9.下列提法中,不属于ifconfig命令作用范围的是D。 A配置本地回环地址 B配置网卡的IP地址 C激活网络适配器 D加载网卡到内核中 10.下列关于链接描述,错误的是B。 A硬链接就是让链接文件的i节点号指向被链接文件的i节点 B硬链接和符号连接都是产生一个新的i节点 C链接分为硬链接和符号链接 D硬连接不能链接目录文件 11.在局域网络内的某台主机用ping命令测试网络连接时发现网络内部的主机都可以连同,而不能与公网连通,问题可能是C。 A主机IP设置有误 B没有设置连接局域网的网关 C局域网的网关或主机的网关设置有误 D局域网DNS服务器设置有误 12.下列文件中,包含了主机名到IP地址的映射关系的文件是:B。 A /etc/HOSTNAME B /etc/hosts C /etc/resolv.conf D /etc/networks 13.不需要编译内核的情况是D。 A删除系统不用的设备驱动程序时 B升级内核时 C添加新硬件时 D将网卡激活 14.下列不是Linux系统进程类型的是D。 A交互进程 B批处理进程 C守护进程 D就绪进程(进程状态) 15.配置Apache服务器需要修改的配置文件为A A httpd.conf B access.conf C srm.conf D named.conf 16.内核不包括的子系统是D。 A进程管理系统 B内存管理系统 C I/O管理系统 D硬件管理系统 17.在日常管理中,通常CPU会影响系统性能的情况是:A。 A CPU已满负荷地运转 B CPU的运行效率为30% C CPU的运行效率为50% D CPU的运行效率为80% 18.若一台计算机的内存为128GB,则交换分区的大小通常是A。 A 4GB B 16GB C 64GB D 256GB 19.Linux查看文件的命令,若希望在查看文件内容过程中可以用光标上下移动来查看文件内容,应使用C命令。 A cat B more C less D head 20.在TCP/IP模型中,应用层包含了所有的高层协议,在下列的一些应用协议中,B是能够实现本地与远程主机之间的文件传输工作。 A telnet B FTP C SNMP D NFS 21.当我们与某远程网络连接不上时,就需要跟踪路由查看,以便了解在网络的什么位置出现了问题,满足该目的的命令是C。 A ping B ifconfig C traceroute D netstat 22.对名为fido的文件用chmod 551 fido进行了修改,则它的许可权是D。 A -rwxr-xr-x B -rwxr--r-- C -r--r--r-- D -r-xr-x—x 23.用ls–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 zhang Dl rwxr--r-- 1 hel users 2024 Sep 12 08:12 cheng 24.DNS域名系统主要负责主机名和A之间的解析。 A IP地址 B MAC地址 C网络地址 D主机别名 25.WWW服务器是在Internet上使用最为广泛,它采用的是B结构。 A服务器/工作站 B B/S C集中式 D分布式 26.Linux系统通过C命令给其他用户发消息。 A less B mesg y C write D echo to [注:mesg [y|n]所有使用者 决定是否允许其他人传讯息到自己的终端机介面] 27.NFS是C系统。 A文件 B磁盘 C网络文件 D操作 28.B命令可以在Linux的安全系统中完成文件向磁带备份的工作。 A cp B tr C dir D cpio [注:如果用echo $PATH或者echo $LD_LIBRARY_PATH等类似的命令来显示路径信息的话,我们看到的将会是一大堆用冒号连接在一起的路径,tr命令可以把这些冒号转换为回车,这样,这些路径就具有很好的可读性了:echo $PATH | tr ":" "\n" ] 29.Linux文件系统的文件都按其作用分门别类地放在相关的目录中,对于外部设备文件,一般应将其放在C目录中。 A /bin B /etc C /dev D /lib 30.在重新启动Linux系统的同时把内存中的信息写入硬盘,应使用D命令实现。 A # reboot B # halt C # reboot D # shutdown –r now 31.网络管理具备以下几大功能:配置管理、A、性能管理、安全管理和计费管理等。 A故障 管理 B日常备份管理 C升级管理 D发送邮件 32.关于代理服务器的论述,正确的是A。 A使用internet上已有的公开代理服务器,只需配置客户端。 B代理服务器只能代理客户端http的请求。 C设置好的代理服务器可以被网络上任何主机使用。 D使用代理服务器的客户端没有自己的ip地址。 33.关闭linux系统(不重新启动)可使用命令B。 A Ctrl+Alt+Del B halt C shutdown -r now D reboot 34.实现从IP地址到以太网MAC地址转换的命令为:C。 A ping B ifconfig C arp D traceroute 35.在vi编辑器中的命令模式下,键入B可在光标当前所在行下添加一新行。 A; B o C; D A 36.在vi编辑器中的命令模式下,删除当前光标处的字符使用A命令。 A x B ;; C ; D ;; 37.在vi编辑器中的命令模式下,重复上一次对编辑的文本进行的操作,可使用C命令。 A上箭头 B下箭头 C <.>; D <*>; 38.用命令ls -al显示出文件ff的描述如下所示,由此可知文件ff的类型为A。-rwxr-xr-- 1 root root 599 Cec 10 17:12 ff A普通文件 B硬链接 C目录 D符号链接 39.删除文件命令为:D。 A mkdir B rmdir C mv D rm 40.在下列的名称中,不属于DNS服务器类型的是:C A Primary Master Server B Secondary Master Server C samba D Cache_only Server 41.邮件转发代理也称邮件转发服务器,它可以使用SMTP协议,也可以使用C协议。 A FTP B TCP C UUCP D POP 42.启动samba服务器进程,可以有两种方式:独立启动方式和父进程启动方式,其中前者是在C文件中以独立进程方式启动。 A /usr/sbin/smbd B /usr/sbin/nmbd Crc.samba D /etc/inetd.conf 43.DHCP是动态主机配置协议的简称,其作用是可以使网络管理员通过一台服务器来管理一个网络系统,自动地为一个网络中的主机分配D地址。 A网络 B MAC C TCP D IP 44.对文件进行归档的命令为D。 A dd B cpio C gzip D tar 45.改变文件所有者的命令为C。 A chmod B touch C chown D cat 46.在给定文件中查找与设定条件相符字符串的命令为:A。 A grep B gzip C find D sort 47.建立一个新文件可以使用的命令为D。 A chmod B more C cp D touch (指令改变档案的时间记录。) 48.在下列命令中,不能显示文本文件内容的命令是:D。 A more B less C tail D join 49.在使用匿名登录ftp时,用户名为B。 A users B anonymous C root D guest 50.在实际操作中,想了解命令logname的用法,可以键入D得到帮助。 A logname --man B logname/? C help logname D logname --help 51.文件权限读、写、执行的三种标志符号依次是A。 A rwx B xrw C rdx D srw 52.Linux文件名的长度不得超过C个字符。 A 64 B 128 C 256 D 512 53.从后台启动进程,应在命令的结尾加上符号A。 A & B @ C # D $ 54.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 MIN crontab命令:实现程序定时运行 55.用ftp进行文件传输时,有两种模式:C。 A Word和binary B .txt和Word Document C ASCII和binary D ASCII和Rich Text Format 56.某文件的组外成员的权限为只读;所有者有全部权限;组内的权限为读与写,则该文件的权限为D。 A 467 B 674 C 476 D 764 57.在DNS系统测试时,设named进程号是53,命令D通知进程重读配置文件。 A kill –USR2 53 B kill –USR1 53 C kill -INT 63 D kill –HUP 53 58.Apache服务器默认的接听连接端口号是C。 A 1024 B 800 C 80 (http) D 8 59.PHP和MySQL的联合使用 解决 了C。 A在Proxy上处理数据库的访问问题 B在WWW服务器上处理黑客的非法访问问题 C在WWW服务器上处理数据库的访问问题 D在Sendmail邮件系统上处理数据库的访问问题 60.OpenSSL是一个A。 A加密软件 B邮件系统 C数据库管理系统 D嵌入式脚本编程语言 61.将Windows C:盘(hda1)安装在Linux文件系统的/winsys目录下,命令是B。 Aroot@l04.edu.cn:~#mount dev/had1 /winsys Broot@l04.edu.cn:~#mount /dev/had1 /winsys Croot@l04.edu.cn:~#mount /dev/had1 winsys Droot@l04.edu.cn:~#mount dev/had1 winsys 63.设超级用户root当前所在目录为:/usr/local,键入cd命令后,用户当前所在目录为B。 A /home B /root C /home/root D /usr/local 64.字符设备文件类型的标志是B。 A p B c C s D l 65.在/home/stud1/wang目录下有一文件file,使用D可实现在后台执行命令,此命令将file文件中的内容输出到file.copy文件中。 A cat file >;file.copy B cat >;file.copy C cat file file.copy & D cat file >;file.copy & 66.在DNS配置文件中,用于表示某主机别名的是:B。 A NS B CNAME C NAME D CN 67.qmail是B。 A收取邮件的协议 B邮件服务器的一种 C发送邮件的协议 D邮件队列 68.已知某用户stud1,其用户目录为/home/stud1。分页显示当前目录下的所有文件的文件或目录名、用户组、用户、文件大小、文件或目录权限、文件创建时间等信息的命令是D。 A more ls –al B more –al ls C more < ls –al D ls –al | more 69.关于进程调度命令,B是不正确的。at--定期执行程序的调度命令 A当日晚11点执行clear命令,使用at命令:at 23:00 today clear B每年1月1日早上6点执行date命令,使用at命令:at 6am Jan 1 date C每日晚11点执行date命令,crontab文件中应为:0 23 * * * date D每小时执行一次clear命令,crontab文件中应为:0 */1 * * * clear 70.系统中有用户user1和user2,同属于users组。在user1用户目录下有一文件file1,它拥有644的权限,如果user2用户想修改user1用户目录下的file1文件,应拥有B权限。 A 744 B 664 C 646 D 746 71.如果想配置一台匿名ftp服务器,应修改C文件。 A /etc/gateway B /etc/ftpservers C /etc/ftpusers D /etc/inetd.conf 72.Samba服务器的进程由B两部分组成 。 A named和sendmail Bsmbd和nmbd C bootp和dhcpd D httpd和squid 73.要配置NFS服务器,在服务器端主要配置C文件。 A /etc/rc.d/rc.inet1 B /etc/rc.d/rc.M C /etc/exports D /etc/rc.d/rc.S 74.为保证在启动服务器时自动启动DHCP进程,应对B文件进行编辑。 A /etc/rc.d/rc.inet2 B /etc/rc.d/rc.inet1 C /etc/dhcpd.conf D /etc/rc.d/rc.S 75.在配置代理服务器时,若设置代理服务器的工作缓存为64MB,配置行应为D。 A cache 64MB B cache_dir ufs /usr/local/squid/cache 10000 16 256 C cache_ mgr 64MB Dcache_ mem 64MB 76.安全管理涉及的问题包括保证网络管理工作可靠进行的安全问题和保护网络用户及网络管理对象问题。C属于安全管理的内容。 A配置设备的工作参数 B收集与网络性能有关的数据 C控制和维护访问权限 D监测故障 77.以下命令对中,正确的是:B。 A ls和sl B cat和tac C more和erom D exit和tixe cat是显示文件夹的命令,这个大家都知道,tac是cat的倒写,意思也和它是相反的。cat是从第一行显示到最后一行,而tac是从最后一行显示到第一行,而rev则是从最后一个字符显示到第一个字符 78.B命令是在vi编辑器中执行存盘退出。 A :q B ZZ C :q! D :WQ 79.B不是进程和程序的区别。 A程序是一组有序的静态指令,进程是一次程序的执行过程 B程序只能在前台运行,而进程可以在前台或后台运行 C程序可以长期保存,进程是暂时的 D程序没有状态,而进程是有状态的 三、简答题 服务器管理和工作原理 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.什么是静态路由,其特点是什么?什么是动态路由,其特点是什么? 参考答案: 静态路由是由系统管理员设计与构建的路由表规定的路由。适用于网关数量有限的场合,且网络拓朴结构不经常变化的网络。其缺点是不能动态地适用网络状况的变化,当网络状况变化后必须由网络管理员修改路由表。动态路由是由路由选择协议而动态构建的,路由协议之间通过交换各自所拥有的路由信息实时更新路由表的内容。动态路由可以自动 学习 网络的拓朴结构,并更新路由表。其缺点是路由广播更新信息将占据大量的网络带宽。 7.进程的查看和调度分别使用什么命令? 参考答案: 进程查看的命令是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: …… ROUTE add –net default gw 192.168.0.101 netmask 255.255.0.0 metric 1 ROUTE add –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应改为:netmask255.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); Options Indexes FollowSymLinks AllowOverride None Order deny,allow deny from all allow from 192.168.1.5 ; (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 18.将内网192.168.0.0/24的原地址修改为 公网IP地址:1.1.1.1 [root@xuegod63 ~]# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to 1.1.1.1 把从eth0进来的要访问TCP/80的数据包目的地址改为192.168.0.1. [root@xuegod63 ~]# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 192.168.0.1 19.简述raid0 raid1 raid5三种工作模式的工作原理及特点。 RAID 0:连续以位或字节为单位分割数据,并行读/写于多个磁盘上,因此具有很高的数据传输率,但它没有数据冗余,因此并不能算是真正的RAID结构。RAID 0只是单纯地提高性能,并没有为数据的可靠性提供保证,而且其中的一个磁盘失效将影响到所有数据。因此,RAID 0不能应用于数据安全性要求高的场合。 RAID 1:它是通过磁盘数据镜像实现数据冗余,在成对的独立磁盘上产生互为备份的数据。当原始数据繁忙时,可直接从镜像拷贝中读取数据,因此RAID 1可以提高读取性能。RAID1是磁盘阵列中单位成本最高的,但提供了很高的数据安全性和可用性。当一个磁盘失效时,系统可以自动切换到镜像磁盘上读写,而不需要重组失效的数据。简单来说就是:镜象结构,类似于备份模式,一个数据被复制到两块硬盘上。 RAID10:高可靠性与高效磁盘结构一个带区结构加一个镜象结构,因为两种结构各有优缺点,因此可以相互补充。主要用于容量不大,但要求速度和差错控制的数据库中。 RAID5:分布式奇偶校验的独立磁盘结构,它的奇偶校验码存在于所有磁盘上,任何一个硬盘损坏,都可以根据其它硬盘上的校验位来重建损坏的数据。支持一块盘掉线后仍然正常运行 20.如何查看占用端口8080的进程 lsof -i:8080 21.请写出apache2.X版本的两种工作模式,以及各自工作原理。如何查看apache当前 所支持的模块,并且查看是工作在哪种模式下? 答案:prefork(多进程,每个进程产生子进程)和worker(多线程,每个进程生成多个线程) prefork的工作原理是,控制进程在最初建立―StartServers个子进程后,为了满足MinSpareServers设置的需要创建一个进程,等待一秒钟,继续创建两个,再等待一秒钟,继续创建四个……如此按指数级增加创建的进程数,最多达到每秒32个,直到满足MinSpareServers设置的值为止。这就是预派生(prefork)的由来。这种模式可以不必在请求到来时再产生新的进程,从而减小了系统开销以增加性能。 worker是2.0版中全新的支持多线程和多进程混合模型的MPM。由于使用线程来处理,所以可以处理相对海量的请求,而系统资源的开销要小于基于进程的服务器。但是,worker也使用了多进程,每个进程又生成多个线程,以获得基于进程服务器的稳定性。这种MPM的工作方式将是Apache 2.0的发展趋势。 可以通过命令httpd -l可以查看apache当前的模块,如果带有worker.c就是工作在worker模式下,如果有prefork.c就是工作在prefork.c的模式下。 22.你使用过监控软件吗?说说其特点 使用nagios对服务器进行监控,其特点可实时实现手机短信、电子邮件、MSN、飞信报警。 使用cacti对流量进行监控。 23.你对现在运维工程师的理解和以及对其工作的认识 运维工程师在公司当中责任重大,需要保证时刻为公司及客户提供最高、最快、最稳定、最安全的服务.运维工程师的一个小小的失误,很有可能会对公司及客户造成重大损失,因此运维工程师的工作需要严谨及富有创新精神。 24.linux下常用的DNS服务软件是什么,举出几种常用的DNS记录,如果域名abc.com配置好了一台邮件服务器,IP地址为202.106.0.20,我该如何做相关的解析?是否了解bind的智能解析,如果了解请简述一下其原理 答案: 1)常用的DNS软件是bind 2)A记录 地址记录 MX记录 邮件交换记录 CNAME记录 别名域记录 3)修改abc.com域名的配置文件,增加以下记录 IN MX 10 mail.abc.com. mail IN A 202.106.0.20 4)bind根据请求解析客户端的IP地址,做出不同的解析,其原理是在配置文件中,设定了view,在每个view都有客户端的IP地址段,bind服务器根据请求解析客户端的IP地址,匹配不同的view,再根据该view的配置,到相应的配置文件进行查询,将结果返回给请求的客户端。 25.通过apache访问日志access.log统计IP和每个地址访问的次数,按访问量列出前10名。日志格式样例如下 192.168.1.247–- [02/Jul/2010:23:44:59 +0800]―GET / HTTP/1.1″200 19 答案: [root@xuegod63 ~]# service httpd restar [root@xuegod63 ~]# curl http://192.168.1.63#自己产生一些日志 [root@xuegod63 ~]# cat /var/log/httpd/access_log |awk '{ print $1 }'| uniq -c|sort -rn|head -10 //这个别的方法也能统计,但有些命令是必要的awk , sort,uniq ,主要看是否这些命令都使用了。 26.如何用MySQL命令进行备份和恢复?以test库为例,创建一个备份,并再用此备份进行恢复。 [root@xuegod63 ~]# yum install -y mysql-server [root@xuegod63 ~]# service mysqld start [root@xuegod63 ~]# mysqldump -u root -p test > test.sql //主要考对方msqldump > test.sql和mysql < test.sql 27.你认为在系统调优方面都包括哪些工作,以linux为例,请简明阐述,并举一些参数为例。 答案: 系统调优包括内核参数优化和应用优化2个方面,对方只要从这两方面来说,就可以了,尽量能有些经验的阐述。 28.挂载windows的共享目录? mount.cifs //IP/SHARE linux的目录--verbose -o user=username <--这个用户是windows下的用户--verbose这个参数可以不加,它是显示过程的 例如mount.cifs //10.1.1.246/gongxiang /mnt --verbose -o user=gao 或者是mount -t cifs umount /mnt或umount.cifs /mnt -l <--取消挂载 图形界面:smb://IP 29.A B网络是通的,最少列出五种传输文件的服务 nfs ,ftp,scp ,rsync,samba,http:// 30.假设Apache产生的日志文件名为access_log,在apache正在运行时,执行命令mv access_log access_log.bak,执行完后,请问新的apache的日志会打印到哪里,为什么? 新的日志会打印在access_log.bak中,因为apache启动时会找到access_log文件,随时准备向文件中加入日志信息,虽然此时文件被改名,但是由于服务正在运行,因为它的inode节点的位置没有变,程序打开的fd仍然会指向原来那个inode,不会因为文件名的改变而改变。apache会继续向已改名的文件中追加日志,但是若重启apache服务,系统会检查access_log文件是否存在,若不存在则创建。 31.如何查看当前Linux系统的状态,如CPU使用,内存使用,负载情况等. Linux系统中―/proc‖是个伪文件目录,不占用系统空间,及时的反应出内存现在使用的进程情况......其中许多文件都保存系统运行状态和相关信息对于―/proc‖中文件可使用文件查看命令浏览其内容,文件中包含系统特定信息: cpuinfo主机CPU信息 filesystems文件系统信息 meninfo主机内存信息 version Linux内存版本信息 diskstatus磁盘负载情况 另外top命令可以动态的显示当前系统进程用户的使用情况,而且是动态的显示出来,尤其是在该命令显示出来的对上方对系统的情况进行汇总. free命令呢可以查看真实使用的内存 一般用free -m 使用lsof、ps -aux可以查看详细的每个进程的使用状况 dmesg也是常用来查看系统性能的命令 32.比如,ext2文件系统, 如果异常死机,开机如何修复文件系统? 如果异常关机,比如断电,通知机房的人开机之后,我们需要远程修复、检查文件系统除了/分区之外, 其他的分区: umount /home fsck -y /home /分区需要开机之后, 由机房的人来扫描随后我们再登录并扫描/home等其他分区如何查看一个进程所使用的文件句柄?看这里面/proc/进程号/fd/的个数就行了 33.简单的比如如何查看apache进程数 [root@localhost fd]# ps -ef|grep httpd|wc -l 1 34./proc/sys子目录的作用 该子目录的作用是报告各种不同的内核参数,并让您能交互地更改其中的某些。与/proc中所有其他文件不同,该目录中的某些文件可以写入,不过这仅针对root。其中的目录以及文件的详细列表将占据过多的篇幅,而且该目录的内容是依赖于系统的,而大部分的文件也仅仅对某些特殊的应用程序有用。然而,以下是该子目录的两个最常见的用途: 允许路由:即便是Mandrakelinux默认的内核也是允许路由的,您必需显式允许它这么做。为此,您只要以root身份键入以下命令:$ echo 1 >/proc/sys/net/ipv4/ip_forward如果您要禁用路由,请将上述命令中的1改为0。 阻止IP欺骗:IP欺骗会让人认为某个来自于外部的某个数据包是来自于它到达的那个接口。这一技术常被骇客(cracker)所使用。您可以让内核阻止这种入侵。请键入:$ echo 1 >/proc/sys/net/ipv4/conf/all/rp_filter这样,这种攻击就不再可能了。这些改变仅当系统运行时有效。在系统重新启动之后,它们会改会它们的默认值。要在启动时就改动这些值,您可以将您在shell提示符后键入的命令添加到/etc/rc.d/rc.local中以免每次都键入它们。另一个方法是修改/etc/sysctl.conf 35.实现字符串翻转 [root@localhost bin]# cat 8 qweqewqedadaddas [root@localhost bin]# rev 8 saddadadeqweqewq ########################################第2次电面 36.sed awk grep哪个最好 我答的是 哪个掌握的精通,都很好,但是还是问我哪个最好,我只能说awk了,对于行操作和列操作都可以操作的很好。 37.grep -E -P是什么意思 我说的是-E, --extended-regexp采用规则表示式去解释样式。-P不太清楚 38.简述Apache两种工作模式,以及它们之间的区别。 答案:最主要的两种模式是prefork模式与worker模式。prefork每个子进程只有一个线程,效率高但消耗内存大,是unix下默认的模式;worker模式每个子进程有多个线程,内存消耗低,但一个线程崩溃会牵连其它同子进程的线程。 39.用iptables添加一个规则允许192.168.0.123访问本机3306端口 iptables -I INPUT 1 -p tcp -m tcp --dport 3306 -s 192.168.0.123 -j ACCEPT 40.个人对该工作的未来如何规划,需要加强哪些能力。 首先,我有一颗真诚的心,遇事沉着冷静,不急不躁;其次,我有相应的专业知识和工作经验。一年多的系统管理经历锻炼了我在这个行业的业务能力,并对行业前景和发展动态有相应的了解;最后,我会用踏实的作风在今后的工作中证明我自己的能力! 41.日常监控都需要监控哪些? 1)硬件: CPU:/proc/cpuinfo 内存:/proc/meminfo 硬盘:fdisk -l 2)系统: 负载:/proc/loadavg uptime查看实时load average、swap 虚拟内存:vmstat(参数-s;2 4) SUID,用户,进程 系统日志:tail -f /var/log/messages logwatch --print --range Today --service SSHD --service pam_unix 3)网络:Host_Alive,Ping,端口,连接 42.如何将本地80端口的请求转发到8080端口,当前主机IP为192.168.16.1,其中本地 网卡eth0: 答: #iptables -t nat -A PREROUTING -d 192.168.16.1 -p tcp --dport 80 -j DNAT --to 192.168.16.1:8080 或者: #iptables -t nat -A PREROUTING -i eth0 -d 192.168.16.1 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080 43.什么是NAT,常见分为那几种,DNAT与SNAT有什么不同,应用事例有那些? NAT(网络地址转换)是将IP数据包头中的IP地址转换为另一个IP地址的过程。在实际应用中,NAT主要用于实现私有网络访问公共网络的功能。 常见的有:DNAT目的网络地址转换,SNAT源网络地址转换 从定义来讲它们一个是源地址转换,一个是目标地址转换。 44.包过滤防火墙与代理应用防火墙有什么区别,能列举几种相应的产品吗? 包过滤防火墙工作在网络协议IP层,它只对IP包的源地址、目标地址及相应端口进行处理,因此速度比较快,能够处理的并发连接比较多,缺点是对应用层的攻击无能为力。 代理服务器防火墙将收到的IP包还原成高层协议的通讯数据,比如http连接信息,因此能够对基于高层协议的攻击进行拦截。缺点是处理速度比较慢,能够处理的并发数比较少。 代理应用防火墙:天融信GFW4000 包过滤防火墙:华为NE 16E 45.iptables是否支持time时间控制用户行为,如有请写出具体操作步骤 支持。需要增加相关支持的内核补丁,并且要重新编译内核。 或者使用crontab配合iptables,首先:vi /deny.bat输入/sbin/iptables -A OUTPUT -p tcp -s 192.168.1.0/24 --dport 80 -j DROP保存退出 打开crontab -e 输入:00 21* * */bin/sh /deny.bat 46.说出你知道的几种linux/unix发行版本 Redhat、CentOS、Fedora、SuSE、Slackware、Gentoo、Debian、Ubuntu、FreeBSD、Solaris、SCO、AIX 47.列出linux常见打包工具并写相应解压缩参数(至少三种) Targzbz 48.计划每星期天早8点服务器定时重启,如何实现? Crontab -e 00 08 * * 7/sbin/init 6 49.列出作为完整邮件系统的软件,至少二类 Sendmail,postfix,qmail 50.当用户在浏览器当中输入一个网g站,说说计算机对dns解释经过那些流程?注:本机跟本地dns还没有缓存。 答:a.用户输入网址到浏览器 b.浏览器发出DNS请求信息 c.计算机首先查询本机HOST文件,看是否存在,存在直接返回结果,不存在,继续下一步 d.计算机按照本地DNS的顺序,向合法dns服务器查询IP结果, e.合法dns返回dns结果给本地dns,本地dns并缓存本结果,直到TTL过期,才再次查询此结果 f.返回IP结果给浏览器 g.浏览器根据IP信息,获取页面 51.我们都知道,dns既采用了tcp协议,又采用了udp协议,什么时候采用tcp协议?什么时候采用udp协议?为什么要这么设计? 答:这个题需要理解的东西比较的多,分一下几个方面 a,从数据包大小上分:UDP的最大包长度是65507个字节, 响应dns查询的时候数据包长度超过512个字节,而返回的只要前512个字节,这时名字解释器通常使用TCP从发原来的请求。 b,从协议本身来分:大部分的情况下使用UDP协议,大家都知道UDP协议是一种不可靠的协议,dns不像其它的使用UDP的Internet应用(如:TFTP,BOOTP和SNMP等),大部分集中在局域网,dns查询和响应需要经过广域网,分组丢失和往返时间的不确定性在广域网比局域网上更大,这就要求dns客户端需要好的重传和超时算法,这时候使用TCP 52.一个EXT3的文件分区,当使用touch test.file命令创建一个新文件时报错,报错的信息是提示磁盘已满,但是采用df -h命令查看磁盘大小时,只使用了,60%的磁盘空间,为什么会出现这个情况,说说你的理由。 答:两种情况,一种是磁盘配额问题,另外一种就是EXT3文件系统的设计不适合很多小文件跟大文件的一种文件格式,出现很多小文件时,容易导致inode耗尽了 53.我们都知道FTP协议有两种工作模式,说说它们的大概的一个工作流程? FTP两种工作模式:主动模式(Active FTP)和被动模式(Passive FTP) 在主动模式下,FTP客户端随机开启一个大于1024的端口N向服务器的21号端口发起连接,然后开放N+1号端口进行监听,并向服务器发出PORT N+1命令。服务器接收到命令后,会用其本地的FTP数据端口(通常是20)来连接客户端指定的端口N+1,进行数据传输。在被动模式下,FTP客户端随机开启一个大于1024的端口N向服务器的21号端口发起连接,同时会开启N+1号端口。然后向服务器发送PASV命令,通知服务器自己处于被动模式。服务器收到命令后,会开放一个大于1024的端口P进行监听,然后用PORT P命令通知客户端,自己的数据端口是P。客户端收到命令后,会通过N+1号端口连接服务器的端口P,然后在两个端口之间进行数据传输。总的来说,主动模式的FTP是指服务器主动连接客户端的数据端口,被动模式的FTP是指服务器被动地等待客户端连接自己的数据端口。被动模式的FTP通常用在处于防火墙之后的FTP客户访问外界FTp服务器的情况,因为在这种情况下,防火墙通常配置为不允许外界访问防火墙之后主机,而只允许由防火墙之后的主机发起的连接请求通过。因此,在这种情况下不能使用主动模式的FTP传输,而被动模式的FTP可以良好的工作。 54.apache有几种工作模式,分别介绍下其特点,并说明什么情况下采用不同的工作模式? apache主要有两种工作模式:prefork(apache的默认安装模式)和worker(可以在编译的时候加参数--with-mpm-worker选择工作模式) prefork的特点是:(预派生) 1.这种模式可以不必在请求到来时再产生新的进程,从而减小了系统开销 2.可以防止意外的内存泄漏 3.在服务器负载下降的时候会自动减少子进程数 worker的特点是:支持混合的多线程多进程的多路处理模块如果对于一个高流量的HTTP服务器worker MPM是一个比较好的选择,因为workerMPM占用的内存要比prefork要小。 55.简述linux下编译内核的意义与步骤 编译内核的意义在于让硬件设备更稳定的发挥其应有的效能; 56.简述Linux启动过程 Bios引导--》启动引导工具grub--》核心初始化--》载入初始程序init--》init初始化--》从inittab中读取数据,决定启动级别--》系统运行 57.简述DDOS攻击的原理 黑客劫持大量傀儡主机,对目标服务器进行合理的资源请求,导致服务器资源耗尽而不能进行正常的服务。 58.简述Tcp三次握手的过程 第一次握手,建立连接,客户端发送SYN包到服务器,并进入SYN_SEND状态,等待服务器确认; 第二次握手,服务器收到SYN,同时自己也发送一个SYN包和一个ACK包来确认客户端的SYN,并进入SYN_RECV; 第三次握手,客户端收到服务器发来的SYN+ACK后,回复服务器端一个ACK确认,发送完毕后,双方进入ESTABLISHED状态。 三次握手成功后,开始传输数据。 59.简述VPN,常见有哪几种? VPN是指在公共的网络上建立专用网络的技术,但是两个节点间并没有物理上的专用的端到端链路,而是通过广域网或者运营商提供的网络平台之上的逻辑网络,用户数据在逻辑链路中传输,它可以有效的节省一般需要达到DDN专线所能达到的同样的目的,而且VPN采用身份验证和加密技术,充分保证了安全性。常见的VPN有:ipsec vpn、PPTP vpn、L2TP vpn、SSL vpn 60.请考虑以下系统的设计.您可以翻阅资料,查询任何您有帮助的资料、指南等。 您有的资源: 8台安装Linux (2.6内核)的双网卡PC服务器以及相关开源软件,交换机 Apache 2.2.x Tomcat 5.5.X 数据库系统 最多8个Internet IP地址,请您设计一个系统: 1、使用双apache web server前端; 2、采用AJP连接后段的3台Tomcat应用服务器,这些tomcat被配置成cluster,因此需要考虑apache对后端的分配, 分配采用完全平衡的方法; 配置使用cookie来实现session stickness; 3、1台数据库服务器只有tomcat才需要连接,也不需要对Internet提供服务。 4、考虑系统的安全性和维护方便性; 5、通过rewrite规则配置把下属URL规则改写成友好的URL http://server/webapp/getinfo?id=XXXX&name=YYYY –> http://server/getinfo/YYYY/XXXX 您需要提交 1、服务器规划,包括: * 网络结构图 * 每台机器的IP地址分配 * 每台机器上运行的关键软件 * 您从安全性和维护性方面的考虑 2、Apache的以下配置文件给我们: *extra/http-proxy-ajp.conf *extra/http-rewrite.conf 2.你可以采取任何设备和不同操作系统服务器设计对两台WWW服务器和两台FTP服务器做负载均衡,用网络拓扑图表示并加以说明!(方法越多越好) 第一种方法: DNS轮巡 www1 IN A 192.168.1.1 www2 IN A 192.168.1.2 www3 IN A 192.168.1.3 ftp1 IN A 192.1.1.4 ftp2 IN A 192.1.1.5 ftp3 IN A 192.1.1.6 www IN CNAME www1 www IN CNAME www2 www IN CNAME www3 ftp IN CNAME ftp1 ftp IN CNAME ftp2 ftp IN CNAME ftp3 四、编程与应用题 1.用Shell编程,判断一文件是不是字符设备文件,如果是将其拷贝到/dev目录下。 参考程序: #!/bin/sh FILENAME= echo―Input file name:‖ read FILENAME if [ -c "$FILENAME" ] then cp $FILENAME /dev fi 2.请下列shell程序加注释,并说明程序的功能和调用方法:#!/bin/sh #!/bin/sh # # /etc/rc.d/rc.httpd # # Start/stop/restart the Apache web server. # # To make Apache start automatically at boot, make this # file executable: chmod 755 /etc/rc.d/rc.httpd # case "$1" in 'start') /usr/sbin/apachectl start ;; 'stop') /usr/sbin/apachectl stop ;; 'restart') /usr/sbin/apachectl restart ;; *) echo "usage $0 start|stop|restart" ;; esac 参考答案: (1)程序注释 #!/bin/sh定义实用的shell # # /etc/rc.d/rc.httpd注释行,凡是以星号开始的行均为注释行。 # # Start/stop/restart the Apache web server. # # To make Apache start automatically at boot, make this # file executable: chmod 755 /etc/rc.d/rc.httpd # case "$1" in #case结构开始,判断―位置参数‖决定执行的操作。本程序携带一个―位置参数‖,即$1 'start') #若位置参数为start /usr/sbin/apachectl start ;; #启动httpd进程 'stop') #若位置参数为stop /usr/sbin/apachectl stop ;; #关闭httpd进程 'restart') #若位置参数为stop /usr/sbin/apachectl restart ;; #重新启动httpd进程 *) #若位置参数不是start、stop或restart时 echo "usage $0 start|stop|restart" ;; #显示命令提示信息:程序的调用方法 esac #case结构结束 (2)程序的功能是启动,停止或重新启动httpd进程 (3)程序的调用方式有三种:启动,停止和重新启动。 3.设计一个shell程序,添加一个新组为class1,然后添加属于这个组的30个用户,用户名的形式为stdxx,其中xx从01到30。 参考答案: #!/bin/sh i=1 groupadd class1 while [ $i -le 30 ] do if [ $i -le 9 ] ;then USERNAME=stu0${i} else USERNAME=stu${i} fi useradd $USERNAME mkdir /home/$USERNAME chown -R $USERNAME /home/$USERNAME chgrp -R class1 /home/$USERNAME i=$(($i+1)) done 4.编写shell程序,实现自动删除50个账号的功能。账号名为stud1至stud50。 参考程序: #!/bin/sh i=1 while [ $i -le 50 ] do userdel -r stud${i} i=$(($i+1 )) done 5.某系统管理员需每天做一定的重复工作,请按照下列要求,编制一个解决 方案 : (1)在下午4 :50删除/abc目录下的全部子目录和全部文件; (2)从早8:00~下午6:00每小时读取/xyz目录下x1文件中每行第一个域的全部数据 加入到/backup目录下的bak01.txt文件内; (3)每逢星期一下午5:50将/data目录下的所有目录和文件归档并压缩为文件: backup.tar.gz; (4)在下午5:55将IDE接口的CD-ROM卸载(假设:CD-ROM的设备名为hdc); (5)在早晨8:00前开机后启动。 参考答案: 解决方案: (1)用vi创建编辑一个名为prgx的crontab文件; prgx文件的内容: 50 16 * * * rm -r /abc/* (2)、0 8-18/1 * * * cut -f1 /xyz/x1 >;>; /backup/bak01.txt (3)、50 17 * * * tar zcvf backup.tar.gz /data (4)、55 17 * * * umount /dev/hdc (5)、由超级用户登录,用crontab执行prgx文件中的内容: root@xxx:#crontab prgx;在每日早晨8:00之前开机后即可自动启动crontab。 --------------------------------------- ------- 6.设计一个shell程序,在每月第一天备份并压缩/etc目录的所有内容,存放在/root/bak目录里,且文件名为如下形式yymmdd_etc,yy为年,mm为月,dd为日。Shell程序fileback存放在/usr/bin目录下。 参考答案: (1)编写shell程序fileback: #!/bin/sh DIRNAME=`ls /root | grep bak` if [ -z "$DIRNAME" ] ; then mkdir /root/bak cd /root/bak fi YY=`date +%y` MM=`date +%m` DD=`date +%d` BACKETC=$YY$MM$DD_etc.tar.gz tar zcvf $BACKETC /etc echo "fileback finished!" (2)编写任务定时器: echo "0 0 1 * * /bin/sh /usr/bin/fileback" >; /root/etcbakcron crontab /root/etcbakcron 或使用crontab -e命令添加定时任务: 0 1 * * * /bin/sh /usr/bin/fileback 7.有一普通用户想在每周日凌晨零点零分定期备份/user/backup到/tmp目录下,该用户应如何做? 参考答案:(1)第一种方法: 用户应使用crontab–e命令创建crontab文件。格式如下: 0 0 * * sun cp –r /user/backup /tmp (2)第二种方法: 用户先在自己目录下新建文件file,文件内容如下: 0 * * sun cp –r /user/backup /tmp 然后执行crontab file使生效。 8.设计一个Shell程序,在/userdata目录下建立50个目录,即user1~user50,并设置每个目录的权限,其中其他用户的权限为:读;文件所有者的权限为:读、写、执行;文件所有者所在组的权限为:读、执行。 参考答案:建立程序Pro16如下: #!/bin/sh i=1 while [ i -le 50 ] do if [ -d /userdata ];then mkdir -p -m 754 /userdata/user$i加上-m 754就不用写下面那一句了-p是递归建 立目录 #chmod 754 /userdata/user$i echo "user$i" let "i = i + 1"(或i=$(($i+1)) else mkdir /userdata mkdir -p -m /userdata/user$i #chmod 754 /userdata/user$i echo "user$i" let "i = i + 1"(或i=$(($i+1)) fi done 9.有文件file [root@xuegod63 ~]# cat file#file中内容如下: aaaaaa bbbbbbbb cccccccabc 查询file里面空行的所在行号 awk'{if($0~/^$/)print NR}'file or grep -n ^$ file |awk'BEGIN{FS=":"}{print $1}' 查询file1以abc结尾的行 grep abc$ file1 打印出file1文件第1到第3行 sed -n '1,3p'file head -3 file 10.编写个shell脚本将/boot/grub/目录下大于100K的文件转移到/opt目录下 [root@xuegod63 ~]# cat test.sh #!/bin/bash cd /boot/grub for file in `ls /boot/grub` #for file in `ls /boot/grub` do if [ -f $file ]; then if [ `ls -l $file|awk '{print $5}'` -gt 10000 ]; then mv $file /opt/ fi fi done 11.有个文件如下: http://a.domain.com/1.html http://b.domain.com/1.html http://c.domain.com/1.html http://a.domain.com/2.html http://b.domain.com/2.html http://a.domain.com/3.html 要求:得到主机名(和域名),并统计哪个网址出现的次数,并排序。可以shell或C。 得到的结果应该是: 3 a.domain.com 2 b.domain.com 1 c.domain.com [root@mail ~]# awk‗BEGIN{FS=‖/‖}{arr[$3]++}END{for(i in arr) print arr[i],i}‘list| sort -r答案 3 a.domain.com 2 b.domain.com 1 c.domain.com 12.如果得到随机的字串,长度和字串中出现的字符表可定义,并将字串倒序显示,如把0123456789作为基准的字串字符表,产生一个6位的字串642031,打印出的字串为130246,可使用bash/perl/php/c任意一种. [root@localhost ~]# awk -v count=6 'BEGIN {srand();str="0123456789";len=length(str);for(i=count;i>0;i--) marry[i]=substr(str,int(rand()*len),1);for(i=count;i>0;i--) printf("%c",marry[i]);printf("\n");for (i=0;i<=count;i++) printf("%c",marry[i]);printf("\n")}' 838705 507838 13.有10台被监控主机、一台监控机,在监控机上编写脚本,一旦某台被监控机器/分区适用率大于80%, 就发邮件报警放到crontab里面, 每10分钟检查一次 #测试机器:虚拟机Linux as 4 #1.首先建立服务器间的信任关系。拿两台机器做测试 本机ip:192.168.1.6 [root@codfei ~]# ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): /root/.ssh/id_rsa already exists. Overwrite (y/n)? y (以为我是第2次建立关系所以此处覆盖原来的文件) Enter passphrase (empty for no passphrase):(直接回车无须输入密钥) Enter same passphrase again: Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: 04:37:13:2a:4b:10:af:c1:2b:03:3f:6b:27:ce:b9:62 root@codfei [root@codfei ~]# cd .ssh/ [root@codfei .ssh]# ll -rw------- 1 root root 883 Apr 25 17:51 id_rsa -rw-r--r-- 1 root root 221 Apr 25 17:51 id_rsa.pub -rw-r--r-- 1 root root 442 Apr 25 17:37 known_hosts id_rsa是密钥文件,id_rsa.pub是公钥文件。 [root@codfei .ssh]# scp id_rsa.pub192.168.1.4:/root/.ssh/192.168.1.6 root@192.168.1.4's password: id_rsa.pub 100% 221 0.2KB/s 00:00 这里把公钥文件取名为本机的ip地址就是为了以后和更多的机器建立信任关系不发生混淆。 现在登陆到192.168.1.4机器 [root@codfei ~]# cd .ssh/ [root@codfei .ssh]# cat 192.168.1.6 >> authorized_keys 然后回到192.168.1.6机器直接 [root@codfei .ssh]# ssh 192.168.1.4 Last login: Wed Aug 8 12:14:42 2007 from 192.168.1.6 这样就可以了,里面偶尔涉及到权限问题。一般./ssh文件夹是755 authorized_keys为600或者644 ####脚本如下####################### #!/bin/bash #SCRIPT:df_check.sh #Writeen by codfei Mon Sep 3 07:25:28 CST 2007 #PURPOSE:This script is used to monitor for full filesystems. #######################Begining#################### #################### FSMAX="80" remote_user='root' #####完全可以不用root remote_ip=(192.168.1.5 192.168.1.6 192.168.1.7 192.168.1.8 192.168.1.9 192.168.1.10 192.168.1.11 192.168.1.12 192.168.1.13 192.168.1.14 ) ----> 这里填写你要监控的主机ip ip_num='0' while [ "$ip_num" -le "$(expr ${#remote_ip[@]} - 1)" ] do read_num='1' ssh "$remote_user"@"${remote_ip[$ip_num]}" df -h > /tmp/diskcheck_tmp grep '^/dev/*' /tmp/diskcheck_tmp|awk '{print $5}'|sed 's/\%//g' > /tmp/diskcheck_num_tmp while [ "$read_num" -le $(wc -l < /tmp/diskcheck_num_tmp) ] do size=$(sed -n "$read_num"'p' /tmp/diskcheck_num_tmp) if [ "$size" -gt "$FSMAX" ] then $(grep '^/dev/*' /tmp/diskcheck_tmp|sed -n $read_num'p' > /tmp/disk_check_mail) $(echo ${remote_ip[$ip_num]} >> /tmp/disk_check_mail) $(mail -s "diskcheck_alert" admin < /tmp/disk_check_mail) fi read_num=$(expr $read_num + 1) done ip_num=$(expr $ip_num + 1) done #############over################################ ################让脚本每十分钟执行一次############# 在cron表中加入 0/10 * * * * /home/codfei/diskcheck.sh 2>&1 ################################################ ########################## 14.如何统计apache的每秒访问数? tail access_log | awk '{print $1,$4}' [root@localhost logs]# grep -c `date -d '3 second ago' +%T` access_log 0 15.将一个文本的奇数行和偶数行合并,第2行和第3行合并 [root@localhost bin]# cat 1 48 Oct 3bc1997 lpas 68.00 lvx2a 138 484 Jan 380sdf1 usp 78.00 deiv 344 483 nov 7pl1998 usp 37.00 kvm9d 644 320 aug der9393 psh 83.00 wiel 293 231 jul sdf9dsf sdfs 99.00 werl 223 230 nov 19dfd9d abd 87.00 sdiv 230 219 sept 5ap1996 usp 65.00 lvx2c 189 216 Sept 3zl1998 usp 86.00 kvm9e 234 [root@localhost bin]# sed '$!N;s/\n/ /g' 1 48 Oct 3bc1997 lpas 68.00 lvx2a 138 484 Jan 380sdf1 usp 78.00 deiv 344 483 nov 7pl1998 usp 37.00 kvm9d 644 320 aug der9393 psh 83.00 wiel 293 231 jul sdf9dsf sdfs 99.00 werl 223 230 nov 19dfd9d abd 87.00 sdiv 230 219 sept 5ap1996 usp 65.00 lvx2c 189 216 Sept 3zl1998 usp 86.00 kvm9e 234 [root@localhost bin]# sed -n -e 2p -e 3p 1|sed '$!N;s/\n/ /' 484 Jan 380sdf1 usp 78.00 deiv 344 483 nov 7pl1998 usp 37.00 kvm9d 644 16.自动ftp上传 #!/bin/sh ftp -n<<END_FTP open 192.168.1.4 user codfei duibuqi //用户名codfei密码duibuqi binary prompt off //关闭提示 mput test //上传test close bye END_FTP 自动ssh登陆 从A到B然后再到c #!/usr/bin/expect -f set timeout 30 spawn ssh codfei@B expect "password:" send "pppppp\r" expect "]*" send "ssh codfei@C\r" expect "password:" send "pppppp\r" interact 17.从a.log文件中提取包含―WARNING或FATAL,同时不包含―IGNOR的行,然后,提取以―:分割的第五个字段? egrep 'WARNING|FATAL' a.log|grep -v'IGNOR'|awk -F: '{print$5}'egrep 'WARNING|FATAL' a.log|grep -v'IGNOR'|awk -F: '{print$5}' 18.添加一个新组为class01,然后,添加属于这个组的30个用户,用户名的形式为stdXX,其中,XX从01到30? #!/bin/bash groupadd class1 for ((i=1;i<=30;i++)) do if [ $i -lt 10 ];then username="std0"$i else username="std"$i fi useradd -G class1 $username done#!/bin/bash groupadd class1 for ((i=1;i<=30;i++)) do if [ $i -lt 10 ];then username="std0"$i else username="std"$i fi useradd -G class1 $username done 19.在每个月的第一天备份并压缩/etc目录下的所有内容,存放在/root/backup目录里,且文件名为如下形式yymmdd_etc,yy为年,mm为月,dd为日。shell程序fileback存放在/usr/bin目录下? crottab -e 0011** /usr/bin/fileback # vi /usr/bin/fileback #!/bin/bash cd /tmp tar zcvf `date +%Y%m%d`_etc/etc mv `date +%Y%m%d`_etc/root/backup 20.用shell编程,判断一文件是不是字符设备文件,如果是将其拷贝到/dev目录下? 参考答案: #!/bin/bash directory=/dev for file in anaconda-ks.cfg install.log install.log.syslog do if [ -f $file ] then cp $file $directory/$file.bak echo " HI, $LOGNAME $file is backed up already in $directory !!" fi done 20.某系统管理员需要每天做一定的重复工作,编制一个解决方案: (1).从下午4:50删除/abc目录下的全部子目录和全部文件; (2).从早上8:00~下午6:00每小时读取/xyz目录下x1文件中每行第一个域的全部数据加入到/backup目录下的back01.txt文件内; (3).每逢周一下午5:50将/data目录下的所有目录和文件归档并压缩为文件backup.tar.gz; (4).在下午5:55将IDE接口的CD-ROM缷载(假设CD-ROM的设备名为hdc); (5).在早上8:00前开机后启动。 解决方案: (1)用vi创建编辑一个名为prgx的crontab文件; prgx文件的内容: 50 16 * * * rm -r /abc/* (2)、0 8-18/1 * * * cut -f1 /xyz/x1 >;>; /backup/bak01.txt (3)、50 17 * * * tar zcvf backup.tar.gz /data (4)、55 17 * * * umount /dev/hdc (5)、由超级用户登录,用crontab执行prgx文件中的内容: root@xxx:#crontab prgx;在每日早晨8:00之前开机后即可自动启动crontab。 21.使用shell,建立class1用户组,再批量建立stu1--stu30的用户,并指定用户组为class1。 vi autoaddusr #!/usr/bin/php -q - 补充vim常用快捷方式 dd 删除当前行 G 移动到文章末行 gg移动到文本首行 x 编辑后保存推出,相对于wq! shift + $ 删除当前位置到行末 shift + G 删除当前位置到文本结束

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

性能面试题汇总

linux 怎么查看文件的后10行内容(考查点:tail) 怎么打印出log中所有404的url(考查点:awk) 当配置文件中,一行有多个ab和abc,如何使用sed命令,一次性把所有的ab替换为ab123,而abc不变? (考查点:sed) 4. top命令主要查看那些参数 数据库 三个表的关联查询 视图怎么用,作用是啥? 编程 Hashmap和Hashtable的区别 启动线程有几种方式?N个线程访问N条sql语句语句,怎么保证不死锁? 其他 如果QQ可以正常登录,但百度访问不了,你怎么分析这个问题? 运行场景时,数据库中数据怎么复用? 运行前备份数据库,复用时还原数据库。 说说项目的支付流程 前端优化的27条定律 如何设计负载?设计负载的标准是什么? 如何识别性能瓶颈?如何发现web服务器的相关问题,如何发现数据库的相关问题? linux文件中,一行有多个ab、abc,如何使用sed命令一次性把ab替换为ab123,而abc不变? 性能测试过程中,数据库你们是怎么监控的呢? 目前你们这个项目共多少用户? 你们的并发用户数最大测到多少? 你们测得的最大TPS是多少? 简要画一下你们的系统架构? 你们这个项目的线上是什么配置? 跟我说说你们的性能测试是怎么做的? 测试的过程中,你都发现了哪些问题? 你们的数据库是怎么优化的? 测试的过程中都发现了哪些数据库的问题? 你们的数据库是怎么监控的? 用mysql慢查询怎么找到执行时间大于5秒的sql语句?怎么配置详细说说怎么找到具体的sql? explain结果怎么分析? 你们的线上使用集群了吗? 中间件(apache、nginx、tomcat)你们是怎么监控的? 数据库死锁的问题你们是怎么定位的? 说说你们接口具体是怎么做的? 如何设置负载?有什么标准? app前端性能你们怎么测试的? loadrunner支持的最大并发时多少?tomcat能够支持的最大并发时多少? 你们这个产品现在有多少用户?你们的并发最大测到多少? 性能测试都测哪些场景?混合场景是怎么组合的? 怎么提交性能需求 本文转自屌丝逆袭博客51CTO博客,原文链接http://blog.51cto.com/5731674/1684175如需转载请自行联系原作者 _追随我心

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

Android面试,与Service交互方式

五种交互方式,分别是:通过广播交互、通过共享文件交互、通过Messenger(信使)交互、通过自定义接口交互、通过AIDL交互。(可能更多) Service与Thread的区别 Thread:Thread 是程序执行的最小单元,可以用 Thread 来执行一些异步的操作。 Service:Service 是android的一种机制,当它运行的时候如果是Local Service,那么对应的 Service 是运行在主进程的 main 线程上的。如果是Remote Service,那么对应的 Service 则是运行在独立进程的 main 线程上。 Thread 的运行是独立的,也就是说当一个 Activity 被 finish 之后,如果没有主动停止 Thread 或者 Thread 里的 run 方法没有执行完毕的话,Thread 也会一直执行。因此这里会出现一个问题:当 Activity 被 finish 之后,不再持有该 Thread 的引用,也就是不能再控制该Thread。另一方面,没有办法在不同的 Activity 中对同一 Thread 进行控制。 例如:如果 一个Thread 需要每隔一段时间连接服务器校验数据,该Thread需要在后台一直运行。这时候如果创建该Thread的Activity被结束了而该Thread没有停止,那么将没有办法再控制该Thread,除非kill掉该程序的进程。这时候如果创建并启动一个 Service ,在 Service 里面创建、运行并控制该 Thread,这样便解决了该问题(因为任何 Activity 都可以控制同一个Service,而系统也只会创建一个对应 Service 的实例)。 因此可以把 Service 想象成一种消息服务,可以在任何有 Context 的地方调用 Context.startService、Context.stopService、Context.bindService、Context.unbindService来控制它,也可以在 Service 里注册 BroadcastReceiver,通过发送 broadcast 来达到控制的目的,这些都是 Thread 做不到的。 Service的生命周期 1. 被启动的服务(startService())的生命周期。 如果一个Service被某个Activity 调用Context.startService() 方法启动,那么不管是否有Activity使用bindService()绑定或unbindService()解除绑定到该Service,该Service都在后台运行。如果一个Service被多次执行startService(),它的onCreate()方法只会调用一次,也就是说该Service只会创建一个实例,而它的onStartCommand()将会被调用多次(对应调用startService()的次数)。该Service将会一直在后台运行,直到被调用stopService(),或自身的stopSelf方法。当然如果系统资源不足,系统也可能结束服务。2. 被绑定的服务(bindService())的生命周期。 如果一个Service被调用Context.bindService ()方法绑定启动,不管调用bindService()调用几次,onCreate()方法都只会调用一次,而onStartCommand()方法始终不会被调用,这时会调用onBind()方法。当连接建立之后,Service将会一直运行,除非调用Context.unbindService() 断开连接或者之前调用bindService() 的 Context 不存在了(如该Activity被finish),系统将会自动停止Service,对应onDestroy()将被调用。 3. 被启动又被绑定的服务的生命周期。 如果一个Service又被启动又被绑定,则该Service将会一直在后台运行。调用unbindService()将不会停止Service,而必须调用stopService()或Service的stopSelf()方法来停止服务。4. 当服务被停止时清除服务。 当一个Service被终止时,Service的onDestroy()方法将会被调用,在这里应当做一些清除工作,如停止在Service中创建并运行的线程等。 Process的生命周期 当Service运行在低内存的环境时,系统会kill掉一些进程。因此进程的优先级将会狠重要: 1. 如果Service当前正在执行onCreate()、onStartCommand()、onDestroy()方法,那麼此时主进程将会成为前台进程来保证代码可以执行完成而避免被kill。 2. 如果Service已经启动,那么主进程将会比其他可见的进程的重要性低,但比其他看不见的进程高。这裡说的可见指的是对用户来讲,可见的进程优先级永远是最高的,用户至上嘛。但只有少部分进程始终是用户可见的,因此除非系统处於极度低内存的时候,不然 service是不会被kill的。 3. 如果有Client端连到Service,那么Service永远比Client端重要。 4. Service可以使用startForeground()将Service放到前台状态。这样在低内存时被kill的几率更低,但如果在极低内存的情况下,该Service理论上还是会被kill掉。但这个情况基本不用考虑。 广播交互 提到Activity与Service的交互,可能狠多人首先想到的就是BroadCast——广播。在Android中,广播是系统提供的一种很好的交互方式。比如:在电池电量过低,开机完成等情况下,系统都会发出相应的系统广播,我们的应用程序只需要注册相应的广播接收器,就可以接收到这些系统的广播。同时,我们也可以定义自己的广播,这样在不同的Activity、Service以及应用程序之间,就可以通过广播来实现交互。我们通过模拟应用程序后台下载的情况来分析Service与Activity的交互方式。 当我们点击StartService按钮之后,界面上的进度条将会每隔一秒加1。因为是模拟下载,因此下载动作我们在Service中通过一个Timer定时器来实现,在Timer中对一个整型数据i进行自加(i++),然后Client端获取Server端的i值并显示在界面上,从而达到模拟的目的。 1.1. 实现原理 Server端将目前的下载进度,通过广播的方式发送出来,Client端注册此广播的监听器,当获取到该广播后,将广播中当前的下载进度解析出来并更新到界面上。 1.2. 实现步骤 1.2.1 在Client端中通过startService()啟动Service。 if(v == startBtn){ Log.i(TAG, "start button clicked...pid: "+Process.myPid()); mIntent.setClass(BroadCastService.this, DownLoadService.class); startService(mIntent); } 这里的mIntent = new Intent();Process.myPid()方法可以获取当前进程的ID号。 1.2.2 DownLoadService接到启动的命令之后,执行onCreate()方法,并在其中开启timer计数模拟下载。 @Override public void onCreate() { super.onCreate(); Log.i(TAG, "DownLoadService.onCreate()...pid: "+Process.myPid()); intent = new Intent("com.seven.broadcast"); mTimer = new Timer(); mTimer.schedule(new MyTimerTask(), 0 , TIME * 1000); } 这里的intent是Server端向Client端传送数据用的,使用的action是”com.seven.broadcast”,Client端只有註册了相应action才能够接收到Server端的广播,并解析其中的内容。Process.myPid()是获取当前进程的ID。 1.2.3 在Server端的timer计数其中发送广播,告知Client端目前下载进度。 class MyTimerTask extends TimerTask{ @Override public void run() { if(i==100){ i=0; } intent.putExtra("CurrentLoading", i); sendBroadcast(intent); i++; Log.e(TAG, "i= "+i); } } 通过intent.putExtra(key,value);设置intent的值,然后通过sendBroadcast(intent)方法,将广播发送出去。 1.2.4 在Client端通过匿名内部类的方式实例化BroadcastReceiver并覆写其中的onReceive()方法。 BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if(MYACTION.equals(intent.getAction())){ Log.i(TAG, "get the broadcast from DownLoadService..."); curLoad = intent.getIntExtra("CurrentLoading", ERROR); mHandler.sendMessage(mHandler.obtainMessage()); } } }; 在onReceive()方法中,判断是否为Server端发送的广播,如果是则对广播中携带的intent数据进行解包处理。这裡也可以单独写一个类继承自BroadcastReceiver,在其中覆写onReceive()方法,在Client端中实例化其对象,同样可以达到相应的效果,这样做可以为后面实现静态注册广播。 1.2.5 更新主介面下载进度。 Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); Log.i(TAG, "current loading: "+curLoad); if(curLoad<0||curLoad>100){ Log.e(TAG, "ERROR: "+curLoad); return; } mProgressBar.setProgress(curLoad); mTextView.setText(curLoad+"%"); } }; 这里对获取到的进度进行了一次判断,如果获取到的值没有异常,那么将会显示到界面,并更新进度条的进度,如果异常则返回。 1.2.6 一定要对Broadcast进行注册和取消注册。只有注册之后相应的broadcast之后才能接收到广播注册方法有两种。 动态注册/取消注册: @Override protected void onResume() { super.onResume(); Log.i(TAG, "register the broadcast receiver..."); IntentFilter filter = new IntentFilter(); filter.addAction(MYACTION); registerReceiver(receiver, filter); } @Override protected void onDestroy() { super.onDestroy(); Log.i(TAG, "unregister the broadcast receiver..."); unregisterReceiver(receiver); } 动态註册可以随时註册随时取消。 静态註册: <receiver android:name="MyBroadcastReceiver"> <intent-filter> <action android:name="com.seven.broadcast" /> </intent-filter> </receiver> 注:这里的MyBroadcastReceiver是一个继承自BroadcastReceiver的类。静态注册只要注册了一次那么只要该程序没有被卸载那么该广播将一直有效。 最后贴出整个AndroidManifest.xml文件 <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".BroadCastService" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:name="DownLoadService" android:process=":remote"/> </application> 这里的android:process =”:remote”可以使该Service运行在单独进程中,从而可以模拟跨进程通信。 1.3 小结 通过广播的方式实现Activity与Service的交互操作简单且容易实现,可以胜任简单级的应用。但缺点也十分明显,发送广播受到系统制约。系统会优先发送系统级广播,在某些特定的情况下,我们自定义的广播可能会延迟。同时在广播接收器中不能处理长耗时操作,否则系统会出现ANR即应用程序无响应。 共享文件交互 这里提到的共享文件指的是Activity和Service使用同一个文件来达到传递数据的目的。我们使用SharedPreferences来实现共享,当然也可以使用其它IO方法实现,通过这种方式实现交互时需要注意,对于文件的读写的时候,同一时间只能一方读一方写,不能两方同时写。 2.1 实现原理 Server端将当前下载进度写入共享文件中,Client端通过读取共享文件中的下载进度,并更新到主界面上。 2.2 实现步骤 2.2.1 在Client端通过startService()啟动Service。 if(startSerBtn==v){ Log.i(TAG, "Start Button Clicked."); if(intent!=null){ startService(intent); timer.schedule(new MyTimerTask(), 0, TIME * 1000); } } 2.2.2 Server端收到启动intent之后执行onCreate()方法,并开启timer,模拟下载,以及初始化SharedPreferences对象preferences。 @Override public void onCreate() { super.onCreate(); Log.i(TAG, "DownLoadService.onCreate()..."); preferences = getSharedPreferences("CurrentLoading_SharedPs", 0); timer = new Timer(); timer.schedule(new MyTimerTask(), 0, TIME*1000); } 2.2.3 开始计数并将下载进度写入shared_prefs文件夹下的xml文件中,内容以键值对的方式保存。 class MyTimerTask extends TimerTask{ @Override public void run() { setCurrentLoading(); if(100==i){ i=0; } i++; } } private void setCurrentLoading() { preferences.edit().putInt("CurrentLoading", i).commit(); } 对於SharedPreferences的使用需要注意一下几点: 首先,使用sharedPreferences前需要获取文件引用。 preferences = getSharedPreferences("CurrentLoading_SharedPs", 0); 其次,使用sharedpreferences写数据方式。 preferences.edit().putInt("CurrentLoading", i).commit(); 最后,读取数据的方式。 int couLoad = preferences.getInt("CurrentLoading", 0); 2.2.4 Client端通过读取/data/data/com.seven.servicetestdemo/shared_prefs文件夹下的xml文件,并取得里面的键值对,从而获取到当前的下载进度,并更新到主界面上。 Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); int couLoad = preferences.getInt("CurrentLoading", 0); mProgressBar.setProgress(couLoad); currentTv.setText(couLoad+"%"); } }; 2.3 小结 因為方法简单,因此就不贴出AndroidManifest.xml文件了。对於这种方式实现Activity与Service的交互,可以说很方便,就像使用管道,一个往裡写,一个往外读。但这种方式也有缺陷,写入数据较为复杂以及数据量较大时,就有可能导致写入与读数据出不一致的错误。同时因为经过了一个中转站,这种操作将更耗时。 Messenger交互(信使交互) Messenger翻译过来指的是信使,它引用了一个Handler对象,别人能够向它发送消息(使用mMessenger.send(Message msg)方法)。该类允许跨进程间基于Message通信,在服务端使用Handler创建一个 Messenger,客户端只要获得这个服务端的Messenger对象就可以与服务端通信了。也就是说我们可以把Messenger当做Client端与Server端的传话筒,这样就可以沟通交流了。 3.1 实现原理 在Server端与Client端之间通过一个Messenger对象来传递消息,该对象类似于信息中转站,所有信息通过该对象携带。 3.2 Messenger的一般用法 (1). 在Server端创建信使对象。 mMessenger = new Messenger(mHandler) (2). Client端使用bindService()绑定Server端。 (3). Server端的onBind()方法返回一个binder对象。 return mMessenger.getBinder(); (4). Client端使用返回的binder对象得到Server端信使。 public void onServiceConnected(ComponentName name, IBinder service) { rMessenger = new Messenger(service); ...... } 这里虽然是new了一个Messenger,但我们查看它的实现 public Messenger(IBinder target) { mTarget = IMessenger.Stub.asInterface(target); } 发现它的mTarget是通过AIDL得到的,实际上就是远程创建的那个。 (5). Client端可以使用这个Server端的信使对象向Server端发送消息。 rMessenger.send(msg); 这样Server端的Handler对象就能收到消息了,然后可以在其handlerMessage(Message msg)方法中进行处理。经过这5个步骤之后只有Client端向Server端发送消息,这样的消息传递是单向的,那么如何实现消息的双向传递呢? 首先需要在第5步做修改,在send(msg)前通过msm.replyTo = mMessenger将Client端自己的信使设置到消息中,这样Server端接收到消息时同时也得到了Client端的信使对象,然后Server端也可以通过使用得到的Client端的信使对象来项Client端发送消息 cMessenger = msg.replyTo2 cMessenger.send(message); 这样即完成了从Server端向Client端发送消息的功能,这样Client端可以在自己的Handler对象的handlerMessage()方法中接收服务端发送来的message进行处理。 3.3 实现步骤 3.3.1 创建并初始化Server端的信使对象。 private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case TEST: Log.e(TAG, "Get Message from MainActivity."); cMessenger = msg.replyTo; mTimer.schedule(new MyTimerTask(), 1000,TIME * 1000); break; default: break; } } }; //It's the messenger of server private Messenger mMessenger = new Messenger(mHandler); 3.3.2 在Client端使用bindService()方法绑定Server端。 private void doBindService(){ Log.i(TAG, "doBindService()..."); mIsBind = bindService(intent, serConn, BIND_AUTO_CREATE);//if bind success return true Log.e(TAG, "Is bind: "+mIsBind); } 3.3.3 在Server端的onBind()方法中返回一个binder对象。 @Override public IBinder onBind(Intent intent) { Log.i(TAG, "MessengerService.onBind()..."); return mMessenger.getBinder(); } 这裡的mMessenger就是Server端的信使对象。 3.3.4 Client端使用ServiceConnected()方法来获取Server端的信使对象。 private ServiceConnection serConn = new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) { Log.i(TAG, "onServiceDisconnected()..."); rMessenger = null; } @Override public void onServiceConnected(ComponentName name, IBinder service) { Log.i(TAG, "onServiceConnected()..."); rMessenger = new Messenger(service);//get the object of remote service mMessenger = new Messenger(mHandler);//initial the object of local service sendMessage(); } }; 获取Server端的信使对象的同时,也初始化Client端的自己的信使对象,并且通过sendMessage()方法发送消息给Server端,表示可以开始下载了。 3.3.5 Client端使用获取到的rMessenger来发送消息给Server端,同时将Client端的信使封装到消息中,一并发送给Server端。 private void sendMessage() { Message msg = Message.obtain(null, MessengerService.TEST);//MessengerService.TEST=0 msg.replyTo = mMessenger; try { rMessenger.send(msg); } catch (RemoteException e) { e.printStackTrace(); } } 这里的MessengerService.TEST為Server端里的一个静态常量。Msg.replyTo=mMessenger;表示发送给Server端的信息里携带Client端的信使。 3.3.6 Server端获取Client端发送的消息并得到Client端的信使对象。 private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case TEST: Log.e(TAG, "Get Message from MainActivity."); cMessenger = msg.replyTo;//get the messenger of client mTimer.schedule(new MyTimerTask(), 1000,TIME * 1000); break; default: break; } } }; 在接收到Client端的信息之后,Server端开啟timer模拟下载,并接收Client端的信使对象。 3.3.7 Server端向Client端发送数据。 class MyTimerTask extends TimerTask { @Override public void run() { if (i == 100) { i = 0; } try { //send the message to the client Message message = Message.obtain(null, MessengerService.TEST,i, 0); cMessenger.send(message); } catch (RemoteException e) { e.printStackTrace(); } i++; } } 直接使用接收到的Client端的信使对象来发送当前下载进度给Client端。 3.3.8 Client端接收来自Server端的数据。 private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case MessengerService.TEST: Log.e(TAG, "Get Message From MessengerService. i= "+msg.arg1); int curLoad = msg.arg1; mTextView.setText(curLoad+"%"); mProgressBar.setProgress(curLoad); break; default: break; } } }; Client端的接收和Server端的接收狠类似。接收到Server端传过来的数据之后进行介面更新,以及下载进度更新。 以下是AndroidManifest.xml文件: <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.seven.messengerservicedemo" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="10" /> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".MainActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:name="MessengerService"> <intent-filter> <action ndroid:name="com.seven.messagerservice.MessengerService" /> </intent-filter> </service> </application> </manifest> 这里在Service的註册中加入了过滤动作,只有相匹配的action才能启动相应的Service。 3.4 小结 通过Messenger来实现Activity和Service的交互,稍微深入一点我们就可以知道,其实Messenger也是通过AIDL来实现的。对於前两种实现方式,Messenger方式总体上来讲也是比较容易理解的,这就和平时使用Handler和Thread通信一个道理。 自定义接口交互 何谓自定义接口呢,其实就是我们自己通过接口的实现来达到Activity与Service交互的目的,我们通过在Activity和Service之间架设一座桥樑,从而达到数据交互的目的,而这种实现方式和AIDL非常类似(后文会说到)。 4.1 实现原理 自定义一个接口,该接口中有一个获取当前下载进度的空方法。Server端用一个类继承自Binder并实现该接口,覆写了其中获取当前下载进度的方法。Client端通过ServiceConnection获取到该类的对象,从而能够使用该获取当前下载进度的方法,最终实现实时交互。 4.2 实现步骤 4.2.1 新建一个Interface,并在其中创建一个用于获取当前下载进度的的空方法getCurrentLoad()。 public interface ICountService { public int getCurrentLoad(); } 4.2.2 新建Server端DownService实现ICountService并在其中通过一个内部类ServiceBinder继承自Binder并实现ICoutService接口。 public class DownLoadService extends Service implements ICountService{ private ServiceBinder serviceBinder = new ServiceBinder(); public class ServiceBinder extends Binder implements ICountService{ @Override public int getCurrentLoad() { Log.i(TAG, "ServiceBinder getCurrentLoad()... i=:"+i); return i; } } @Override public int getCurrentLoad() { return 0; } } 在Server端中,实现获取下载进度的空方法getCurrentLoad();这是Eclipse自动生成的,重点不在这裡。我们需要在ServiceBinder类中覆写getCurrentLoad()方法,这裡我们返回当前的下载进度i。 4.2.3 Client端使用bindService()绑定Server端。 if (startSerBtn == v) { Log.i(TAG, "Start Button Clicked."); bindService(intent, serConn, BIND_AUTO_CREATE); timer.schedule(new MyTimerTask(), 1000, TIME * 1000);//这里一定要延迟一下再开始获取数据,不然会报空指针异常 } 在Client端绑定Server端的同时,延迟1s开始获取下载进度。其中的intent = new Intent(“com.seven.test”);com.seven.test该字符串要与在AndroidManifest.xml中申明的一致 4.2.4 Server端返回binder对象。 @Override public IBinder onBind(Intent intent) { Log.i(TAG, "DownLoadService.onBind()..."); return serviceBinder; } 这里的serviceBinder因为继承了Binder因此也是Binder对象。 4.2.5 Client端通过ServiceConnection来获取Server端的binder对象。 private ServiceConnection serConn = new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) { iCountService = null; } @Override public void onServiceConnected(ComponentName name, IBinder service) { Log.i(TAG, "onServiceConnected()..."); iCountService = (ICountService)service; } }; 获取的过程是在bindService()过程中完成的,这里的iCountService是接口ICountService的对象,在这里得到实例化。 4.2.6 在绑定完成之后,Server端会开启下载,在实际情况中Server端会开启独立线程用于下载,这里用i++来代替。 @Override public void onCreate() { super.onCreate(); Log.i(TAG, "DownLoadService.onCreate()..."); timer = new Timer(); timer.schedule(new MyTimerTask(), 0, TIME*1000); } class MyTimerTask extends TimerTask{ @Override public void run() { if(100==i){ i=0; } i++; } } bindService()方法执行之后会调用DownLoadService中的onCreate()方法,在其onCreate()方法中开启timer使得i++。 4.2.7 Server端已经开启了下载,那么Client端需要及时获取下载进度并在主界面上更新。 Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); Log.i(TAG, "handleMessage..."); int curLoad = iCountService.getCurrentLoad(); mProgressBar.setProgress(curLoad); currentTv.setText(curLoad+"%"); } }; class MyTimerTask extends TimerTask{ @Override public void run() { mHandler.sendMessage(mHandler.obtainMessage()); } } Client端的Timer在bindService()完成之后1秒再开始获取下载进度,获取方法是直接通过int curLoad = iCountService.getCurrentLoad();这里的getCurrentLoad()方法是DownLoadService内部类ServiceBinder中的方法。Client端将获取到的下载进度更新到介面上并更新进度条。 4.3 小结 通过上面的例子可以知道,这种方法简单实用,扩展性强,但其也有一些缺点,比如需要延迟一些再开始获取Server端的数据,从而无法完全实现从零开始同步更新。综其所述,通过自定义接口实现Activity与Service交互的方法还是比较实用的。适用於同进程中通信,不能进行跨进程通信。 AIDL交互 AIDL是Android Interface Definition Language的首字母缩写, 也就是Android接口定义语言。提及AIDL就不得不说下Android的服务,Android 支持两种服务类型的服务即本地服务和远程服务。 本地服务无法供在设备上运行的其他应用程序访问,也就是说只能该应用程序内部调用,比如某些应用程序中的下载类服务,这些服务只能由内部调用。而对于远程服务,除了可以由本应用程序调用,还可以允许其他应用程序访问。远程服务一般通过AIDL来实现,可以进行进程间通信,这种服务也就是远程服务。 本地服务与远程服务还是有一些重要的区别。具体来讲,如果服务完全只供同一进程中的组件使用(运行后台任务),客户端一边通过调用 Context.startService()来启动该服务。这种类型的服务为本地服务,它的一般用途是后台执行长耗时操作。而远程服务一般通过bindService()方法启动,主要为不同进程间通信。我们也将远程服务称为AIDL支持服务,因为客户端使用 AIDL 与服务通信。Android中对于远程服务有多种叫法:远程服务、AIDL服务、外部服务和RPC服务。 5.1 AIDL实现流程图 这属于代理/存根结构,通过这张AIDL的流程图,很容易发现Android实现IPC其实是在原来的C/S框架上加入了代理/存根结构。 比如,你到自动取款机上去取款。那么你就是客户(Client),取款机就是你的代理(Proxy);你不会在乎钱具体放在那里,你只想将你的钱从取款机中取出来。你同银行之间的操作完全是取款机代理实现。你的取款请求通过取款机传到另一边,即银行的服务器(Server)。它也没有必要知道你在哪儿取钱,它所关心的是你的身份和你取款多少。当它确认你的权限,就进行相应的操作,返回操作结果给取款机,取款机根据服务器返回结果,从保险柜里取出相应数量的钱给你。你取出卡后,操作完成。取款机不是直接同服务器连接的,他们之间还有一个“存根(Stub)”,取款机与存根通信,服务器与存根通信,从某种意义上说存根就是服务器的代理。 5.3 实现原理 AIDL属于Android的IPC机制,常用于跨进程通信,主要实现原理基于底层Binder机制。 5.4 实现步骤 5.4.1 建立工程。建立AIDLServer端以及AIDLClient端。在AIDLServer端中只有一个服务程序,没有主界面,其主要功能就是负责下载。AIDLClient端从AIDLServer端获取当前下载进度(注:AIDLServer端和AIDLClient端是不同的两个APK,在模拟本例的时候,需要先在模拟器上安装AIDLServer编译出来的APK,安装方法可以直接在模拟器上运行一次,可以通过adb install your.apk 来安装)。 AIDLServer端中新建了一个ICountService.aidl的文件,该文件内容如下: interface ICountService{ int getCount(); } aidl文件的书写规范如下: (1). Android支持String和CharSequence(以及Java的基本数据类型); (2). 如果需要在aidl中使用其它aidl接口类型,需要import,即使是在相同包结构下; (3). Android允许传递实现Parcelable接口的类,需要import; (4). Android支持集合接口类型List和Map,但是有一些限制,元素必须是基本型或者前面三种情况,不需要import集合接口类,但是需要对元素涉及到的类型import; (5). 非基本数据类型,也不是String和CharSequence类型的,需要有方向指示,包括in、out和inout,in表示由客户端设置,out表示由服务端设置,inout是两者均可设置。 AIDLClient端需要将AIDLServer端的ICountService.aidl文件复製过去,这裡为了方便,新建了一个和Server端同名的包,并将ICountService.aidl放与其中。 5.4.2 我们在Server端建立好ICoutService.aidl文件之后,Eclipse会在/gen/com.seven.aidlserver/目录下自动生成ICountService.java文件。该文件由Eclipse自动生成,请勿随便修改,后文我们需引用到的内容如下: public static com.seven.aidlserver.ICountService asInterface(android.os.IBinder obj) { if ((obj == null)) { return null; } android.os.IInterface iin = (android.os.IInterface) obj.queryLocalInterface(DESCRIPTOR); if (((iin != null) && (iin instanceof com.seven.aidlserver.ICountService))) { return ((com.seven.aidlserver.ICountService) iin); } return new com.seven.aidlserver.ICountService.Stub.Proxy(obj); } 5.4.3 在Server端新建一个内部类继承自ICountService.Stub并覆写其中的getCount()方法,以及实例化该类的一个对象serviceBinder。 private AIDLServerBinder serviceBinder = new AIDLServerBinder(); class AIDLServerBinder extends ICountService.Stub{ @Override public int getCount() throws RemoteException { return i; } } 这里与前面提到的“通过接口实现交互”非常类似。 5.4.4 在Server端的onBind()方法中,返回前面的serviceBinder对象。 @Override public IBinder onBind(Intent intent) { Log.i(TAG, "AIDLServer.onBind()..."); return serviceBinder; } 5.4.5 在Server端的onCreate()方法中,开启timer,模拟下载。在Client端通过bindService()绑定Server端的时候,会首先执行Server端的onCreate()方法。 @Override public void onCreate() { super.onCreate(); Log.i(TAG, "AIDLServer.onCreate()..."); mTimer = new Timer(); mTimer.schedule(new MyTimerTask(), 0,TIME * 1000); } class MyTimerTask extends TimerTask{ @Override public void run() { if(i==100){ i=0; } i++; } } 5.4.6 Client端通过bindService()绑定Server端。 if(startBtn==v){ Log.i(TAG, "start button click."); mIsBind = bindService(intent, serConn, BIND_AUTO_CREATE); mTimer.schedule(new MyTimerTask(), 1000 ,TIME * 1000); } 这里的intent = new Intent(“com.seven.aidlserver”);这里跟Server端注册Service时过滤的要一致,也就是说只有发出相同的action才会启动该Service。同时开启了一个timer用于获取下载进度。 5.4.7 Client端通过ServiceConnection来获取Server端的binder对象。 private ServiceConnection serConn = new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) { iCountService = null; } @Override public void onServiceConnected(ComponentName name, IBinder service) { Log.i(TAG, "AIDLClient.onServiceConnected()..."); iCountService = ICountService.Stub.asInterface(service); } }; 这里的iCountService对象实际上就是ICountService的对象在此实例化。 5.4.8 获取当前下载进度并更新到界面上。 Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); try { int count = iCountService.getCount(); mTextView.setText(count+"%"); mProgressBar.setProgress(count); } catch (RemoteException e) { e.printStackTrace(); } } }; 通过更新介面上的进度条,可以狠容易的后去当前下载进度。因為AIDLServer端只是一个继承自Service的服务,因此就不贴出其AndroidManifest.xml文件了。 5.5 小结 AIDL在Android中是进程间通信常用的方式,可能使用较為复杂,但效率高,扩展性好。同时很多系统服务就是以这种方式完成与应用程序通信的。 我是天王盖地虎的分割线 本文转自我爱物联网博客园博客,原文链接:http://www.cnblogs.com/yydcdut/p/3961545.html,如需转载请自行联系原作者

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

IT关键词,面试知识问与答

二叉树遍历的三种方式? 遍历是指依次访问⼆叉树中的每个元素。有三种遍历⽅法,分别是前序遍历、 中序遍历和后序遍历。它们是按照访问根节点和⼦节点的先后顺序命名的。 • 前序遍历:先访问根节点,然后访问左⼦树,最后访问右⼦树; • 中序遍历:先访问左⼦树,然后访问根节点,最后访问右⼦树; • 后序遍历:先访问左⼦树,然后访问右⼦树,最后访问根节点。 php中单引号和双引号有什么区别? 单引号内部的变量不会执行 双引号会执行 如 $name = 'hello'; echo "the $name"; 会输出 the hello 而如果是单引号 $name = 'hello'; echo 'the $name'; 会输出 the $name 主要区别就是这个,其他的无所谓,看你自己喜欢了 时序图 1.什么是时序图 2.如何看懂时序图 3.时序图的作用 4.如何绘制时序图 分布式 一个业务分拆多个子业务,部署在不同的服务器上。 分布式是指将不同的业务分布在不同的地方。 而集群指的是将几台服务器集中在一起,实现同一业务。 集群 同一个业务,部署在多个服务器上。 小饭店原来只有一个厨师,切菜洗菜备料炒菜全干。后来客人多了,厨房一个厨师忙不过来,又请了个厨师,两个厨师都能炒一样的菜,这两个厨师的关系是集群。为了让厨师专心炒菜,把菜做到极致,又请了个配菜师负责切菜,备菜,备料,厨师和配菜师的关系是分布式,一个配菜师也忙不过来了,又请了个配菜师,两个配菜师关系是集群。 生产环境 开发->测试->上线,其中生产环境也就是通常说的真实环境。 消息队列 消息队列(Message Queue,简称MQ),从字面意思上看,本质是个队列,FIFO先入先出,只不过队列中存放的内容是message而已。 socket 我们经常把socket翻译为套接字,socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。 User-Agent 告诉HTTP服务器, 客户端使用的操作系统和浏览器的名称和版本。 索引 索引就像一本书的目录,目录越详细越容易定位具体页码。索引也是越详细就越容易定位具体数据。 索引越详细意味着索引自身的数据越多。 –最好的情况是如果那个列具有unique属性,那每一条数据就会有一个索引记录。 –最差的情况是所有的数据都一样,索引只有一条,这一条索引对应了所有的数据。 算法时间复杂度 一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度。记为T(n)。 常数阶O(1),对数阶O(log2n)(以2为底n的对数),线性阶O(n),线性对数阶O(nlog2n),平方阶O(n^2),立方阶O(n^3),...,k次方阶O(n^k),指数阶O(2^n)。随着问题规模n的不断增大,上述时间复杂度不断增大,算法的执行效率越低。 设每条语句执行一次所需的时间均是单位时间,一个算法的时间耗费就是该算法中所有语句的频度之和。 算法空间复杂度 与时间复杂度类似,空间复杂度是指算法在计算机内执行时所需存储空间的度量。 1.算法程序所占的空间; 2.输入的初始数据所占的存储空间; 3.算法执行过程中所需要的额外空间。 log2n LOG2(N) 相当于2的多少次方(立方)等于N 例:LOG2(8)=3 相当于,2的3次方等于8 OpenStack OpenStack是一个开源的云计算管理平台项目,由几个主要的组件组合起来完成具体工作。OpenStack支持几乎所有类型的云环境,项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenStack通过各种互补的服务提供了基础设施即服务(IaaS)的解决方案,每个服务提供API以进行集成。 经纬度 东西经,南北纬。 一纬度=110.94公里,北纬35度至49度=?公里南北。一经度=85.276公里,东经73度至96度=?公里东西。 DNS DNS (Domain Name System 的缩写)的作用非常简单,就是根据域名查出IP地址。你可以把它想象成一本巨大的电话本。 举例来说,如果你要访问域名math.stackexchange.com,首先要通过DNS查出它的IP地址是151.101.129.69。 当我们通过在浏览器的地址栏中键入域名来访问某个网站时,浏览器将首先查找本地的DNS缓存是否拥有该域名所对应的IP地址。如果有,那么浏览器将尝试直接使用该IP地址访问该网站的内容。如果本地DNS缓存中没有该域名所对应的IP地址,那么它将向DNS发送一个请求,以获得该域名所对应的IP并添加到本地DNS缓存中。 组合和聚合 比如A类中包含B类的一个引用b,当A类的一个对象消亡时,b这个引用所指向的对象也同时消亡(没有任何一个引用指向它,成了垃圾对象),这种情况叫做组合,反之b所指向的对象还会有另外的引用指向它,这种情况叫聚合。 十六进制AF转为十进制 0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F A是10,F是15。转为十进制,10*16+15*1 = 175 框架与库 库是解决某个问题而拼凑出来的一大堆函数与类的集合。 框架则是一个半成品的应用,直接给出一个骨架。写框架能提升自己的架构能力。 剖析别人框架的特点,写出属于自己的框架。 rem 与 px的区别 px:各个终端统一大小,简单明了,未尝不可! rem:大屏幕显示大字体,小屏幕显示小字体,渐进增强视觉感。 冒泡的过程 事件冒泡的过程是:a --> div --> body 。a冒泡到div冒泡到body。 include、require的区别 incluce在用到时加载 require在一开始就加载 _once后缀表示已加载的不加载 include引入文件的时候,如果碰到错误,会给出提示,并继续运行下边的代码。 require引入文件的时候,如果碰到错误,会给出提示,并停止运行下边的代码。 dos系统与微软的关系 DOS=disk operating system, 磁盘操作系统 MS=MICRO SOFT 美国微软公司 MS-DOS是微软公司的磁盘操作系统 DOS(磁盘操作系统)除了微软的外,还有其他公司的产品。如DR-DOS、PC-DOS、ROM-DOS、FreeDOS等,但MS-DOS是最多人使用也是最实用的一种,不过现在基本上见到不其他公司的产品了,都被微软垄断了。 1980年,西雅图电脑产品公司(Seattle Computer Products)的一名24岁的程序员蒂姆·帕特森(Tim Paterson)花费了四个月时间编写出了86-DOS操作系统。1981年7月,微软以五万美元的代价向西雅图公司购得本产品的全部版权,并将它更名为MS-DOS。 最基本的MS-DOS系统由一个基于MBR的BOOT引导程序和三个文件模块组成。这三个模块是输入输出模块(IO.SYS)、文件管理模块(MSDOS.SYS)及命令解释模块。除此之外,微软还在零售的MS-DOS系统包中加入了若干标准的外部程序(即外部命令),这才与内部命令(即由解释执行的命令)一同构建起一个在磁盘操作时代相对完备的人机交互环境。 本文转自TBHacker博客园博客,原文链接:http://www.cnblogs.com/jiqing9006/p/5844568.html,如需转载请自行联系原作者

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

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文件系统,支持十年生命周期更新。