一、进程的定义
进程是操作系统的概念,每当我们执行一个程序时,对于操作系统来讲就创建了一个进程,在这个过程中,伴随着资源的分配和释放。可以认为进程是一个程序的一次执行过程。
二、进程与程序的区别
程序时静态的,它是一些保存 在磁盘上得指令的有序集合,没有任何执行的概念。
进程是一个动态的概念,它是程序执行的过程,包括创建、调度和消亡。
三、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
- linux进程管理之概念(一)
一.进程和线程的概念 1.进程和线程的定义 进程并不只是一段可以运行的代码,也包含了运行代码所需要的资源. 在操作系统来看,进程是资源管理的最小单元,而我们又知道,线程是程序执行的最小单元. 话说回来 ...
- Linux进程管理(一、 基本概念和数据结构)
被问到两个问题, 后来想了下如果要讲明白还不太容易,需要对进程的概念,进程管理有清晰的认识: 1. 父进程打开了一个文件,然后通过fork创建一个子进程, 子进程是否共享父进程的文件描述符? 2. 在 ...
- linux内核之进程的基本概念(进程,进程组,会话关系)
进程是操作系统的一个核心概念.每个进程都有自己唯一的标识:进程ID,也有自己的生命周期.一个典型的进程的生命周期如图4-1所示. 进程都有父进程,父进程也有父进程,这就形成了一个以init进程为根的家 ...
- Linux 进程与信号的概念和操作
进程 主要参考: http://www.bogotobogo.com/Linux/linux_process_and_signals.php 信号与进程几乎控制了操作系统的每个任务. 在shell中输 ...
- Linux 进程与信号的概念和操作 linux process and signals
进程 主要参考: http://www.bogotobogo.com/Linux/linux_process_and_signals.php 译者:李秋豪 信号与进程几乎控制了操作系统的每个任务. 在 ...
- 如何灵活运用Linux 进程资源监控和进程限制
导读 每个 Linux 系统管理员都应该知道如何验证硬件.资源和主要进程的完整性和可用性.另外,基于每个用户设置资源限制也是其中一项必备技能. 在这篇文章中,我们会介绍一些能够确保系统硬件和软件正常工 ...
- Linux进程管理子系统分析【转】
本文转载自:http://blog.csdn.net/coding__madman/article/details/51298732 Linux进程管理: 进程与程序: 程序:存放在磁盘上的一系列代码 ...
- Linux进程关系
Linux进程关系 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Linux的进程相互之间有一定的关系.比如说,在Linux ...
- [转载] Linux进程关系
在工作中, 主进程创建了子进程, 而子进程又创建了孙子进程, 然而子进程被莫名其妙的 kill 了, 结果主进程又启动了一个子进程, 子进程又尝试创建孙子进程, 但是这时候就有问题了, 因为孙子进程还 ...
随机推荐
- 运算符 - PHP手册笔记
运算符优先级 每种编程语言都有运算符,运算符要学会灵活使用. 运算符拥有不同的优先级和结合方向. <?php var_dump(1 <= 1 == 1); // true var_dump ...
- PHP性能优化之:配置opcache
启用opcache,并对配置参数进行优化 [opcache] zend_extension = /usr/local/php5/lib/php/extensions/no-debug-zts-2012 ...
- 定制化Azure站点Java运行环境(3)
定制化Azure Website提供的默认的Tomcat和JDK环境 在我们之前的测试中,如果你访问你的WEB站点URL时不加任何上下文,实际上你看到的web界面是系统自带的测试页面index.jsp ...
- 【深夜急报,Win10下的Linux子系统之Bash】
[在Windows下进行的编程人员,你真的需要学习下Linux] 手册:<Linux 命令手册(特洛伊版2.0)> 链接: https://pan.baidu.com/s/1skrVSvV ...
- 【温故而知新-JQ的节点类型】
来源:http://www.hi-docs.com/jquery/contents.html 定义和用法 查找匹配元素内部所有的子节点(包括文本节点).如果元素是一个iframe,则查找文档内容 语法 ...
- linux的7种运行级别<学习笔记>
Linux系统有7个运行级别(runlevel) 运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动 运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆 运行级别 ...
- Python中and和or
转自:http://unei66.blog.163.com/blog/static/544640292010320745886/ python中的and和or 4.6. and 和 or 的特殊性质在 ...
- 【POJ】3468 A Simple Problem with Integers ——线段树 成段更新 懒惰标记
A Simple Problem with Integers Time Limit:5000MS Memory Limit:131072K Case Time Limit:2000MS Descr ...
- 剑指offer57 删除链表中重复的结点
class Solution { public: ListNode* deleteDuplication(ListNode* pHead) { if(!pHead) return pHead; str ...
- kindeditor 下图片链接取消边框
在项目中使用了 kindeditor,版本是4.1.10,在发布信息的时候,将图片设置成了超链接,在 IE8 或者其他个别浏览器下会自动的为图片加一个蓝色的边框,效果如下图: 这个蓝框可以通过修改信息 ...