海南 网站开发,wordpress站点相关,西宁做网站君博领先,做网站需要哪几个板块文章目录 前言一、概念基本概念进程-PCBtask_structtask_struct内容分类 二、查看和创建进程查看进程PID创建进程 三、进程状态五、僵尸进程和孤儿进程僵尸进程孤儿进程获取进程退出码 四、进程优先级基本概念查看系统进程PRI and NI用top命令更改已存在进程的nice 前言 我们常… 文章目录 前言一、概念基本概念进程-PCBtask_structtask_struct内容分类 二、查看和创建进程查看进程PID创建进程 三、进程状态五、僵尸进程和孤儿进程僵尸进程孤儿进程获取进程退出码 四、进程优先级基本概念查看系统进程PRI and NI用top命令更改已存在进程的nice 前言 我们常见的计算机如笔记本。我们不常见的计算机如服务器大部分都遵守冯诺依曼体系 关于冯诺依曼这里的存储器指的是内存不考虑缓存情况这里的CPU能且只能对内存进行读写不能访问外设(输入或输出设备)外设(输入或输出设备)要输入或者输出数据也只能写入内存或者从内存中读取所有设备都只能和内存打交道。 一、概念
基本概念 课本概念程序的一个执行实例正在执行的程序等。 内核观点担当分配系统资源cpu时间内存的实体。 进程-PCB 进程信息被放在一个叫做进程控制块的数据结构中可以理解为进程属性的集合。 课本上称之为PCBprocess control blockLinux操作系统下的PCB是: task_struct task_struct 在Linux中描述进程的结构体叫做task_struct task_struct是Linux内核的一种数据结构它会被装载到RAM(内存)里并且包含着进程的信息 task_struct内容分类 标示符(pid): 描述本进程的唯一标示符用来区别其他进程。 状态: 任务状态退出代码退出信号等。 优先级: 相对于其他进程的优先级。 程序计数器: 程序中即将被执行的下一条指令的地址。 内存指针: 包括程序代码和进程相关数据的指针还有和其他进程共享的内存块的指针 上下文数据: 进程执行时处理器的寄存器中的数据。 I O状态信息: 包括显示的I/O请求,分配给进程的I O设备和被进程使用的文件列表。 记账信息: 可能包括处理器时间总和使用的时钟数总和时间限制记账号等。 其他信息 二、查看和创建进程
查看进程
方法一进程的信息可以通过 /proc 系统文件夹查看
方法二使用top指令或者ps指令 top指令
ps指令
PID PID就是各进程的身份标识,程序一运行系统就会自动分配给进程一个独一无二的PID。进程中止后PID被系统回收可能会被继续分配给新运行的程序 通过getpid/getppid获取进程标识符
#include stdio.h
#include sys/types.h
#include unistd.h
int main()
{printf(pid: %d\n, getpid()); // 获取当前进程pidprintf(ppid: %d\n, getppid());// 获取父进程pidreturn 0;
}运行结果
创建进程
通过系统调用创建进程-fork
#include stdio.h
#include sys/types.h
#include unistd.h
int main()
{pid_t ret fork(); // 父子谁先运行是不确定的//使用fork创建子进程时fork会有一个返回值父进程调用fork返回子进程的pid0,//子进程调用fork,返回0所有我们可以使用判断使父子进程各自执行各自需要执行的代码 if(ret 0) // 创建失败{perror(fork);return 1;}else if(ret 0){ //childprintf(I am child : %d!, ret: %d\n, getpid(), ret);}else{ //fatherprintf(I am father : %d!, ret: %d\n, getpid(), ret);}sleep(1);return 0;
}注意 1.默认情况下子进程会继承父进程的代码和数据。 2.内核数据结构task_struct也会以父进程为模板初始化子进程的task_struct 3.fork之后子进程和父进程代码是共享的 4.默认情况下数据也是“共享”的但是如果需要修改会 采用写时拷贝。进程具有独立性 fork之后执行流会变成2个谁先运行由调度器决定fork之后的代码共享通常我们通过if和elseif来执行执行分流 这里的号表示进程是在前台运行可通过kill指令或者ctrl c关闭进程如果没有号表示后台进程需使用kill指令关闭进程
三、进程状态
一般的操作系统的书中或者学校中所讲的进程状态一般是下图所示的五状态(或三状态)
阻塞 进程因为等待某种条件就绪而导致的一种不推进的状态 --进程卡住了–阻塞一定是在等待某种资源 为什么会阻塞 进程要通过等待的方式等具体的资源被别人使用完成后再自己使用等待某种资源就绪的过程
挂起 由于系统内存大小有限为了能够使更多的进程加载到内存中操作系统会将一些阻塞的需要等待io的进程的代码和数组暂时存放外存节省内存的大小等到阻塞的进程io申请完成后再将这个进程的代码和数据重新放到内存的执行队列中。 linux可大致分为以下几个状态
R运行状态running : 并不意味着进程一定在运行中(占有CPU)它表明进程要么是在运行中要么在运行队列里
S睡眠状态sleeping): 意味着进程在等待事件完成这里的睡眠有时候也叫做可中断睡眠
D磁盘休眠状态Disk sleep: 有时候也叫不可中断睡眠状态uninterruptible sleep在这个状态的进程通常会等待IO的结束
T停止状态stopped 可以通过发送 SIGSTOP 信号给进程来停止T进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行。 X死亡状态dead 这个状态只是一个返回状态你不会在任务列表里看到这个状态。
Z僵尸状态(zombie) 当进程退出并且父进程没有读取到子进程退出的返回代码时就会产生僵死进程僵死进程会以终止状态保持在进程表中并且会一直在等待父进程读取退出状态代码
所以只要子进程退出父进程还在运行但父进程没有读取子进程状态子进程进入Z状态 五、僵尸进程和孤儿进程
僵尸进程 处于僵尸状态的进程就叫僵尸进程进程的退出状态必须被维持下去因为他要告诉父进程自己的任务完成的怎么样可父进程如果一直不读取那子进程就一直处于Z状态。 维护退出状态本身就是要用数据维护也属于进程基本信息所以保存在task_struct(PCB)中换句话说 Z状态一直不退出 PCB一直都要维护。 那一个父进程创建了很多子进程就是不回收是不是就会造成内存资源的浪费是的因为数据结构对象本身就要占用内存。 僵尸进程会造成内存泄漏。 孤儿进程 父进程如果提前退出那么子进程后退出进入Z之后那该如何处理呢 父进程先退出子进程就称之为“孤儿进程” 孤儿进程被1号进程领养。 获取进程退出码 使用echo ? 可将进程退出码打印到显示器上进程退出码用来系统判断进程执行的结果是否正确 四、进程优先级
基本概念 cpu资源分配的先后顺序就是指进程的优先权priority。 优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用可以改善系统性能。 还可以把进程运行到指定的CPU上这样一来把不重要的进程安排到某个CPU可以大大改善系统整体性能 查看系统进程
在linux或者unix系统中用ps –l命令则会类似输出以下几个内容 UID : 代表执行者的身份 PID : 代表这个进程的代号 PPID 代表这个进程是由哪个进程发展衍生而来的亦即父进程的代号 PRI (priority)代表这个进程可被执行的优先级其值越小越早被执行 NI 代表这个进程的nice值 PRI and NI PRI即进程的优先级此值越小进程的优先级别越高 NI就是nice值其表示进程可被执行的优先级的修正数值 PRI值越小越快被执行那么加入nice值后将会使得PRI变为 PRI(new)PRI(old)nice 当nice值为负值的时候那么该程序将会优先级值将变小即其优先级会变高则其越快被执行所以调整进程优先级 在Linux下就是调整进程nice值nice其取值范围是-20至19一共40个级别 用top命令更改已存在进程的nice top 进入top后按“r”–输入进程PID–输入nice值 一般情况下不建议修改进程的优先级了解即可。上下限20