操作系统:
管理计算机软硬件资源的系统软件。
进程和程序:
程序:完成特定任务的一系列指令集合
进程:(内存中)从用户角度看,进程是程序的一次动态的执行过程
从内核角度看, 进程是分配CPU,内存等系统资源的基本单位,每一个进程都有自己独立的地址空间和运行状态
1.进程是系统分配资源的最小单位
2.进程是程序的一次动态的执行过程,需要对进程的现场信息进行维护,就需要相应的数据结构,对应着C语言的结构体。这个结构体叫PCB(Process Control Block);
进程和程序的区别:
1.程序是永久的, 进程相对短暂
2.程序是静态的, 进程是动态的
3.进程右PCB, 程序没有
4.一个进程只能对应一个程序,一个程序可以对应多个进程
进程控制块(PCB):
PCB是操作系统感知进程存在的数据结构,操作系统中维护一个PCB表,用来标识当前系统有多少个进程。
程序 = 代码 + 数据;
进程 = 代码 + 数据 + 堆栈 + PCB;
MMU:(Memory Management Unit)即内存管理单元:内存映射,权限管理
内核空间映射到内存的同一块空间
用户空间映射到内存时,映射到不同的空间
Linux下的PCB都包含哪些信息:
1.标识号
2.现场保护
3.资源信息
4.虚拟内存
5.文件
6.I/O设备
7.终端
8.拥有者
9.计时
10.进程间通信
11.进程状态
12.信号
Linux下的PCB(进程控制块)——task_struct结构体中的各个字段的含义:
Linux内核通过一个被称为进程描述符的task_struct结构体来管理进程,
task_struct是Linux中的【进程控制块PCB结构】的具体数据结构。
task_struct:是Linux内核的一种数据结构。它放在RAM(运行内存)里并包含着进程的信息。每个进程都把自己的信息放在task_struct数据结构里。
调度数据成员:
volatile long states;
表示进程的当前状态:
TASK_RUNNING:正在运行或在就绪队列run-queue中准备运行的进程,实际参与进程调度。
TASK_INTERRUPTIBLE:处于等待队列中的进程,待资源有效时唤醒,也可由其它进程通过信号(signal)或定时中断唤醒后进入就绪队列run-queue。
TASK_UNINTERRUPTIBLE:处于等待队列中的进程,待资源有效时唤醒,不可由其它进程通过信号(signal)或定时中断唤醒。
TASK_ZOMBIE:表示进程结束但尚未消亡的一种状态(僵死状态)。此时,进程已经结束运行且释放大部分资源,但尚未释放进程控制块。
TASK_STOPPED:进程被暂停,通过其它进程的信号才能唤醒。导致这种状态的原因有二,或者是对收到SIGSTOP、SIGSTP、SIGTTIN或SIGTTOU信号的反应,或者是受其它进程的ptrace系统调用的控制而暂时将CPU交给控制进程。
TASK_SWAPPING: 进程页面被交换出内存的进程。
unsigned long flags;
进程标志:
PF_ALIGNWARN 打印“对齐”警告信息。
PF_PTRACED 被ptrace系统调用监控。
PF_TRACESYS 正在跟踪。
PF_FORKNOEXEC 进程刚创建,但还没执行。
PF_SUPERPRIV 超级用户特权。
PF_DUMPCORE dumped core。
PF_SIGNALED 进程被信号(signal)杀出。
PF_STARTING 进程正被创建。
PF_EXITING 进程开始关闭。
PF_USEDFPU 该进程使用FPU(SMP only)。
PF_DTRACE delayed trace (used on m68k)。
信号处理
进程队列指针
进程标识
时间数据成员
进程上下文环境
页面管理
支持对称多处理器方式(SMP)时的数据成员
其它数据成员
信号量数据成员
(1) struct sem_undo *semundo;
进 程每操作一次信号量,都生成一个对此次操作的undo操作,它由sem_undo结构描述。这些属于同一进程的undo操作组成的链表就由semundo 属性指示。当进程异常终止时,系统会调用undo操作。sem_undo的成员semadj指向一个数据数组,表示各次undo的量。结构定义在 include/linux/sem.h。
(2) struct sem_queue *semsleeping;
每一信号量集合对应一 个sem_queue等待队列(见include/linux/sem.h)。进程因操作该信号量集合而阻塞时,它被挂到semsleeping指示的关 于该信号量集合的sem_queue队列。反过来,semsleeping。sleeper指向该进程的PCB。
文件系统数据成员
(1) struct fs_struct *fs;
fs 保存了进程本身与VFS的关系消息,其中root指向根目录结点,pwd指向当前目录结点,umask给出新建文件的访问模式(可由系统调用umask更 改),count是Linux保留的属性,如下页图所示。结构定义在include/linux/sched.h中。
(2) struct files_struct *files;
files包含了进程当前所打开的文件(struct file *fd[NR_OPEN])。在Linux中,一个进程最多只能同时打开NR_OPEN个文件。而且,前三项分别预先设置为标准输入、标准输出和出错消息输出文件。
(3) int link_count;
文件链(link)的数目。
内存数据成员:
struct mm_struct *mm;
在linux 中,采用按需分页的策略解决进程的内存需求。task_struct的数据成员mm指向关于存储管理的mm_struct结构。其中包含了一个虚存队列 mmap,指向由若干vm_area_struct描述的虚存块。同时,为了加快访问速度,mm中的mmap_avl维护了一个AVL树。在树中,所有的 vm_area_struct虚存块均由左指针指向相邻的低虚存块,右指针指向相邻的高虚存块。 结构定义在include/linux/sched.h中。
进程队列的全局变量