父进程等待子进程的异步版本

前言
首先,打开linux虚拟机或者系统的时候,系统自己建立一个init进程,这是Linux系统的基础进程,然后init进程再根据一些配置文件决定创建哪些进程,或者我们在终端自己创建一个新进程的时候,如果你有时间,你可以一直追查这个进程的祖祖辈辈,你会发现,他们都指向一个进程,那就是init进程。所以,可以这么说,Linux系统服务中,所有进程都是init的子孙进程。所以,进程的创建是通过创建子进程一个一个实现的。

  但是,一味的创建进程,而不对进程进行合理的管理,必然会造成操作系统的冗余,长时间下来,因为无用进程过多,系统将会崩溃。因为每个进程需要对自己维护一个PCB的结构体,来描述一个进程所有可能用到的资源、标志…所以,这个结构体并不小,且每个进程都自己私有一个,所以对无用进程的PCB管理是很有必要的。
  
  操作系统把无用或退出进程的PCB管理交给了他的父进程,每个拥有子进程的父进程函数体中都有一个等待操作,需要对他创建的子进程进行管理,毕竟,父亲管儿子天经地义嘛!所以,父进程在执行完自己的所有操作后,会以阻塞或者轮询的方式等待子进程的退出,收到子进程的退出数据之后,通过一定的手段,对子进程的PCB进行资源的释放。

验证子进程退出时给父进程发送信号

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
void handler(int sig)
{
    printf("%d\n",sig);
}

int main()
{
    int i=1;
    for(;i<=31;i++){
        signal(i,handler);
    }
    printf("\n");
    pid_t id=fork();
    if(id<0){
        perror("fork");
        exit(1);
    }else if(id==0){
        printf("i am a child:%d,my father is %d\n",getpid(),getppid());
        exit(2);
    }
    printf("i am father:%d\n",getpid());
    sleep(1);
    return 0;
}

使用signal函数实现对信号的捕捉,捕捉到17号信号,即SIGCHLD信号。
这里写图片描述

程序运行结果:
这里写图片描述

父进程先退出,子进程退出之后给父进程发送一个信号。

现在已经验证子进程退出时会对父进程发出一个SIGCHLD的信号,所以我们可以对这个信号进行捕捉,自定义的信号处理方式表位等待一个子进程,所以这就省去了对于一个子进程的阻塞等待或者轮询等待时资源的耗费。
代码

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<signal.h>

void catchSig(int sig)
{
    do{
        pid_t ret = waitpid(-1,NULL,WNOHANG);
        if(ret>0){
            printf("wait success:%d\n",ret);
        }else{
            printf("wait failed\n");
            break;
        }
    }while(1);
}

int main()
{
    signal(SIGCHLD,catchSig);
    pid_t id = fork();
    if(id==0){
        //child
        printf("i am child! pid:%d\n",getpid());
        sleep(4);
        exit(1);
    }else{
        while(1)
        {
            printf("do father things!\n");
            sleep(1);
        }
    }
    return 0;
}

输出结果:
这里写图片描述

### 使用 AutoGPTQ 库量化 Transformer 模型 为了使用 `AutoGPTQ` 对 Transformer 模型进行量化,可以遵循如下方法: 安装所需的依赖包是必要的操作。通过 pip 安装 `auto-gptq` 可以获取最新版本的库。 ```bash pip install auto-gptq ``` 加载预训练模型并应用 GPTQ (General-Purpose Tensor Quantization) 技术来减少模型大小和加速推理过程是一个常见的流程。下面展示了如何利用 `AutoGPTQForCausalLM` 类来进行这一工作[^1]。 ```python from transformers import AutoModelForCausalLM, AutoTokenizer from auto_gptq import AutoGPTQForCausalLM model_name_or_path = "facebook/opt-350m" quantized_model_dir = "./quantized_model" tokenizer = AutoTokenizer.from_pretrained(model_name_or_path) model = AutoModelForCausalLM.from_pretrained(model_name_or_path) # 加载已经量化的模型或者创建一个新的量化器对象用于量化未压缩过的模型 gptq_model = AutoGPTQForCausalLM.from_pretrained(quantized_model_dir, model=model, tokenizer=tokenizer) ``` 对于那些希望进一步优化其部署环境中的模型性能的人来说,`AutoGPTQ` 提供了多种配置选项来自定义量化参数,比如位宽(bit-width),这有助于平衡精度损失与运行效率之间的关系。 #### 注意事项 当处理特定硬件平台上的部署时,建议查阅官方文档以获得最佳实践指导和支持信息。此外,在实际应用场景之前应该充分测试经过量化的模型以确保满足预期的质量标准。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值