Linux系统下的进程控制管理(保姆级概念+fork代码)

Linux系统下的进程控制管理(保姆级概念+fork代码),第1张

这次先说废话,再上代码!

一、进程 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,具体相关内容请关注下个博客。)

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/2991790.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-09-23
下一篇 2022-09-23

发表评论

登录后才能评论

评论列表(0条)

保存