Linux进程2.0
1.进程理解:
进程就是pcb结构对象加自己的代码数据----这个pcb结构里面包含了所有进程的属性信息
2.通过系统调用创建进程:
fork初识:对于fork的介绍首先就是fork函数有两个返回值,这一点是比较罕见的。
图中代码段:
#include<stdio.h>
#include<unistd.h>
int main()
{
printf("process\n");
pid_t id=fork();
// pid_t id=getpid();
if(id==0)
{
while(1)
{
printf("son process:pid :%d,ppid:%d\n",getpid(),getppid());
sleep(1);
}
}
else if(id>0)
{
while(1)
{
printf("parent process:pid :%d,ppid:%d\n",getpid(),getppid());
sleep(1);
}
}
else
{
printf("errror\n");
}
//printf("hello hush\n");
// printf("PID: %d\n",getpid());
// sleep(1);
return 0;
}
返回不同的返回值目的就是为了区分让不同执行流,执行不同的代码块
一般而言fork之后的代码是父子共享的,给父进程返回子进程的pid是为了让父进程(父亲)可以区分每一个子进程(儿女)
我们为什么要创建子进程?为了让父与子执行不同的事情,需要想办法让父与子执行不同的代码块
下面这张图帮你了解fork函数究竟干了什么?
关于为什么可以让父子共享代码是因为:代码是不可以被修改的,而数据不能共享是因为数据是可以修改的!
- 进程创建:Linux 中
fork
函数创建子进程,通常借助写时拷贝,父子进程先共享内存页,当任意一方试图修改内存页数据时,才复制对应内存页,生成独立副本。这样能快速创建子进程,减少内存占用。
父子进程被创建好,fork()往后是谁先运行,是由调度器决定的。
这里介绍一个实时查看进程的命令:
while :; do ps axj | head -1;ps axj | grep proc |grep -v grep;echo "---------------------------";sleep 1;done
3.进程状态:
先简单介绍一下OS中的一些进程状态:
在操作系统里,你可以把进程想象成一个个正在处理任务的 “小助手”,它们有不同的工作状态。运行状态就是某个 “小助手” 正占用着 CPU(相当于拥有了工作场地和工具),全力处理着任务 ;阻塞状态则是 “小助手” 在等待一些条件满足才能继续工作,比如在等其他同事传递数据、等打印机完成打印等,即便给它工作场地(CPU),它也没办法干活;挂起状态呢,就像是内存(工作空间)不够用了,操作系统把一些暂时用不到的 “小助手” 的资料(进程数据和代码)先移到外存(比如磁盘,相当于仓库)存放,等后续内存空间足够或者有其他合适条件时,再把这些 “小助手” 的资料调回内存继续工作。
每一个进程都有一个叫做:时间片的概念
运行态R:
阻塞态:
大量的把进程从CPU是放上去;拿下来的动作叫做进程切换。
挂起在操作系统内存资源不足的时候,把阻塞状态的进程换出到磁盘中,这个等待内存资源OK,这个状态叫挂起状态,等内存资源好了再换入
4.在Linux系统下状态是如何维护的:
- R 运行状态(running):并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里。
- S 睡眠状态(sleeping):意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠(interruptible sleep))。
- D 磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待 IO 的结束。
- T 停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行。
进入断点位置,进程状态变为了追踪暂停
- X 死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态。
僵尸进程危害
- 进程的退出状态必须被维持下去,因为它要告诉关心它的进程(父进程)任务完成情况。若父进程一直不读取,子进程就一直处于 Z 状态。
- 维护退出状态需用数据,这属于进程基本信息,存于 task_struct (PCB) 中。即 Z 状态不退出,就一直要维护 PCB。
- 若一个父进程创建很多子进程却不回收,会造成内存资源浪费。因为数据结构对象会占用内存,如同 C 中定义结构体变量需在内存开辟空间。
- 这会导致内存泄漏。
如果子进程先结束(pid) 父进程不受影响,但是如果父进程ppid先结束了,那子进程也会继续执行但是子进程的父进程就会更新为1ppid,此时的1就是操作系统。
5.进程优先级
基本概念
- cpu 资源分配的先后顺序,就是指进程的优先权(priority)。
- 优先权高的进程有优先执行权利。配置进程优先权对多任务环境的 linux 很有用,可以改善系统性能。
- 还可以把进程运行到指定的 CPU 上,将不重要的进程安排到某个 CPU,可大大改善系统整体性能 。
PRI and NI
- PRI 即进程的优先级,也就是程序被 CPU 执行的先后顺序,此值越小进程的优先级别越高。
- NI 即 nice 值,表示进程可被执行的优先级的修正数值。
- PRI 值越小越快被执行,加入 nice 值后,PRI 变为:PRI (new)=PRI (old)+nice。
- 当 nice 值为负值时,程序优先级值变小,优先级变高,越快被执行。
- 在 Linux 下调整进程优先级,就是调整进程 nice 值,nice 取值范围是 - 20 至 19,共 40 个级别。
PRI vs NI
- 进程的 nice 值不是进程的优先级,二者概念不同,但 nice 值会影响进程优先级变化。
- nice 值是进程优先级的修正数据 。