linux学习(等待+进程替换初识)[9]

阻塞等待

一般在内核中阻塞(伴随着被切换),等待被唤醒(放在等待队列【一种数据结构】中)
在Linux中,阻塞等待是指一个进程或线程被暂停执行,直到某个条件满足或事件发生。下面介绍两种常见的阻塞等待方式:

  1. 阻塞等待系统调用:在Linux中,许多系统调用函数可以使进程或线程进入阻塞等待状态,直到某个条件满足。例如,常见的阻塞等待系统调用包括:

    • read():从文件描述符中读取数据,如果没有数据可读,则进程会阻塞等待,直到有数据可读或出现错误。
    • write():向文件描述符中写入数据,如果写入的缓冲区已满,则进程会阻塞等待,直到有空间可写或出现错误。
    • sleep():使进程休眠指定的时间,进程会阻塞等待,直到休眠时间结束。
    • wait():等待子进程结束,进程会阻塞等待,直到子进程结束或出现错误。

    当条件满足时,阻塞等待的系统调用会返回,并使进程或线程继续执行。

  2. 阻塞等待同步原语:除了系统调用外,Linux还提供了一些同步原语,用于实现线程之间的阻塞等待。这些同步原语包括:

    • 互斥锁(Mutex):线程可以使用互斥锁来保护共享资源,当一个线程持有互斥锁时,其他线程尝试获取锁会被阻塞等待,直到锁被释放。
    • 条件变量(Condition Variable):线程可以使用条件变量来等待某个条件满足,当条件不满足时,线程会阻塞等待在条件变量上,直到其他线程发出条件满足的信号。
    • 信号量(Semaphore):线程可以使用信号量来控制对共享资源的访问,当信号量的值为0时,线程会阻塞等待,直到信号量的值大于0。

    这些同步原语可以帮助线程进行有效的互斥和同步,并实现线程之间的阻塞等待。

非阻塞等待

非阻塞等待是指进程或线程在等待某个条件满足时,不会被暂停执行,而是继续执行其他任务。在Linux中,非阻塞等待通常使用以下两种方式实现:

  1. 轮询:进程或线程可以通过轮询的方式来检查条件是否满足。它会反复地检查条件,如果条件满足,则继续执行相应的操作;如果条件不满足,则继续轮询或执行其他任务。轮询可以使用循环结构实现,例如使用while循环。

    以下是一个简单的示例,展示了如何使用轮询实现非阻塞等待:

    while (!condition) {// 执行其他任务
    }
    // 条件满足,执行相应的操作
    

    轮询的优点是简单直接,但它可能会消耗大量的CPU资源,并且可能导致延迟。

  2. 异步事件处理:进程或线程可以将等待任务交给操作系统或其他模块处理,并在条件满足时通过回调函数或事件通知方式得到通知。这样,进程或线程可以继续执行其他任务,而不需要主动轮询。

    异步事件处理通常涉及使用特定的API或框架,例如Linux中的epollselectpoll等系统调用,或者使用异步编程框架,例如libevent、Boost.Asio等。

    以下是一个简单的示例,展示了如何使用异步事件处理实现非阻塞等待:

    // 创建事件循环
    event_loop = create_event_loop();// 注册事件处理函数
    register_event_handler(event_loop, event_type, event_handler);// 启动事件循环
    run_event_loop(event_loop);
    

    当事件发生时,事件处理函数 event_handler 将被调用,进程或线程可以在事件处理函数中执行相应的操作。

    异步事件处理的优点是可以提高系统的性能和响应性,但它通常需要更复杂的编程模型和代码结构。

非阻塞等待在处理异步任务和事件驱动编程中非常常见,它可以提高系统的并发性和吞吐量。具体使用哪种非阻塞等待方式取决于您的需求和场景。如果您有特定的问题或需求,请提供更多详细信息,我将尽力提供帮助。
在这里插入图片描述
在这里插入图片描述

进程替换

替换原理

内核结构没有变,并没有创建新的进程
在这里插入图片描述
在这里插入图片描述
如何理解将程序放入内存当中:加载!exec*系列函数
在这里插入图片描述
可变参数列表最后一个参数必须是NIULL,标识参数传递完毕!
在这里插入图片描述

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>int main()
{extern char **environ;pid_t id = fork();if(id == 0){//childprintf("我是子进程: %d\n", getpid());//execl: 如果替换成功,不会有返回值,如果替换失败,一定有返回值 ==》如果失败了,必定返回 ==》 只要有返回值,就失败了//不用对该函数进行返回值判断,只要继续向后运行一定是失败的!//execl("/bin/ls", "ls", "-a", "-ln", NULL); //lsssss: 不存在//char *const myargv[] = {//    "ls",//    "-a",//    "-l",//    "-n",//    NULL//};//execv("/bin/ls", myargv); //lsssss: 不存在//execlp("ls", "ls", "-a", "-l", "-n", NULL);//execvp("ls", myargv);//char *const myenv[] = {//    "MYENV=YouCanSeeMe",//    NULL//};//putenv("MYENV=YouCanSeeMe");//execle("./exec/otherproc", "otherproc", NULL, environ);//execl("./exec/shell.sh", "shell.sh", NULL);execl("./exec/test.py", "test.py", NULL);exit(1);}sleep(1);//fatherint status = 0;printf("我是父进程: %d\n", getpid());waitpid(id, &status, 0);printf("child exit code: %d\n", WEXITSTATUS(status));return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/68327.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

秦岭地形图、水系图、全景图

来源&#xff1a;头条留白sy&#xff0c;星球研究所等&#xff0c;转自&#xff1a;地理科学研究苑

【Git】安装以及基本操作

目录 一、初识Git二、 在Linux底下安装Git一&#xff09;centOS二&#xff09;Ubuntu 三、 Git基本操作一&#xff09; 创建本地仓库二&#xff09;配置本地仓库三&#xff09;认识工作区、暂存区、版本库四&#xff09;添加文件五&#xff09;查看.git文件六&#xff09;修改文…

探索未来:元宇宙与Web3的无限可能

随着科技的奇迹般发展&#xff0c;互联网已经成为了我们生活的不可分割的一部分。然而&#xff0c;尽管它的便利性和普及性带来了巨大的影响&#xff0c;但我们仍然面临着传统互联网体验的诸多限制。 购物需要不断在实体店与电商平台间切换&#xff0c;教育依然受制于时间与地…

Mongodb (四十一)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、概述 1.1 相关概念 1.2 特性 二、应用场景 三、安装 四、目录结构 五、默认数据库 六、 数据库操作 6.1 库操作 6.2 文档操作 七、MongoDB数据库备份 7.1 备…

截止到目前全量主体总数有多少?

企业主体类型 企业主体类型有很多种&#xff0c;一般我们会分为公司&#xff08;有限责任&#xff09;、合伙企业、个人独资企业、个体经营户这些类别。 今天我们按照企业&#xff0c;个体&#xff0c;组织的分类方式来看各个主体的总数。 企业&#xff1a;统一社会信用代码…

“MongoDB基础知识【超详细】

"探索MongoDB的无边之境&#xff1a;沉浸式数据库之旅" 欢迎来到MongoDB的精彩世界&#xff01;在这个博客中&#xff0c;我们将带您进入一个充满创新和无限潜力的数据库领域。无论您是开发者、数据工程师还是技术爱好者&#xff0c;MongoDB都将为您带来一场令人心动…

7.5.tensorRT高级(2)-RAII接口模式下的生产者消费者多batch实现

目录 前言1. RAII接口模式封装生产者消费者2. 问答环节总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程&#xff0c;之前有看过一遍&#xff0c;但是没有做笔记&#xff0c;很多东西也忘了。这次重新撸一遍&#xff0c;顺便记记笔记。 本次课程学习 tensorRT 高级-RAI…

仿东郊到家【8月份稳定版】同城到家/家政上门/美容/理疗/足疗/推拿/私教/瑜伽/健身

1、物料商城&#xff08;商品分类、商品管理&#xff09; 2、地图导览&#xff08;平台总销售额、人员统计、营收数据、当前开放城市&#xff09; 3、后台新增&#xff1a;技师统计&#xff08;技师概况、技师数据统计、区域分布、技师数据等&#xff0c;可视化数据一目了然&am…

Compute shader SV 理解图

本图转子&#xff1a;【Computeshader】个人总结_蒋伟博的博客-CSDN博客

C语言快速回顾(二)

前言 在Android音视频开发中&#xff0c;网上知识点过于零碎&#xff0c;自学起来难度非常大&#xff0c;不过音视频大牛Jhuster提出了《Android 音视频从入门到提高 - 任务列表》&#xff0c;结合我自己的工作学习经历&#xff0c;我准备写一个音视频系列blog。C/C是音视频必…

手机出现 不读卡 / 无信号时应该怎么办?

当手机屏幕亮起&#xff0c;一般在屏幕最上方都会有代表手机卡状态的显示&#xff0c;其中网络信号和读卡状态的标识&#xff0c;依旧有很多人分不太清&#xff0c;更不清楚改怎么办了。 1、当我们的手机里有两张卡时&#xff0c;则会有两个信号显示 2、信号状态一般是由短到…

【MySQL--->表的操作】

文章目录 [TOC](文章目录) 一、创建表二、查看表三、修改表四、删除表drop table 表名; ![在这里插入图片描述](https://img-blog.csdnimg.cn/15227b8335364d41bd01b4b4dd83ee55.png) 一、创建表 语句格式:create table 表名(列名 类型,…)字符集 校验规则 存储引擎;字符集和校…