目录
编辑
1.进程的概念
进程的基本概念
进程与程序的主要区别
进程的特征
进程的状态
描述进程—PCB
task_struct中的内容
查看进程
1.创建一个进程,运行以下代码
通过系统调用获取进程标示符
getpid()以及getppid()
1.进程的概念
进程的基本概念
进程是计算机系统的一个执行实例,是正在执行的程序;每个进程都有自己的内存空间、代码、数据和执行状态。多个进程可以同时运行在计算机系统中,是担当分配系统资源(cpu 时间,内存)的实体。
进程与程序的主要区别
- 程序是永存的;进程是暂时的,是程序在数据集上的一次执行,有创建有撤销,存在是暂时的;
- 程序是静态的观念,进程是动态的观念;
- 进程具有并发性,而程序没有;
- 进程是竞争计算机资源的基本单位,程序不是。
- 进程和程序不是一一对应的:
- 一个程序可对应多个进程即多个进程可执行同一程序;
- 一个进程可以执行一个或几个程序
进程的特征
进程的基本特征是对比单个程序的顺序执行提出的,也是对进程管理提出的基本要求。
- 动态性:进程是程序的一次执行,它有着创建、活动、暂停、终止等过程,具有一定的生命周期,是动态地产生、变化和消亡的。动态性是进程最基本的特征。
- 并发性:指多个进程实体同存于内存中,能在一段时间内同时运行。引入进程的目的就是使进程能和其他进程并发执行。并发性是进程的重要特征,也是操作系统的重要特征
- 独立性:指进程实体是一个能独立运行、独立获得资源和独立接受调度的基本单位。凡未建立PCB的程序,都不能作为一个独立的单位参与运行。
- 异步性:由于进程的相互制约,使得进程按各自独立的、不可预知的速度向前推进。异步性会导致执行结果的不可再现性,为此在操作系统中必须配置相应的进程同步机制。
进程的状态
- 运行状态:进程正在处理机上运行。
- 就绪状态:进程已处于准备运行的状态,即进程获得了除处理机之外的一切所需资源,一旦得到处理机即可运行。
- 阻塞状态:又称等待状态:进程正在等待某一事件而暂停运行,如等待某资源为可用(不包括处理机)或等待输入/输出完成。即使处理机空闲,该进程也不能运行。
- 创建状态:进程正在被创建,尚未转到就绪状态。
- 创建进程通常需要多个步骤:首先申请一个空白的PCB,并向PCB中填写一些控制和管理进程的信息;然后由系统为该进程分 配运行时所必需的资源;最后把该进程转入到就绪状态。
- 结束状态:进程正从系统中消失,这可能是进程正常结束或其他原因中断退出运行。当进程需要结束运行时,系统首先必须置该进程为结束状态,然后再进一步处理资源释放和 回收等工作。
描述进程—PCB
进程的信息会被放到一个叫进程控制块的数据结构中,可以理解成它是进程属性的集合。linux中的PCB实际上是一个叫做task_struct的结构体
task_struct = PCB + 代码,数据;
task_struct中的内容
- 标示符: 描述本进程的唯一标示符,用来区别其他进程。
- 状态: 任务状态,退出代码,退出信号等。
- 优先级: 相对于其他进程的优先级。
- 程序计数器: 程序中即将被执行的下一条指令的地址。
- 内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
- 上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。
- I/ O状态信息: 包括显示的I/O请求,分配给进程的I/ O设备和被进程使用的文件列表。
- 记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
- 其他信息
//截取源码部分
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,基本上所有指令进程的父进程。