操作系统及进程基本概念

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/bian_cheng_ru_men/article/details/79675168

操作系统:

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

进程和程序:
程序:完成特定任务的一系列指令集合
进程:(内存中)从用户角度看,进程是程序的一次动态的执行过程
              从内核角度看, 进程是分配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中。 

进程队列的全局变量 


没有更多推荐了,返回首页