Linux 内核结构与进程管理
? Linux系统结构
L i n u x K e r n e l
M o d u l e s
D e v i c e
D r i v e r s
M
o
d
u
l
e
I
n
t
e
r
f
a
c
e
D
e
v
i
c
e
D
r
i
v
e
r
I
n
t
e
r
f
a
c
e
S y s t e m C a l l I n t e r f a c e ( P O S I X, 1 ),s h e l l,G U I,C o m p i l e r,L i b r a r y,e t c,
P P P P P
硬 件 层
L i n u x 内 核 层
用 户 进 程
O t h e r
D e v i c e s
C P U
D i s k
O S 服 务 层
Linux kernel,开放源代码的 linux操作系统内核,目前版本为 2.6
Linux内核组成
1,进程调度程序( S C H E D)负责控制进程访问 C P U。保证进程能够公平地访问 C P U,
同时保证内核可以准时执行一些必需的硬件操作。
2,内核管理程序( M M)使多个进程可以安全地共享机器的主存系统,并支持虚拟内存。
3,虚拟文件系统( V F S)。通过提供一个所有设备的公共文件接口,V F S抽象了不同硬
件设备的细节。此外,V F S支持与其他操作系统兼容的不同的文件系统格式。
4,网络接口( N E T)提供对许多建网标准和网络硬件的访问。
5,进程间通信( I P C)子系统为进程与进程之间的通信提供了一些机制。
这些子系统虽然实现的功能相对独立,但存在着较强的依赖性(调用依赖模块中相应的函数
),所以说 linux内核是 单块结构( monolithic) 的,而 windows体系结构是 微内核
(microkernel)的。
Linux启动流程
1,从 BIOS到 KERNEL
MBR- >KERNEL- >KERNEL自解压- >内核初始化- >内核启动 ( start_kernel函
数,在 linux内核源代码树的 /usr/src/linux/init/main.c中 )
2,内核启动:创建 1#进程并执行,由它创建若干内核线程( kernel thread),然
后装入并执行程序 /sbin/init(变成一个用户进程)。此后,init根据 /etc/inittab
配置文件 来执行相应的脚本进行系统初始化,如设置键盘、字体,装载模块,设
置网络等
对于 Redhat来说,执行的顺序为:
/etc/rc.d/rc.sysinit # 由 init执行的第一个脚本
/etc/rc.d/rc $RUNLEVEL # $RUNLEVEL为缺省的运行模式
/etc/rc.d/rc.local #运行模式 2,3,5时会运行的脚本
/sbin/mingetty(或 getty) # 等待用户登录
/etc/inittab中指定了系统的运行级别( RUNLEVEL),init根据运行级别启动相
关的服务(一些后台进程),实现不同的功能。
RUNLEVEL:0- 6
0,halt,1:单用户,2:多用户,3:多用户并启动 NFS服务
4:保留,5:运行 xdm( X window) 以图形界面方式登录
6,reboot
Linux中用户登陆流程
linux进程的四要素
?程序
?PCB
?地址空间
?系统堆栈空间
PCB:进程创建时内核为其分配的一个核心数据结构, 进程自身不
能直接存取 。
系统堆栈空间:进程运行在核心态时使用的堆栈, 和 PCB连在一起,
共 8KB,其中 PCB约占 1000字节, 系统堆栈空间约占 7200字节 。
2.2 内核中 linux进程个数有最大值限制( 4092)。但 2.4以后,系统中
的进程个数受限于系统的物理内存数,即限定所有进程的 PCB及
系统堆栈( 8K)占用的空间 ≤1/2的物理内存总和。例 64M内存:
进程数 ≤64M/2/8K=4K
PCB中的重要信息
? 身份信息,pid,uid,gid,euid,egid等;
? 状态信息,running,interruptible,non-interruptible,
stopped,zombie
? 调度信息,policy,priority,rt_priorty,need_resched
? policy即进程的类别,分 SCHED_FIFO,SCHED_RR,
SCHED_OTHER三种,前两种为实时进程,后一种为非实时进程
? IPC信息:如定义对某些信号的处理等
? 家族信息:父进程、兄弟进程、子进程信息
? 时钟和定时信息
? 文件系统
? 存储管理
进程的创建
? 进程创建,fork,clone,vfork
? 父子进程共享资源的形式
? a.不共享( fork时缺省)
? b.部分共享
? c.完全共享(线程)
#include <stdio.h>
int myvar=0;
void main()
{
int pid;
pid = fork(); //system call
if (pid < 0 ) { //error occurred
printf(“fork failed.”);
exit(-1); //system call
}
else if (pid == 0 ) { //child process
printf(“child process executing… \n”);
myvar = 1;
}
else { //parent process
wait(); //system call,wait for children completion
printf(“child complete.”);
myvar ++;
printf(“father,myvar=%d”,myvar);
exit(0);
}
}
fork实例
进程调度
? 调度时机
a,用户进程自愿放弃 CPU,如执行 sleep()系统调用;
b.系统调用中, 需要等待时, 直接调用 schedule()进行调度;
c.系统调用、中断或异常处理完成后,返回到用户空间前,若当前进程
的 PCB中的 need_resched = 1,则发生调度;
? 调度策略:基于进程的权值( weight,即动态优先级)
实时进程,weight = 1000+rt_priority ( >1000)
分时进程,weight = counter + 20 – nice ( <1000)
其中,rt_priority:是实时进程的优先级
counter:进程还剩余的时间片值
nice:进程优先级的调整值 (均在进程的 PCB中标识)
硬件时钟
(晶振,
CMOS电路
)
定时器
8253 中断控制器 8259 CPU
? Linux系统结构
L i n u x K e r n e l
M o d u l e s
D e v i c e
D r i v e r s
M
o
d
u
l
e
I
n
t
e
r
f
a
c
e
D
e
v
i
c
e
D
r
i
v
e
r
I
n
t
e
r
f
a
c
e
S y s t e m C a l l I n t e r f a c e ( P O S I X, 1 ),s h e l l,G U I,C o m p i l e r,L i b r a r y,e t c,
P P P P P
硬 件 层
L i n u x 内 核 层
用 户 进 程
O t h e r
D e v i c e s
C P U
D i s k
O S 服 务 层
Linux kernel,开放源代码的 linux操作系统内核,目前版本为 2.6
Linux内核组成
1,进程调度程序( S C H E D)负责控制进程访问 C P U。保证进程能够公平地访问 C P U,
同时保证内核可以准时执行一些必需的硬件操作。
2,内核管理程序( M M)使多个进程可以安全地共享机器的主存系统,并支持虚拟内存。
3,虚拟文件系统( V F S)。通过提供一个所有设备的公共文件接口,V F S抽象了不同硬
件设备的细节。此外,V F S支持与其他操作系统兼容的不同的文件系统格式。
4,网络接口( N E T)提供对许多建网标准和网络硬件的访问。
5,进程间通信( I P C)子系统为进程与进程之间的通信提供了一些机制。
这些子系统虽然实现的功能相对独立,但存在着较强的依赖性(调用依赖模块中相应的函数
),所以说 linux内核是 单块结构( monolithic) 的,而 windows体系结构是 微内核
(microkernel)的。
Linux启动流程
1,从 BIOS到 KERNEL
MBR- >KERNEL- >KERNEL自解压- >内核初始化- >内核启动 ( start_kernel函
数,在 linux内核源代码树的 /usr/src/linux/init/main.c中 )
2,内核启动:创建 1#进程并执行,由它创建若干内核线程( kernel thread),然
后装入并执行程序 /sbin/init(变成一个用户进程)。此后,init根据 /etc/inittab
配置文件 来执行相应的脚本进行系统初始化,如设置键盘、字体,装载模块,设
置网络等
对于 Redhat来说,执行的顺序为:
/etc/rc.d/rc.sysinit # 由 init执行的第一个脚本
/etc/rc.d/rc $RUNLEVEL # $RUNLEVEL为缺省的运行模式
/etc/rc.d/rc.local #运行模式 2,3,5时会运行的脚本
/sbin/mingetty(或 getty) # 等待用户登录
/etc/inittab中指定了系统的运行级别( RUNLEVEL),init根据运行级别启动相
关的服务(一些后台进程),实现不同的功能。
RUNLEVEL:0- 6
0,halt,1:单用户,2:多用户,3:多用户并启动 NFS服务
4:保留,5:运行 xdm( X window) 以图形界面方式登录
6,reboot
Linux中用户登陆流程
linux进程的四要素
?程序
?PCB
?地址空间
?系统堆栈空间
PCB:进程创建时内核为其分配的一个核心数据结构, 进程自身不
能直接存取 。
系统堆栈空间:进程运行在核心态时使用的堆栈, 和 PCB连在一起,
共 8KB,其中 PCB约占 1000字节, 系统堆栈空间约占 7200字节 。
2.2 内核中 linux进程个数有最大值限制( 4092)。但 2.4以后,系统中
的进程个数受限于系统的物理内存数,即限定所有进程的 PCB及
系统堆栈( 8K)占用的空间 ≤1/2的物理内存总和。例 64M内存:
进程数 ≤64M/2/8K=4K
PCB中的重要信息
? 身份信息,pid,uid,gid,euid,egid等;
? 状态信息,running,interruptible,non-interruptible,
stopped,zombie
? 调度信息,policy,priority,rt_priorty,need_resched
? policy即进程的类别,分 SCHED_FIFO,SCHED_RR,
SCHED_OTHER三种,前两种为实时进程,后一种为非实时进程
? IPC信息:如定义对某些信号的处理等
? 家族信息:父进程、兄弟进程、子进程信息
? 时钟和定时信息
? 文件系统
? 存储管理
进程的创建
? 进程创建,fork,clone,vfork
? 父子进程共享资源的形式
? a.不共享( fork时缺省)
? b.部分共享
? c.完全共享(线程)
#include <stdio.h>
int myvar=0;
void main()
{
int pid;
pid = fork(); //system call
if (pid < 0 ) { //error occurred
printf(“fork failed.”);
exit(-1); //system call
}
else if (pid == 0 ) { //child process
printf(“child process executing… \n”);
myvar = 1;
}
else { //parent process
wait(); //system call,wait for children completion
printf(“child complete.”);
myvar ++;
printf(“father,myvar=%d”,myvar);
exit(0);
}
}
fork实例
进程调度
? 调度时机
a,用户进程自愿放弃 CPU,如执行 sleep()系统调用;
b.系统调用中, 需要等待时, 直接调用 schedule()进行调度;
c.系统调用、中断或异常处理完成后,返回到用户空间前,若当前进程
的 PCB中的 need_resched = 1,则发生调度;
? 调度策略:基于进程的权值( weight,即动态优先级)
实时进程,weight = 1000+rt_priority ( >1000)
分时进程,weight = counter + 20 – nice ( <1000)
其中,rt_priority:是实时进程的优先级
counter:进程还剩余的时间片值
nice:进程优先级的调整值 (均在进程的 PCB中标识)
硬件时钟
(晶振,
CMOS电路
)
定时器
8253 中断控制器 8259 CPU