Linux内核结构与进程管理
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
stopped, zombie 调度信息:policy, priority, rt_priorty, need_resched
policy即进程的类别,分SCHED_FIFO, SCHED_RR, SCHED_OTHER三种,前两种为实时进程,后一种为非实时进程
IPC信息:如定义对某些信号的处理等 家族信息:父进程、兄弟进程、子进程信息 时钟和定时信息 文件系统 存储管理
exit(0);
}
}
进程调度
硬件时钟 (晶振, CMOS电路
)
定时器
中断控制
CPU
8253
器8259
调度时机
a. 用户进程自愿放弃CPU,如执行sleep()系统调用;
b.系统调用中,需要等待时,直接调用schedule()进行调度;
c.系统调用、中断或异常处理完成后,返回到用户空间前,若当前进程
的PCB中的need_resched = 1,则发生调度;
调度策略:基于进程的权值(weight,即动态优先级)
实时进程: weight = 1000+rt_priority (>1000)
分时进程: weight = counter + 20 – nice (<1000)
其中:rt_priority:是实时进程的优先级
myvar = 1;
}
else {
//parent process
wait(); //system call, wait for children completion
printf(“child complete.”);
myvar ++;
printf(“father,myvar=%d”,myvar);
/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-interC 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)的。
进程的创建
进程创建:fork , clone, vfork 父子进程共享资源的形式
a.不共享(fork时缺省) b.部分共享 c.完全共享(线程)
fork实例
#include <stdio.h>
int myvar=0;
void main()
{
int pid;
pid = fork();
//system call
counter:进程还剩余的时间片值
nice:进程优先级的调整值
(均在进程的PCB中标识)
后装入并执行程序/sbin/init(变成一个用户进程)。此后,init根据/etc/inittab
配置文件来执行相应的脚本进行系统初始化,如设置键盘、字体,装载模块,设
置网络等
对于Redhat来说,执行的顺序为:
/etc/rc.d/rc.sysinit
# 由init执行的第一个脚本
/etc/rc.d/rc $RUNLEVEL # $RUNLEVEL为缺省的运行模式
Linux启动流程
1. 从BIOS到KERNEL
MBR->KERNEL->KERNEL自解压->内核初始化->内核启动(start_kernel函
数,在linux内核源代码树的/usr/src/linux/init/main.c中)
2. 内核启动:创建1#进程并执行,由它创建若干内核线程(kernel thread),然
if (pid < 0 ) { //error occurred
printf(“fork failed.”);
exit(-1);
//system call
}
else if (pid == 0 ) { //child process
printf(“child process executing…\n”);
policy即进程的类别,分SCHED_FIFO, SCHED_RR, SCHED_OTHER三种,前两种为实时进程,后一种为非实时进程
IPC信息:如定义对某些信号的处理等 家族信息:父进程、兄弟进程、子进程信息 时钟和定时信息 文件系统 存储管理
exit(0);
}
}
进程调度
硬件时钟 (晶振, CMOS电路
)
定时器
中断控制
CPU
8253
器8259
调度时机
a. 用户进程自愿放弃CPU,如执行sleep()系统调用;
b.系统调用中,需要等待时,直接调用schedule()进行调度;
c.系统调用、中断或异常处理完成后,返回到用户空间前,若当前进程
的PCB中的need_resched = 1,则发生调度;
调度策略:基于进程的权值(weight,即动态优先级)
实时进程: weight = 1000+rt_priority (>1000)
分时进程: weight = counter + 20 – nice (<1000)
其中:rt_priority:是实时进程的优先级
myvar = 1;
}
else {
//parent process
wait(); //system call, wait for children completion
printf(“child complete.”);
myvar ++;
printf(“father,myvar=%d”,myvar);
/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-interC 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)的。
进程的创建
进程创建:fork , clone, vfork 父子进程共享资源的形式
a.不共享(fork时缺省) b.部分共享 c.完全共享(线程)
fork实例
#include <stdio.h>
int myvar=0;
void main()
{
int pid;
pid = fork();
//system call
counter:进程还剩余的时间片值
nice:进程优先级的调整值
(均在进程的PCB中标识)
后装入并执行程序/sbin/init(变成一个用户进程)。此后,init根据/etc/inittab
配置文件来执行相应的脚本进行系统初始化,如设置键盘、字体,装载模块,设
置网络等
对于Redhat来说,执行的顺序为:
/etc/rc.d/rc.sysinit
# 由init执行的第一个脚本
/etc/rc.d/rc $RUNLEVEL # $RUNLEVEL为缺省的运行模式
Linux启动流程
1. 从BIOS到KERNEL
MBR->KERNEL->KERNEL自解压->内核初始化->内核启动(start_kernel函
数,在linux内核源代码树的/usr/src/linux/init/main.c中)
2. 内核启动:创建1#进程并执行,由它创建若干内核线程(kernel thread),然
if (pid < 0 ) { //error occurred
printf(“fork failed.”);
exit(-1);
//system call
}
else if (pid == 0 ) { //child process
printf(“child process executing…\n”);