Linux内核结构与进程管理 Linux系统结构 用户进程 System Call Interface(POSIX. 1), shell, GUI, Compiler, Library, etc. 0服务层 Modul Linux Kernel Linux内按层 Drivers Other 硬件层 Disk Devices Linux kernel:开放源代码的inux操作系统内核,目前版本为2.6
Linux 内核结构与进程管理 ◼ Linux系统结构 Linux Kernel Modules Device Drivers Module Interface Device Driver Interface System Call Interface(POSIX.1),shell, GUI, Compiler, Library, etc. P P P P P 硬件层 Linux内核层 用户进程 Other Devices CPU Disk OS服务层 Linux kernel: 开放源代码的linux操作系统内核,目前版本为2.6
Linux内核组成 内存管理程序 虚拟文件系统 进程调度程序 进程间通信 说明: 子系统 网络接口 依赖于 1.进程调度程序( SCHED)负责控制进程访问CPU。保证进程能够公平地访问CPU, 同时保证内核可以准时执行一些必需的硬件操作。 2.内核管理程序(MM)使多个进程可以安全地共享机器的主存系统,并支持虚拟内存。 3.虚拟文件系统(VFS)。通过提供一个所有设备的公共文件接口,VFS抽象了不同硬 件设备的细节。此外,VFS支持与其他操作系统兼容的不同的文件系统格式 4.网络接口(NET)提供对许多建网标准和网络硬件的访问。 5.进程间通信(IPC)子系统为进程与进程之间的通信提供了一些机制。 这些子系统虽然实现的功能相对独立,但存在着较强的依赖性(调用依赖模块中相应的函数 ),所以说1inux内核是单块结构( monolithic)的,而 windows体系结构是微内核 ( microkernel1)的
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/rcd/ rC SRUNLEⅤEL#$ RUNLEⅤEL为缺省的运行模式 /etc/rc. d/rc. local #运行模式2、3、5时会运行的脚本 /sbin/ mingetty(或get)#等待用户登录 /etc/ inittab中指定了系统的运行级别( RUNLEVEL),init根据运行级别启动相 关的服务(一些后台进程),实现不同的功能 RUNLEVEL: 0-6 0:halt,1:单用户,2:多用户,3:多用户并启动NFS服务 4:保留,5:运行xdm( X window)以图形界面方式登录 6: reboot
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中用户登陆流程
inux进程的四要素 程序 PCB ■地址空间 ■系统堆栈空间 PCB:进程创建时内核为其分配的一个核心数据结构,进程自身不 能直接存取 系统堆栈空间:进程运行在核心态时使用的堆栈,和PCB连在一起, 共8KB,其中PCB约占1000字节,系统堆栈空间约占7200字节。 22内核中 linux进程个数有最大值限制(4092)。但24以后,系统中 的进程个数受限于系统的物理内存数,即限定所有进程的PCB及 系统堆栈(8K)占用的空间<1/的物理内存总和。例64M内存: 进程数<64M2/8K=4K
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 rescl policy即进程的类别,分 SCHED FIFO, SCHED_RR SCHED OTHER三种,前两种为实时进程,后一种为非实时进程 ■IPC信息:如定义对某些信号的处理等 ■家族信息:父进程、兄弟进程、子进程信息 ■时钟和定时信息 ■文件系统 ■存储管理
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,vork ■父子进程共享资源的形式 a不共享(fork时缺省) b部分共享 C.完全共享(线程)
进程的创建 ◼ 进程创建:fork , clone, vfork ◼ 父子进程共享资源的形式 ◼ a.不共享(fork时缺省) ◼ b.部分共享 ◼ c.完全共享(线程)
fok实例 *include int myvar=0 void maino int pid pid= forko; //system call if (pid<o)//error occurred printf(“ fork failed.”); exit(-1 //system call else if pid==0) //child process printf(“ child process executing.ln”) myvar =l, e se //parent process waito 11. wait for child printf ("child complete. " myvar++ printf("father, my var=d", myvar) exit
#include 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实例
进程调度 硬件时钟 (晶振, MOS电路 定时器 中断控制 CPU 8253 8259 调度时机 a.用户进程自愿放弃CPU,如执行 sleep o系统调用 b.系统调用中,需要等待时,直接调用 schedule进行调度; C.系统调用、中断或异常处理完成后,返回到用户空间前,若当前进程 的PCB中的 Ineed resched=1,则发生调度; 调度策略:基于进程的权值( weight,即动态优先级) 实时进程: weight=1000+ rt priority (>1000) 分时进程: weight= counter+20-nice(<1000 其中: rt priority:是实时进程的优先级 coun ter:进程还剩余的时间片值 nice:进程优先级的调整值 (均在进程的PCB中标识)
进程调度 ◼ 调度时机 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