进程概念:
1、进程定义
2、进程描述
3、进程组织
4、进程状态
1、进程定义:
>> 正在执行的程序
>> 正在计算机上执行程序的实例
>> 能分配给处理器并由处理器执行的实体
>> 进程是由程序代码和进程控制块组成的实体
2、进程描述---PCB ( Process Control Block 进程控制块)
1>什么是PCB
PCB就是进程控制块,进程信息被存放在这个数据结构中,是操作系统能够支持多进程和提供多处理的关键工具
Linux系统下的PCB是task_struct
>> task_struct:是PCB的一种,是linux系统下描述进程的结构体
>> task_struct是Linux内核中的一种结构体,它会被加载到RAM ( random access memory 随机存储内存 ) 中且包含进程信息
2>task_struct ( PCB ) 的内容分类:
标识符:描述这个进程的唯一标识,用来区别其他进程
状态:如任务状态,代码退出,退出信号等 / 一个程序正在执行,那么这个程序就处于运行态
程序计数器:记录程序中即将执行的下一条指令的地址
上下文数据:进程执行时处理器的寄存器中的数据
内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享内存块的指针
进程优先级:相对于其他进程的优先级
记账信息:可能包括处理器时间总和、使用的时钟数总和、时间限制、记账号等
IO状态信息:包括显式的IO请求、分配给进程的IO设备和被进程调用的文件列表等
3> 对进程的进一步认识:
其实进程就是pcb,是一个运行程序的描述,通过描述信息中的内存指针可以找到内存中运行的程序代码以及数据,
并且通过上下文数据可以保存程序调度切换时正在处理的数据,通过程序计数器保存进程切换程序时即将执行的下一条指令,
通过这些描述信息从而控制一个程序的运行,所以,对于操作系统来说,进程就是PCB
3、进程组织
1.查看进程的信息可以通过/proc文件进行查看
2.通过系统调用创建进程
函数原型:pid_t fork( void );
功能:创建一个进程
头文件:#include <unistd.h>
返回值:
On success, the PID of the child process is returned in the parent, and 0 is returned in the child.
On failure, -1 is returned in the parent, no child process is created, and errno is set appropriately.
如果成功,则在父进程中返回子进程的PID,在子进程中返回0
如果失败,则在父进程中返回-1,不创建子进程,并适当地设置errno
注意:父子进程代码共享,数据各自开辟一份空间,私有一份( 通过写时拷贝技术实现 )
fork之后通常用if进行分流,为了区分父子进程所要执行的代码
源代码
getpid():返回值是调用进程的pid
#include <stdio.h> #include <unistd.h> #include <sys/types.h> int main(){ pid_t pid = fork(); if( pid < 0 ){ perror("fork"); return 1; }else if( pid == 0 ){ printf("Child Process : %d,pid = %d ", getpid(), pid); }else { printf("Parent Process : %d, pid = %d ",getpid(), pid); } sleep(1); return 0; }
4、进程状态
运行状态:正在运行或已经拿到时间片就能运行的进程
可中断睡眠状态:进程在等在这某件事情的完成
不可中断睡眠状态:这个状态下的进程通常会等待IO的结束
停止状态:使进程处于停止的状态,此状态下犹如活死人,无痛无感,就是什么也不能做,在这一时刻停了下来
可以通过发送SIGSTOP信号让进程停止下来,暂停的进程可以通过发送SIGCONT使之运行起来
僵死状态:这个只是一个返回状态,不会再任务列表中看到这个状态
进程状态查看
命令行:ps -ef 或 -aux
可以通过管道功能进行查看进程的PID " | grep " 所要查找的字符
ps -ef / -aux | grep xxx
以上述代码为例:
UID:user_id使用者id
PID:进程id
PPID:父进程id