住房和城乡建设部网站中国建造师网,怎样进行站点优化,wordpress媒体库加载不出来,建设信用卡网站登录进程的创建和回收
进程概念
概念 程序 存放在磁盘上的指令和数据的有序集合#xff08;文件#xff09; 静态的 进程 执行一个程序所分配的资源的总称 动态的进程和程序比较 注#xff1a;进程是存在RAM中#xff0c;程序是存放在ROM(flash)中的进程内容 BSS段#xff…进程的创建和回收
进程概念
概念 程序 存放在磁盘上的指令和数据的有序集合文件 静态的 进程 执行一个程序所分配的资源的总称 动态的进程和程序比较 注进程是存在RAM中程序是存放在ROM(flash)中的进程内容 BSS段存放程序中未初始化的全局变量 数据段已初始化的全局变量static声明的变量 代码段程序执行代码 堆heapmalloc等函数分配内存 栈(stack)局部变量函数参数函数的返回值 进程控制块pcb)PID 进程优先级文件描述符表进程控制块 进程标识PID、进程用户、进程状态、优先级、文件描述符表进程类型 交互进程在shell下启动在前台后台运行 批处理进程和在终端无关被提交到一个作业队列中以便顺序执行 守护进程和终端无关一直在后台运行进程状态 运行态、等待态、停止态、死亡态
进程常用命令
查看进程信息 ps 查看系统进程快照 top 查看进程动态信息 /proc 查看进程详细信息执行命令如下 ps当前shell显示 ps -e 所有进程显示 ps -el是显示详细信息具体命令参数信息如下 ps 命令详细参数 -e显示所有进程 -l长格式显示更加详细的信息 -f 全部列出通常和其他选项联用 表头 含义 F 进程标志说明进程的权限常见的标志有两个: 1进程可以被复制但是不能被执行 4进程使用超级用户权限 S 进程状态。进程状态。常见的状态有以下几种 -D不可被唤醒的睡眠状态通常用于 I/O 情况。-R该进程正在运行。-S该进程处于睡眠状态可被唤醒。-T停止状态可能是在后台暂停或进程处于除错状态。-W内存交互状态从 2.6 内核开始无效。-X死掉的进程应该不会出现。-Z僵尸进程。进程已经中止但是部分程序还在内存当中。-高优先级以下状态在 BSD 格式中出现。-N低优先级。-L被锁入内存。-s包含子进程。-l多线程小写 L。-位于后台。 UID 运行此进程的用户的 ID PID 进程的 ID PPID 父进程的 ID C 该进程的 CPU 使用率单位是百分比 PRI 进程的优先级数值越小该进程的优先级越高越早被 CPU 执行 NI 进程的优先级数值越小该进程越早被执行 ADDR 该进程在内存的哪个位置 SZ 该进程占用多大内存 WCHAN 该进程是否运行。-代表正在运行 TTY 该进程由哪个终端产生 TIME 该进程占用 CPU 的运算时间注意不是系统时间 CMD 产生此进程的命令名 实时查看进程命令如下 top 查看进程动态信息 shift 后翻页 shift 前翻页 top -p PID 查看某个进程改变进程优先级 nice 按用户指定的优先级运行进程 nice [-n NI值] 命令 NI 范围是 -20~19。数值越大优先级越低 普通用户调整 NI 值的范围是 0~19而且只能调整自己的进程。 普通用户只能调高 NI 值而不能降低。如原本 NI 值为 0则只能调整为大于 0。 只有 root 用户才能设定进程 NI 值为负值而且可以调整任何用户的进程。 renice 改变正在运行进程的优先级 renice [优先级] PID设置优先级案例如下 改变优先级案例如下 进程相关命令 jobs 查看后台进程 bg 将挂起的进程在后台运行 fg 把后台运行的进程放到前台运行 ctrl z 把运行的前台进程转为后台并停止案例代码如下 编写一个.c文件然后调用一个简单的sleep函数后执行test后在另一个端口查看进程如下 注上述是在运行函数后按ctrl Z使其进程进入停止状态T
创建子进程
子进程概念 子进程为由另一个进程(对应称之为父进程)所创建的进程实际上你在linux中写程序都是别人创建的比如运行.test文件时就是shell的子进程子进程创建-fork #include unistd.h pid_t fork(void); 创建新的进程失败时返回-1 成功时父进程返回子进程的进程号子进程返回0 通过fork的返回值区分父进程和子进程创建子进程案例如下 注创建子进程时虽然会复制父进程的代码但是不会从头开始执行而是从创建fork函数下方的时候执行所以子进程没有赋予相应的进程号但是系统默认给了0下面图片显示得很清楚 要点1 子进程只执行fork之后的代码 父子进程执行顺序是操作系统决定的。父子进程 子进程继承了父进程的内容 父子进程有独立的地址空间互不影响 若父进程先结束 子进程成为孤儿进程被init进程收养 子进程变成后台进程 若子进程先结束 父进程如果没有及时回收子进程变成僵尸进程父子进程案例如下 运行如下 注可以得出父子进程没有什么特定的关系是系统随机调用的通过父进程号看出子进程和父进程 在用kill -9 杀死父进程然后可以发现子进程的父进程PPID变成1也就是init进程中然后另一个终端ctrl c结束不掉说明以及变为后台进程了 注有些新版的ubuntu系统子进程可能被其他进程领养例如systemd作为最新的初始化系统init来提高系统的启动速度。这和进程1的init是一个道理不要疑惑。
子进程进阶例题
一个父进程拥有五个子进程代码如下 运行结果如下 注可以看出出现了孙进程的情形因为上述代码中for循环语句使子进程执行完fork函数下面的语句后由于for内部是一个循环语句因此子进程也执行了一次fork函数所以出现孙进程的情形解决办法如下 注在子进程语句中末尾加入break即可
进程的退出
进程结束-exit/_exit #include stdlib.h #include unistd.h void exit(int status); void _exit(int status);//不刷新流缓冲区 结束当前的进程并将status返回 exit结束进程时会刷新(流)缓冲区 return 和exit的区别 main函数结束时会隐式地调用exit函数普通函数return是返回上一级。案例如下 执行如下 注这里要注意exit(0)相当于return 0所以printf(“after exit”)不会被调用因此终端上不显示而且不要以为return在任何情况下都会隐式调用exit只有main函数下才会调用exit要牢记
进程的回收
进程回收-wait #include unistd.h pid_t wait(int *status); 成功时返回回收的子进程的进程号失败时返回EOF 若子进程没有结束父进程一直阻塞 若有多个子进程哪个先结束就先回收 status 指定保存子进程返回值和结束方式的地址 status为NULL表示直接释放子进程PCB,不接收返回值例子代码如下 注因为status里面包含地址和进程返回值不能直接输出需要通过宏来判断执行后使用ps查看进程的状态看是否由僵尸进程也就是判断exit是否收回子进程如下 查看注释wait那两行后的ps状态如下 注可以看出多出一个wait僵尸进程(即僵尸进程)进程回收-waitpid #include unistd.h pid_t waitpid(pid_t pid, int *status, int option); 参数 pid pid0时只等待进程ID等于pid的子进程不管其它已经有多少子进程运行结束退出了只要指定的子进程还没有结束waitpid就会一直等下去。 pid-1时等待任何一个子进程退出没有任何限制此时waitpid和wait的作用一模一样。 pid0时等待同一个进程组中的任何子进程如果子进程已经加入了别的进程组waitpid不会对它做任何理睬。 pid-1时等待一个指定进程组中的任何子进程这个进程组的ID等于pid的绝对值。 options options提供了一些额外的选项来控制waitpid目前在Linux中只支持WNOHANG和WUNTRACED两个选项这是两个常数可以用|运算符把它们连接起来使用 WNOHANG 若由pid指定的子进程未发生状态改变(没有结束)则waitpid()不阻塞立即返回0 WUNTRACED 返回终止子进程信息和因信号停止的子进程信息 wait(wait_stat) 等价于waitpid(-1,wait_stat,0)案例如下 注ps查看进程后也是回收的也可以将-1改为pid因为上面代码只有一个子进程有一个案例要注意下如下 执行如下 注可以得出在休息1s后下面的waitpid先执行然后WNOHANG的话上述也有解释若pid进程未发生状态改变返回0状态值也返回异常那么如何解决这个问题呢如下修改后代码代码如下 修改如下 注可以发现修改完成