您的位置:首页 > 其它

操作系统及进程基本概念

2018-03-24 10:48 330 查看
操作系统:

管理计算机软硬件资源的系统软件。

进程和程序:

程序:完成特定任务的一系列指令集合

进程:(内存中)从用户角度看,进程是程序的一次动态的执行过程

从内核角度看, 进程是分配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中。



进程队列的全局变量

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息