1. 进程0是所有其他进程的祖先, 也称作idle进程或swapper进程.。
2. 进程0是在系统初始化时由kernel自身从无到有创建.。
3. 进程0的数据成员大部分是静态定义的,即由预先定义好的INIT_TASK, INIT_MM等宏初始化.进程0的描述符init_task定义在arch/arm/kernel/init_task.c,由INIT_TASK宏初始化。 i。
nit_mm等结构体定义在include/linux/init_task.h内,为init_task成员的初始值,分别由对应的初始化宏如INIT_MM等初始化Process 1进程0最终会通过调用kernel_thread创建一个内核线程去执行init函数,这个新创建的内核线程即Process 1(这时还是共享着内核线程0的资源属性如地址空间等)。
init函数继续完成剩余的内核初始化,并在函数的最后调用execve系统调用装入用户空间的可执行程序/sbin/init,这时进程1就拥有了自己的属性资源,成为一个普通进程(init进程)。
至此,内核初始化和启动过程结束。下面就进入了用户空间的初始化,最后运行shell登陆界面。
(注:Init进程一直存活,因为它创建和监控在操作系统外层执行的所有进程的活动。)。
——————这段对进程0的描述引用自《Understanding The Linux Kernel - Third Edtion》
The ancestor of all processes, called process 0, the idle process, or, for historical reasons, the swapper process, is a kernel thread created from scratch during the initialization phase of Linux. This ancestor process uses the following statically allocated data structures (data structures for all other processes are dynamically allocated)。
ini是初始化的意思。
init进程,它是内核启动的第一个用户级进程。init有许多很重要的任务,比如像启动getty(用于用户登录)、实现运行级别、以及处理孤立进程。
当内核启动了自己之后,已被装入内存、已经开始运行、已经初始化了所有的设备驱动程序和数据结构等等,通过启动用户级程序init来完成引导进程的内核部分。因此,init总是第一个进程(它的进程号总是1)。
当init开始运行,它通过执行一些管理任务来结束引导进程,例如检查文件系统、清理/tmp、启动各种服务以及为每个终端和虚拟控制台启动getty,在这些地方用户将登录系统。
扩展资料
init用法
lassSongBird(Bird):。
def__init__(self):。
Bird.__init__(self)。
self.sound='Squawk'。
defsing(self):
printself.song()。
classM(父类):
def__init__(self,*args,**kwargs):。
super(M,self).__init__()。
self.xx=xx
def
__init__()叫做构造方法,在调用了一个实例的方法时,该方法的self参数会自动绑定到实例上(称为绑定方法)
参考资料来源:百度百科—init进程。
init即initialize,属于子函数,用户自命名的,一般顾名思义是初始化的意思 。
意思就是对声明的变量或对象、结构体等进行赋初始值的操作。
比如声明变量int a;
带有初始化的方式是int a = 0;
扩展资料:
init进程介绍
当init开始运行,它通过执行一些管理任务来结束引导进程,例如检查文件系统、清理/tmp、启动各种服务以及为每个终端和虚拟控制台启动getty,在这些地方用户将登录系统。
在系统完全起来之后,init为每个用户已退出的终端重启getty(这样下一个用户就可以登录)。init同样也收集孤立的进程:当一个进程启动了一个子进程并且在子进程之前终止了,这个子进程立刻成为init的子进程。
参考资料来源:百度百科-init进程。
Linux init详解
init是Linux系统操作中不可缺少的程序之一。
所谓的init进程,它是一个由内核启动的用户级进程。
内核自行启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式,完成引导进程。所以,init始终是第一个进程(其进程编号始终为1)。
内核会在过去曾使用过init的几个地方查找它,它的正确位置(对Linux系统来说)是/sbin/init。如果内核找不到init,它就会试着运行/bin/sh,如果运行失败,系统的启动也会失败。
一、什么是INIT:
init是Linux系统操作中不可缺少的程序之一。
所谓的init进程,它是一个由内核启动的用户级进程。
内核自行启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式,完成引导进程。所以,init始终是第一个进程(其进程编号始终为1)。
内核会在过去曾使用过init的几个地方查找它,它的正确位置(对Linux系统来说)是/sbin/init。如果内核找不到init,它就会试着运行/bin/sh,如果运行失败,系统的启动也会失败。
二、运行级别
那么,到底什么是运行级呢?
简单的说,运行级就是操作系统当前正在运行的功能级别。这个级别从1到6 ,具有不同的功能。
不同的运行级定义如下:(可以参考Red Hat Linux 里面的/etc/inittab)
# 0 - 停机(千万不能把initdefault 设置为0 )
# 1 - 单用户模式
# 2 - 多用户,没有 NFS 。
# 3 - 完全多用户模式(标准的运行级) 。
# 4 - 没有用到
# 5 - X11 (xwindow) 。
# 6 - 重新启动 (千万不要把initdefault 设置为6 )
这些级别在/etc/inittab 文件里指定。这个文件是init 程序寻找的主要文件,最先运行的服务是放在/etc/rc.d 目录下的文件。在大多数的Linux 发行版本中,启动脚本都是位于 /etc/rc.d/init.d中的。这些脚本被用ln 命令连接到 /etc/rc.d/rcn.d 目录。(这里的n 就是运行级0-6) 。
三、运行级别的配置
运行级别的配置是在/etc/inittab行内进行的,如下所示:
12 : 2 : wait : / etc / init.d / rc 2 。
第一个字段是一个任意指定的标签;
第二个字段表示这一行适用于运行那个级别(这里是2);
第三个字 段表示进入运行级别时,init应该运行第四个字段内的命令一次,而且init应该等待该命令结束。/etc/init.d/rc命令运行启动和终止输入以便进入运行级别2时所需的任何命令。
第四个字段中的命令执行设置运行级别时的一切“杂活”。它启动已经没有运行的服务,终止不应该再在新运行级别内运行的服务。根据Linux版本的不同,采用的具体命令也不同,而且运行级别的配置也是有差别的。
init启动时,它会在/etc/inittab内查找一个代码行,这一行指定了默认的运行级别:
id : 2 : initdefault : 。
你可以要求init在启动时,进入非默认运行级别,这是通过为内核指定一个“single”或“emergency” 命令行参数来实现的。比如说,内核命令行参数的指定可通过LILO来执行。这样一来,你就可以选择单用户模式了(即运行级别1)。
系统正在运行时,telinit命令可更改运行级别。运行级别发生变化时, init 就会从/etc/inittab运行相应的命令。
四、/etc/inittab中的特殊配置 。
/etc/inittab中,有几个特殊的特性,允许init重新激活特殊事件。这些特殊特性都是用第三个字段中的特殊关键字标记出来的。比如:
1. powerwait 。
允许init在电源被切断时,关闭系统。其前提是具有U P S和监视U P S并通知init电源已被切断的软件。
2. ctrlaltdel 。
允许init在用户于控制台键盘上按下C t r l + A l t + D e l组合键时,重新启动系统。注意,如果该系统放在一个公共场所,系统管理员可将C t r l + A l t + D e l组合键配置为别的行为,比如忽略等。
3. sysinit
系统启动时准备运行的命令。比如说,这个命令将清除/tmp。
上面列出的特殊关键字尚不完整。其他的关键字及其使用详情,可参考你的inittab手册页。
五、在单用户模式下引导
一个重要的运行级别就是单用户模式(运行级别1),该模式中,只有一个系统管理员使用特定的机器,而且尽可能少地运行系统服务,其中包含登录。单用户模式对少数管理任务(比如在/usr分区上运行fsck)而言,是很有必要的,因为这需要卸载分区,但这是不可能的,除非所有的服务系统已被杀死。
一个正在运行的系统可以进入单用户模式,具体做法是利用init,请求运行级别1。内核启动时,在内核命令行指定single或emergency关键字,就可进入运行级别1了。内核同时也为init指定命令行, init从关键字得知自己不应该采用默认的运行级别(内核命令行的输入方式和你启动系统的方式有关)。
有时,以单用户模式进行启动是必要的,这样一来,用户在装入分区之前,或至少在装入分散的/usr分区之前,能手工运行fsck(在分散的文件系统上,任何活动都可能使其更为分散,所以应该尽可能地运行fsck)。
如果自动化的fsck在启动时失败了,启动脚本init的运行将自动进入单用户模式。这样做是为了防止系统使用不连贯的文件系统,这个文件系统是f s c k不能自动修复的。文件系统不连贯的现象极为少见,而且通常会导致硬盘的不连贯或实验性的内核释放,但最好能做到防患于未然。
由于安全上的考虑,在单用户模式下,启动外壳脚本之前,配置得当的系统会要求用户提供root密码。否则,它会简单地为L I L O输入合适的一行代码,以r o o t的身份登录(当然,如果/etc/passwd已经由于文件系统的问题而不连贯了,就不适合这里的原则了,为对付这种情况,你最好随时准备一张启动盘)。
不同的运行级有不同的用处,也应该根据自己的不同情形来设置。
例如,如果丢失了root口令,那么可以让机器启动进入单用户状态。在启动后的 lilo 提示符下输入:
init=/bin/sh rw 使机器进入运行级1 ,并把 root 文件系统挂为读写。他会跳过所有系统认证,让你可以使用passwd 程序来改变root口令,然后启动到一个新的运行级。
AIX(Advanced Interactive eXecutive)是IBM开发的一套UNIX操作系统。它符合Open group的UNIX 98行业标准(The Open Group UNIX 98 Base Brand),通过全面集成对32-位和64-位应用的并行运行支持,为这些应用提供了全面的可扩展性。它可以在所有的IBM ~ p系列和IBM RS/6000工作站、服务器和大型并行超级计算机上运行。
在系统启动过程中,在预初始化过程中装入根文件系统之后,将发生下面这些事件:
作为启动过程中的最后一个步骤,运行 init 命令。
init 命令尝试读取 /etc/inittab 文件。
如果 /etc/inittab 文件存在,那么 init 命令将尝试在 /etc/inittab 文件中查找 initdefault 条目。
如果 initdefault 条目存在,那么 init 命令使用指定的运行级别作为初始的系统运行级别。
如果 initdefault 条目不存在,那么 init 命令将请求用户从系统控制台 (/dev/console) 输入一个运行级别。
如果用户输入 S、s、M、或者 m 运行级别,那么 init 命令将进入维护运行级别。只有这些运行级别不需要经过正确格式化的 /etc/inittab 文件。
如果 /etc/inittab 文件不存在,那么 init 命令在缺省情况下将使系统进入维护运行级别。
init 命令每隔 60 秒将再次读取 /etc/inittab 文件。如果在 init 命令上一次读取 /etc/inittab 文件之后,其中的内容发生了更改,那么将执行 /etc/inittab 文件中的新命令。
/etc/inittab 文件。
/etc/inittab 文件用于控制初始化过程。
/etc/inittab 文件提供了相应的脚本,以使得 init 命令的角色成为通用的进程调度器。init 命令的进程调度活动中的主要进程是 /etc/getty 线路进程,它将启动单独终端线路。通常由 init 命令进行调度的其他进程包括守护进程和 Shell。
/etc/inittab 文件由一些与位置无关的条目组成,它们的格式如下所示:
Identifier:RunLevel:Action:Command。
每个条目之间由一个换行符进行分隔。换行符前面加上一个反斜杠 (\) 表示继续该条目。在 /etc/inittab 文件中,对于条目的数目没有任何限制(但不能超过最大的条目大小)。最大的条目大小为 1024 个字符。
条目字段包括:
Identifier,由一到十四个字符组成的字段,唯一地标识一个对象。
RunLevel,可以对该条目进行处理的运行级别。
运行级别具有下面的属性:
运行级别有效地对应于系统中的进程配置。
可以为每个由 init 命令启动的进程分配一个或者多个运行级别(该进程可以存在于其中)。
运行级别使用数字 0 到 9 进行表示。例如,如果系统处于运行级别 1,那么只有那些在运行级别字段中包含 1 的条目才会启动。
当您请求 init 命令更改运行级别时,在运行级别字段中不包含匹配条目(对于目标运行级别)的所有进程都将接收到一个警告信号 (SIGTERM)。在使用删除信号 (SIGKILL) 强行结束这些进程之前,有 20 秒钟的过渡期。
通过使用从 0 到 9 的任意组合,可以选择多个运行级别,从而在运行级别字段中为一个进程定义多个运行级别。如果没有指定运行级别,那么就假定该进程在所有的运行级别中都是有效的。
在运行级别字段中,还可能出现其他四种取值,即使它们并不是真正的运行 级别:a、b、c 和 h。仅当使用 telinit 命令请求它们运行时(无论系统当前运行级别如何),才会处理那些运行级别字段中包含这些字符的条目。它们与运行级别的不同之处在于,init 命令不可能进入到运行级别 a、b、c 或者 h。另外,任何这些进程的执行请求都不会更改当前运行级别。而且,在 init 命令更改级别时,不会终止以 a、b 或者 c 命令开头的进程。只有在下面三种情况下才会终止它们:在 /etc/inittab 文件中,它们所在行的操作字段被标记为 off,从 /etc/inittab 中完全删除它们所在的行,或者 init 命令进入到单用户模式。
Action,用于告诉 init 命令如何处理在进程字段中指定的进程。init 命令能识别下列的操作:
respawn:如果进程不存在,则启动该进程。不需要等待它的结束(继续扫描 /etc/inittab 文件)。当进程中止时,重新启动该进程。如果该进程已经存在,则什么也不做,继续扫描 /etc/inittab 文件。
wait:当 init 命令进入到与该条目的运行级别相匹配的运行级别时,启动该进程,并等待它的结束。当 init 命令处于相同的运行级别时,所有后续对 /etc/inittab 文件的读取操作都将导致 init 命令忽略这个条目。
once:当 init 命令进入到与该条目的运行级别相匹配的运行级别时,启动该进程,并且不需要等待它的结束。当它中止时,不重新启动该进程。当系统进入一个新的运行级别,并且该进程的运行来自前一个运行级别更改时,不重新启动该程序。
boot: 仅在系统启动时(即在系统启动的过程中当 init 命令读取 /etc/inittab 文件的时候)处理该条目。启动该进程,不需要等待它的结束,并且当它中止时,不重新启动该进程。为了使得该指令有意义,运行级别应该为缺省值,或者它必须 与启动时 init 命令的运行级别相匹配。对于系统硬件重新启动之后的初始化功能来说,这种操作是非常有价值的。
bootwait:在系统启动之后,当 init 命令第一次从单用户进入到多用户状态时,处理该条目。启动该进程,等待它的结束;并且当它中止时,不重新启动该进程。如果 initdefault 为 2,那么在启动之后运行该进程。
powerfail:仅当 init 命令接收到电源故障信号 (SIGPWR) 时,才执行与这个条目相关联的进程。
powerwait:仅当 init 命令接收到电源故障信号 (SIGPWR) 时,才执行与这个条目相关联的进程,并且在继续处理 /etc/inittab 文件之前,必须等待它结束。
off:如果与这个条目相关联的进程目前正在运行,那么发送警告信号 (SIGTERM),等待 20 秒钟,然后使用删除信号 (SIGKILL) 终止该进程。如果该进程没有运行,则忽略这个条目。
ondemand:从功能上看,与 respawn 是相同的,但是这个操作适用于 a、b 或者 c 值,而不是运行级别。
initdefault: 仅在 init 命令最初被调用时,才扫描包含这个操作的条目。init 命令使用这个条目(如果它存在的话)来确定最初要进入的运行级别。通过使用运行级别字段中所指定的最高运行级别,就可以实现这一点,并使用它作为其初始状 态。如果运行级别字段为空,那么将其解释为“0123456789”:因此,init 命令将进入运行级别 9。另外,如果 init 命令在 /etc/inittab 文件中没有找到 initdefault 条目,那么将要求用户在启动时指定一个最初的运行级别。
sysinit:当 init 命令在登录之前尝试访问控制台时,将执行这种类型的条目。在正常情况下,这个条目仅用于初始化设备(init 命令可能会对这些设备询问有关运行级别的问题)。执行这些条目,并等待它们结束,然后再继续。
Command: 要执行的 Shell 命令。整个命令字段以 exec 作为前缀,然后以 sh -c exec command 的形式传递给一个使用 fork 系统调用生成的 sh。任何合法的 sh 命令语法都可以出现在这个字段中。可以使用 # comment 语法插入注释。
getty 命令将覆盖 /etc/inittab 文件中出现在它之前的任何命令的输出。要将这些命令的输出记录到启动日志,可以使用管道将它们的输出传递给 alog -tboot 命令。
在 init 命令处理 inittab 条目时,stdin、stdout 和 stderr 文件描述符可能是不可用的。向 stdout 或者 stderr 进行写入操作的任何条目都可能无法按照预期的方式工作,除非它们将自己的输出重定向到一个文件或者 /dev/console。
对于修改 /etc/inittab 文件中的记录,仅支持下列的命令:
mkitab:将记录添加到 /etc/inittab 文件。
lsitab:列出 /etc/inittab 文件中的记录。
chitab:更改 /etc/inittab 文件中的记录。
rmitab:删除 /etc/inittab 文件中的记录。
例如,您希望向 /etc/inittab 文件添加一条记录,以便在运行级别 2 中运行 find 命令,并且在它结束后再次启动它:
1. 运行 ps 命令,并显示那些仅包含单词 find 的进程:
# ps -ef
grep find
root 19750 13964 0 10:47:23 pts/0 0:00 grep find。
2. 使用 mkitab 命令向 /etc/inittab 添加一条名为 xcmd 的记录:
# mkitab "xcmd:2:respawn:find / -type f > /dev/null 2>&1"。
3. 使用 lsitab 命令显示新的记录:
# lsitab xcmd
xcmd:2:respawn:find / -type f > /dev/null 2>&1。
4. 显示进程:
# ps -ef
grep find
root 28972 13964 0 11:07:33 pts/0 0:00 grep find。
5. 结束 find 进程:
# kill 25462
6. 显示进程:
# ps -ef
grep find
root 23538 13964 0 10:58:24 pts/0 0:00 grep find。
root 28966 1 4 10:58:21 - 0:00 find / -type f。
由于 action 项被设置成为了 respawn,所以一个新的 find 进程(上面显示的 28966)在前一个进程结束后又被系统启动了。
这个进程会被不断的重新启动,除非把 action 项的设置修改,如:
1. 把 xcmd 这条记录的 action 项的值从 respawn 修改为 once:
# chitab "xcmd:2:once:find / -type f > /dev/null 2>&1"。
2. 显示进程:
# ps -ef
grep find
root 20378 13964 0 11:07:20 pts/0 0:00 grep find。
root 28970 1 4 11:05:46 - 0:03 find / -type f。
3. 结束 find 进程:
# kill 28970
4. 显示进程:
# ps -ef
grep find
root 28972 13964 0 11:07:33 pts/0 0:00 grep find。
可以看到 find 进程没有再被系统启动。
要从 /etc/inittab 文件中删除这条记录,您可以使用 rmitab 命令。例如:
# rmitab xcmd
# lsitab xcmd
/etc/inittab 条目的顺序 。
在 /etc/inittab 文件中,基本条目按照如下所示的方式进行排序:
initdefault
sysinit
Powerfailure Detection (powerfail)。
Multiuser check (rc)。
/etc/firstboot (fbcheck)。
System Resource Controller (srcmstr)。
Start TCP/IP daemons (rctcpip)。
Start NFS daemons (rcnfs)。
cron
pb cleanup (piobe)。
getty for the console (cons)。
必须在 etc/inittab 文件的开始处附近启动系统资源控制器(System Resource Controller,SRC),因为需要 SRC 守护进程来启动其他进程。因为 NFS 需要 TCP/IP 守护进程正确地运行,所以应该在启动 NFS 守护进程之前启动 TCP/IP 守护进程。/etc/inittab 文件中的条目根据依赖关系进行排序,这意味着,如果一个进程 (process2) 的正常运行需要另一个进程 (process1) 的存在,那么在 /etc/inittab 文件中,process1 的条目应该出现在 process2 的条目之前。