linux 进程(一)---基本概念

一、进程的定义

        进程是操作系统的概念,每当我们执行一个程序时,对于操作系统来讲就创建了一个进程,在这个过程中,伴随着资源的分配和释放。可以认为进程是一个程序的一次执行过程。

 

二、进程与程序的区别

    

    程序时静态的,它是一些保存 在磁盘上得指令的有序集合,没有任何执行的概念。

    进程是一个动态的概念,它是程序执行的过程,包括创建、调度和消亡。

 

三、linux系统中进程的表示

 

    在linux系统中,进程由一个叫task_struct的结构体描述,也就是说linux中的每个进程对应一个task_struct结构体。该结构体记录了进程的一切。下面我们来看看它的核心字段。

 

struct task_struct

{

 

    //这个是进程的运行状态,-1代表不可运行,0代表可运行,>0代表已经停止。

    volatile long state;

 

    /*

        flags是进程当前的状态标志,具体如下:

 

        0x0000 0002表示进程正在被创建

 

        0x0000  0004表示进程正准备退出

 

        0x0000  0040表示此进程被fork出,但是并没有执行exec

 

        0x0000   0400表示此进程由于其他进程发送相关信号而被杀死

    */

    unsigned int flags;

 

    //表示此进程的运行优先级

    unsigned     int   rt_priority;

 

    //该结构体记录了进程内存使用的相关情况

    struct   mm_struct *mm;

 

    //进程号,是进程的唯一标识

    pid_t   pid;

 

    //进程组号

    pid_t  tgid;

 

    //real_parent是该进程的"亲生父亲",不管其是否被"寄养"

    struct  task_struct  *real_parent;

 

    //parent是该进程现在的父进程,有可能是"继父"

    struct   task_struct  *parent;

 

    //这里children指的是该进程孩子的链表,可以得到所有孩子的进程描述符

    struct   list_head    children;

 

    //同理,sibling该进程兄弟的链表,也就是其父进程的所有孩子的链表

    struct    list_head    sibling;

 

    //这个是主线程的进程描述符,也许你会奇怪,为什么线程用进程描叙符表示,因为linux并没有单独实现线程的相关结构体,只用一            个进程来代替线程,然后对其做一些特殊的处理。

    struct   task_struct  *group_leader;

 

    //这个是该进程所有线程的链表

    struct   list_head   thread_group;

 

    //这个是该进程使用cpu时间的信息,utime是在用户态下执行的时间,stime 是在内核态下执行的时间

    cputime_t   utime,stime;

 

    //comm是保存该进程名字的字符数组,长度最长为15,因为TASK_COMM_LEN为16

    char   comm[TASK_COMM_LEN];

 

    //打开的文件相关信息结构体

    struct  files_struct  *files;

 

 

 

    //信号相关信息的句柄

    struct   signal_struct  *signal;

    struct   sigband_struct  *sighand;

 

};

 

    task_struct结构体非常庞大,我们没必要去了解它的所有字段,只需要对其中比较重要的字段加以关注就可以了。从上面的分析可以看出,一个进程至少有一下东东

 

1. 进程号(pid),就像我们的身份证ID一样,每个人的都不一样。进程ID也是,是其唯一标示。

 

2.进程的状态,标识进程是处于运行态,等待态,停止态,还是死亡态

 

A.运行态:此时进程 或者正在运行,或者准备运行

 

B.等待态:此时进程在等待一个事件发生或某种系统资源

 

C.停止态:此时进程被终止

 

D.死亡态:这是一个已终止的进程,但还在进程向量数组中,占有一个task_struct结构。

 

3.进程的优先级和时间片。不同有优先的进程,被调度运行的次序不一样,一般是高优先级的进程先运行。时间片标识一个进程将被处理器运行的时间

 

4.虚拟内存    大多数进程有一些虚拟内存(内核线程和守护进程没有) ,并且Linux必须跟踪内存如何映射到系统物理内存。

 

5.处理器相关上下文      一个进程可以被认为是系统当前状态的总和。每当一个进程运行时,它要使用处理器的寄存器、栈等,这是进程的上下文(context)。并且,每当一个进程被暂停时,所有的CPU相关上下文必须保存在该进程的task_struct中。当进程被调度器重新启动时其上下文将从这里恢复。

 

 

四、linux进程中的文件

 

linux操作系统中每个进程有两个数据结构描叙文件相关信息。

第一个:fs_struct,它包含此进程当前工作目录和根目录、umask。umask是新文件被 创建的缺省模式,它可以通过系统调用来改变。

 

第二个:files_struct,包含此进程正在使用的所有文件的信息。f_mode字段描述该文件是以什么模式创建的:只读、读写、还是只写。f_pos保存文件中下一个读或写将发生的位置。f_inode描叙文件的VFS索引节点,而f_ops是一个例程向量的指针,每个代表一个想施加于文件的操作的函数。

 

    每次一个文件被打开时,files_struct中的空闲file指针之一就被用来指向新的file结构。Linux进程在启动时有三个文件描叙符被打开了,他们是标准输入设备、标准输出设备和标准错误设备,并且通常是从创建此进程的父进程继承得来的。所有对文件的访问时通过传递或返回文件描叙符的标准系统调用进行的。这些描述符是进程fd向量的索引,所以标准输入设备、标准输出设备和标准错误设备分别对应文件描述符0、1和2。

 

五、进程中的虚拟内存

 

    在Linux操作系统中,当我们运行一个二级制可执行文件时,操作系统将创建一个进程。此时如果将这个可执行二进制文件的全部代码和数据装入物理内存将是浪费的。因为他们不可能同时使用。随着系统中进程数的增多,这种浪费将被成倍的扩大,系统将非常低效地运行。事实上,linux使用一种称为请求调页(demand-paging)的技术:只有当进程要使用时其虚拟内存时,其对应的数据才装入物理内存。所以,不是直接把代码和数据装入物理内存。linux内核只修改进程的页表,标识虚拟内存页存在但其对应的数据不在内存中。当进程想要访问代码或数据时,系统硬件将产生页故障并把控制交给Linux内核来解决。因此,对于进程地址空间中的每一个内存区,Linux都需要知道该虚拟内存来自何处,以及如何把它装入内存以解决故障。

    

    当一个进程分配虚拟内存时,Linux并不真正为它保留物理内存。它只是创建一个新vm_area_struct数据结构来描叙虚拟内存,这个结构被链入进程的虚拟内存列表。当进程试图写一个位于新分配虚拟内存区域的虚拟地址时,系统将产生页故障。处理器试图转换该虚拟地址,但是因为没有此内存的页表项,它将放弃并产生一个页故障异常,留给Linux内核来解决。Linux查看被引用的虚拟地址是否是位于当前进程的虚拟内存地址空间。如果是Linux创建适当的PTE并为此进程分配一页物理内存。代码或数据可能需要从文件系统或交换硬盘上读入物理内存。然后进程可以从引起页故障的那条指令处重启,并且因为这次内存物理地址存在,所以它可以继续执行。如果不是,就是大家常常见到的"段错误"。

 

    呵呵,更纤细的介绍请看linux 进程地址空间的一步步探究。

 

from:http://blog.chinaunix.net/uid-26833883-id-3193588.html

时间: 2024-11-18 07:11:07

linux 进程(一)---基本概念的相关文章

linux进程的基本概念

学习操作系统已经有两年了,惭愧的是至今没有好好复习一下课本上关于进程这一章节的内容,以至于到现在很多概念性的东西,很多深层次的东西理解起来总是不通顺,所以我决定花自己一个下午的时间,好好把这一章节整理出来,给自己总结一下,也供自己以后回顾,也希望各位童鞋能给我些指导,让我有更深层次的理解. 1.进程的特征与状态 首先明确第一个问题,进程与程序的区别: 1 进程是一个动态的概念,进程的实质是程序的一次执行过程,动态性是进程的基本特征,同时进程是有一定的生命期的:而程序只是一组有序指令的集合,本身并

Linux进程和线程的基础与管理

  一.进程的基本概念 程序是为了完成某种任务而设计的软件,比如vi是程序.什么是进程呢? 进程就是运行中的程序.一个运行着程序,可能有多个进程.比如Web服务器是Apache服务器,当管理员启动服务后,可能会有好多人来访问,也就是说许多用户同时请求httpd,Apache服务器将会创建多个httpd进程来对其进行服务. 首先我们看看进程的定义.进程是一个具有独立功能的程序关于某个数据集合的一次可以并发执行的运行活动,是处于活动状态的计算机程序.进程作为构成系统的基本细胞,不仅是系统内部独立运行

Linux进程ID号--Linux进程的管理与调度(三)

进程ID概述 进程ID类型 要想了解内核如何来组织和管理进程ID,先要知道进程ID的类型: 内核中进程ID的类型用pid_type来描述,它被定义在include/linux/pid.h中 enum pid_type { PIDTYPE_PID, PIDTYPE_PGID, PIDTYPE_SID, PIDTYPE_MAX }; 1 2 3 4 5 6 7 1 2 3 4 5 6 7 PID 内核唯一区分每个进程的标识 pid是 Linux 中在其命名空间中唯一标识进程而分配给它的一个号码,称做

Linux进程及进程通讯

一.进程特点及关键字. 1. 基础 [概念]一个具有一定独立功能的程序的一次运行. [特点]动态性,并发性,独立性,异步性. [状态]就绪,执行,阻塞. 2. 几个关键字 [PID/PPID]标示进程的唯一数字,PPID特指父进程ID. [UID]启动进程用户. 3. 临界资源与临界区 [临界资源]资源只允许指定数量的进程同时访问. [临界区]进程中访问临界资源的代码. [进程同步]并发进程按照一定顺序执行的过程. 4. 进程调度--按照一定的算法从一组待运行的进程中选出一个来占有CPU运行.

如何灵活运用Linux进程资源监控和进程限制

每个 Linux 系统管理员都应该知道如何验证硬件.资源和主要进程的完整性和可用性.另外,基于每个用户设置资源限制也是其中一项必备技能. 在这篇文章中,我们会介绍一些能够确保系统硬件和软件正常工作的方法,这些方法能够避免潜在的会导致生产环境下线或钱财损失的问题发生. 报告 Linux 进程统计信息 你可以使用 mpstat 单独查看每个处理器或者系统整体的活动,可以是每次一个快照或者动态更新. 为了使用这个工具,你首先需要安装 sysstat: # yum update && yum in

Linux进程资源用量监控和按用户设置进程限制

由于 2016 年 2 月 2 号开始启用了新的 LFCS 考试要求,我们在已经发表的 LFCS 系列 基础上增加了一些必要的主题.为了准备考试,同时也建议你看看 LFCE 系列 文章. 每个 Linux 系统管理员都应该知道如何验证硬件.资源和主要进程的完整性和可用性.另外,基于每个用户设置资源限制也是其中一项必备技能. 在这篇文章中,我们会介绍一些能够确保系统硬件和软件正常工作的方法,这些方法能够避免潜在的会导致生产环境下线或钱财损失的问题发生. 报告 Linux 进程统计信息 你可以使用

Linux进程关系

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Linux的进程相互之间有一定的关系.比如说,在Linux进程基础中,我们看到,每个进程都有父进程,而所有的进程以init进程为根,形成一个树状结构.我们在这里讲解进程组和会话,以便以更加丰富的方式了管理进程.   进程组 (process group) 每个进程都会属于一个进程组(process group),每个进程组中可以包含多个进程.进程组会有一个进程组领导进程 (pro

Linux进程上下文切换过程context_switch详解--Linux进程的管理与调度(二十一)【转】

转自:http://blog.csdn.net/gatieme/article/details/51872659 版权声明:本文为博主原创文章 && 转载请著名出处 @ http://blog.csdn.net/gatieme   目录(?)[-] 前景回顾 1 Linux的调度器组成 2 调度工作 进程上下文 1 进程上下文的概念 2 上下文切换 context_switch进程上下文切换 1 context_switch完全注释 2 prepare_arch_switch切换前的准备工

Linux进程管理与调度-之-目录导航【转】

转自:http://blog.csdn.net/gatieme/article/details/51456569 版权声明:本文为博主原创文章 && 转载请著名出处 @ http://blog.csdn.net/gatieme   目录(?)[-] 项目链接 进程的描述 进程的创建 进程的加载与运行 进程的退出 进程的调度 调度普通进程-完全公平调度器CFS   日期 内核版本 架构 作者 GitHub CSDN 2016-07-21 Linux-4.6 X86 & arm gat