进程控制
1、什么是进程:进程是可并发执行的程序,是一个在数据集合上的运行过程
当一个程序开始执行后,在开始执行到执行结束的这段时间里,它内存中的部分被称为进程
通俗讲:程序:在硬盘上的可执行文件
进程:在执行中的程序
2、什么是并发
多个进程同时运行,多个任务同时执行
3、虚拟内存
Linux虚拟内存管理技术:
物理内存:实际在处理器中的内存模块 几百M
将硬盘中的一部分存储单元拿来当内存使用 4G(受操作系统的寻址范围的影响)
0x0000000-0xfffffff
操作系统:内核空间 和 用户空间
高地址1G 低地址3G
好处:1、有效防止内核空间被破坏
2、防止恶意窥探 虚拟内存防止恶意窥探
虚拟地址由什么组成:物理内存+偏移量
3、拓展内存空间
进程的分类
1、守护进程
2、批处理进程
3、交互进程
进程的ID(PID):是唯一的数值,用来区分进程
父进程的ID:PPID
启动进程的用户ID:UID
进程的状态:运行R,休眠S,僵尸进程Z
进程优先级
进程占用资源的大小(内存,cpu)
6、进程控制模块PCB:数据结构
进程号 ps命令查看Linux系统中的进程(ps -aux | grep 进程)
l:长格式输出
u:按用户名和启动时间的顺序来显示进程
f:用树状格式来显示进程
a:显示所有用户的所有进程
x:显示无控制终端进程 (aux)
%CPU占的CPU百分比
%MEM占的内存百分比
TTY终端Id
STAT进程状态
START进程开始时间
TIME进程消耗cpu的时间
COMMAND命令参数的名称
I< 这个符号代表进程的优先级比较高
s+ 位于后台的进程
kill:
kill+进程号(ps -aux 查看进程之后里面的PID)
-9:强制终止
pkill:pkill+程序名 = killall
xkill:在桌面上杀死图像化界面
renice:改变进程的优先级,通过进程ID(PID)来改变谦让度,进而达到改变进程的优先级
renice 谦让度 PID
7、进程的状态转换
(1)就绪:当进程已分配到除CPU以外的所有必要资源,只要获得处理器就可以执行
(2)执行:已经获取处理器,其程序正在处理器上执行
(3)阻塞:正在执行的进程,由于等待某个事件的发生而无法执行时,便放弃处理机会而处于阻塞状态
并发的本质
时间片轮巡
8、linux进程调度
1)FCFS也叫FIFO,先来先处理;缺点:对于短的任务可能变得非常缓慢
2)时间片轮巡算法:周期性的切换总体时常比FIFO短
3)STCF:短任务优先算法
抢占式和非抢占式
4)银行家算法:
优先级反转
9、创建一个进程
fork()函数:它是有两个返回值
0:子进程
-1:失败
getpid():获取进程识别码
getppid():获取当前父进程号
父进程与子进程跑在不同的内存空间中:父进程与子进程有自己独立的内存空间
早期:fork函数运行之后,子进程会复制父进程的堆栈数据空间(调用时复制)
优化:读时不管,写时复制(虚拟内存存在的原因)
fork函数 创建的父子进程关系时竞争关系,不能判断是谁先动
vfork() :创建一个进程的
1、保证子进程先动
2、当子进程调用exit()函数后,父进程往下执行
3、不会继承父进程的页面;
eg:
1、创建两条进程,一条输出A,一条输出B,交替输出ABABABABABAB
2、三进程,交替输出ABC
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<stdlib.h>
int main()
{
int i=0;
FILE *fp;
fp=fopen("./text.txt",“w+”);
for(i=0;i<6;i++)
{
pid_t pid=vfork();
if(-1 = =pid)
{
perror(“error!”);
exit(1);
}
if(0= =pid)
{
printf(“A\n”);
exit(1);
}
else
{
int pid=vfork();
if(-1= =pid)
{
perror(“error!”);
exit(1);
}
if(0==pid)
{
printf(“B\n”);
exit(1);
}
else
{
printf(“C\n”);
}
}
fclose(fp);
}
}
进程优缺点
优点:
对用户来说操作系统变得更加健壮,(一个应用程序无法破坏另一个进程或操作系统的运行)
对于开发者来说,更容易进行内存的读取和写入
缺点:
多任务实现开销比较大
编写能够与其他进程通信或者能够对其他进程操作的应用程序将要困难得多