一、概念
1、操作系统的职能:进程管理、内存管理、设备管理、文件管理 。
操作系统对用户提供操作和接口。
二、进程的概念:
我们知道操作系统最核心的概念就是进程。其实进程简单来说就是在操作系统中运行的程序,它是操作系统资源管理的最小单位。但是进程是一个动态的实体,它是程序的一次执行过程。进程和程序的区别在于:进程是动态的,程序是静态的,进程是运行中的程序,而程序是一些保存在硬盘上的可执行代码。
在Linux下面,可以通过命令ps或pstree查看当前系统中的进程。
三、Linux进程结构:
可由三部分组成:代码段、数据段、堆栈段。也就是程序、数据、进程控制块PCB(Process Control Block)组成。进程控制块是进程存在的惟一标识,系统通过PCB的存在而感知进程的存在。
代码段存放程序的可执行代码。数据段存放程序的全局变量、常量、静态变量。堆栈段中的堆用于存放动态分配的内存变量,堆栈段中的栈用于函数调用,它存放着函数的参数、函数内部定义的局部变量。
系统通过PCB对进程进行管理和调度。PCB包括创建进程、执行程序、退出进程以及改变进程的优先级等。而进程中的PCB用一个名为task_struct的结构体来表示,定义在include/linux/sched.h中,每当创建一新进程时,便在内存中申请一个空的task_struct结构,填入所需信息,同时,指向该结构的指针也被加入到task数组中,所有进程控制块都存储在task[]数组中。
四、一般情况下Linux下C程序的生成可分为4个阶段:
预编译、编译、汇编、链接。编译器gcc经过预编译、编译、汇编3个步骤将源程序文件转换为目标文件。如果程序有多个目标文件或者程序使用了库函数,编译器还要将所有的目标文件或所需要的库链接起来,最后形成可执行程序。当程序执行时,操作系统将可执行程序复制到内存中。
五、进程的内存映像(可执行程序的地址空间——就是上课画的那个图)
指内核在内存中如何存放可执行程序文件。在将程序转换为进程的过程中,操作系统将可执行程序由硬盘复制到内存中。
程序的内存映像一般布局为:从低地址到髙地址一次为:
1、代码段:即二进制机器代码,代码段是只读的,可被多个进程共享,如果一个进程创建了一个子进程,父子进程共享代码段,此外子进程还获得父进程数据段、堆、栈的复制。
2、初始化数据段:存储已被初始化的变量,包括全局变量和已被初始化的静态变量。
3、未被初始化数据段:存储未被初始化的静态变量,它也被称为bss段。
4、堆:用于存放程序运行中动态分配的变量。
5、栈:用于函数调用,保存函数的返回地址、函数参数、函数内部定义的局部变量。
6、另外髙地址还存储了命令行参数和环境变量
可执行程序和内存映像的区别在于:可执行程序位于磁盘中而内存映像位于内存中,可执行程序没有堆栈,因为程序被加载到内存中才会分配堆栈,可执行程序虽然也有未初始化数据段但它并不被存储在位于硬盘中的可执行文件中,可执行程序是动态的、不变的,而内存映像随着程序的执行时在动态变化的,例如,数据段随着程序的执行要存储新的变量值,栈在函数调用时也是不断在变化的