我们使用多任务管理,那就要考虑进程与线程俩种命令,今天,我们来看看进程的相关知识:
进程
1.进程的概念
1.程序:是一段存放在外存中代码的集合(静态的)
2.进程:是一个程序动态执行的过程,包括创建、调度、消亡(动态的)
进程运行需要消耗两个主要资源:
cpu+内存
2.进程的创建:
进程创建后,操作系统为进程分配独立的(0 - 4G)的虚拟空间,内核只有一个。
进程是操作系统资源分配的最小单位。
进程空间包括:
1.文本区(.text)
存储代码和指令
2.数据区
1.字符串常量区
.rodata
2.未初始化静态变量/全局变量
.bss
3.已初始化静态变量/全局变量
.data
3.系统数据段
1.堆区
程序员手动管理区域
程序员负责申请(malloc)释放(free)
2.栈区(存放 1.局部变量
2.函数的形参和返回值
3.函数调用保护现场)
操作系统管理区域
操作系统负责申请释放
4.内核区域
1.CPU管理
2.内存管理
3.文件系统管理
4.硬件设备管理
5.进程管理
3.进程调度:
保障多个任务能同时执行
宏观并行
多个任务同时向下执行
微观串行
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
进程执行结束,空间被回收
普通进程状态分为3种:就绪态,执行态,阻塞态三种
5.进程相关命令:
1.ps -aux
查看进程状态
ps -aux|grep a.out
|管道:筛选与之相关的软件
2.top
根据CPU占用率;查看进程信息
q 退出
3.ps -ef
查看当前时刻进程信息
PID:子进程的ID号(唯一)
PPID:父进程的ID号
4.pstree
查看进程关系
pstree -p
查看所有进程关系及pid号
pstree -sp + 进程id号
查看某一进程关系
5.kill
killall
给进程发送一个信号
kill -9 进程PID
killall -9 进程名
6.jobs
查看当前终端下的后台执行任务
7.fg 编号
让一个后台执行的任务放到前台执行
6.进程创建关系:
父子进程:
父进程:创建新进程的进程称为新进程的父进程
子进程:被创建的进程称为原进程的子进程
内核进程
systemd进程(1)
所有进程任务
7.进程相关接口:
1.fork :
pid_t fork(void);
一次调用,会返回两次。
子进程先运行还是父进程先运行,顺序不确定。变量不共享。
子进程复制父进程的0到3g空间和父进程内核中的PCB,但id号不同。
功能:通过该函数可以从当前进程中克隆一个同名新进程。
克隆的进程称为子进程,原有的进程称为 父进程。
子进程是父进程的完全拷贝。
子进程的执行过程是从fork函数之后执行。
子进程与父进程具有相同的代码逻辑。
参数:
缺省
返回值:
失败返回-1
成功父进程中返回子进程的PID
子进程中返回0
2.getpid
pid_t getpid(void);
功能:
获得调用该函数进程的pid
参数:
缺省
返回值:
进程的pid
3.getppid
pid_t getppid(void);
功能:
获得调用该函数进程的父进程pid号
参数:
缺省
返回值:
返回父进程id号
作业习题:
1.进程对文件的操作
创建两个进程,分别向一个文件以不同的频率写入:不同数据+时间戳+写入者pid
2.动态生成5个子进程,并打印输出各自进程的pid号