一、进程process 过程(动态的过程)
1.1、进程
进程是程序的一次执行过程,是系统进行资源分配和处理机调度的一个独立单位
- 进行中的程序--正在运行中的程序
- 进程---程序的一次执行的过程
- 进程是程序的一个实例
- 程序 加载 到内存 运行起来 成为了 进程。
- 一个程序 可以 对应到多个进程
进程分类:
1、交互式进程 shell进程
2、批处理进程 shell脚本 .bat
3、守护进程 (后台进程) //前台进程
1.2、进程 vs 程序
1、./a.out 程序都在内存里面运行、程序跑起来的在内存变为进程
- 一个程序可以对应多个进程
- 程序 --- 静态---硬盘
- 进程---动态---内存
2、程序
程序中有啥:
程序 = 数据+代码
linux:
程序
bss --- 未初始化的数据 |
data --- 初始化了的数据 | 静态区 | ---数据
text --- 正文段(代码段)
程序
./a.out
进程: (占用 cpu ,内存相关的资源 ,IO资源(屏幕,键盘))
栈
堆 //程序运行过程中动态的内存
bss --- 未初始化的数据 |
data --- 初始化了的数据 | 静态区 | ---数据
text --- 正文段(代码段)
3、区别
程序:静态
存储在硬盘中代码,数据的集合
进程:动态
程序执行的过程,包括进程的创建、调度、消亡
.c ----> a.out-----> process(pid)
1)程序是永存,进程是暂时的
2)进程有程序状态的变化,程序没有
3)进程可以并发,程序无并发
4)进程与进程会存在竞争计算机的资源
5)一个程序可以运行多次,变成多个进程
一个进程可以运行一个或多个程序内存的分布
0-3G,是进程的空间,
3G-4G是内核的空间,虚拟地址
虚拟地址 * 物理内存和虚拟内存的地址 映射表 1page=4k
1.3、为什么需要进程?
1、单道程序
main()
{
while(1)
{
}
} //单道 程序
2、多道程序
程序1->|
程序2->|--- [CPU]-->
程序3->|
进程1->| 4G空间
进程2->|--- [CPU]-->
进程3->|
为了描述和管理 程序运行 动态过程
进程(操作系统为了 管理程序的动态运行提出了进程的概念)进程调度
1.4、PCB(process control block)进程控制块
1.5、进程的组成
程序的构成:代码+数据
[栈 ]
[堆 ]
[静态区(全局区)] //data --已初始化的 全局变量 或 静态变量
//bss --未初始化的 全局变量 或 静态变量
[字符串常量区 ]
[代码区 ] //text (正文) --代码段
data 初始化数据,bss 未初始化
可执行程序 a.out
bss /datat/text/ c程序编译就定下来
堆/栈/bss/data/text ./a.out 之后就产生了堆栈,其他三个不消失
进程 = PCB+进程的实体(也即是各个段)
PID(process id)每个进程都有唯一的id
1.6、进程的生命周期
具体解释
- 宏观并行,微观串行(cpu还是一个一个串进去的)
- 深度(不可中断态)、浅度(可中断),暂停用于代码调试阶段
- 僵尸态,进程的实体运行结束。
2、Linux 系统进程的状态
3、查询进程相关命令
1.ps aux | grep 进程名
查看进程相关信息
R ------- 运行或可运行 ----就绪态
S ---------可中断的睡眠态
D-----------不可中断睡眠态
T ------------暂停态
Z -------------僵尸态
2.top
根据CPU占用率查看进程相关信息
3.kill和killall发送一个信号
- kill PID
- 发送信号+PID对应的进程,默认接收者关闭
- kill -9 进程PID号
- kill -l //查看信号列表
- killall -9 进程名
- 发送信号 进程名对应的所有进程
- killall a.out //通过 进程名 发信号
- kill 信号编号 进程I
- Linux进程命令
- pstree -sp(查看指定的) pid号查看父子进程的关系(以树形图的方式展现)
ps-elf 查看父子id的号
ps aux (查看某个进程的id号以及状态) |(管道) grep表示搜素(程序名)
二、进程的创建
2.1、进程的创建
fork() // 叉子 - 树杈
- 功能;创建一个子进程,通过复制他调用的进程(复制父进程(调用函数))子进程和父进程分别在独立的内存空间
- 返回值类型 pid_t
- 返回值是-1 代表创建子进程失败
- 成功:
- 在父进程中 返回了 子进程的pid 号
- 在子进程 返回了 0
2.2、注意点
- pid 号 实际上是一个非负 整数
- 最小的pid号---------1
- 复制主要是复制他的实体
- 返回值是在父进程里面返回一次,在子进程里面返回一次。
- 32位的平台,每个进程拥有独立4G(3G的用户空间,1G的内核空间)站在进程角度。
- 每个进程运行在个自己独立的4G内存空间中。
- 父子进程间,数据相互独立,不受影响。
- 父子进程运行的顺序,不确定(谁先运行),取决于操作系统-----先调度谁。
- 僵尸态的状态,尽可能多的避免,对系统资源来说是一种消耗
- 2^32 // 1024
- 重定向 >: ./a.out > log.txt(本来在屏幕上输出,但是现在让输出到文本)
2.3、容易出错点
在被系统收养之后,自动变成后台程序,因此前台给其CTRL+c 对齐没有影响。
被init收养之后,不管咋结束都变成僵尸态,希望有人来关心态,回收资源。
多个fork之间的关系,总共是 2^n,生成 2^n -1