提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:以下是本篇文章正文内容,下面案例可供参考
一、进程的基本概念?
1.进程与程序的区别
程序:存放在外存一段代码集合
进行是一个动态执行的过程:
包括进程的创建、调度和消亡
二、创建进程
1.进程的创建
开辟 0 - 4G虚拟内存空间 其中内核1G,栈的空间为8兆
系统数据段:
堆栈
数据段:
字符串常量区
未初始化全局变量或者静态变量
初始化全局变量或者静态变量
代码段:
2.进程的调度
1.单核cpu情况下,微观并行,宏观串行
运行进程信息都会放在一个结构体中,内核通过管理链表管理进程
2.进程调度算法
1.先来先执行,后来后执行
2.按高优先级调度算法
3.时间片轮转调度算法
4.多级队列反馈调度算法
5.负载均衡算法
时间片:cpu在执行任务的时候执行一段时间
3.进程的消亡
孤儿进程:子进程没有结束,父进程先结束,子进程会成为孤儿进程,会被init进程收养
僵尸进程:执行代码结束,空间没有被回收
僵尸进程产生的原因:
1.子进程没有结束,父进程没有回收子进程的空间,子进程就会成为僵尸进程
避免产生僵尸继承:
1.父进程回收子进程空间
2.父进程先结束
三、进程的状态
就绪态/运行态:R 程序在按时间片运行时,还没运行到
可换醒等待态: S 由于缺少 某些资源,如read
不可唤醒态: D 系统启动时候
暂停态: T 程序内部设置停止
僵尸态: Z 进程任务结束但是空间没有释放
结束态: X
四、进程相关的命令
1.在后台执行任务
./a.out &
2.查看后台任务
ps
jobs
3.将后台任务放到前台
fg加任务编号
4.杀死进程
kill -9 进程PID
killall -9 进程名
5.根据cpu占用率擦查看当前进程任务
top
6.查看当前所有任务PID及父进程PID
ps -ef
7.查看所有进程的状态
ps -aux
8.以-10优先级执行进程
sudo nice -n -10 进程名
9.重新设置进程任务优先级
sudo ranice -n -10 进程PID
五、函数接口
函数接口:
1.fork
同步:执行上有一定的时间关系
异步:执行方面谁先谁后没有关系
fork创建父子进程是异步关系,谁执行的哪没有关系。
pid_t fork(void)
功能:创建一个进程,将0-4G虚拟内存空间拷贝一份,父子代码段完全一样执行的功能不同。
参数:无
返回值: pid=-1fork失败
pid=0代表子进程
pid)0代表父进程
2.exit(int status)
功能:结束进程
参数
返回值
3._exit
功能:结束进程
参数
返回值
两者的区别是
(1) exit 是库函数 _exit是系统调用
(2)exit()清理注册函数,刷新缓存区,调用_ecit,exit是直接结束进程
4.int atexit(void (*function)(void));
功能:注册函数
参数:函数指针,当事件不确定什么时候发生,函数参数为指针函数
返回值:空
5.pid_t wait(int *status)
功能:回收子进程空间
参数:status:存放子进程结束状态空间首地址
返回值:
成功返回收到的子进程的PID
失败返回-1
注意
1.wait具有阻塞功能,
2.wait可以实现父子进程同步
关于status有几个带参宏
WIFEXITED(status)
判断子进程是否正常结束
WEXITSTATUS(status)
返回进程结束的值
WIFSIGNALED(status)
返回是由那个信号结束的
WTERMSIG(status)
杀死进程的编号
6.pid_t waitpid(pid_t pid, int *status, int options);
功能:回收进程空间
参数:pid:
< -1 回收子进程组ID与传入pid值绝对值相同的子进程空间
== -1 回收任意子进程
== 0 回收子进程组ID与调用函数进程PID相同的子进程空间
> 0 回收传入pid的值所对应的空间
status存放子进程结束状态空间首地址
options
0 是非阻塞
WNOHANG 阻塞回收
返回值:
成功返回子进程的pid
失败返回-1
设置WNOHANG,没有收到子进程空间返回0
会话组:
同一个终端下所有进程都会在一个会话组
进程组:
会话组分为前台进程组喝后台进程组
六、exec组函数
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg,
..., char * const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[],
char *const envp[]);
功能:
利用进程空间执行另外一段代码
参数:
path:代码的路径
file:代码的名字
返回值:
成功执行另一段代码
失败返回-1
execl参数以列表的形式
execv参数与指针数组的形式
execlp:在环境变量PATH对应路径下查找该文件
执行系统命令
char *getenv(const char *name);
功能:
获取系统环境变量
参数:
name:环境变量名的首地址
返回值:
返回成功返回变量内容字符串首地址
int setenv(const char *name, const char *value, int overwrite)
功能:
设置环境变量
参数:
naem:设置环境变量的名字
value:环境变量的值
overwrite:
非0 覆盖
0 不覆盖
返回值:
成功返回0
失败返回-1
int system(const char *command);
system = fork + execlp
在代码执行终端命令