多任务和fork()

多任务

  1. 单任务 vs 多任务

  2. 并发(单个CPU) vs 并行(多个CPU)

  3. 进程

  4. 进程的特点:每个进程都有自己独立的虚拟地址空间,大小为4G(互不干扰,相互独立)

  5. 进程虚拟地址空间的构成:

     栈空间:先进后出;系统管理;生命周期由所在函数决定;生命周期:局部
     堆空间:先进先出;用户管理(malloc,free);用户决定;生命周期:局部或全局
     数据段:系统管理;生命周期:全局
    
  6. 进程id(getpid(), getppid())

  7. 所有进程创建都是由父进程创建的,父进程创建的进程称为子进程;

  8. Linux系统下所有的进程的父进程:init 0
    在这里插入图片描述

fork

pid_t fork( void);
  1. 概念: 复刻(英语:fork,又译作派生、分支)是UNIX或类UNIX中的分叉函数,fork函数将运行着的程序分成2个(几乎)完全一样的进程,每个进程都启动一个从代码的同一位置开始执行的线程。这两个进程中的线程继续执行,就像是两个用户同时启动了该应用程序的两个副本。

  2. 返回值:它不需要参数并返回一个整数值。下面是fork()返回的不同值。

    负值:创建子进程失败。
    零:返回到新创建的子进程。
    正值:返回父进程或调电者。该值包含新创建的子进程的进程ID

  3. 头文件

    #include<unistd.h>/*#包含<unistd.h>*/
    #include<sys/types.h>/*#包含<sys/types.h>*/
    
  4. 僵尸进程的处理:当父进程先于子进程结束时,子进程就变成了一个僵尸程序。

     wait() // waitpid()
    
    #include <sys/types.h>
    #include <sys/wait.h>
    
    pid_t wait(int *status);
    pid_t waitpid(pid_t pid, int *status, int options);
    
     status是一个传出参数。
     waitpid的pid参数选择:
     < -1 回收指定进程组内的任意子进程
     = -1 回收任意子进程
     = 0  回收和当前调用waitpid一个组的所有子进程
     > 0  回收指定ID的子进程
    

    在父进程中调用wait和waitpid可以避免僵尸进程的出现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值