进程的一点点内容

进程

1.概念
1.1 进程的概念

进程是程序执行和资源管理的最小单位,每一个程序被运行后会产生一个进程,系统会为其分配一个0-4G的虚拟内存,这个虚拟内存会被内存管理单元映射到物理内存

1.2 进程和程序的区别

在这里插入图片描述

1.3 进程包含的内容

bss段:存放程序中未初始化的全局变量

data段:存在初始化过的全局变量

text段:存放程序代码

堆:malloc申请的空间

栈:局部变量、函数参数、函数的返回值

进程控制块(pcb):包括PID、进程优先级、文件描述符表等

1.4 进程的类型

交互进程:完成人机交互的,比如shell

批处理进程:比如:gcc(四步流程)

守护进程:开机自启动,关机自动关闭(后台进程)

1.5 进程的状态

在这里插入图片描述

2.进程相关命令
2.1 ps
ps		查看系统进程快照

ps 命令详细参数

-e:显示所有进程

-l:唱歌时显示更加详细的信息

-f:全部列出,通常和其他选项连用
表头含义
F进程标志,说明进程的权限,常见的标志有两个: · 1:进程可以被复制,但是不能被执行
4:进程使用超级用户权限;
S进程状态。进程状态。常见的状态有以下几种:
1. -D:不可被唤醒的睡眠状态,通常用于 I/O 情况。 2. -R:该进程正在运行。
3. -S:该进程处于睡眠状态,可被唤醒。
4. -T:停止状态,可能是在后台暂停或进程处于除错状态。
5. -W:内存交互状态(从 2.6 内核开始无效)。
6. -X:死掉的进程(应该不会出现)。
7. -Z:僵尸进程。进程已经中止,但是部分程序还在内存当中。
8. -<:高优先级(以下状态在 BSD 格式中出现)。
9. -N:低优先级。
10. -L:被锁入内存。
11. -s:包含子进程。
12. -l:多线程(小写 L)。
13. -+:位于后台。
UID运行此进程的用户的 ID;
PID进程的 ID;
PPID父进程的 ID;
C该进程的 CPU 使用率,单位是百分比;
PRI进程的优先级,数值越小,该进程的优先级越高,越早被 CPU 执行;
NI进程的优先级,数值越小,该进程越早被执行;
ADDR该进程在内存的哪个位置;
SZ该进程占用多大内存;
WCHAN该进程是否运行。"-"代表正在运行;
TTY该进程由哪个终端产生;
TIME该进程占用 CPU 的运算时间,注意不是系统时间;
CMD产生此进程的命令名;
2.2 top
top 	查看进程动态信息
shift +> 后翻页
shift +< 前翻页
top -p PID  查看某个进程
2.3 nice
nice   按用户指定的优先级运行进程
     nice [-n NI值] 命令
NI 范围是 -20~19。数值越大优先级越低
普通用户调整 NI 值的范围是 0~19,而且只能调整自己的进程。
普通用户只能调高 NI 值,而不能降低。如原本 NI 值为 0,则只能调整为大于 0。
只有 root 用户才能设定进程 NI 值为负值,而且可以调整任何用户的进程。

2.4 renice
renice   改变正在运行进程的优先级
	renice [优先级] PID
2.6 jobs
jobs	查看后台进程
2.7 bg
bg     将挂起的进程在后台运行
2.8 fg
fg      把后台运行的进程放到前台运行
3. 进程相关API
3.1 创建子进程
#include <unistd.h>
pid_t fork(void)
	创建新的进程,失败时返回-1
	成功时父进程返回紫禁城的进程号,子进程返回0
	通过fork的返回值区分父进程和子进程

注:1.子进程只执行fork之后的代码

​ 2.父子进程执行顺序是操作系统决定的

​ 子进程继承了父进程的内容,父子进程有独立的地址空间,互不影响。

若父进程先结束:

​ 子进程成为孤儿进程,被init进程收养

​ 子进程变成后台进程

若子进程先结束

​ 父进程没有及时回收资源,子进程变成僵尸进程

​ 子进程先于父进程退出,但是父进程还未去回收子进程的退出资源(task_struct类型的变量),此时的子进程就会沦为僵尸进程,僵尸进程出现浪费空间以及会出现资源泄露的问题,因此要尽可能避免僵尸进程的产生。(通过wait或者waitpid函数实现让父进程回收子进程的退出资源)

3.2 进程的退出
#include <stdlib.h>
#include <unistd.h>

void exit(int status)
会清除缓冲区
void _exit(int status)
不会清除缓冲区
3.3 进程的回收
#include <unistd.h>

pid_t wait(int *status)
	status:指定保存子进程返回值和结束方式的地址
	status为NULL时,表示直接释放子进程PCB,不接收返回值
	成功返回回收子进程的进程号,失败返回EOF
	若子进程没有结束,父进程一直阻塞
	若有多个子进程,那个先结束就先回收
#include <unistd.h>
pid_t waitpid(pid_t pid,int *status,int option)
	pid:
		pid>0时,只等待进程ID等于pid的子进程,不管其他已经		有多少子进程运行结束退出,只要指定的子进程还没结束,		  waitpid就会一直等下去
		pid=-1时,等待任何一个子进程退出,没有任何限制,此	  时waitpid和wait的作用一模一样
		pid=0时,等待同一个进程组的任何子进程,如果子进程已	  经加入了别的进程组,waitpid不会对它做任何理睬
		pid<-1时,等待一个指定进程组中的任何人子进程,这个	  进程组的ID等于pid的绝对值
	option:
		WNOHANG,若由pid指定的子进程未发生状态改变(没有		 结束),则waitpid()不阻塞,立即返回0
		WUNTRACED,返回终止子进程信息和因信号停止的子进程		 信息
	
4. gdb调试多进程命令
set follow-fork-mode child     设置GDB调试子进程
set follow-fork-mode parent    设置GDB调试父进程
set detach-on-fork  on/off     设置GDB跟踪调试单个进程或多个
on: 只调试父进程或子进程的其中一个,(根据follow-fork-mode来决定),这是默认的模式
off:父子进程都在gdb的控制之下,其中一个进程正常调试(根据follow-fork-mode来决定),另一个进程会被设置为暂停状态。
info inferiors    显示GDB调试的进程
inferiors  进程序号(1,2,3....)  切换GDB调试的进程
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值