基本概念
在计算机结构中,进程是程序的基本执行(担当分配系统资源,包括像CPU时间,内存空间)的实体。
通俗来说,进程就是我们具体执行程序的那个过程。当我们执行一段代码时,就是一个进程。
而每一个进程都有属于本进程的一些属性信息。这些信息被存放在内核的一个结构体当中。包括像进程的标识符,状态,优先级等信息。
在linux操作系统中,可以在/proc
系统文件夹中查看。
创建进程
一般我们可以通过fork()
函数来创建一个进程。当我们通过fork()
创建一个进程时,如果创建成功,会返回一个值
- 如果这个值是大于0的,则意味着这是一个父进程
- 如果这个值是等于0的,则意味着这是一个子进程
- 如果这个值是小于0的,则意味着进程创建失败。
所以我们一般在创建一个进程后,需要对程序进行分流。让父子进程完成相对应的工作。
虽然父子进程执行的意义不一样。但是父子进程是会共享代码的。但是在进程创建后,再改变的的值是不会共享的。例如原本有a=5; 在子进程中改为1=10;此时在父进程中的a依然还是5。
int main(){
int a=5;
int pid =fork();
if(pid == 0){
a=10;
cout<<"this is child"<<getpid()<<": "<<a<<endl;
}
else if(pid>0){
sleep(2);
cout<<"this is parent"<<getpid()<<": "<<a<<endl;
}
return 0;
}
执行上面的代码可以看到控制台打印信息:
进程状态
一个进程是拥有很多状态的。虽然我们在使用计算机时,可以开启很多进程。但是实际上进程还是一个一个交叉执行的。这也是并发的概念。
当我们的计算机有用多核时,就可以同时运行多个进程,这也叫做并行。
所以一个进程除了在运行中——运行状态。还有:
睡眠状态——即进程在等待其他时间的完成
休眠状态 僵尸状态 孤儿进程 停止状态 死亡状态。
死亡状态是指返回状态。所以我们是看不到一个任务列表里的进程处于死亡状态的。
我们可以通过命令ps
一系列命令来查看进程状态
UID: 执行者
PID: 进程号
PPID:父进程号
PRI:执行优先级。(越小优先级越高)
NI:进程的NICE 值
进程优先级
通过上面我们可以看到 我们注意到两个PRI NI 两个信息。PRI即一般来说进程的优先级。进程的优先级会决定cpu执行进程的顺序。一般进程的PRI值为80。
NI值是对进程优先级修正。取值是-20~19的值。一共四十个级别。
当接入NI值时,进程的优先值就会变为PRI+NI的新值。
当我们需要改变一个进程的NI值时,可以利用
命令top
->r
->输入进程的PID->输入NI值
我们就将进程的PID为12431的进程NI值改为了19。