欢迎来到天天文库
浏览记录
ID:20792566
大小:224.50 KB
页数:32页
时间:2018-10-15
《linux内核设计与实现第三章进程管理》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第二章进程管理本章讨论了进程的内核抽象,以及进程如何被创建、销毁和管理。由于操作系统最终目的是让用户运行程序,所以这章是最基础的内容。相关章节第三章进程调度第十五章进程地址空间作业及实验(一)作业:(1)请分析linux执行程序的ELF格式,并描述其加载执行的过程(2)请分析linux进程调度器的接口,设计并实现一个调度算法,并分析其性能。实验:(1)设计一个linux进程调度器进程与线程执行线程,简称线程:是在进程中活动的对象。每个线程都拥有一个独立的程序计数器、进程栈和一组进程寄存器。内核调度的对
2、象是线程,而不是进程。线程模型Linux:线程=进程Windows:线程!=进程进程虚拟机制两种虚拟机制虚拟处理器虚拟内存。虚拟处理器给进程一种假象,让进程觉得自己在独享处理器。虚拟内存让进程在获取和使用内存时觉得自己拥有整个系统的所有内存资源。线程之间(在同一个进程中的线程)可以共享虚拟内存,但拥有各自的虚拟处理器。如何查看进程信息ps–aKill-9PID进程的信息Proc文件系统Proc/PID目录下Pmap内存区域Objdump-x进程树进程树第一个进程Init在Linux系统中,通常调用fo
3、rk()系统调用创建进程该系统调用通过复制一个现有进程来创建一个全新的进程。通常创建新的进程都是为了执行新的、不同的程序,而接着调用exec()这族函数创建新的地址空间,并把新的程序载入。最终程序通过exit()系统调用退出执行。这个函数会终结进程并将其占用的资源释放掉。2.1进程描述符及任务队列内核把进程存放在叫做任务队列(tasklist)的双向循环链表中。链表中的每一项都是类型为task_struct,称为进程描述符(processdescription)的结构,该结构定义在include/li
4、nux/sched.h文件中。进程描述符中包含一个具体进程的所有信息。2.1.1分配进程描述符Linux通过slab分配器分配task_struct结构,这样能达到对象复用和缓存着色的目的。(通过预先分配和重复使用task_struct,可以避免动态分配和释放所带来的资源消耗。)各个进程的task_struct存放在它们内核栈的尾端。从而避免使用额外的寄存器专门记录。所以只需在栈底(对于向下增长的栈)或栈顶(对于向上增长的栈)创建一个新的结构structthread_info。在x86上,struct
5、thread_info在文件中定义如下:structthread_info{structtask_struct*task;structexec_domain*exec_domain;unsignedlongflags;__u32cpu;__s32preempt_count;mm_segment_taddr_limit;u8supervisor_stack[0];};每个任务的thread_info结构在它的内核栈的尾端分配。结构中task域中存放的是指向
6、该任务实际task_struct的指针。内核通过一个唯一的进程标识值(processidentificationvalue)或PID来标识每个进程。PID是一个数,最大值默认设置为32767(shortint短整型的最大值)。它存放在每个进程的进程描述符中。它实际上就是系统中同时存在的进程的最大数目。也可由系统管理员通过修改/proc/sys/kernel/pid_max来提高上限。在内核中,访问任务通常需要获取指向其task_struct指针。通过current宏查找当前正在运行进程的进程描述符的速
7、度就显得尤其重要。它是随着硬件体系结构不同从而它的实现也不同。2.1.2进程描述符的存放#definecurrent(get_current())在x86系统上,current把栈指针的后13个有效位屏蔽掉,用来计算出thread_info的偏移,该操作通过current_thread_info()函数完成。汇编代码如下:movl$-8192,%eaxandl%esp,%eax最后,current在从thread_info的task域中提取并返回task_struct的地址。staticinlines
8、tructtask_struct*get_current(void){returncurrent_thread_info()->task;}2.1.3进程状态进程描述符中的state域描述了进程的当前状态。系统中的每个进程都必然处于五种进程状态中的一种。现存的任务调用fork()函数并且创建一个新进程TASK_INTERRUPTIBLE或TASK_UNINTERRUPTIBLE(等待)TASK_RUNNING(正在运行)TASK_ZOMBIE(任务
此文档下载收益归作者所有