linux-进程与进程环境

进程与进程环境

进程是运行中的程序,每个进程都运行在各自的虚拟地址空间中,某个进程的崩溃不会影响其它进程的运行。进程间的通信(IPC)要通过系统内核(系统调用)来实现。

进程分类

在Linux系统中,根据进程的特点,进程可分为3大类:交互进程、批处理进程和守护进程。

l 交互进程:由Shell启动的进程,可在前后台运行,在执行过程中要求与用户进行交互操作;

l 批处理进程:类似于Windows中原来的批处理,是一个进程序列,该进程负责按顺序启动其他进程;

l 守护进程:执行特定功能或者执行系统相关任务的后台进程。只是一个特殊的进程,不是内核组成部分。许多守护进程在系统启动时启动,只到系统关闭时停止运行。而某些只在需要的时候才启动,如FTP或Apache服务,可在需要时启动。(好像都是废话)

虚拟内存

安装Linux时建立swap分区被用作内存的扩展,系统将暂时不会用到的数据写到交换分区中,在需要时在都会内存,这种内存扩展机制被称为虚拟内存。

Linux中每个进程都运行在虚拟内存空间中。虚拟内存技术用于解决多进程同时运行时内存空间不足的问题,还提供了如下功能:

l 巨大寻址空间:Linux操作系统采用了虚拟内存管理技术,使得在32位系统上支持寻址高达4GB的线性地址空间。用户所看到的进程运行地址为虚拟地址,不是物理地址。4GB内存空间被分为用户空间和内核空间。用户程序在通常情况下只能访问用户空间,只有通过系统调用才能进入内核空间。与用户空间的内容在进程切换会发生变化不同,内核空间是由内核进行映射的,因此不会随着进程切换而发生变化。

l 共享虚拟内存:虚拟内存机制保证了每个进程都运行在自己的虚拟地址空间中,同时虚拟内存还提供了共享内存功能,即进程间通信(IPC)的一种方法,可实现进程间的数据交换。

l 进程保护:系统中的进程运行在自己的虚拟地址空间,保证了进程在运行时的稳定性。

vmstat命令可显示虚拟内存使用情况。

进程内存

所有的进程运行在自己的虚拟地址空间中。而每个进程都有自己的内存地址。

每个进程运行在自己私有的内存空间中(即虚拟地址空间)。在32位系统中,4GB被分为用户空间(03GB,16进制表示为0xC0000000),内核空间为3GB4GB。

对一个进程而言,都会涉及3种不同的数据段,分别是代码段、数据段和堆栈段。

l 代码段:保存可执行文件操作指令和程序定义的常量。为防运行时代码被修改,只允许读,不能进行修改。多进程能够共享相同的代码段,即当程序被多次执行时,运行的相同程序将共享代码段。

l 数据段:位置紧接代码段,分为初始化代码段和未初始化代码段(也被称为BSS段)。初始化数据段用于存放已经初始化的全局变量和程序的静态变量,而未初始化数据段用于保存未初始化的全局变量。

l 堆栈段:堆栈段中的堆用于存放进程中动态分配的内存地址。如C中的malloc函数,C++中的new函数分配的内存空间将在堆中分配。当使用free(如果内存是通过malloc函数分配)或delete函数释放内存时,分配的内存将从堆中删除。

栈用于保存程序中创建的临时变量,进行数据交换的内存区域。栈大小受操作系统限制,空间有限,而堆大小只是受限于虚拟内存空间,堆位置与数据段相邻。

进程标识

Linux系统使用进程ID(PID)来标识进程。出了init进程(PID为1)外,每个进程都有一个父进程。当父进程早于子进程结束时,子进程变为了“孤儿进程”,将被系统进程(init进程)收养。这时,init进程变为子进程的父进程。

每个进程在创建时候,系统会分配一个进程ID给该进程。当进程ID达到系统最大值时(<linux/threads.h>中有PID_MAX的定义,该常量表示系统能使用的最大PID数),系统将重新使用最小且当前未使用的PID号。

getpid函数返回当前进程的进程ID,getppid函数返回当前进程的父进程ID。

    pid_t getpid(void);

    pid_t getppid(void);

当root用户创建新用户时,会给每个用户分配一个用户ID(UID)。可在/etc/passwd文件中查找到用户的UID信息。Linux系统每个进程都有两个ID:UID和EUID。当用户登录入系统时,系统会将UID和EUID设置成/etc/passwd文件中的UID。UID用于表示进程的创建者,只有进程的创建者和root用户才有权限对进程进行操作。EUID用于确定进程在任何给定的时刻,对资源和文件具有访问权限。通过使UID和EUID不同,可使某个程序具有超越程序执行者的权限。当设置了EUID,无论哪个用户执行该进程,程序将拥有文件拥有者的权限。

修改EUID:chmod u+s filename;

修改EGID:chmod g+s filename;

wait函数

为同步父子进程,父进程等待子进程结束,需要用到wait函数。如下为wait函数工作流程示意图:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值