进程的专属

来源:互联网 发布:软件模块化优点 编辑:程序博客网 时间:2024/04/29 02:43

进程:

操作系统的主要任务是管理计算机的软,硬件资源。现代操作系统的主要系统特点在于程序的并发执行,Linux操作系统亦是如此。操作系统借助于进程来管理计算机的软,硬件资源,支持多任务的并行执行。所以说,操作系统最核心的概念就是进程。

Linux是一个多用户多任务的操作系统。多用户是指多个用户可以在同一时间使用计算机;多任务是指Linux可以同时执行几个任务,可以在还未执行完一个任务时又执行另外一个任务。进程简单的来讲就是运行中的程序,Linux系统的一个重要特点是可以同时启动多个进程。根据操作系统的定义:进程是操作系统资源管理的最小单元


进程是一个动态的实体,是程序的一次执行过程。进程是操作系统资源分配的基本单位。

进程的特征:

动态性:是程序的一次执行;

并发性:进程是可以并发执行;

独立性:是系统进行资源分配和调度的一个独立单位;

异步性:进程间的相互制约,使进程执行具有间隙;

结构性:进程是具有结构的


(父进程的退出并不能说明子进程也就直接退出 ,两者没有直接关系)

进程和程序的区别:

在于进程是动态的,程序是静态的;进程是运行中的程序,程序是一些保存在硬盘上的可执行代码;

程序是永存的(一组有序的静态指令的集合);进程是暂时的(有一定的生命期),是程序在数据集上的一次执行,有创建有撤销,存在是暂时的;但是,进程离开了程序也就没有也就没有了意义。因此,我们可以这样说:进程是执行程序的动态过程,而程序是进程运行的静态文本。

进程具有并发性,而程序没有;

进程是竞争计算机资源的基本单位,程序不是;

进程和程序不是一一对应的: 一个程序可对应多个进程即多个进程可执行同一程序; 一个进程可以执行一个或几个程序

C、C++、Java等语言编写的源程序经相应的编译器编译成可执行文件后,提交给计算机处理器运行。这时,处在可执行状态中的应用程序称为进程。从用户角度来看,进程是应用程序的一个执行过程。从操作系统核心角度来看,进程代表的是操作系统分配的内存、CPU时间片等资源的基本单位,是为正在运行的程序提供的运行环境。


总的来说:为了让计算机在同一时间能执行更多任务,在进程内部又划分了许多线程。线程在进程内部,它是比进程更小的能独立运行的基本单位。线程基本上不拥有系统资源,它与同属一个进程的其他线程共享进程拥有的全部资源。进程在执行的过程中拥有独立的内存单元,其内部的线程共享这些内存,一个线程可以创建和撤销另一个线程,同一个进程中的多个线程可以并发执行。(Linux下,可以通过命令ps或pstree查看当前系统中的进程)


进程的结构:

Linux中的一个进程由三部分组成:代码段,数据段,堆栈段

代码段存放程序的可执行代码。数据段存放程序的全局变量,常量,静态变量。堆栈段中的堆用于存放动态分配的内存变量;堆栈段中的栈用于函数调用,它存放着函数的参数,函数内部定义的局部变量



Linux进程状态

运行状态:进程正在运行或在运行队列中等待运行

可中断等待状态:进程正在等待某个事件完成(如等待数据到达)。等待过程中可以被信号或定时器唤醒

不可中断等待状态:进程也正在等待某个事件完成,在等待过程中不可以被信号或定时器唤醒,必须等待直到等待的事件发生

僵死状态:进程已终止,但进程描述符依然存在,直到父进程调用wait()函数后释放。

停止状态:进程因为收到SIGSTOP,SIGSTP,SIGTIN,SIGTOU信号后停止运行或者该进程正在被跟踪(调试程序时,进程处于被跟踪状态)


运行中的进程可能具有以下三种状态:

1,就绪状态:(当进程已分配到除cpu以外的所有必要资源后,只要再获得cpu,便可以立即执行,进程这个时候的状态就称为就绪状态。在一个系统之中处于就绪状态的进程可能有多个,通常将它们排成一个队列,称为就绪队列)

2,执行队列:(进程已获得cpu,其程序正在执行。在单处理机系统中,只有一个进程处于执行状态,在多处理机系统中,则有多个进程处于执行状态)

3,阻塞状态:(正在执行的进程由于发生某件事而暂时无法继续执行时,便放弃处理机而处于暂停状态,亦即进程的运行受到阻塞,把这种暂停状态称为阻塞状态,有时也称为等待状态或封锁状态。致使进程阻塞的典型事件有:请求I/O,申请缓冲空间等。通常将这种处于阻塞状态的进程也排成一个队列。有的系统则根据阻塞原因的不同而把处于阻塞状态的进程拍成多个队列)



处于就绪状态的进程,在调度程序为之分配了处理机之后,该进程便可执行,相应的,它就由就绪状态转变为执行状态。正在执行的进程也称为当前进程,如果因为分配给他的时间片已完而被暂停执行时,该进程就由执行状态又回复到就绪状态;如果因为发生某件事而使进程的执行受阻(例如:进程请求访问某临界资源,而该资源正被其他进程访问时),使之无法继续执行,该进程将由执行状态转变为阻塞状态


Linux下程序转化为进程:

Linux下C程序分为4个阶段:预编译,编译,汇编,链接。编译器gcc经过预编译,编译,汇编3个步骤将源程序文件转化为目标文件。如果程序中有多个目标文件或者程序中使用了库函数,编译器还要将所有的目标文件或所需的库链接起来,最后生成可执行文件。

当程序执行时:操作系统将可执行程序复制到内存中。

程序转化为进程通常要经过以下步骤:

1,内核将程序读入内存,为程序分配内存空间

2,内核为该进程分配进程标识符(PID)和其他所需资源

3,内核为该进程保存PID及相应的状态信息,把进程放到运行队列中等待执行,程序转换为进程后就可以被操作系统的调度程序调度执行了


进程的内存映像

进程的内存映像是指内核在内存中是如何存放可执行程序文件的。在将程序转化为进程的过程中,操作系统将可执行程序由硬盘复制到内存

从内存的低地址到高地址依次如下:

代码段:即二进制机器代码(存放CPU执行的机器指令),代码段是只读的(防止其他程序的意外修改),可以被多个进程共享。如一个进程创建了一个子进程,父子进程共享代码段,此外子进程还获得父进程的数据段,堆,栈的复制。

数据段(也称为全局初始化数据区/静态数据区):该区包含了在程序中明确被初始化的全局变量,静态变量(包括全局静态变量和局部静态变量),常量数据(字符串常量),只初始化一次,值得注意的是:(如果在一个函数前面加上static,则表示此函数只能在当前文件中被调用)

未初始化数据区(BSS):存入的是全局未初始化的变量。BSS的叫法是根据一个早期的汇编运算而来的,这个汇编运算符标志着一个块的开始。BSS区的数据在程序开始之前被内核初始化为0或者空指针(NULL)

栈(stack):由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。每当一个函数被调用,该函数返回地址和一些关于调用的信息,如:某些寄存器中的内容,被存储到栈区。然后内核根据这个被调用的函数再为他的自动变量和临时变量在栈区上分配空间,这也就是C实现函数递归调用的方法。每一次执行递归函数的调用,一个新的栈框架就会被使用,这样这个新实例栈里面的变量就不会和该函数的另一个实例栈里面的变量混淆。是向低地址扩展的数据结构,是连续的内存区域,栈顶的地址和栈的最大容量是系统预先规定好的。当申请的空间超过栈的剩余空间事,将提示溢出。

堆(heap):动态内存分配。堆在内存中位于BSS区和栈区之间。一般由程序员分配和释放,若程序员不释放,程序结束后有可能由OS回收。堆是向高地址扩展的数据结构,是不连续的内存区域。因为系统使用链表来存储空闲内存地址,且链表的遍历方向是由低地址向高地址,而且对于堆来说,频繁的malloc,new,势必会造成内存空间的不连续,从而造成大量的碎片,使得效率降低,可能产生内存泄露

另外,高地址还存储了命令行参数和环境变量

所以说:Linux下的内存映像如下所示

可执行程序和内存映像的区别在于:

可执行程序位于磁盘中,而内存映像位于内存中;可执行程序没有堆栈,因为程序被加载到内存中,内核才会给分配堆栈;可执行程序虽然也有未初始化数据段,但它并不被存储在位于硬盘中的可执行文件中;可执行程序是静态的,不变的,而内存映像随着程序的执行是在动态变化的,数据段随着程序的运行要存储新的变量值,栈在函数调用时也是不断变化的,不断分配新的栈框架以及空间


关于操作系统:

计算机系统由硬件和软件两部分组成。操作系统(OS,Operating  System)是配置在计算机硬件上的第一层软件,是对硬件系统的首次扩充,在计算机系统中占据了特别重要的地位,(汇编程序,编译程序,数据库管理系统等系统软件,还有其他大量的软件,都依赖于操作系统的支持)

目的:

(有效性):1,提高系统资源利用率(在未配置OS的计算机系统中,诸如CPU,I/O设备等各种资源,都会因为经常处于空闲状态而得不到充分利用,内存及外存中所存放的数据太少或者无序而浪费了大量的存储空间。配置了OS后,可使CPU和I/O设备由于能保持忙碌的状态而得到有效的利用,且可以使内存和外存中存放的数据因有序而节省了存储空间)

                  :2,提高系统的吞吐量(吞吐量是在给定时间段内系统完成的交易数量。即系统的吞吐量越大,说明系统在单位时间内完成的用户或系统请求越多,系统的资源越得到充分的利用)也可以理解为数据交换量


(方便性):配置(OS)后可以使计算机更容易使用,如果是未配置的话,计算机硬件只能识别0和1这样的机器代码。用户如果要直接在计算机硬件上运行自己所编写的程序,就必须用机器语言书写程序(这可是特别麻烦的啊!!),如果我们配置了OS之后,用户可以通过各种命令来使用计算机系统,可以很方便的写一些高级语言,然后经由OS来将其转化为机器语言



OS可以看做是用户与计算机硬件系统之间的接口

是计算机系统资源的管理者:通常将资源分为四类:处理器,存储器,I/O设备以及信息(数据和程序)

处理机管理:用于分配和控制处理机;

存储器管理:主要负责内存的分配与回收

I/O设备管理:负责I/O设备的分配与操纵

文件管理:负责文件的存取,共享和保护


进程控制块(PCB)

系统为每个进程定义了一个数据结构(PCB,Process  Control  Block)

使一个在多道程序环境下不能独立运行的程序(含数据),成为一个能独立运行的基本单位,一个能与其它进程并发执行的进程

PCB是进程存在的唯一标志,OS通过PCB来控制和管理进程

PCB应常驻内存,因为经常被访问:调度程序,资源分配,中断处理

系统将所有的PCB组织成若干个链表(或队列),存放在操作系统中专门开辟的PCB区内。

Linux系统中用task_struct数据结构来描述每个进程的进程控制块

Window操作系统中,则用一个执行体进程块(EPROCESS)来表示进程对象的基本信息


0 0
原创粉丝点击