【linux】进程概念|task_struct|getpid|getppid

目录

​编辑

1.进程的概念

进程的基本概念

进程与程序的主要区别  

进程的特征

进程的状态

 描述进程—PCB

task_struct中的内容

查看进程

1.创建一个进程,运行以下代码 

通过系统调用获取进程标示符

getpid()以及getppid() 


 

1.进程的概念

进程的基本概念

进程是计算机系统的一个执行实例,是正在执行的程序;每个进程都有自己的内存空间、代码、数据和执行状态。多个进程可以同时运行在计算机系统中,是担当分配系统资源cpu 时间内存)的实体。

 

进程与程序的主要区别  

  • 程序是永存的进程是暂时的,是程序在数据集上的一次执行,有创建有撤销,存在是暂时的;
  • 程序是静态的观念,进程是动态的观念;
  • 进程具有并发性,而程序没有;
  • 进程是竞争计算机资源的基本单位,程序不是。
  • 进程和程序不是一一对应的:
  • 一个程序可对应多个进程即多个进程可执行同一程序;
  • 一个进程可以执行一个或几个程序

进程的特征

进程的基本特征是对比单个程序的顺序执行提出的,也是对进程管理提出的基本要求。

  1. 动态性:进程是程序的一次执行,它有着创建、活动、暂停、终止等过程,具有一定的生命周期,是动态地产生、变化和消亡的。动态性是进程最基本的特征。
  2. 并发性:指多个进程实体同存于内存中,能在一段时间内同时运行。引入进程的目的就是使进程能和其他进程并发执行。并发性是进程的重要特征,也是操作系统的重要特征
  3. 独立性:指进程实体是一个能独立运行、独立获得资源和独立接受调度的基本单位。凡未建立PCB的程序,都不能作为一个独立的单位参与运行。
  4. 异步性:由于进程的相互制约,使得进程按各自独立的、不可预知的速度向前推进。异步性会导致执行结果的不可再现性,为此在操作系统中必须配置相应的进程同步机制。 

进程的状态

  1. 运行状态:进程正在处理机上运行。
  2. 就绪状态:进程已处于准备运行的状态,即进程获得了除处理机之外的一切所需资源,一旦得到处理机即可运行。
  3. 阻塞状态:又称等待状态:进程正在等待某一事件而暂停运行,如等待某资源为可用(不包括处理机)或等待输入/输出完成。即使处理机空闲,该进程也不能运行。
  4. 创建状态:进程正在被创建,尚未转到就绪状态。
    1. 创建进程通常需要多个步骤:首先申请一个空白的PCB,并向PCB中填写一些控制和管理进程的信息;然后由系统为该进程分 配运行时所必需的资源;最后把该进程转入到就绪状态。
  5. 结束状态:进程正从系统中消失,这可能是进程正常结束或其他原因中断退出运行。当进程需要结束运行时,系统首先必须置该进程为结束状态,然后再进一步处理资源释放和 回收等工作。

 描述进程—PCB

进程的信息会被放到一个叫进程控制块的数据结构中,可以理解成它是进程属性的集合。linux中的PCB实际上是一个叫做task_struct的结构体

task_struct = PCB + 代码,数据;

task_struct中的内容

  1. 标示符:    描述本进程的唯一标示符,用来区别其他进程。
  2. 状态:     任务状态,退出代码,退出信号等。
  3. 优先级:    相对于其他进程的优先级。
  4. 程序计数器:    程序中即将被执行的下一条指令的地址。
  5. 内存指针:   包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
  6. 上下文数据:   进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。
  7. I/ O状态信息:   包括显示的I/O请求,分配给进程的I/ O设备和被进程使用的文件列表。
  8. 记账信息:    可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
  9. 其他信息

 

 

//截取源码部分
struct task_struct {
	volatile long state;//状态	/* -1 unrunnable, 0 runnable, >0 stopped */
	void *stack;//栈
	atomic_t usage;
	unsigned int flags;	/* per process flags, defined below */
	unsigned int ptrace;

	int lock_depth;		/* BKL lock depth */
    /* task state */
	int exit_state;
	int exit_code, exit_signal;
	int pdeath_signal;  /*  The signal sent when the parent dies  */
	/* ??? */
	unsigned int personality;
	unsigned did_exec:1;
	unsigned in_execve:1;	/* Tell the LSMs that the process is doing an
				 * execve */
	unsigned in_iowait:1;


	/* Revert to default priority/policy when forking */
	unsigned sched_reset_on_fork:1;

	pid_t pid;//标识符
	pid_t tgid;
    //...
};

查看进程

linux下进程的信息可以通过 /proc 系统文件夹查看,该文件夹存放了所有进程的信息,每一个进程的信息都是一个文件夹

1.创建一个进程,运行以下代码 

通过系统调用获取进程标示符

进程id–PID (进程的身份证号,唯一标识一个进程)
父进程id–PPID

getpid()以及getppid() 

观察以下代码:

哪个进程调用getpid(),就会得到哪个进程的PID

当我们运行以上代码,就会建立相应的进程,通过getpid()获取到当前进程的PID,getppid()获得当前进程的父进程的PID

 

程序的父进程是谁呢?  -》bash,基本上所有指令进程的父进程。 

 

  • 23
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值