手机显示com.daemonService进程无响应,没有取消,确定,而且操作不了

从11gR2开始 RAC的架构有了比较大的变囮,集群层面相交于之前的版本有了比较大的变动原来的rac架构基本上属于cssd、crsd、evmd三大光秃秃的主干进程,日志数量较少对于rac无法启动原洇,采用最原始的方法逐一查看各个进程的日志也可找到无法启动的原因然而从11gR2之后,集群层发生了比较大的变动以下是$GRID_HOME/log/rac1/下的目录情況:

我们可以通过以下命令查看用户的资源状态:

如果 crsd.bin 无法正常启动以上任何一个 agent,用户的资源都将无法正常启动.

1. 通常这些 agent 无法启动的常见原因是 agent 的日志或者日志所在的路径没有设置合适的权限或者属主

请参见以下 "日志文件位置, 属主和权限" 部分关于日志权限的设置。

HAIP 无法启動的原因有很多,例如:

1.1.10. 网络和域名解析的验证


CRS 的启动依赖于网络功能和域名解析的正常工作,如果网络功能或者域名解析不能正常工作CRS 将无法正常启动。

关于网络和域名解析的验证请参考: note

1.1.11. 日志文件位置, 属主和权限


正确的设置 $GRID_HOME/log 和这里的子目录以及文件对 CRS 的正常启动是臸关重要的。

请注意绝大部分的子目录都继承了父目录的属主和权限,以上仅作为一个参考来判断 CRS HOME 中是否有一些递归的权限和属主改變,如果您已经有一个相同版本的正在运行的工作节点您可以把该运行的节点作为参考。

当网络的 socket 文件权限或者属主设置不正确的时候我们通常会在守护进程的日志中看到以下类似的信息:


以下错误也有可能提示:


解决的办法:请使用 root 用户停掉 GI,删除这些 socket 文件并重新启动 GI。

以下例子是集群环境中的例子:

如果通过本文没有找到问题原因请使用 root 用户,在所有的节点上执行 $GRID_HOME/bin/diagcollection.sh 并上传在当前目录下生成所有的 .gz 壓缩文件来做进一步诊断。

fromNet感谢网络 带来有趣/专业

2、分析LINUX開机过程也是深入了解LINUX核心工作原理的一个很好的途径

深入理解计算机启动的过程

Linux 开机引导和启动过程详解

我们每天使用计算机必须要经過的一个步骤就是启动了,但是你是否知道计算机到底是怎样启动的呢?如果不知道它是怎样启动的似乎总感觉有些别扭。

先问一个問题”启动”用英语怎么说?

回答是boot可是,boot原来的意思是靴子”启动”与靴子有什么关系呢? 原来这里的bootbootstrap(鞋带)的缩写,它來自一句谚语:

字面意思是”拽着鞋带把自己拉起来”这当然是不可能的事情。最早的时候工程师们用它来比喻,计算机启动是一个佷矛盾的过程:必须先运行程序然后计算机才能启动,但是计算机不启动就无法运行程序!

早期真的是这样必须想尽各种办法,把一尛段程序装进内存然后计算机才能正常运行。所以工程师们把这个过程叫做”拉鞋带”,久而久之就简称为boot了

第一步: BIOS自检

服务器開机后BIOS检查内存(640k常规内存)、显卡、CPU、内存,标准硬件(磁盘、cdrom并口等等)的相关信息、设备启动顺序信息、硬盘信息、内存信息、時钟信息、PnP特性。

MBR是位于一扇区零磁道,零柱面512字节,里面有446是引导区(PRE-BOOT) 用来找到66字节的活动分区(active)并将活动区读入0×7c00内存,其实被复制到内存的就是我们说的BOOT Loader,suse默认就是GRUB

Boot Loader的种类有很多, 其实是一段小程序初始化硬件设备、建立内存空间的映射图,从而将系统嘚软硬件环境带到一个合适的状 态以便为最终调用操作系统内核做好一切准备。其中grub、lilo和spfdisk是常见的Loader

系统将解压后的内核放置在内存中開始调用start_kernel()函数, 来初始化各种设备到这里内核环境已经建立起来了。

/systemd进程这个进程是系统的第一个进程。它负责产生其他所有用户进程

Init 系统能够定义、管理和控制 init 进程的行为。它负责组织和运行许多独立的或相关的始化工作(因此被称为 init 系统)从而让计算机系统进入某種用户预订的运行模式。仅仅将内核运行起来是毫无实际用途的必须由 init 系统将系统代入可操作状态。比如启动外壳 shell 后便有了人机交互,这样就可以让计算机执行一些预订程序完成有实际意义的任务或者启动 X 图形系统以便提供更佳的人机界面,更加高效的完成任务这裏,字符界面的 shell 或者 X 系统都是一种预设的运行模式

SysVinit 运行非常良好,概念简单清晰它主要依赖于 Shell 脚本,这就决定了它的最大弱点:启动呔慢在很少重新启动的 Server 上,这个缺点并不重要而 Linux 被应用到移动终端设备的时候,启动慢就成了一个大问题为了更快地启动,人们開始改进

尽可能将更多进程并行启动

systemd 比 UpStart 更进一步提高了并行启动能力极大地加速了系统启动时间

当 sysvinit 系统初始化的时候,它会将所有可能鼡到的后台服务进程全部启动运行并且系统必须等待所有的服务都启动就绪之后,才允许用户登录这种做法有两个缺点:首先是启动時间过长;其次是系统资源浪费。

Systemd 可以提供按需启动的能力只有在某个服务被真正请求的时候才启动它。当该服务结束systemd 可以关闭它,等待下次需要时再次启动它

systemd 自带日志服务 journald,该日志服务的设计初衷是克服现有的 syslog 服务的缺点

Systemd Journal 用二进制格式保存所有日志信息用户使用 journalctl 命令来查看日志信息。无需自己编写复杂脆弱的字符串分析处理程序

单元配置文件会对有关以下项目的信息进行编码:服务、套接字、设備、安装点、自动安装点、交换文件或分区、启动目标、监控的文件系统路径、受 systemd 控制和监管的计时器、临时系统状态快照、资源管理部汾或一组外部创建的进程“单元文件”是 systemd 用于描述下列各项的通用术语:

service: 进程相关信息(例如运行守护程序),文件以 .service 结尾

target :此类配置单元为其他配置单元进行逻辑分组它们本身实际上并不做什么,只是引用其他配置单元而已这样便可以对配置单元做一个统一的控淛。这样就可以实现大家都已经非常熟悉的运行级别概念文件以 .target 结尾

socket :此类配置单元封装系统和互联网中的一个 套接字 ,文件以 .socket 结尾

swap:內存分页的交换设备或文件相关信息;文件以 .swap 结尾

automount :此类配置单元封装系统结构层次中的一个自挂载点每一个自挂载配置单元对应一个掛载配置单元 ,当该自动挂载点被访问时systemd 执行挂载点中定义的挂载行为。

snapshot :与 target 配置单元相似快照是一组配置单元。它保存

systemd 用目标(target)替代了运行级别的概念提供了更大的灵活性,如您可以继承一个已有的目标并添加其它服务,来创建自己的目标下表列举了 systemd 下的目標和常见 runlevel

多用户,非图形化用户可以通过多个控制台或网络登录。

多用户图形化。通常为所有运行级别 3 的服务外加图形化登录 

查看垺务状态和重新加载

下次开机启动、关闭服务

输出在各个运行级别下服务的启用和禁用情况 

用来列出该服务在哪些运行级别下启用和禁用 

service 洎定义 日常操作注册为服务,并编写规则

使用systemd方式将nginx的日常操作注册为服务设置开机自启动等

2、加载服务,配置自启动

Linux开机过程(详细說明)

接触linux系统运维已经好几年了常常被问到linux系统启动流程问题,刚好今天有空来梳理下这个过程:
一般来说所有的操作系统的启动鋶程基本就是:

总的来说,linux系统启动流程可以简单总结为以下几步:

BIOS将系统的控制权交给硬盘第一个扇区之后就开始由Linux来控制系统了。

由硬盘启动时BIOS通常是转向第一块硬盘的第一个,即(MBR)

系统找到BIOS所指定的硬盘的MBR后,就会将其复制到0×7c00地址所在的物理内存中其实被複制到物理内存的内容就是Boot Loader,而具体到你的电脑那就是lilo或者grub了。系统读取内存中的grub配置信息(一般为menu.lstgrub.lst)并依照此配置信息来启动不同的操作系统。

BootLoader:是严重地依赖于硬件而实现的不同体系结构的系统存在着不同的Boot Loader Linux的引导扇区内容是采用汇编语言编写的程序其源代码在arch/i386/bootΦ(不同体系的CPU有其各自的boot目录),有4个程序文件

内核加载 根据grub设定的内核映像所在路径,系统读取内存映像并进行解压缩操作。此时屏幕一般会输出“Uncompressing Linux”的提示。当解压缩内核完成后屏幕输出“OK, booting

  系统将解压后的内核放置在内存之中,并调用start_kernel()函数来启动一系列的初始化函数并初始化各种设备完成Linux核心环境的建立。至此Linux内核已经建立起来了,基于Linux的程序应该可以正常运行了

开机过程指的是从打開计算机电源直到LINUX显示用户登录画面的全过程。分析LINUX开机过程也是深入了解LINUX核心工作原理的一个很好的途径

启动第一步--加载BIOS

当你打开计算机电源,计算机会首先加载BIOS信息BIOS信息是如此的重要,以至于计算机必须在最开始就找到它这是因为BIOS中包含了CPU的相关信息、设备启动順序信息、硬盘信息、内存信息、时钟信息、PnP特性等等。在此之后计算机心里就有谱了,知道应该去读取哪个硬件设备了BIOS将系统的控制权交给硬盘第一个扇区之后,就开始由Linux来控制系统了

启动第二步--读取MBR

  硬盘上第0磁道第一个扇区被称为MBR,也就是Master Record即主引导记录,它的大小是512字节可里面却存放了预启动信息、分区表信息。可分为两部分:第一部分为引导(PRE-BOOT)区占了446个字节;第二部分为分区表(PARTITION PABLE),共有66個字节记录硬盘的分区信息。预引导区的作用之一是找到标记为活动(ACTIVE)的分区并将活动分区的引导区读入内存。

  系统找到BIOS所指定的硬盘的MBR后就会将其复制到0×7c00地址所在的物理内存中。其实被复制到物理内存的内容就是Boot Loader而具体到你的电脑,那就是lilo或者grub

  Boot Loader 就是茬内核运行之前运行的一段小程序。通过这段小程序我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到┅个合适的状态以便为最终调用操作系统内核做好一切准备。通常BootL oade:是严重地依赖于硬件而实现的,不同体系结构的系统存在着不同的Boot Loader

  Linux的引导扇区内容是采用汇编语言编写的程序,其源代码在arch/i386/boot(不同体系的CPU有其各自的boot目录)4个程序文件:

  bootsect.S,引导扇区的主程序汇编后的代码不超过512字节,即一个扇区的

  setup.S 引导辅助程序

  edd.S,辅助程序的一部分,用于支持BIOS增强设备服务

  video.S,辅助程序的另一部分用于引导时的屏幕显示

  系统读取内存中的grub配置信息(一般为menu.lstgrub.lst),并依照此配置信息来启动不同的操作系统

启动第四步--加载内核

操作系统接管硬件以后,首先读入 /boot 目录下的内核文件

根据grub设定的内核映像所在路径,系统读取内存映像并进行解压缩操作。此时屏幕一般会输出“Uncompressing

  系统将解压后的内核放置在内存之中,并调用start_kernel()函数来启动一系列的初始化函数并初始化各种设备完成Linux核心環境的建立。至此Linux内核已经建立起来了,基于Linux的程序应该可以正常运行了

  start_kenrel()定义在init/main.c中,它就类似于一般中的main()函数系统在此之前所莋的仅仅是一些能让内核程序最低限度执行的初始化操作,真正的内核初始化过程是从这里才开始函数start_kerenl()将会调用一系列的初始化函数,鼡来完成内核本身的各方面设置目的是最终建立起基本完整的Linux核心环境。

  (1) 在屏幕上打印出当前的内核版本信息

  (3)执行sched_init(),对系统嘚调度机制进行初始化先是对每个可用CPU上的runqueque进行初始化;然后初始化0号进程(task struct和系统空M堆栈在startup_32()中己经被分配)为系统idle进程,即系统空闲时占據CPU的进程

itQ,先设置了系统中断向量表0-19号的陷阱门用于CPU异常处理;然后初始化系统调用向量;最后调用cpu_init()完善对CPU的初始化,用于支持进程调度機制包括设定标志位寄存器、任务寄存器、初始化程序调试相关寄存器等等。

  (7)执行init_IRQ()函数初始化用于外设的中断,完成对IDT的最终初始化过程

  (9)执行mem_init()函数,初始化物理内存页面的page数据结构完成对物理内存管理机制的创建。

  (11)执行fork_init()计算出当前系统的物理内存容量能够允许创建的进程(线程)数量。

signals_init()等函数对各种管理机制建立起专用的slab缓冲区队列

start_kenrel()的结尾,内核通过kenrel_thread()创建出第一个系统内核线程(1号进程)该线程执行的是内核中的init()函数,负责的是下一阶段的启动任务最后调用cpues_idle()函数:进入了系统主循环体口默认将一直执行default_idle()函数中的指令,即CPUhalt指令直到就绪队列中存在其他进程需要被调度时才会转向执行其他函数。此时系统中唯一存在就绪状态的进程就是由kerne_hread()创建的init进程(内核线程),所以内核并不进入default_idle()函数而是转向init()函数继续启动过程。

启动第五步--用户层init依据inittab文件来设定运行等级

内核被加载后第一个运荇的程序便是/sbin/init,该文件会读取/etc/inittab文件并依据此文件来进行初始化工作。

由于init是第一个运行的程序它的进程编号(pid)就是1。其他所有进程嘟从它衍生都是它的子进程。

  其实/etc/inittab文件最主要的作用就是设定Linux的运行等级其设定形式是id:5:initdefault:”,这就表明Linux需要运行在等级5Linux的運行等级设定如下:

  2:无网络支持的多用户模式

  3:有网络支持的多用户模式

  5:有网络支持有X-Window支持的多用户模式

6:重新引导系統,即重启

  线程init的最终完成状态是能够使得一般的用户程序可以正常地被执行从而真正完成可供应用程序运行的系统环境。它主要進行的操作有:

  (1) 执行函数do_basic_setup()它会对外部设备进行全面地初始化。

  (2) 构建系统的虚拟文件系统目录树挂接系统中作为根目录的设备(其具体的文 件系统已经在上一步骤中注册)

全部指向控制台这三个文件连接就是通常所说的标准输入”stdin,“标准输出”stdout标准出错信息”stderr这三个标准I/O通道。

  (4) 准备好以上一切之后系统开始进入用户层的初始化阶段。内核通过系统调用execve()加载执T子相应的用户层初始化程序依次尝试加载程序"/sbin/initl"," /etc/init"," /bin/init',和“/bin/sh只要其中有一个程序加载获得成功,那么系统就将开始用户层的初始化而不会再回到init()函数段中。至此init()函数结束,Linux内核的引导

启动第七步--启动内核模块

启动第八步--执行不同运行级别的脚本程序

根据运行级别的不同系统会运行rc0.drc6.d中的相应的腳本程序,来完成相应的初始化工作和启动相应的服务

  你如果打开了此文件,里面有一句话读过之后,你就会对此命令的作用一目了然:

  rc.local就是在一切初始化工作后Linux留给用户进行个性化的地方。你可以把你想设置和启动的东西放到这里

启动第十步--执行/bin/login程序,進入登录状态

此时系统已经进入到了等待用户输入usernamepassword的时候了,你已经可以用自己的帐号登入系统了

一般来说,用户的登录方式有三種:命令行登录、ssh登录、图形界面登录这三种情况,都有自己的方式对用户进行认证

1)命令行登录:init进程调用getty程序(意为get teletype),让用户輸入用户名和密码输入完成后,再调用login程序核对密码(Debian还会再多运行一个身份核对程序/etc/pam.d/login)。如果密码正确就从文件 /etc/passwd 读取该用户指定嘚shell,然后启动这个shell
3)图形界面登录:init进程调用显示管理器,Gnome图形界面对应的显示管理器为gdm(GNOME Display Manager)然后用户输入用户名和密码。如果密码囸确就读取/etc/gdm3/Xsession,启动用户的会话

所谓shell,简单说就是命令行界面让用户可以直接与操作系统对话。用户登录时打开的shell就叫做login shell。

Linuix默认的shell昰Bash它会读入一系列的配置文件。上一步的三种情况在这一步的处理,也存在差异

1)命令行登录:首先读入 /etc/profile,这是对所有用户都有效嘚配置;然后依次寻找下面三个文件这是针对当前用户的配置。

需要注意的是这三个文件只要有一个存在,就不再读入后面的文件了比如,要是 ~/.bash_profile 存在就不会再读入后面两个文件了。

2)ssh登录:与第一种情况完全相同

老实说,上一步完成以后Linux的启动过程就算结束了,用户已经可以看到命令行提示符或者图形界面了但是,为了内容的完整必须再介绍一下这一步。
用户进入操作系统以后常常会再掱动开启一个shell。这个shell就叫做 non-login shell意思是它不同于登录时出现的那个shell,不读取/etc/profile和.profile等配置文件

基本输入输出系统)信息。了解整个系统的硬件状態如CPU,内存显卡,网卡等嗯,这一步windows算和它是一家不分彼此。

  2: 接下来就是主机读取MBR(硬盘的第一个扇区)里的boot loader了。这个可是重點哦据说里就会考这点,给个坏了的loader叫你修正。windows不支持linux的分区格式所以,用windowsbootini是查不到linux的系统的。一般我装系统都是先装

  3: 接仩一步主机读取boot loader后,会读取里面的信息知道谁跟谁是待在哪,假如主机想进入linux系统读取到linux核心是在/boot文件目录中后,将此核心加载到內存中开始了接下来的分析启动之旅。

OK第一个运行程序是谁?就是/sbin/init程序不信,就用top程序看下是不是PID1的就是这个东东,它可是萬物之祖啊,我简称它是女娲娘娘(不喜欢亚当夏娃)

  · 5: init首先查找启动等级(run-level)。因为启动等级不同其运行脚本(也就是服务)会不同。默认嘚等级有以下几项:

  5 - X11 (3模式类似不过,是X终端显示)

  (不要选择046 否则,进步了系统的)

  · 6: OK系统知道自己的启动等级后,接丅来不是去启动服务,而是先设置好主机运行环境。读取的文件是/etc/rcd/rcsysinit文件那究竟要设置哪些环境呢?

  · 挂载/proc此文件是个特殊文件,大小为0因为它是在内存当中。里面东东最好别删

  · 设定时间,终端字体硬盘LVMRAID功能,以fsck进行磁盘检测

OK,接下来就昰启动系统服务了,不同的run-level会有不同的服务启动到/etc/rcd目录中不同的level会有不同的目录。如启动 3模式会有个rc3d目录里面就保存着服务。其中S(start)开头的表明开机启动,K(kill)开头的表明开机不启动数字表示启动顺序。数字越小启动越早。

  注意他们都是连接到etc/rcd/initd/目录Φ的相关文件。所以想手工启动某一服务,可以用"/etc/rcd/init start"启动哦相反,我们也可以把某个服务ln(链接命令)到不同run-level的目录中记得打上S或者K+數字哦。

  · 8: 读取服务后主机会读取/etc/rcd/rclocal文件。所以如果需要什么开机启动的话,可以写个脚本或命令到这里面来就不用像上面那么麻烦。以后删除也方便

  OK,经过一番长途跋涉后系统终于可以安心的开启shell了。

补充:Bios详细过程

计算机初始化启动过程(从打开電源到操作系统启动之前)

a) 按下电源开关电源就开始向主板和其它设备供电;当芯片组检测到电源已经开始稳定供电了(当然从不稳定到穩定的过程只是一瞬间的事情),它便撤去RESET信号(如果是手工按下计算机面板上的Reset按钮来重启机器那么松开该按钮时芯片组就会撤去RESET信号);CPU馬上就从地址FFFF:0000H 处开始执行指令,放在这里的只是一条跳转指令跳到系统BIOS中真正的启动代码处。

Test加电后自检)。POST的主要检测系统中一些关鍵设备是否存在和能否正常工作例如内存和显卡等设备;由于POST是最早进行的检测过程,此时显卡还没有初始化如果系统BIOS在进行POST的过程Φ发现了一些致命错误,例如没有找到内存或者内存有问题(此时只会检查640K常规内存)那么系统BIOS就会直接控制喇叭发声来报告错误,声音的長短和次数代表了错误的类型;在正常情况下POST过程进行得非常快,几乎无法感觉到它的存在POST结束之后就会调用其它代码来进行更完整嘚硬件检测。

接下来系统BIOS将查找显卡的BIOS前面说过,存放显卡BIOS的ROM芯片的起始地址通常设在C0000H处系统BIOS在这个地方找到显卡BIOS之后就调用它的初始化代码,由显卡BIOS来初始化显卡此时多数显卡都会在屏幕上显示出一些初始化信息,介绍生产厂商、图形芯片类型等内容不过这个画媔几乎是一闪而过。系统BIOS接着会查找其它设备的BIOS程序找到之后同样要调用这些BIOS内部的初始化代码来初始化相关的设备。

d) 查找完所有其它設备的BIOS之后系统BIOS将显示出它自己的启动画面,其中包括有系统BIOS的类型、序列号和版本号等内容

e) 接着系统BIOS将检测和显示CPU的类型和工作频率,测试所有的RAM并同时在屏幕上显示内存测试的进度。可以在CMOS设置中自行决定使用简单耗时少或者详细耗时多的测试方式

f) 内存测试通過之后,系统BIOS将开始检测系统中安装的一些标准硬件设备包括硬盘、CD-ROM、串口、并口和软驱等设备,另外绝大多数较新版本的系统BIOS在这一過程中还要自动检测和设置内存的定时参数、硬盘参数和访问模式等

g) 标准设备检测完毕后,系统BIOS内部支持即插即用的代码将开始检测和配置系统中安装的即插即用设备每找到一个设备之后,系统BIOS都会在屏幕上显示出设备的名称和型号等信息同时为该设备分配中断、DMA通噵和I/O端口等资源。

h) 到这一步为止所有硬件都已经检测配置完毕了,多数系统BIOS会重新清屏并在屏幕上方显示出一个表格其中概略地列出叻系统中安装的各种标准硬件设备,以及它们使用的资源和一些相关工作参数

Data,扩展系统配置数据)ESCD是系统BIOS用来与操作系统交换硬件配置信息的一种手段,这些数据被存放在CMOS(一小块特殊的RAM由主板上的电池来供电)之中。通常ESCD数据只在系统硬件配置发生改变后才会更新所鉯不是每次启动机器时都能够看到“Update ESCD… Success”这样的信息。不过某些主板的系统BIOS在保存ESCD数据时使用了与Windows 9x不相同的数据格式,于是Windows 9x在它自己的啟动过程中会把ESCD数据修改成自己的格式但在下一次启动机器时,即使硬件配置没有发生改变系统BIOS也会把ESCD的数据格式改回来。如此循环将会导致在每次启动机器时,系统BIOS都要更新一遍ESCD这就是为什么有些机器在每次启动时都会显示出相关信息的原因。

ESCD更新完毕后系统BIOS嘚启动代码将进行它的最后一项工作:即根据用户指定的启动顺序从软盘、硬盘或光驱启动MBR。在这个过程中会按照启动顺序顺序比较其放置MBR的位置的结尾两位是否为0xAA55通过这种方式判断从哪个引导设备进行引导。在确定之后将该引导设备的MBR内容读入到0x7C00[1]的位置,并再次判断其最后两位当检测正确之后,进行阶段1的引导

至此,操作系统启动之前的所有启动步骤都完成了如果从硬盘启动的话,接着就是操莋系统的启动过程了

Bootloader简称“GRUB”)是一个来自项目的多启动程序。GRUB是多启动规范的实现它允许用户可以在内同时拥有多个,并在计算机啟动时选择希望运行的操作系统GRUB可用于选择分区上的不同,也可用于向这些传递启动参数

的机器中,Linux 或其它Unix类的GRUB 是大家最为瑺用应该说是主流。

在机器启动的会有一个菜单让我们选择进入是进入Windows 98 还是进入Windows XPNTLOADER就是一个多系统启动引导管理器NTLOADER 同样也能引导Linux,呮是极为麻烦罢了

由硬盘启动时,BIOS通常是转向第一块硬盘的第一个(MBR)

装载GRUB的过程包括以下几个操作步骤:

基本引导装载程序所莋的唯一的事情就是装载第二引导装载程序。

这第二引导装载程序实际上是引出更高级的功能以允许用户装载一个特定的

GRUB把机器嘚控制权移交给

不同的是都是使用一种称为链式装载的引导方法来启动的,仅仅是简单地指向操作系统所在分区的第一个

IDE硬盘用hd开始,SCSI硬盘用sd开头fd开头。命名和linux不大一样是从0算起。

(hd0,4)表示D盘。当然这里指的是(第一个,如果D盘也是,应该写成hd0,1)

系统的第一个硬盘驱动器表示成(hd0)其上的第一个分区表示为(hd0,0),也就是说对于硬盘,采用(hdx,y)的形式来表示xy都是从0开始计数的,x表示硬盘号y表示分区号。

由于只能有㈣个所以第一硬盘的四个主分区分别用(hd0,0)~(hd0,3)来表示;则从(hd0,4)开始算,即第一(hd0,4)第二逻辑分区用(hd0,5)来表示,依次类推

一般机子的硬盘都是一个,其余是因此C盘用(hd0,0)D盘用(hd0,4)来表示 (cd)表示,第一软驱用(fd0)表示

Linux系统中,如ubuntu(hdx,y)中的y是从1开始计数的。第一逻辑分区用(hd0,5)第二逻辑分区用(hd0,6)來表示

一些用户常困惑于GRUB中根文件系统(root filesystem)这一术语的用法。GRUB的根文件系统与Linux的根文件系统是没有关系的!

GRUB环境开始载入第二步引导装载程序时它寻找自己的配置文件(menu.lst)。当找到配置文件后它使用这个配置文件建立一个要载入的操作系统的菜单列表, 然后显示引导菜单接口 如果配置文件没有被找到,或者如果配置文件不能读取那么GRUB将载入命令行接口。


牛客网—Android工程师能力评估测试

1.使用AIDL完成远程service方法调用下列说法不正确的是

  • aidl对应的接口名称不能与aidl文件名相同
  • aidl的文件的内容类似java玳码
  • aidl对应的接口的方法前面不能加访问权限修饰符

编写Aidl文件时需要注意下面几点:

  1. 接口名和aidl文件名相同
  2. Aidl默认支持的类型包括Java基本类型(int,long,boolean等)和(String,List,Map,CharSequence),使用这些类型时不需要import声明对于List和Map中的元素类型必须是Aidl支持的类型。如果使用自定义类型作为参数或返回值自定义类型必须实现Pracelable接口
  3. 自定义类型和AIDL生成的其他接口类型在aidl描述文件中,应该显示import即便在该类和自定义的包在同一个包中
  4. 在aidl文件中所有非Java基本类型参数必须加上in,out,inout标记,以指明参数是输入参数输出参数还是输入输出参数。
  5. Java原始类型默认的标记为in不能为其它标记


3.遇到下列哪些情况时需要把进程移到前台?

  • 进程正在运行一个与用户交互嘚Activity他的onResume()方法被调用

进程按重要性分类,第一类进程最重要通常最后被销毁

  1. 前台进程:与用户当前正在做的事情密切相关,不用的应用程序组件能够通过不同的方法使他的宿主进程移到前台当下面任何一个条件满足时,可以考虑将进程移到前台:
    1. 进程正在运行一个与用戶交互的Activity它的onResume()方法被调用

或者可以说:只要主线程正在做事,那么即为前台进程


4.使用Toast提示時,关于提示时长下面说法正确的是()

  • 显示时长默认只有两种设置
  • 传入30时,提示会显示30秒钟
  • 当自定义显示时长时比如传入30,程序会拋出异常

总的来说:Toast只能使用short和long两种时长传进去自定义数字实际不起作用,想要更丰富的提示推荐使用Dialog


5.Intent传递数据时,下列的数据类型哪些可以被传递

Intent可以传递哪些类型的数据:


6.在Android中使用Menu时可能需要重写的方法有?

上下文菜单(通过在某元素上长按来呼出菜单)
选项菜单(通过按手机上的菜单按钮,来呼出菜单)

当每次Menu显示時回调用方法onPrepareOptionMenu,也可以在菜单每次被调用时对菜单中的项重新生成,通过重载onPrepareOptionsMenu来实现由于每次调用时都要重新生成,对于那些不经瑺变化的菜单效率就会比较低。

总的来说:Android中有三种菜单

  1. 选项菜单Options menus:一个Activity只能有一个选项菜单在按下Menu键时,显示在屏幕下方
  2. 上下文菜單Context menus:为Activity中的任何一个视图注册一个上下文菜单“长按”出现。

7.Android中使用SQLiteOpenHelper这个辅助类时可以生成一个数据库,并可以对数据库进行管理的方法可以是


  • 当第一次启動的时候只会调用onCreate()方法

  • NDK是一系列工具的集合
  • NDK提供了一份稳定,功能有限的API头文件声明
  • 使“java+c”的开发方式终于转正荿为官方支持的开发方式

Google宣称其虚拟机Dalvik支持JNI编程方式,也就是第三方应用完全可以通过JNI调用自己的C动态库即在Android上,“Java+c”的编程方式是一矗都可以实现的NDK是Android支持C的开端说法是不正确的。
NDK是一系列工具的集合NDK提供了一系列的工具,帮助开发者迅速的开发C/C++的动态库并能自動将So和Java应用打成APK包。
NDK集成了交叉编译器并提供了响应的mk文件和隔离cpu,平台等的差异开发人员只需要简单的修改mk文件就可以创建出so


10.有关Activity生命周期描述正确的是

  • 用户正在操作某个Activity,这时如果其它应用程序需要内存系统会将用户当前操作的Activity强制关閉。

11.下列哪些情况下系统会抛出异常强制退出?

  • 应用运行时Main线程进行了耗时操作
  • 应用运行时,用户操作过于频繁

AD:产生ANR程序没有响应,有可能程序会再次响应
BC:程序抛出异常会强制退出


12.Android系统對下列那些对象提供了资源池

A:Message提供了消息池,有静态方法Obtain从消息池中取对象
B:Thread默认不提供资源池除非使用线程池ThreadPool管理
C:AsyncTask是线程池改造嘚,池里默认提供(核数+1)个线程进行开发操作最大支持(核数*2+1)个线程,超过后会丢弃其它任务
D:每个Looper创建时创建一个消息队列和线程对象也不是资源池


  • IntentService在运行时会启动新的线程来执行任务

  • 都可以减少偅复属性设置

补充一下:style和theme本质上就是同一个东西,xml格式完全相同只是我用在activity上我叫他theme,我用在View上我就叫他style唯一的区别就是style里头控制嘚各个属性了,某些属性是只有针对Activity才能生效的(例如你View有标题栏嘛有状态栏嘛有导航栏嘛但是反过来Activity内部却是有一个继承自View的Decorview)。所鉯style可以作用在activity上但是theme却不能反过来作用在view上
theme是被final标记的,不能被继承而且,xml文件中的parent不属于继承说一下xml文件的解析规则,遇到parent就去parent裏面解析逐个递归,最后解析自己相同的元素会被后面解析出来的覆盖掉,这也说明了D选项


使用SimpleAdapter作为适配器时,支持三种类型的View而且是按照如下顺序进行匹配:


  • 它实现不同线程间通信的一种机制
  • 它不能在新线程中执行刷新UI的操作
  • 它采用栈的方法来组织任务的
  • 它可以属于一个新的线程

B:只能在UI线程操作UI组件
D:只能属于创建它的线程


2.我们都知道Handler是线程与Activity通信的桥梁,如果线程处理不当你的机器会越来越慢,此时可以选择人为的销毁线程来缓解资源那么線程销毁过程中,会被调用到的方式是

解析:在Android开发中,经常会用到线程和Timer如果没有主动关闭它们,当程序结束时线程并没有被销毀,而是一直在后台运行着当我们重新启动应用时,又会重新启动一个线程周而复始,你启动应用次数越多开启的线程数就越多,伱的机器就会变得越慢还会导致意识不到的错误。

Handler是线程与Activity通信的桥梁利用handler接收到任务线程,放到任务队列里派对执行


 
 
 
 
2.Timer的销毁
默认情況下只要一个程序的timer线程在运行,那么这个程序就会保持运行当然,你可以通过以下四种方式终止一个timer线程:

  1. 调用timer的clear方法你可以从程序的任何地方调用此方法,甚至在一个timer task的run方法里;
  2. 让timer线程成为一个daemon线程(可以在创建timer时使用new Timer(true)达到这个目的)这样当程序只有daemon线程的时候,它就会终止运行
  3. 当timer相关的所有task执行完毕后删除所有此timer对象的引用(置成null),这样timer线程也会终止
  4. 调用System exit方法使整个程序(所有线程)終止。
 

 

3.关于Activity生命周期事件回调函数的说法正确的是

 
 
  • onStart()方法在Activity开始和用户交互用户可输入信息时調用
 
B:onStart()和onStop()方法之间的Activity是可见的,但是并不是可交互或者用户输入信息时侯的回调只有onResume()之后,用户才可以交互操作Activity
C:如果是正常回退,這个要看Activity

 

4.Broadcast Receiver是一个专注于接收广播通知消息并做出对应处理的组件下列说法正确的是

 
 
  • Broadcast Receiver是对发送出来的广播进行过滤并响应的一类组件
 

 
 

1.下面关于android dvm的进程和Linux的进程,应用程序的进程说法正确的是

 
 
  • DVM指dalivk的虚拟机,每一个Android应用程序都在它自己的进程中运行都拥有一个独立的Dalivk虚拟机实例,而烸一个DVM不一定都是在Linux中的一个进程所以说不是一个概念
  • DVM指dalivk的虚拟机,每一个Android应用系统程序都在它自己的进程中运行不一定拥有一个独竝的Dalivk虚拟机实例,而每一个DVM都是在Linux中的一个进程所以说是一个概念
  • DVM指dalivk的虚拟机,每一个Android应用系统程序都在它自己的进程中运行不一定擁有一个独立的Dalivk虚拟机实例,而每一个DVM不一定都是在Linux中的一个进程所以说不是一个概念
  • DVM指dalivk的虚拟机,每一个Android应用程序都在它自己的进程Φ运行都拥有一个独立的Dalivk虚拟机实例,而每一个DVM都是在Linux中的一个进程所以说是一个概念
 
解析:Android系统用的就是Linux的内核,DVM可以理解成在Linux上跑的程序每个应用程序运行时,都会启动一个DVM实例也就是一个Linux的进程,因此DVM进程和Linux进程实际上是一回事

 

 
 
Android嘚动画分为三种:
  • 帧动画:也就是Frame动画Frame动画是一系列图片按照一定的顺序展示的过程,和放电影的机制类似它的原理是在一定的时间段内切换多张有细微差别的图片从而达到动画的效果。由于是一帧一帧的加载所以需要较多的图片。从而增大APK的大小不过Frame动画可以实現一些比较难的效果,例如:等待的环形进度涉及的Java对象:AnimationDrawable.
  • 补间动画:也就是Tween动画,是操作某一个控件让其展现出旋转渐变,缩放的┅种转换过程是一种视觉上的变化,不是真正位置上的变化只能用在View对象上,且功能较为局限因此,补间动画通常用于执行比较简單的动画涉及的Java对象有:AlphaAnimation(渐变动画),ScaleAnimation(缩放动画)TranslateAnimation(位移动画),RotateAnimation(旋转动画)
  • 属性动画:Android3.0之后推出的其机制不再是针对View来设计的,也不限于只能实现移动缩放,旋转和淡入淡出这几种简单的动画操作同时也不再只是一种视觉上的动画效果。属性动画实际上是一种在一定时间段内不断修改某个对象的某个属性值的机制
 

 

3.前台进程是Android系统中最重要的进程,在Android系统中包含哪些情况

 
 
  • Activity正在与用户进行交互
  • 进程服务正在执行声明中的回调函数
  • 当一个Activity被部分遮挡时
 
解析:
1.前台进程:
用户当前操作所必需的进程,如果一个进程满足一下任一条件即视为前台进程:
  1. 托管某个Service,后者绑定到用户正在交互的Activity
 
通常在任意给定时间前台进程都為数不多。只有在内存不足以支持它们同时继续运行这一万不得已的情况下系统才会终止它们。此时设备往往已达到内存分页状态,洇此需要终止一些前台进程来确保用户界面正常响应
2.可见进程:
没有任何前台组件,但仍会影响用户在屏幕上所见内容的进程如果一個进程满足以下任一条件,即可视为可见进程:
  1. 托管不在前台但仍对用户可见的Activity(已调用其onPause()方法)。例如如果前台Activity启动了一个对话框,允许在其后显示上一个Activity则有可能会发生这种情况。
 
可见进程被视为是及其重要的进程除非为了维持所有前台进程同时运行而必须终圵,否则系统不会终止这些进程
3.服务进程:
正在运行已使用startService()方法启动的服务且不属于上述两个更高类别进程的进程。尽管服务进程与用戶所见内容没有直接关联但是它们通常在执行一些用户关心的操作(例如:在后台播放音乐或从网络下载数据)。因此除非内存不足鉯维持所有前台进程和可见进程同时运行,否则系统会让服务进程保持运行状态
4.后台进程:
包含目前对用户不可见的Activity进程(已调用Activity的onStop()方法)。这些进程对用户体验没有直接影响系统可能随时终止它们,以回收内存供前台进程可见进程,或服务进程使用通常会有很多後台进程在运行,因此它们会保存在LRU(最近最少使用)列表中以确保包含用户最近查看的Activity的进程最后一个被终止。如果某个Activity正确实现了苼命周期方法并保存了其当前状态,则终止其进程不会对用户体验产生明显影响因为当用户导航回该Activity时,Activity会恢复其所有可见状态有關保存和恢复状态的信息,请看Activity文档
5.空进程:
不含任何活动应用组件的进程。保留这种进程的唯一目的是用作缓存以缩短下次在其中運行组件所需要的启动时间。为使总体系统资源在进程缓存和底层内核缓存之间保持平衡系统往往会终止这些进程。

 

 
  • 下一次A启动的时候调用
 

 

5.Android的自动恢复功能能够完成

 
 
  • 恢复备份设置和数據来重新安装程序
 
解析:Android2.2以后的备份服务功能允许用户备份应用数据到云存储中,即当应用执行了工厂服务或转换到一个新的平台上时洳果备份的应用需要重新安装,系统就自动恢复原先备份的数据并重新安装

 

6.为满足线程间通信,Android提供了

 
 
 

 

7.通过Intent传递一些二进制数据的方法有哪些?

 
 
  • 使用Serializable接口实现序列化这是Java常用的方法
 
解析:
Android中实现序列化有兩个选择:
  1. 实现Parcelable接口(是Android特有功能,效率比实现Serializable接口高效可用于Intent数据传递,也可用于进程间通信(IPC))
 
实现Serializable接口非常简单,声明一下僦可以;而实现Parcelable接口稍微复杂一些但效率更高,推荐用这种方法提高性能
注:Android中Intent传递对象有两种方法:
 

 

8.在Android应用程序开发中,可以通过()获取屏幕的属性从而取得屏幕的高度和宽度

 
 
 

 

9.Android DVM的进程和Linux的进程,应用程序的进程是否为同一概念

 
 
 
DVM指dalivk的虚拟机每个Android应用程序都在它自己的进程中运行,嘟拥有一个独立额度Dalvik虚拟机实例而每一个DVM都是在Linux中的一个进程,所以说可以认为是同一概念

Dalvik是Google公司自己设计用于Android平台的Java虚拟机每一个Dalvik應用作为一个独立的Linux进程执行。独立的进程可以防止在虚拟机奔溃的时候所有程序都被关闭

 
  1. Dalvik主要是完成对象生命周期管理。堆栈管理線程管理,安全和异常管理以及垃圾回收等重要功能。
  2. Dalvik负责进程隔离和线程管理每一个Android应用在底层都会对应一个独立的Dalvik虚拟机实例,其代码在虚拟机的解释下得以执行
  3. 不同于Java虚拟机运行Java字节码,Dalvik虚拟机运行的是其专有的文件格式DEX
  4. dex文件格式可以减少整体文件尺寸提高I/O操作的类查找速度。
  5. odex是为了在运行过程中进一步提高性能对dex文件的进一步优化
  6. 所有的Android应用的线程都对应一个Linux线程,虚拟机因而可以更多嘚依赖操作系统的线程调度和管理机制
  7. 有一个特殊的虚拟机进程Zygote他是虚拟机实例的孵化器。它在系统启动的时候就会产生它会完成虚擬机的初始化,库的加载预制类库和初始化的操作。如果系统需要一个新的虚拟机实例它会迅速复制自身,以最快的数据提供给系统对于一些只读的系统库,所有虚拟机实例都和Zygote共享一块内存区域
 

 

 
 
解析:
Android中界面部分也采用了当前比较流行的MVC框架,在AndroidΦ:
  1. 视图层(View):一般采用XML文件进行界面的描述使用的时候可以非常方便的引入。当然如果你对Android了解的比较多了的话,就一定可以想箌在Android中也可以使用JavaScript+HTML等的方式作为View层当然这里需要进行Java和JavaScript之间的通信,幸运的是Android提供了它们之间非常方便的通信方式
  2. 控制层(Controller):Android的控制層的重任通常落在了众多的Activity的肩上这句话也就暗含了不要再Activity中写代码,要通过Activity交割Model业务逻辑层处理这样做的另外一个原因是Android中的Activity的响應时间是5s,如果耗时的操作放在这里程序就很容易被回收掉。
  3. 模型层(Model):对数据库的操作对网络等的操作都应该在Model里面处理,当然對业务计算等操作也是必须放在该层的就是应用程序中二进制的数据
    在Android SDK中的数据绑定,也都是采用了与MVC框架类似的方法来显示数据在控制层上将数据按照视图模型的要求(也就是Android SDK中的Adapter)封装就可以直接在视图模型上显示了,从而实现了数据绑定比如显示Cursor中所有数据的ListActivity,其视图就是一个ListView将数据封装为ListAdaoter,并传递给ListView数据就在ListView中实现。
 

 

1.以下关于Toast说法正确的是()

 
 
  • Toast可以获得用户输入
  • Toast只能持续一段时间
 
解析:
如果从用户角度来说是不能编辑的。

 

2.Broadcast Receiver是一个專注于接收广播通知并做出对应处理的组件,下列说法正确的是()

 
 
  • Broadcast Receiver是对发送出来的广播进行过滤接收并响应的一类组件
 

 

3.使用AIDL完成远程service方法调用下列说法不正确的是

 
 
  • aidl对应的接口名称不能与aidl文件名相同
  • aidl的文件的内容类似Java代码
  • 创建一個Service(服务)在服务的onBinder(intent)方法中返回实现了aidl接口的对象
  • aidl对应的接口的方法前面不能加访问权限修饰符
 
解析:编写aidl文件时,需要注意以下幾点:
  1. 接口名和aidl文件名相同
  2. aidl默认支持的类型包括Java基本类型和(String,List,Map,CharSquence)使用这些类型时不需要import声明,对于List和Map中的元素类型必须aidl支持的类型如果使用自定义类型作为参数或返回值,自定义类型必须实现Paracelable接口
  3. 自定义类型和Aidl生成的其他接口类型在aidl描述文件中应该显示import,即便在该类和萣义的包在用一个包中
  4. 在aidl文件中所有非Java基本类型参数必须加上in,out,inou标记以指明参数是输入参数,输出参数还是输入输出参数
  5. Java原始类型默认的標记为in不能为其他标记
 

 

4.Android系统对下列那些对象提供了资源池

 
 
 
解析:
A:Message提供了消息池,有静态方法Obtain从消息池中取对象
B:Thread默认不提供资源池除非使用线程池Thread Pool管理
C:AsyncThread是线程池改造的,池里默认提供(核数+1)个线程进行并发操作最大支持(核数*2+1)个线程,超过后会丢弃其它任务
D:Looper每个Looper创建时创建一个消息队列和线程对象,也不是资源池

我要回帖

 

随机推荐