进程基础

      我们都知道,任何一台计算机上都有一个管家,即操作系统(OS),对于用户,它帮助我们方便的应用用户程序,为用户程序提供良好的运行环境,对于计算机,它管理所有的硬件资源,合理的对各类作业进行调度。

早期,为了提高计算机的工作效率,提高计算机的资源利用率,增加系统的吞吐量,我们[希望程序可以并发执行,便引入了进程。

1. 进程的概念

       进程简单理解就是程序运行的动态执行过程,是一个独立运行的活动实体。换句话说,进程是具有独立功能的程序在一个数据集合上运行的过程,是系统进行资源分配和调度的一个独立单位。

2. 对进程的管理

     为了实现对进程的描述和管理,操作系统为之配置了专门的数据结构,称为进程控制块( Process Control Block, PCB ),(Linux 下称为task_struct ).系统利用PCB来描述和组织进程的基本情况和活动过程,进而控制和管理进程。由程序段,相关的数据段,PCB 三部分便构成了进程实体。实际上,创建进程,就是创建所谓的PCB。

3. 进程的特征

(1)动态性 :进程的实质是进程实体的执行过程。

(2)并发性 :一个进程实体可以和其他进程实体并发执行。

(3)独立性 :进程是一个独立运行,独立获得资源和独立接受调度的基本单位。

(4)异步性 :各个进程之间独立的,以不同的速度向前推进。

注:并发是指两个或者两个以上 的事件在同一时间间隔内发生

4. 进程的基本状态

(1)就绪(Ready)状态:指进程处于准好资源的状态,就等CPU空闲下来。

(2)运行 (Runing)状态:指进程已经获得CPU,处于正在执行的状态。

(3)阻塞(Block)状态:指正在执行过程中,由于发生某事件暂时无法执行的状态。

5. 进程控制块(PCB,task_struct)

(1) 进程标示符 : 描述本进程的唯一标识符,用来区别其他进程。 

(2) 处理机状态 :任务状态,退出代码,退出信号等。 

(3) 进程优先级 :相对于其他进程的优先级. 

(4) 程序计数器:程序中即将被执行的下一条指令的地址。 

(5) 内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针。

(6) 上下文数据:进程执行时处理器的寄存器中的数据。 

(7)  I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。 

(8)  记账信息:可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。

6. PCB的作用

(1) 作为独立运行基本单位的标志.

(2) 能实现间断性运行方式.

(3) 提供进程管理所需要的信息

(4) 提供进程调度所需要的信息

(5) 实现与其他进程的同步与通信.

7. 对僵尸进程和孤儿进程的理解

(1) 僵尸进程( Z-zombie )

1)僵尸进程是指当子进程退出并且父进程没有读取到子进程的退出信息即返回码时,子进程便成为僵尸进程.

2)僵尸进程会以终止状态保存在进程表中,并且会一直等待父进程读取退出状态代码.

3)只要子进程退出,父进程没有读取子进程的状态退出码,子进程就进入僵尸状态.

4)僵尸进程会造成内存泄漏.

(2)模拟实现僵尸进程

 #include <stdio.h>
  2 #include <stdlib.h>
  3 
  4 int main()
  5 {
  6     pid_t id=fork();
  7     if(id<0)
  8     {
  9         perror("fork");
 10         return 1;
 11     }
 12     else if(id>0)
 13     {
 14         printf("parent[%d] is sleeping.\n",getpid());
 15         sleep(30);
 16     }
 17     else
 18     {
 19         printf("child[%d] is begin z...\n",getpid());
 20         sleep(5);
 21         exit(EXIT_SUCCESS);
 22     }
 23     return 0;         
    }

(3) 孤儿进程

1)孤儿进程是指: 父进程先退出,子进程还未退出,此时子进程就成为孤儿进程.

2)孤儿进程在退出以后会成为僵尸进程.

3)孤儿进程由系统回收.

(4)模拟实现孤儿进程

    #include<stdio.h>                                                           
  2 #include<stdlib.h>
  3 
  4 int main()
  5 {
  6     pid_t id=fork();
  7     if(id<0)
  8     {
  9         perror("fork");
 10         return 1;
 11     }
 12     else if(id==0)
 13     {
 14         printf("i am child",getpid());
 15         sleep(18);
 16     }
 17     else
 18     {
 19         printf("i am parent",getpid());
 20         sleep(50);
 21         exit(0);
 22     }
 23     return 0;
     }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值