1.进程的概念
正在运行的程序,其运行过程中需要消耗内存和CPU。
main.c ---------->a.out ----------------->./a.out
应用程序 可执行程序 内存
硬盘 硬盘 cpu
程序和进程的区别
程序:静态的数据集合,存储在硬盘空间
程序运行起来可以产生进程;
一个程序可以产生多个进程进程:是一个程序动态执行的过程,需要消耗内存和CPU,
进程具备动态生命周期,从产生到调度再到消亡
一个进程中也可执行多个程序是操作系统资源分配的最小单位
2.进程的产生
进程产生时,操作系统都会为其分配0-4G的虚拟内存空间。
内核:
1. 文件管理
2. 进程管理
3. 内存管理
4. ...栈区:
1.保存局部变量
2.函数的形参和返回值
3.保存函数的调用关系(保护现场和恢复现场)堆区:
1. 由开发人员手动分配
2. 使用完要手动释放数据区:
data段:1. 已初始化的全局变量 2. 已初始化的静态变量
bss段:1.未初始化的全局变量 2. 未初始化的静态变量(static)-->bss段初始时按位清0
字符串常量区:1. 保存字符串常量 "hello world"
文本区:
1. 存放指令代码 2. 存放常量 eg:'A', 10
3.进程的调度
CPU:数据处理速度快
宏观并行,微观串行
cpu调度算法
1、时间片轮询算法
2、先来先服务,后来后服务(任务队列)
3、短作业优先调度
4、高优先级先执行,低优先级后执行
4.进程的状态
操作系统进程进程三态图:
Linux操作系统的进程状态:
1.运行态(用户运行态、内核运行态) R
正在执行,且被CPU任务调度所执行的进程
2.就绪态 R
正在执行,没有CPU任务调度执行的进程(只缺少cpu)
3.可唤醒等待态 S
也称为睡眠态,阻塞等待资源的进程
4.不可唤醒等待态 D
不想被CPU任务调度所打断的进程任务可以设置为不可唤醒等待态
5.暂停态 T
被暂停执行的进程
6.僵尸态 Z
进程执行结束,空间没有被回收7.结束态 X
进程执行结束,空间被回收
5. 进程的消亡
1. 进程执行结束(进程退出)
2. 回收进程资源空间
僵尸进程:进程退出后,但其资源空间未被父进程回收
如何避免僵尸进程产生:
1. 子进程退出后,父进程及时为其回收资源空间
2. 让该进程成为一个孤儿进程,结束时被操作系统中的系统进程回收孤儿进程:父进程先消亡,其对应的子进程成为一个孤儿进程,会被系统进程所收养
(守护类的进程)
6. 进程相关命令
PID:进程的ID号
PPID :父进程ID号
父进程:产生子进程的进程称为父进程
子进程:父进程产生出来的新进程即为该父进程的子进程
1. ps -aux 查看进程相关参数:PID、状态、CPU占有率、内存占有率
ps -aux | grep ./a.out
| : 管道 :前面命令的输出作为后面命令的输入
grep : 字符串查找:在输入中查找和后面字符串相关的数据
2. top 动态查看进程的相关参数:CPU占有率、内存占有率3. ps -ef 查看该进程的ID和父进程ID
4. pstree 查看进程的产生关系
pstree -p 查看进程的产生关系(有PID号)pstree -sp 进程PID号 查看某个指定的进程的产生关系
5. kill -信号的编号/信信号的名称 PID 向进程发送信号,让进程的状态发生变化
kill -l 查看系统支持的信号eg:杀死一个指定的进程
kill -9 PID
kill -SIGKILL PID
killall -9 进程名称有+号表示:前台进程
无+号表示: 后台进程
jobs 查看当前终端的后台进程
fg 后台进程编号 让后台进程切换成前台进程
7.进程相关编程
(1)进程创建
fork()
getpid(); 获取当前进程自己的PID号
getppid():获取当前进程父进程的PID号
头文件:
#include <sys/types.h>
#include <unistd.h>函数接口:
pid_t fork(void);
功能:通过拷贝父进程产生一个新的子进程
子进程完全拷贝父进程0-3G的虚拟内存空间
子进程拷贝父进程PCB(进程控制块)块中的部分内容:PID不拷贝
返回值:
>0 :父进程 ,是子进程的PID号
==0:子进程
-1 :出错
注意:
1. 子进程完完整整拷贝父进程0-3G虚拟内存空间。
2. 父子进程栈区、数据区、文本区、堆区完全独立,数据不共享
3. 要想共享数据,需要使用进程间通信方式实现
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{
int *p = malloc(sizeof(int));
*p = 100;
pid_t pid = fork();
if(pid > 0)
{
*p = 1000;
printf("ppid = %d, pid = %d, *p = %d\n",getpid(), pid, *p);
}
else if(0 == pid)
{
*p = 10000;
printf("pid = %d, ppid = %d, *p = %d\n", getpid(), getppid(), *p);
}
else
{
perror("fork error");
}
return 0;
}
(2)进程调度
操作系统完成
(3)进程消亡
进程退出:return、exit()相关函数
1)main中return
2) exit ()、_exit() :结束一个进程
exit (0) : 正常退出
exit (非0) :由于进程产生了某种问题,需要主动退出进程