天天看点

第二章 进程一、进程标识二、进程的用户ID与组ID(进程的运行身份)三、进程状态四、Linux下的进程结构五、Linux下的进程管理

一、进程标识

OS会为每个进程分配一个唯一的整型ID,做为进程的标识号(pid)。进程除了自身的ID外,还有父进程ID(ppid),所有进程的祖先进程是同一个进程,它叫做init进程,ID为1,init进程是内核自举后的一个启动的进程。init进程负责引导系统、启动守护(后台)进程并且运行必要的程序。

虽然进程ID是唯一的,但是进程ID是可复用的。当一个进程终止后,其进程ID就成为复用的候选者。

系统中有一些专用进程,但具体细节随实现而不同。ID为0的进程通常是调度进程,常常被称为交换进程。该进程是内核的一部分,它并不执行任何磁盘上的程序,因此也被称为系统进程。

进程的标识号(pid)和父进程ID(ppid)可以分别通过函数getpid()和getppid()获得(返回值都是整型的)。

二、进程的用户ID与组ID(进程的运行身份)

进程在运行过程中,必须具有一类似于用户的身份,以便进行进程的权限控制,缺省情况下,哪个登录用户运行程序,该程序进程就具有该用户的身份。例如,假设当前登录用户为gotter,他运行了ls程序,则ls在运行过程中就具有gotter的身份,该ls进程的用户ID和组ID分别为gotter和gotter所属的组。这类型的ID叫做进程的真实用户ID和真实组ID。真实用户ID和真实组ID可以通过函数getuid()和getgid()获得(返回值都是整型的)。

与真实ID对应,进程还具有有效用户ID和有效组ID的属性,内核对进程的访问权限检查时,它检查的是进程的有效用户ID和有效组ID,而不是真实用户ID和真实组ID。缺省情况下(系统默认情况),用户的(有效用户ID和有效组ID)与(真实用户ID和真实组ID)是相同的。有效用户id和有效组id通过函数geteuid()和getegid()获得(返回值都是整型的)。

#include <unistd.h>

pid_t getpid()      //返回值:调用进程的进程ID

pid_t getppid()     //返回值:调用进程的父进程ID

uid_t getuid()      //返回值:调用进程的实际用户ID

uid_t geteuid()     //返回值:调用进程的有效用户ID

gid_t getgid()      //返回值:调用进程的实际组ID

gid_t getegid()     //返回值:调用进程的有效组ID
           
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main()
{
	printf("pid:%d   ppid:%d\n",getpid(),getppid());
	printf("uid:%d   euid:%d\n",getuid(),geteuid());
	printf("gid:%d   egid:%d\n",getgid(),getegid());
	return 0;
}
           
第二章 进程一、进程标识二、进程的用户ID与组ID(进程的运行身份)三、进程状态四、Linux下的进程结构五、Linux下的进程管理

PS:用ps -elf可以查看现有进程

ps -elf | grep pidname 查看进程pid

kill -9 pidname 杀掉进程

第二章 进程一、进程标识二、进程的用户ID与组ID(进程的运行身份)三、进程状态四、Linux下的进程结构五、Linux下的进程管理

将编译后的可执行文件的权限改为“s”(s的含义:将可执行程序的权限上升到root,比如密码的修改。在赋予s权限的时候,必须确保程序有x权限,是可执行程序,否则s权限不能生效,显示为大写的S)

第二章 进程一、进程标识二、进程的用户ID与组ID(进程的运行身份)三、进程状态四、Linux下的进程结构五、Linux下的进程管理

三、进程状态

进程是程序的执行过程,根据它的生命周期可以划分成3种状态: 1、执行态:该进程正在运行,即进程正在占用CPU。 2、就绪态:进程已经具备执行的一切条件,正在等待分配CPU的处理时间片 3、等待态:进程不能使用CPU,若等待事件未发生(等待的资源分配到)则可将其唤醒。

第二章 进程一、进程标识二、进程的用户ID与组ID(进程的运行身份)三、进程状态四、Linux下的进程结构五、Linux下的进程管理

调度策略:(具体请参考操作系统) OTHER :普通调度策略 实时调度策略: FIFO:先进先出 RR:时间片轮转

四、Linux下的进程结构

Linux系统是一个多进程的系统,他的进程之间具有并行性、互不干扰等特点。也就是说,进程之间是分离的任务,拥有各自的权利和责任。其中,每个进程都运行在各自独立的虚拟地址空间因此,即使一个进程发生了异常,它也不会影响到系统的其他进程。 Linux中的进程包含3个段,分别为“数据段”、“代码段”和“堆栈段”。 1、“数据段”放全局变量、常数以及动态数据分配的数据空间。数据段分成普通数据段(包括可读可写/只读数据段,存放静态初始化的全局变量或常量)、BSS数据段(存放未初始化的全局变量)以及堆(存放动态分配的数据)。 2、“代码段”存放的是程序代码的数据(不可改写)。 3、“堆栈段”存放的是子程序的返回地址、子程序的参数以及程序的局部变量等。(每执行一个函数就分配一个栈,函数结束,栈就消失)

第二章 进程一、进程标识二、进程的用户ID与组ID(进程的运行身份)三、进程状态四、Linux下的进程结构五、Linux下的进程管理

系统运行的核心线程都在内核进程(硬件),平时写的程序都运行在用户态,用户要想进入内核态必须通过系统调用接口。

五、Linux下的进程管理

第二章 进程一、进程标识二、进程的用户ID与组ID(进程的运行身份)三、进程状态四、Linux下的进程结构五、Linux下的进程管理

备注: 进程process是os的最小单元,os会为每个进程分配大小为4G的虚拟内存空间,其中1G给内核空间,3G给用户空间(代码区,数据区,堆栈区) ps查看活动进程,ps -aux查看所有的进程  ps -aux|grep aa 查找指定(aa)进程  ps -ef可以显示父子进程关系 top显示前20条进程,动态的改变 ps -aux看%cpu(cpu使用量)%mem(内存使用量)  stat(状态)(S睡眠 T暂停(和S一起在等待队列里) R运行 Z僵尸) 进程进入死循环时,按Ctrl+z可以把程序暂停(向进程发送一个SIGSTOP暂停信号,kill -l查看信号),再执行[bg 作业ID]可以将该进程带入后台。利用jobs可以查看后台任务,fg 1把后台任务带到前台,这里的1标识作业ID。

命令:

第二章 进程一、进程标识二、进程的用户ID与组ID(进程的运行身份)三、进程状态四、Linux下的进程结构五、Linux下的进程管理

对应的状态

第二章 进程一、进程标识二、进程的用户ID与组ID(进程的运行身份)三、进程状态四、Linux下的进程结构五、Linux下的进程管理