这次先说废话,再上代码!
一、进程 1、进程概念(1)、程序:二进制文件,占用的磁盘空间
(2)、进程:启动的程序
(3)、所有的数据都在内存中
(4)、需要占用更多的系统资源
(5)、占用CPU,物理内存
2、并行和并发(1)、并发:指在 *** 作系统中,一个时间段中有几个程序都处于已启动运行完毕之间,这几个程序在同一个处理机上运行。(多个事情,在同一时间段内同一个CPU上同时发生)
并发不是真正意义上的 “ 同时进行 ” ,只是 CPU 把一个时间段划分成几个时间片段(时间区间),然后在这几个时间区间之间来回切换,由于 CPU 处理的速度非常快,只要时间间隔处理得当,即可让用户感觉是多个 用程序同时在进行。如:打游戏和听音乐两件事情在 同一个时间段内 都是在同一台电脑上完成了 从开始到结束的动作 。那么,就可以说听音乐和打游戏是并发的。
(2)、并行:当一个系统有多个CPU时,当一个CPU执行一个进程时,另一个CPU可以执行另一个进程,互不抢占CPU资源,可以同时进行,这种方法就叫并行。(多个事情,在同一时间点,多个CPU上同时发生)
其实决定并行的因素不是 CPU 的数量,而是 CPU 的核心数量,比如一个 CPU 多个核也可以并行
3、PCB(进程控制块)
每个进程在内核都有一个进程控制块(PCB)来维护相关信息,Linux内核的进程控制块是task_struct结构体。
(1)、进程ID:系统中每个进行都有唯一的ID,在C语言中用pid_t类型表示,为非负整数表示。
(2)、进程的状态,有就绪、运行、挂机起、停止等状态。
(3)、描述虚拟地址空间的信息。
(4)、拥有文件描述符,包含很多指向FILE结构体的指针。
(5)、表示当前工作目录。
4、进程状态进程基本的状态有五种,分别为初始态、就绪态、运行态、挂起态和终止态。(不过最重要的是其中的就绪态、运行态、终止态)
其中初始态为进程准备阶段,常常与就绪态结合来看。
二、进程控制 1、fork函数(1)、一个进程,包括代码、数据和分配给进程的资源。
(2)、fork函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事情,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事情。
(3)、一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码空间,然后把原来进程所有值都复制到新的进程中,不过只有少数值不一样,说白了就相当于克隆了一个自己。
eg:定义全局变量为int i=100;如果父进程i+200,那么父进程输出就是300;那么子进程i+500,那么子进程输出就是600
头文件:
#include
#include
函数原型:
pid_t fork(void);
两个返回值:
==0 当前进程为子进程;
>0 当前进程为父进程;
-1 error;
注:
(1)、fork后用户数据一样,进程ID不一样。
(2)、父子进程执行顺序不一定都是父进程先。
(3)、 getpid与getppid函数区分父子进程。
(4)、子进程的getppid表示为其父进程ID,就是程序原来父进程的ID,二者是一样的。
getpid:得到当前进程PID;
getppid:得到当前父进程的PID;
代码来咯(请在Linux系统下运行,window运行会报错):
#include
#include //后两个头文件是Linux系统内部独有的
#include
//pid_t fork(void);
int num=100;
int main(int argc,char *argv[]){
int i=0;
pid_t pid;
pid=fork();
if(pid >0){
printf("This is father process: %d,num=%d\n",getpid(),num+200);//num==300
}
else if(pid==0){
printf("This is chird process: %d,father is %d,num=%d\n",getpid(),getppid(),num+400);//num==500
}
for(i=0;i<4;i++)//父子进程都会调用这个程序并输出
{
printf("i = %d\n",i);
}
return 0;
}
温馨提示:若程序中父子进程进入死循环,例如加上while(1),可以在Linux的命令终端中按CTRL+C终止程序;但是父子进程某一个被后台挂起运行,按CTRL+C无法终止程序,那么可以再开一个终端,输入kill -9 +当前无法终止进程的ID。(注意:+不要加上,eg kill -9 6079,具体相关内容请关注下个博客。)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)