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