现代操作系统 Chapter 7.ppt
《现代操作系统 Chapter 7.ppt》由会员分享,可在线阅读,更多相关《现代操作系统 Chapter 7.ppt(53页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Chapter 7 Case study:LinuxContentsvLinux内核结构内核结构vLinux的进程管理的进程管理vLinux的进程调度的进程调度vLinux的内存管理的内存管理27.1 Linux内核结构内核结构37.2 Linux的进程管理的进程管理一般来说,一般来说,Linux中的进程都具备以下四要素:中的进程都具备以下四要素:v有一段程序供其执行。有一段程序供其执行。v有起码的有起码的“私有财产私有财产”,这就是系统专用的系统堆,这就是系统专用的系统堆栈空间。栈空间。v有有“户口户口”,这就是在内核中的一个,这就是在内核中的一个task_struct数数据结构(在操作系统
2、教科书中常称为据结构(在操作系统教科书中常称为PCB)。)。v有独立的存储空间,意味着拥有专有的用户空间。有独立的存储空间,意味着拥有专有的用户空间。注:缺了其中任何一条就不成其为注:缺了其中任何一条就不成其为“进程进程”。如果只具备。如果只具备了前面了前面3 3条而缺第条而缺第4 4条,那就称为条,那就称为“线程线程”。特别地,如果。特别地,如果完全没有用户空间,就称为完全没有用户空间,就称为“内核线程内核线程”,而如果共享用,而如果共享用户空间则就称为户空间则就称为“用户线程用户线程”。4task与与process Linux系统中的系统中的“进程进程”(process)和和“任务任务”(
3、task)是同一个意思,在内核代码是同一个意思,在内核代码中也常混用这两个名词。中也常混用这两个名词。57.2.1 进程描述符及任务结构进程描述符及任务结构v在内核中,进程描述符是一个名为在内核中,进程描述符是一个名为task_struct的结构体,用于保存进程的属的结构体,用于保存进程的属性和其他信息,它在性和其他信息,它在include/linux/sched.h中定义。中定义。v内核用双向循环链表内核用双向循环链表task_list存放所有进程存放所有进程描述符;同时借助全局变量描述符;同时借助全局变量current保存当保存当前运行进程的前运行进程的task_struct。6进程描述符
4、进程描述符v进程描述符必须保存的信息类型有:进程描述符必须保存的信息类型有:进程的属性进程的属性进程间的关系进程间的关系进程的内存空间进程的内存空间文件管理文件管理信号量管理信号量管理进程的可信度进程的可信度资源限制资源限制与调度相关的域与调度相关的域77.2.2 进程状态进程状态task_struct结构中的结构中的state域描述了进程的当前域描述了进程的当前状态。系统中的每个进程都必然处于几种进程状态状态。系统中的每个进程都必然处于几种进程状态之一。其具体定义见之一。其具体定义见sched.h。#define TASK_RUNNING0#define TASK_INTERRUPTIBLE
5、1#define TASK_UNINTERRUPTIBLE2#define TASK_STOPPED4#define TASK_TRACED8#define EXIT_ZOMBIE16#define EXIT_DEAD328进程状态进程状态vTASK_RUNNING可执行状态,表示这个进程可以被调度执行而成为当前进程。可执行状态,表示这个进程可以被调度执行而成为当前进程。当进程处于这样的可执行状态时,内核就将该进程的当进程处于这样的可执行状态时,内核就将该进程的task_struct结构通过其队列头结构通过其队列头run_list挂入一个挂入一个“运行队列运行队列”。vTASK_INTERRU
6、PTIBLE进程睡眠,可因进程睡眠,可因“信号到来信号到来”而被唤醒而被唤醒vTASK_UNINTERRUPTIBLE进程深度睡眠,不受信号干扰进程深度睡眠,不受信号干扰vTASK_STOPPED挂起状态,主要用于调试目的挂起状态,主要用于调试目的vTASK_ZOMBIE进程已经结束,但资源未释放,进程结构还在(进程已经进程已经结束,但资源未释放,进程结构还在(进程已经“去世去世”但但“户口户口”尚未注销)尚未注销)9进程状态转换进程状态转换107.2.3 进程创建进程创建vLinux将进程的创建与目标程序的执行分成将进程的创建与目标程序的执行分成两步两步:第一步:第一步:从已经存在的从已经存
7、在的“父进程父进程”复制出一个复制出一个“子进程子进程”。复制出来的子进程有自己的。复制出来的子进程有自己的task_struct和系统空间堆栈,但与父进程共享和系统空间堆栈,但与父进程共享其它所有的资源。其它所有的资源。Linux为此提供了两个系统调用:为此提供了两个系统调用:fork()和和clone()。第二步:第二步:读取可执行文件并将其载入地址空间读取可执行文件并将其载入地址空间开始运行。开始运行。Linux为此提供了一个函数族:为此提供了一个函数族:exec()。11fork()与与clone()的区别的区别vfork()是全部复制,父进程所有的资源全都是全部复制,父进程所有的资源
8、全都通过数据结构的复制通过数据结构的复制“遗传遗传”给子进程。给子进程。vclone()则可以将资源有选择地复制给子进则可以将资源有选择地复制给子进程,而没有复制的数据结构则通过指针的复程,而没有复制的数据结构则通过指针的复制让子进程共享。在极端的情况下,一个进制让子进程共享。在极端的情况下,一个进程可以程可以clone()出一个线程。出一个线程。vfork()是无参数的,是无参数的,clone()是带有参数的。是带有参数的。12写时拷贝写时拷贝(copy_on_write)v传统的传统的fork()系统调用直接把所有的资源复制给新系统调用直接把所有的资源复制给新创建的进程。创建的进程。缺点:
9、效率低下缺点:效率低下vLinux的的fork()使用使用写时拷贝写时拷贝来实现。来实现。v写时拷贝写时拷贝是一种可以推迟甚至免除拷贝数据的技是一种可以推迟甚至免除拷贝数据的技术。术。新创建进程时,内核并不复制整个进程地址空间,新创建进程时,内核并不复制整个进程地址空间,而是让父进程和子进程共享同一个拷贝;只有在而是让父进程和子进程共享同一个拷贝;只有在需要写入的时候,数据才会被复制,从而使各个需要写入的时候,数据才会被复制,从而使各个进程拥有各自的拷贝。进程拥有各自的拷贝。13写时拷贝写时拷贝v写时拷贝技术使地址空间上的页的拷贝被推写时拷贝技术使地址空间上的页的拷贝被推迟到实际发生写入的时候
10、,在页根本不会被迟到实际发生写入的时候,在页根本不会被写入的情况下(如写入的情况下(如fork()后立即调用后立即调用exec()),它们就无需复制了。),它们就无需复制了。v一般情况下,进程创建后都会马上运行一个一般情况下,进程创建后都会马上运行一个可执行的文件,这种优化可以避免拷贝大量可执行的文件,这种优化可以避免拷贝大量根本就不会被使用的数据。根本就不会被使用的数据。147.3 Linux的进程调度的进程调度v调度程序是内核的组成部分,它负责选择下调度程序是内核的组成部分,它负责选择下一个要运行的进程。一个要运行的进程。v调度程序的基本工作调度程序的基本工作:在一组处于可运行状:在一组处
11、于可运行状态的进程中选择一个来执行。态的进程中选择一个来执行。vLinux提供提供抢占式抢占式的多任务模式。的多任务模式。157.3.1 调度策略调度策略(policy)调度策略决定调度程序在何时让什调度策略决定调度程序在何时让什么进程运行。么进程运行。16(1)I/O消耗型和处理器消耗型进程消耗型和处理器消耗型进程vI/O消耗型进程消耗型进程:进程的大部分时间用来提:进程的大部分时间用来提交交I/O请求或是等待请求或是等待I/O请求。请求。这样的进程经常处于可运行状态,但通常每这样的进程经常处于可运行状态,但通常每次运行时间很短。次运行时间很短。v处理器消耗型进程处理器消耗型进程:它把时间大
12、多用在执行:它把时间大多用在执行代码上。代码上。v对于对于处理器消耗型进程处理器消耗型进程,调度策略是尽量降,调度策略是尽量降低它们的运行频率。低它们的运行频率。17调度策略调度策略v调度策略通常要在两个矛盾中寻找平衡:调度策略通常要在两个矛盾中寻找平衡:进程响应时间短进程响应时间短系统吞吐量高系统吞吐量高vLinux为了保证交互式应用,更倾向于为了保证交互式应用,更倾向于优先优先调度调度I/O消耗型进程消耗型进程。18调度策略定义调度策略定义v在在include/linux/sched.h中有如下定义:中有如下定义:#define SCHED_NORMAL0 /默认类型,普通的用户进程,动态
13、优先调度策略默认类型,普通的用户进程,动态优先调度策略#define SCHED_FIFO1 /实时进程,先进先出调度规则实时进程,先进先出调度规则#define SCHED_RR2/实时进程,循环实时进程,循环round-robin调度规则调度规则vtask_struct中的成中的成员policy是是进程的程的调度策度策略,它的略,它的值为上述三种策略之一。上述三种策略之一。19(2)进程优先级进程优先级v基于优先级的调度:调度程序总是选择时间基于优先级的调度:调度程序总是选择时间片未用尽而且优先级最高的进程运行。片未用尽而且优先级最高的进程运行。vLinux实现了基于实现了基于动态优先级动
14、态优先级的调度方法。的调度方法。vLinux内核提供了两组独立的优先级:内核提供了两组独立的优先级:nice值:范围从值:范围从-2019,默认值是,默认值是0。值越大,。值越大,优先级越低。优先级越低。实时优先级:任何实时进程的优先级都高于普实时优先级:任何实时进程的优先级都高于普通进程。通进程。20(3)时间片时间片v时间片大小的确定时间片大小的确定太短太短 问题?问题?太长太长 问题?问题?vLinux的调度程序提供较长的默认时间片给的调度程序提供较长的默认时间片给交互式程序。交互式程序。v Linux还能根据进程的优先级动态调整分配还能根据进程的优先级动态调整分配给它的时间片,从而保证
15、优先级高的进程,给它的时间片,从而保证优先级高的进程,执行的频率高,执行时间长。执行的频率高,执行时间长。21时间片时间片v当一个进程的时间片耗尽时,就认为当一个进程的时间片耗尽时,就认为进程到进程到期了期了。v没有时间片的进程不会再投入运行,除非等没有时间片的进程不会再投入运行,除非等到其它所有的进程都耗尽了它们的时间片,到其它所有的进程都耗尽了它们的时间片,这时,会这时,会重新计算所有进程的时间片重新计算所有进程的时间片。22(4)进程抢占进程抢占v两种情况下会发生进程抢占:两种情况下会发生进程抢占:有一个进程进入有一个进程进入TASK_RUNNING状态,而它状态,而它的优先级高于当前正
16、在运行的进程的优先级高于当前正在运行的进程当正在运行的进程的时间片变为当正在运行的进程的时间片变为0时时237.3.2 Linux调度算法调度算法Linux的调度程序在的调度程序在kernel/sched.c中定义。中定义。24(1)可执行队列可执行队列v可执行队列是调度程序中最基本的数据结构,可执行队列是调度程序中最基本的数据结构,它定义于它定义于kernel/sched.c中,由结构中,由结构runqueue表示。表示。v可执行队列是给定处理器上的可执行进程的可执行队列是给定处理器上的可执行进程的链表,链表,每个处理器一个每个处理器一个。25可执行队列可执行队列runqueuestruct
17、 runqueue spinlock_t lock;unsigned long nr_running;unsigned long long nr_switches;unsigned long nr_uninterruptible;unsigned long expired_timestamp;unsigned long long timestamp_last_tick;task_t*curr,*idle;struct mm_struct*prev_mm;prio_array_t*active,*expired,arrays2;atomic_t nr_iowait;task_t*migratio
18、n_thread;struct list_head migration_queue;26(2)优先级数组优先级数组v每个运行队列有两个优先级数组,一个每个运行队列有两个优先级数组,一个活跃活跃的的,一个,一个过期的过期的。v优先级数组在优先级数组在kernel/sched.c中定义,是中定义,是prio_array类型的结构体。类型的结构体。v优先级数组是一种能够提供优先级数组是一种能够提供O(1)算法复杂度算法复杂度的数据结构。的数据结构。27prio_array结构体结构体vMAX_PRIO定义定义了系统拥有的优先级个数,默认了系统拥有的优先级个数,默认值是值是140,在,在sched.h
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 现代操作系统 Chapter 现代 操作系统
限制150内