当前位置:首页 > 嵌入式培训 > 嵌入式学习 > 讲师博文 > 对进程的理解

对进程的理解 时间:2018-09-28      来源:未知

关于进程的理解,首先得知道进程和程序有什么区别!其实程序大家并不陌生,前面也写过很多程序,那什么是程序?程序是指令和数据的有序集合,本身没有任何运行的含义,是一个静态的概念。那什么又是进程呢?程序是保存在磁盘上的,要想程序实现一定的功能,需要有执行的过程,是一个动态的概念,而对于程序是静态的概念,无法描述程序在内存中的执行情况,所以才引入了进程的概念,进程是一个程序的一次执行过程,是是程序执行和资源管理的小单位。  

对于进程,在同一时间CPU只能处理一个事件,实际上是串行的,但是CPU执行的速度非常快,所以我们感觉像是并行一样。进程是一个实体,进程不仅包括程序的指令和数据,而且包括程序计数器值、CPU的所有寄存器值以及存储临时数据的进程堆栈。它包括三部分:程序、数据、进程控制块PCB,对于进程可以分成三部分:代码段、数据段、堆栈段。

代码段:存放程序的可执行代码。

数据段:存放程序的全局变量、常量、静态变量。

堆栈段:堆用于存放动态分配的内存变量,栈用于函数调用,它存放着函数的参数、

函数内部定义的局部变量。

而程序分成了两部分:只有代码段和数据段(.bss:未初始化的全局变量或静态局部变量,.data:已初始化的全局变量或静态局部变量)

每一个进程都有独立的4g的虚拟空间,而0-3g是用户可用空间,3g-4g是内核空间,每一个进程都拥有相同的内核空间,所以3g-4g是每一个进程的共享空间。物理内存是实际存在的空间,这个空间是根据你电脑的内存条大小来确定的,对于每一个拥有独立4g虚拟空间的进程,都会在内存条上分配一定的空间大小(所以为什么说内存越大电脑的速度越快?比如10个进程在2g内存上运行,需要为每个进程分配200兆的空间来运行,如果10个进程在4g内存上运行,需要为每个进程分配400兆的空间)

对于独立4g虚拟空间的进程,怎么加载到物理内存上的呢?

进程中的每一条指令,比如a+b这条指令会被加载到物理内存中,等下一次进程再次被调度时,系统就会知道再次从什么地方开始执行。

上图中的双向循环链表是保存在3g-4g的内核空间的。

对于进程控制块PCB(process control block),系统通过PCB对进程进行管理和调度。PCB包括创建进程、执行程序、退出进程以及改变进程的优先级等。而进程中的PCB用一个名为task_struct的结构体来表示,定义在linux内核代码include/linux/sched.h中,每当创建一新进程时,便在内存中申请一个空的task_struct结构,填入所需信息,同时,指向该结构的指针也被加入到task数组中,所有进程控制块都存储在task[]数组中。存放进程的信息的PCB是存放在内存中。在这里需要重点去看的是,在PCB结构体中有两项重点来看一下,PID(进程号)和status(进程状态),PID、PPID分别代表的是进程号和父进程号,通过进程号来唯一的表示一个进程;这两个值都是非零正整数。

Linux中进程的类型也有这样几种:

1) 交互进程:该类进程是由shell控制和运行的。交互进程既可以在前台运行,也可以

在后台运行。该类进程经常与用户进行交互,需要等待用户的输入,当接收到用户的输入后,该类进程会立刻响应,典型的交互式进程有:shell命令进程、文本编辑器等

2)批处理进程:该类进程不必与用户进行交互,通常在后台运行,不必很快地响应,它会被提交到一个队列中进行顺序执行。典型的批处理进程有:编译器的编译操作、数据库搜索引擎。

3)守护进程:该类进程在后台运行。它一般在Linux启动时开始执行,系统关闭时才结

束。很多系统进程都是以守护进程的形式存在。

举例:电脑的网线口,不插网线会有小叹号,当插上网线设置好ip后就能上网,这是因为网口驱动程序是守护进程,当系统启动时,此进程就已经被创建,此守护进程后会不停的去询问有没有网线…

同时根据进程在不同时刻存在的不同状态,分成了这样几类:

1)运行态:此时进程或者正在运行,或者准备运行。R

2)等待态:此时进程在等待一个事件的发生或某种系统资源。

a)可中断: 处在这种状态下的进程可以被信号中断,接收到信号或被显示地唤醒呼叫,唤醒之后,进程将转变为运行态。S 

b)不可中断:它不会处理信号,只有在它所等待的事件发生时,进程才被显示的

唤醒  D

3)停止态:此时进程被暂停,当收到SIGSTOP、SIGTSTP、SIGTTIN、SIGTTOU信号,会进入暂停状态。T 

4)僵尸态:这是一个已终止的进程,但还在进程向量数组中占有一个task_struct结构。Z

僵尸有什么特性?

占空间、不起作用,每一个进程都有PCB,描述进程的信息,进程退出时PCB还存在,存放着进程的状态,死亡的状态等,所以程序结束之后PCB还存在,内核栈也存在(内核栈:大小为4k-8k,保存在3g-4g的空间,系统调用函数是需要栈的,而这个栈就是是内核栈)内核栈是占空间的,所以如果僵尸态的进程多了的话,是要消耗资源的,

僵尸进程是怎么产生的?

子进程先退出,父进程没有收尸,那子进程就是僵尸进程

父进程退出后,子进程存在,那子进程就是孤儿进程, 那子进程的父进程就是init进程,

init是系统启动后的用户进程,其中还有一个0号进程,它是系统上电后,由0号进程产生init进程

5)死亡态: 这是终状态,父进程调用wait函数将子进程回收。瞬间发生,程序员不

可见  X

  状态的显示可以使用man ps查看到

       <    high-priority (not nice to other users) 高优先级

       N    low-priority (nice to other users) 低优先级

       L    has pages locked into memory (for real-time and custom IO) 页面锁定在内存(实时或定制的IO)

       s    is a session leader会话组的组长

       l    is multi-threaded (using CLONE_THREAD, like NPTL pthreads do) 进程中包含线程

       +    is in the foreground process group. 前台进程

以上便是我对进程相关内容的一些理解,现在分享给大家,如果存在质疑的地方请主动提出。

上一篇:Linux下文件的特殊权限

下一篇:如何编写块设备驱动

热点文章推荐
华清学员就业榜单
高薪学员经验分享
热点新闻推荐
前台专线:010-82525158 企业培训洽谈专线:010-82525379 院校合作洽谈专线:010-82525379 Copyright © 2004-2022 北京华清远见科技集团有限公司 版权所有 ,京ICP备16055225号-5京公海网安备11010802025203号

回到顶部