更多知识点:linux目录索引
进程
概念
从用户角度:进程就是程序的一次动态执行过程
从操作系统角度:操作系统分配内存,CPU时间等系统资源的基本单位
特点
1.每一个进程都有自己独立的虚拟地址空间和进程状态
2.进程是分配资源的最小单位(基本单位)
进程和程序的区别和联系
联系:
1.程序=文件(静态的可执行文件)
2.进程=执行中的程序=程序+执行状态
3.同一个程序的多次执行对应为不同的进程(ls的多次执行对应多个不同进程)
4.进程执行需要的资源:内存(保存代码和数据)+cpu(执行指令)
区别:
1.程序是静态的,进程是动态的
程序是有序代码的集合 进程是程序的执行,进程有内核态/用户态
2.进程相对于程序的生命周期是短暂的,程序是永久的
3.进程有PCB的数据结构
程序:数据段+代码段 进程:代码段+数据段+堆栈+PCB
4.一个进程只能对应一个程序,一个程序可以对应多个进程
进程控制块(PCB)
概念:
操作系统感知一个进程存在的重要数据结构,进程存在的唯一标识,操作系统管理控制进程运行所用的信息集合
原因:
进程是程序的一次执行过程,需要保存进程的现场信息,这些信息需要一个数据结构来保存,在c语言中用结构体,我们将这个结构称为PCB
使用:
进程创建—-生成该进程的PCB
进程终止—-回收PCB
进程的组织管理—-通过PCB的组织管理来实现PCB中包含的信息
进程标识符
进程状态
进程间的通信信息
进程优先级
各种时间信息
内存使用情况
寄存器的信息(保存现场)PCB组织形式
线性形式
不分状态组织在一个连续表中
优点:简单,不需要额外开销,适用于进程数目不多的系统
缺点:需要扫描整个PCB表
索引方式
对于具有相同状态的进程,分别设置各自的PCB索引表,表目为PCB在PCB表(线性表)中的地址。
两种表:就绪索引表和等待索引表
进程状态
进程的动态性表明进程在其生存期内需要经历一系列的离散状态。
- 进程的三种状态
运行状态(Running): 指进程已获得CPU,并且在CPU上执行的状态。显然,在一个单CPU系统中,最多只有一个进程处于运行态。
就绪状态(Ready): 指一个进程已经具备运行条件,但由于没有获得CPU而不能运行所处的状态。一旦把CPU分配给它,该进程就可运行。处于就绪状态的进程可以是多个。
等待状态(Waiting): 也称阻塞状态(Blocked)或封锁状态。是指进程因等待某种事件发生而暂时不能运行的状态。
- linux下进程的七态
运行状态:不意味着进程一定在运行中,表明进程要么在运行中要么在运行队列中
可中断睡眠:进程在等待时间完成
不可中断睡眠(磁盘休眠状态):进程通常等待IO结束
暂停(停止):可以通过发送SIGTOP信号给进程来停止进程。这个停止的进程可以通过发送SIGCONT信号让进程继续进行
死亡:只是一个返回状态,不会在任务列表中看到
进程标识符
操作系统会给每个进程分配一个独一无二的编号
编号的范围:[2-cat /proc/sys/kernel/pid_max]
查看进程
ps aux | grep 03Fork.c | grep -v grep
进程死亡状态
僵尸进程
如果子进程死亡,父进程存在,子进程称为僵尸进程。
僵尸进程会占用少量系统资源。
僵尸进程有害,僵尸进程不可人为杀死,会一直等待父进程死亡
僵尸进程的危害
PCB会一直维护僵尸进程
内存资源的浪费
内存泄露
例子:一个维持30秒僵尸进程
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<stdlib.h>
int main()
{
pid_t id= fork();
if(id<0)
{
perror("fork");
return -1;
}
else if(id>0)
{
//父进程
printf("parent[%d] is sleeping...\n",getpid());
sleep(30);
}
else
{
printf("child[%d] id begin z...\n",getpid());
sleep(5);
exit(EXIT_SUCCESS);
}
return 0;
}
效果:
孤儿进程
如果父进程死亡,子进程存在,子进程称为孤儿进程。
孤儿进程托管给1号进程,1号进程为孤儿院
例子:
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main()
{
pid_t id=fork();
if(id<0)
{
perror("fork");
return -1;
}
else if(id==0)
{
//子进程
printf("I am child,pid: %d\n",getpid());
sleep(10);
}
else
{
printf("I am parent,pid: %d\n",getpid());
sleep(3);
exit(0);
}
return 0;
}
进程优先级
概念
cpu分配资源的先后顺序,指进程的优先级优先权高的进程有优先执行的权利。配置进程优先权可以改善系统的性能
查看系统的进程:ps -l
修改进程优先级:nice -n(调整的数值) 程序名
修改nice值,:-20~19,共40个级别
nice为负,优先级值变小,优先级升高
nice为正,优先级值变大,优先级降低
修改已存在的程序优先级:renice -n(调整值) -p 进程ID
top命令修改已存在的进程的nice:
top
进入top后,按‘r’->输入进程PID->输入nice值