1、请您根据本课程所学内容总结梳理出一个精简的Linux系统概念模型,最大程度统摄整顿本课程及相关的知识信息,模型应该是逻辑上可以运转的、自洽的,并举例某一两个具体例子(比如读写文件、分配内存、使用I/O驱动某个硬件等)纳入模型中验证模型。
2、然后将一个应用程序放入该系统模型中系统性的梳理影响应用程序性能表现的因素,并说明原因。
3、产出要求是发表一篇博客文章,长度不限,1要简略,2是重点,只谈自己的思考和梳理,严禁引用任何资料(包括本课程的资料)造成文章虚长。
SA20225205 黄兴宇
1 Linux系统模型简述Linux模型的主要模块分以下几个部分:存储管理、进程管理、文件系统、中断、系统调用等。Linux的各个模块之间相互依赖,共同完成操作系统的各项基本的功能和对系统的管理工作,对底层来说,与硬件交互管理所有的硬件资源;对上层来说,为用户程序(应用程序)提供一个良好的执行环境。Linux的整体架构如下图。内核向上为用户提供系统调用接口,向下调用硬件服务接口。其自身实现了上文提到的进程管理等功能,在内核外和提供了如shell、编译器、解释器、库函数等基础设施。
1.1 进程管理 1.1.1 进程的描述
在Linux中每一个进程都由task_struct数据结构来定义,就是通常说的PCB,它是进程存在的标志。当我们调用fork()时,系统会为我们产生一个task_struct结构。然后从父进程那里继承一些数据,并把新的进程插入到进程树中,以待进行进程管理。以往各个进程的task_struct存放在它们内核栈的尾端,由于现在使用了slab分配器动态生成task_struct,所以只需要在栈底创建一个thread_info,该结构体中task指针指向的就是task_struct进程描述符。
实际的task_struct约有1.7KB大小,包含以下信息:
1、进程标识PID
2、进程的状态:有TASK_RUNNING(正在运行或正在等待)、TASK_INTERRUPTIBLE(被阻塞且可中断)、TASK_UNINTERRUPTIBLE(被阻塞且不可中断)、TASK_STOPPED(停止)、TASK_ZOMBIE(僵死,进程终止但资源未回收)、TASK_DEAD(父进程wait()系统调用回收子进程全部资源)、TASK_SWAPPING(换入换出)等。
3、调度信息和策略
3、进程的通信状况IPC
4、因为要插入进程树,要有指向父子兄弟的指针
5、时间信息:计算好执行的之间,以便CPU进程调度
6、占有的资源:如打开的文件
7、进程上下文和内核上下文
8、处理器上下文
9、内存信息
1.1.2 进程的创建init_task为第一个进程(0号进程)的进程描述符结构体变量,他的初始化是通过硬编码方式固定下来的。除此之外,所有其他的进程初始化都是通过fork()系统调复制父进程的方式初始化的(Linux使用clone()系统调用实现的fork())。这里新建一个子进程的主要工作就是新建一个PCB,当然需要修改必要的信息,还要有自己的数据空间和用户堆栈等。
也就是说,在fork()函数之前需要确认内核中有足够的资源来完成。如果资源满足要求,则内核slab分配器在相应的缓冲区中构造子进程的进程控制块,并将父进程控制块中的全部成员都复制到子进程的控制块,然后再把子进程控制块必须的私有数据改成子进程的数据。当fork()返回到用户空间之前,向子进程的内核栈中压入返回值0,而向父进程内核堆栈压入子进程的pid。最后进行一次进程调度,决定是运行子进程还是父进程。