




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第2章Linux内核——进程管理整理课件本章主要介绍:进程概念进程的组成进程的状态和调度进程间关系中断处理与定时器系统调用进程间通信整理课件1进程概念 20世纪60年代,进程(process)一词首先在麻省理工学院的MULTICS和IBM的CTSS/360系统中被引入。 对进程下个准确定义不容易,但有必要强调一下进程具有的两个重要特性。整理课件1.独立性
进程是系统中独立存在的实体,它可以拥有自己独立的资源,比方文件和设备描述符等。 在没有经过进程本身允许的情况下,其他进程不能访问到这些资源。这一点上和线程有很大的不同。 线程是共享资源的程序实体,创立一个线程所花费的系统开销要比创立一个进程小得多。
一个程序至少有一个进程,一个进程至少有一个线程。线程是进程的一个实体,是CPU调度和分派的根本单位,它是比进程更小的能独立运行的根本单位。线程自己根本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组存放器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。整理课件2.动态性
进程与程序的区别在于,程序只是一个静态的指令集合,而进程是一个正在系统中活动的指令集合。 在进程中参加了时间的概念。进程具有自己的生命周期和各种不同的状态,这些概念在程序中都是不具备的。整理课件 由于以上两个性质,又可以衍生出进程的第三个重要特性,即并发性。 假设干个进程可以在单处理机状态上并发执行。注意并发性(concurrency)和多处理机并行(parallel)是两个不同的概念。整理课件
并行指在同一时刻内,有多条指令在多个处理机上同时执行;
并发指在同一时刻内可能只有一条指令执行,但多个进程的指令被快速轮换执行,使得在宏观上具有多个进程同时执行的效果。整理课件2进程的组成 作为申请系统资源的根本单位,进程必须有一个对应的物理内存空间。 而对这样的一块空间,首先要用数据结构进行描述,才能进一步对之进行管理。整理课件 在Linux中,进程以进程号PID(processID)作为标识。 任何对进程进行的操作都要给予其相应的PID号。 每个进程都属于一个用户,进程要配备其所属的用户编号UID。 此外,每个进程都属于多个用户组,所以进程还要配备其归属的用户组编号GID的数组整理课件 UID和GID都分4种,UID包括uid,euid,suid和fsuid, GID包括gid,egid,sgid和fsgid。 一般来说 uid=euid=fsuid, gid=egid=fsgid。整理课件进程标识:uid和gid是运行进程的用户标识和用户组标识。euid和egid又称为有效的uid和gid。出于系统平安权限的考虑,运行程序时要检查euid和egid的合法性。通常,uid等于euid,gid等于egid。有时候,系统会赋予一般用户暂时拥有root的uid和gid〔作为用户进程的euid和egid〕,以便于进行运作。suid和sgid是根据POSIX标准引入的,在系统调用改变uid和gid时,用于保存真正的uid和gid。fsuid和fsgid称为文件系统的uid和gid,用于对文件系统操作时的合法性检查,是LINUX独特的标识类型。它们一般分别和euid和egid一致,但在NFS文件系统中NFS效劳器需要作为一个特殊的进程访问文件,这时只修改客户进程的fsuid和fsgid。整理课件 进程运行的环境称为进程上下文(context)。 Linux中进程的上下文由进程控制块PCB(processcontrolblock)、正文段(textsegment)、数据段(datasegment)以及用户堆栈(stack)组成。 其中:
正文段存放该进程的可执行代码;
数据段存放进程中静态产生的数据结构;
PCB包括进程的编号、状态、优先级以及正文段和数据段中数据分布的大概情况。整理课件 —个称做进程表(processtable)的链表结构将系统中所有的PCB块联系起来,如图2-1所示。整理课件图2-1进程的数据结构整理课件 Linux源代码中也将进程称作任务(Task),Linux上的所有进程都是由task_struct结构体来管理。生成一个进程时会产生一个task_struct结构体,此后通过task_struct结构来管理进程。当然文件也是通过task_struct结构来管理。 Linux中的PCB块又称为task_struct结构,在2.4版本内核中,每个task_struct占1680个字节。 Linux根据系统物理内存的大小限制已翻开进程的总数目。整理课件 系统每次访问一个进程时,内核根据PID在进程表中查找相应的进程PCB块(具体查找过程通过一个PID的hash表实现),再通过PCB块找到其对应的代码段与数据段,并进行操作。整理课件3进程的状态和调度整理课件Linux系统信号 信号主要用于通知进程异步事件的发生。在Linux中可以识别29种不同的信号,这些信号中的大局部都有了预先定义好的意义, 进程可以显式的用kill或killpg系统调用来向另一个进程发信号。整理课件 进程可以通过提供信号处理函数来取代对于任意信号的缺省反响,这种缺省反响一般都是终止进程。 信号发生时,内核中断当前的进程,进程执行处理函数来响应信号,结束后恢复正常的进程处理。 信号有自己的名称和特定的编号,见表3-1所示。整理课件3-1Linux系统信号整理课件进程状态 进程是一个动态的实体,故而它是有生命的。 从创立到消亡,是一个进程的整个生命周期。 在这个周期中,进程可能会经历各种不同的状态。 一般来说,所有进程都要经历以下3种状态。整理课件◆就绪(ready)态: 指进程已经获得所有所需的其他资源,并正在申请处理机资源,准备开始运行。 这种情况下,称进程处于就绪态。整理课件◆阻塞(blocked)态: 指进程因为需要等待所需资源而放弃处理机,或者进程本不拥有处理机,且其他资源也没有满足,从而即使得到处理机资源也不能开始运行。 这种情况下,称进程处于阻塞态。阻塞状态又称休眠状态或者等待状态。整理课件◆运行态: 进程得到了处理机,并不需要等待其他任何资源,正在执行的状态,称之为运行态。 只有在运行态时,进程才可以使用所申请到的资源。整理课件内核以此感知进程的存在财产登记卡,记录着进程所占用的各项资源Task_struct数据结构整理课件进程结构task_struct数据结构进程标志符PID进程所占的内存区域相关文件的文件描述符平安信息进程环境信号处理资源安排同步处理进程状态include/Linux/sched.h整理课件task_struct(include/linux/sch.h)整理课件进程的地址空间task_struct中有structmm_struct*mm;内存描述符mm_struct里面有一个字段mmp指向内存线形区链表的首部。整理课件进程的状态task_struct中的state表示进程当前的状态Linux中的进程主要有5个状态:(include/linux/sched.h)#defineTASK_RUNNING 0#defineTASK_INTERRUPTIBLE 1//等待资源#defineTASK_UNINTERRUPTIBLE 2#defineTASK_STOPPED 4//等待信号#defineTASK_ZOMBIE 8整理课件图2-2Linux进程状态转换整理课件◆RUNNING: 正在运行,或者在就绪队列中等待运行的进程。 也就是上面提到的运行态和就绪态进程的综合。 一个进程处于RUNNING状态,并不代表它一定在被执行。整理课件 由于在多任务系统中,各个就绪进程需要并发执行,所以在某个特定时刻,这些处于RUNNING状态的进程之中,只有一个能够得到处理机,而其他进程必须在一个就绪队列中等待。 即使是在多处理机的系统中,Linux也只能同时让一个处理机执行任务。整理课件◆UNINTERRUPTABLE: 不可中断阻塞状态。 处于这种状态的进程正在等待队列中,当资源有效时,可由操作系统进行唤醒,否那么,将一直处于等待状态。整理课件 ◆INTERRUPTABLE: 可中断阻塞状态。 与不可中断阻塞状态一样,处于这种状态的进程也在等待队列中,当资源有效时,可以由操作系统进行唤醒。 与不可中断阻塞状态有所不同的是,处于此状态中的进程亦可被其他进程的信号和定时中断唤醒。整理课件◆STOPPED: 挂起状态。 进程被暂停,需要通过其他进程的信号才能被唤醒。 导致这种状态的原因有两种。 其一是受到了相关信号(SIGSTOP、SIGSTP、SIGTTIN或SIGTTOU)的反响; 其二是受到父进程ptrace调用的控制,而暂时将处理机交给控制进程。整理课件◆ZOMBIE: 僵尸状态。 表示进程结束但尚未消亡的一种状态。 此时进程已经结束运行并释放大局部资源,但尚未释放进程控制块。整理课件进程调度 调度程序(scheduler)用来实现进程状态之间的转换。 在Linux中,调度程序由系统调用schedule()来完成。
schedule()是一个怪异的函数,它与一般C语言函数不同,因为它的调用和返回不在同一个进程中。整理课件 用户进程由fork()系统调用实现。用户进程由do_fork()函数创立,它也是fork系统调用的执行者。 fork()创立一个新的进程,继承父进程的现有资源,初始化进程时钟、信号、时间等数据。 完成子进程初始化后,父进程将它挂到就绪队列,返回子进程的PID。整理课件 进程创立时的状态为UNINTERRUPTIBLE,在fork()结束前被父进程唤醒后,变为RUNNING。 处于RUNNING状态的进程被移到就绪队列中,在适当时候由schedule()按处理机调度算法选中,获得处理机。整理课件 获得处理机而正在运行的进程假设申请不到某个资源,那么调用sleep()进行休眠,其PCB挂到相应的等待队列,状态变为 UNINTERRUPTIBLE或者 INTERRUPTIBLE。 sleep()将调用schedule()函数把休眠进程释放的处理机分配给就绪队列中的某个进程.整理课件 状态为INTERRUPTIBLE的休眠进程当它申请的资源有效时被唤醒,也可以由信号或定时中断唤醒。 而状态为UNINTERRUPTIBLE的休眠进程只有当它申请的资源有效时被唤醒,不能被信号和定时中断唤醒。 唤醒后,进程状态改为RUNNING,并进入就绪队列。整理课件 进程执行系统调用exit()或收到外部的杀死进程信号SIG_KILL时,进程状态变为ZOMBIE,释放所申请资源。 同时启动schedule()把处理机分配给就绪队列中其他进程。整理课件 假设进程通过系统调用设置了跟踪标志位,那么在系统调用返回前,进入跟踪状态,进程状态变为STOPPED,处理机分配给就绪队列中其他进程。 只有通过其他进程发送SIG_KILL信号或继续信号SIG_CONT,才能把STOPPED进程唤醒。重新进入就绪队列。整理课件 对每一个进程,其PCB块中都可以记录一种调度策略。 进程调度算法可采用先进先出算法(FIFO)或轮转法(round-robin),有实时(这里的“实时〞,只是一种说法。实际上,未经改造的Linux很难实现“实时〞)和非实时两种形式。整理课件 假设采用Linux的轮转法,当时间片到时(10ms的整数倍),由时钟中断触发,引起新一轮调度,把当前进程挂到就绪队列队尾。 在schedule()中有一个goodness()函数,可以用来保证实时的进程可以得到优先调用。 然而这只是在调用上优先,事实上在内核态下,实时进程并不能对普通进程进行抢占。 所以Linux中的实时并不是真正意义上的实时。整理课件4进程间关系 Linux中除了0号进程是启动时由系统创立,其余进程都是由其他进程自行创立的。 为了表示这种创立关系,用父进程指代缔造者,用子进程指代被创立出的新进程。 如果进程A是进程B的间接父进程,那么A称做B的祖先,B为A的后代。 既然提到了父子关系,那么这两个进程之间自然是有着如同父子一样的继承性。整理课件进程的“宗族〞关系树型组织task_struct中的structtask_struct*p_pptr,*p_cptr,*p_ysptr,*p_osptr;p_pptr:parent(父进程)p_cptr:child(指向自己最年轻、最新的子进程)p_ysptr:指向比自己年轻的兄弟进程p_osptr:指向比自己老的兄弟进程整理课件 在数据结构上,父进程PCB中的指针p_cptr指向最近创立的一个子进程的PCB块,而每个子进程PCB中的指针p_pptr都指向其父进程的PCB块。 这一对指针构成了进程的父子关系,如图2-3所示。整理课件p_osptr父进程子进程最老的子进程最新的子进程p_pptrp_pptrp_pptrp_cptrp_osptrp_ysptrp_ysptr图2-3父子进程关系除了最老的子进程外,每个子进程PCB块中的p_osptr指针都指向其父进程创立的上一个子进程PCB。除了最新的子进程外,每个子进程PCB块中的p_ysptr都指向其父进程所创立的后一个子进程PCB。同一个父亲的子进程们就按“年龄〞顺序构成了一个双向链表。父进程那么可以通过其p_cptr指针,从最新创立的子进程开始,依次访问到其每一个子进程。整理课件task[]数组〔实际是双向链表指针〕包含指向系统中所有task_struct结构的指针数组大小限制了系统中的进程数目将所有任务串连起来Pidhash表通过pid查找进程时,利用hash快速定位双向指针run_list动态的将任务链入prio_array中的某个优先级队列中整理课件current指针当前运行的进程的结构用current指针表示init进程系统初始化后,建立的第一个进程第一个task_struct:INIT_TASK整理课件 系统启动时,内核被加载到内存后,由start_kernel函数(完成内核初始化工作)从无到有地自行创立了一个内核进程,叫做0号进程,其所运行的代码是init_task()函数,在很多链表中起表头的作用。只有当没有其他进程处于可运行状态时,调度程序才选择0号进程。 该进程的作用是作为一切其他进程的父进程,就像亚当夏娃是一切人类的祖先那样。 0号进程不能自动生成,必须手工将其设置到进程表中去,才能启动进程管理机制。整理课件 在启动进程管理机制以后,就可以由进程自行创立新的子进程。 创立新进程的调用是fork()。fork一词在英文中是“分叉〞的意思。 同样,在Linux中,fork()调用也起了一个“分叉〞的作用。 当进程A调用fork()生成进程B时,fork()函数同时在A和B两个进程中返回。 其中,父进程A里的fork()返回了子进程的PID,而子进程B里的fork()返回0。如果出现错误,fork()返回一具负值。整理课件 然而,fork()函数究竟做了些什么呢? 我们发现,经过fork()以后,父进程和子进程拥有相同内容的代码段、数据段和用户堆栈,就像父进程把自己克隆了一遍。 事实上,父进程只复制了自己的PCB块,而代码段、数据段、用户堆栈内存空间并没有复制一份,而是与子进程共享.fork函数演示见文件fork.swf整理课件从概念上讲,fork()就像细胞的裂变,调用fork()的进程就是父进程,而新裂变出的进程就是子进程。新创立的进程与父进程几乎完全相同,只有少量属性必须不同。例,每个进程的PID必须是唯一的。调用fork()后,子进程被创立,此时父进程和子进程都从这个系统调用内部继续运行。为了区分父/子进程,fork()给两个进程返回不同的值。对父进程,fork()返回新创立子进程的进程标识符〔PID〕,而对子进程,fork()返回值0。整理课件 只有当子进程在运行中出现写操作时,才会产生中断,并为子进程分配内存空间。 由于父进程的PCB和子进程的一样,所以在PCB中所记录的父进程占有的资源,也是与子进程共享使用的。 这里的“共享〞一词就意味着“竞争〞。整理课件 有时候为了防止父进程和子进程竞争相同的资源或者出于代码串行性考虑,我们希望父进程可以等待子进程运行结束后再继续执行。 调用vfork()可以使在子进程创立后,随即向父进程发送SIG_STOP信号,使父进程进入挂起状态,直到子进程发送信号表示其已经结束为止。整理课件 如果系统中只提供fork()调用,那么整个操作系统的所有进程就都只能运行同一个程序了,因为其代码段都是复制或者共享的。 Linux为了创立进程运行新的程序,采用fork+exec方法。 execve()支持在新的进程创立后,动态装入新的可执行文件作为自己新的代码段。 并且execve()支持多种可执行文件的格式。整理课件5进程间通讯 用户态进程间处于并发状态。 为了协调进程的运行,需要实现进程之间通信的机制。整理课件在Linux中,进程间通信有以下几种方法:1.管道机制 该机制最适用于解决生产者――消费者问题。 管道是一种在进程之间单向流动数据的结构。 源进程向管道写数据,而内核会自动将这些数据引导向目标进程。 在POSIX标准中,管道必须是单向的。整理课件 虽然通过pipe()调用会产生两个描述符(写管道和读管道),但是在写之前必须关闭读管道,反之亦然。 而在Linux中,使用一个管道的同时还可以使用另一个管道,这就大大增强了管道使用的简便性。整理课件2.先进先出(FIFO)机制 管道机制的最大缺点是不能由多个进程共享,除非此管道为这些进程共同的祖先所创立。 为了解决这个问题,Linux中引入了FIFO机制(又称为namedpipe,命名管道)。整理课件 FIFO为“firstin,firstout〞的简写,指一个在磁盘上的文件,它可以被所有进程所共享。 但是FIFO与一般文件不同,它还使用了内核中的缓冲区,所以在效率上要比一般共享文件快得多。 FIFO和管道都可以使用read()和write()调用来进行读写操作。整理课件3.IPC机制 IPC是“interprocesscommunication〞的缩写形式。 它包含了一系列系统调用,允许用户态进程通过信号量进行同步,向其他进程发消息,并且可以与其他进程共享一块内存空间. IPC首先是在一个叫做“ColumbusUnix〞的系统中实现的,其后在现代Unix类操作系统中广为流行。整理课件 如上文所述,IPC资源包括信号量,消息队列和共享内存几种。整理课件(1)消息队列 消息队列是由内核创立并维护的一个数据结构,它是有标识的。 任何具有足够权限的进程都可以向消息队列中放置一个消息,同样,任何具有足够权限的进程都可以从中读取一个消息。 这样,不同的进程通过访问相同的消息队列便可实现进程间通信。整理课件(2)共享内存 共享内存区是这几种进程间通信方式中最快的一种。 它的特点除了速度快外,而且可传递的信息量大。 它是通过将一段内存区映射到一个进程的地址空间来实现。
整理课件 因此,这种进程间通信就不再涉及到内核(即进程不是通过执行任何进入内核的系统调用来传递数据的。 这样,内核必须建立允许各个进程共享该内存区的内存映射关系,然后一直管理该内存区)。 但同时,也要有效地保证它能同步、有序且没有死锁。整理课件用共享内存实现过程如下:
①效劳器取得访问该共享内存区的权限。②效劳器从输入文件读取数据到该共享内存区。③效劳器读入数据完毕时,通知用户进程。④用户从该共享内存区读出这些数据并输出。整理课件(3)信号量 信号量并不是一种IPC
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 45228-2025信息技术生物特征识别产品适老化通用要求
- GB/T 1634.1-2025塑料负荷变形温度的测定第1部分:通用试验方法
- 顶管电缆施工方案
- 荣杨线施工方案
- 旋转装饰幕墙施工方案
- 安丘路沿石施工方案
- TSHJMRH 0065-2024 北斗卫星与光纤罗经组合导航系统技术规范
- TSHAEPI 015-2024 海洋倾倒在线监控设备技术要求及测试方法
- 二零二五年度解除劳动合同通知书及员工离职培训费用补偿合同
- 2025年度新能源车充电设施建设合同终止函模板
- 各类应急风险预案的防范
- 基于义务教育质量监测结果的德育改进对策研究
- 开展我为同学办实事活动
- 幼儿园大班健康《硬硬的壳香香的肉》课件
- 医科大学2024年12月五官科护理学作业考核试题答卷
- 火锅店新产品研发方案
- GB/T 44569.1-2024土工合成材料内部节点强度的测定第1部分:土工格室
- 2024年基金应知应会考试题库
- 2024年河北省公务员录用考试《行测》试题及答案解析
- 科学四年级下册第一单元第4课《车来了》课件
- 膝关节穿刺术课件
评论
0/150
提交评论