操作系统杂项(九)

news2024/11/13 9:00:51

目录

一、简述sleep和wait的区别

1、sleep

2、wait

3、区别

二、简述线程池的设计思路,线程池中线程数量的决定因素

1、设计思路

2、线程池中线程数量

三、进程和线程相比,为何更慢

四、简述Linux零拷贝的原理

1、概念

2、优点

3、原理

五、简述epoll和select的区别,epoll为何高效

1、区别

2、epoll高效的原因

六、简述多路I/O复用技术有哪些及其区别

1、多路I/O复用技术

2、区别


一、简述sleep和wait的区别

1、sleep

        sleep是一个延时函数,让进程或线程进入休眠。休眠完毕后继续运行。在Linux系统下,sleep函数的参数是秒,而Windows系统中sleep的函数参数是毫秒。例如:

Windows:

#include <windows.h>  //首先导入头文件
Sleep(500);   //第一个字母大写
//到这里停半秒,然后继续向下执行

Linux: 

#include <unistd.h>   //首先导入头文件
sleep(5);    //停5秒
//到这里停5秒,然后继续向下执行

2、wait

        wait是父进程回收子进程PCB资源的一个系统调用。进程一旦调用了wait函数,就立即阻塞自己本身,然后由wait函数自动分析当前进程的某个子进程是否已经退出。当找到一个已经变成僵尸的子进程,wait就会收集这个子进程的信息,并把它彻底销毁后返回。如果没有找到这样一个子进程,wait就会一直阻塞,直到有一个出现为止。函数原型为:

#include <sys/types.h>
#include <sys/wait.h>

pid_t wait(int* status);

        子进程的结束状态值会由参数status返回,而子进程的进程识别码也会一起返回。如果不需要结束状态值,则参数status可以设成NULL。

3、区别

        (1)sleep是一个延时函数,让进程或线程进入休眠。休眠完毕后继续运行。

        (2)wait是父进程回收子进程PCB资源的一个系统调用。

二、简述线程池的设计思路,线程池中线程数量的决定因素

1、设计思路

        实现线程池有以下几个步骤:

        (1)设置一个生产者消费者队列,作为临界资源;

        (2)初始化n个线程,并让其运行起来,加锁去队列里取任务运行;

        (3)当任务队列为空时,所有线程阻塞;

        (4)当生产者队列来了一个任务后,先对队列加锁,把任务挂到队列上,然后使用条件变量去通知阻塞中的一个线程来处理。

2、线程池中线程数量

        影响线程数量的因素:CPUI/O并行并发

如果是CPU密集型应用,则线程池大小设置为:CPU数目+1

如果是I/O密集型应用,则线程池大小设置为:2*CPU数目+1

最佳线程数目=(线程等待时间与线程CPU时间之比 + 1)*CPU数目

        所以线程等待时间所占比例越高,需要越多线程。线程CPU时间所占比例越高,需要越少线程。

        那么为什么要创建线程池?创建线程和销毁线程的花销是比较大的,这些时间有可能比处理业务的时间还要长。这样频繁的创建线程和销毁线程,再加上业务工作线程,消耗系统资源的时间,可能导致系统资源不足。同时线程池也是为了提升系统效率

        任务队列可以存放100个任务,此时为空,线程池里面有10个核心线程,若突然来了10个任务,那么刚好10个核心线程直接处理;若来了90个任务,此时核心线程来不及处理,那么有80个任务先入队列,再创建核心线程处理任务;若又来了120个任务,此时任务队列已满,不得已,就需要创建20个普通线程来处理多余的任务。

        以上是线程池的工作流程

三、进程和线程相比,为何更慢

        1、进程系统开销显著大于线程开销,线程需要的系统资源更少;

        2、进程切换开销比线程大。多进程切换时需要刷新TLB并获取新的地址空间,如何切换硬件上下文和内核栈,多线程切换时只需要切换硬件上下文和内核栈。

        3、进程通信比线程通信开销大。进程通信需要借助管道、队列、共享内存,需要额外申请空间,通信繁琐,而线程共享进程的内存,如代码段、数据段、扩展段,通信快捷简单,同步开销更小。

四、简述Linux零拷贝的原理

1、概念

        零拷贝描述的是计算机操作系统中,CPU不执行将数据从一个内存区域,拷贝到另外一个内存区域的任务。通过网络传输文件时,这样通常可以节省CPU周期和内存带宽。

2、优点

        (1)节省CPU周期,空出的CPU可以完成更多其它任务;

        (2)减少了内存区域之间数据拷贝,节省内存带宽;

        (3)减少用户态和内核态之间数据拷贝,提升数据传输效率;

        (4)应用零拷贝技术,减少用户态和内核态之间的上下文切换。

3、原理

        在传统I/O中,用户态空间与内核态空间之间的复制是完全没有必要的,因为用户态空间仅仅起到了一种数据转存媒介的作用,除此之外没有做任何事。

        (1)Linux提供了sendfile()用来减少我们的数据拷贝和上下文切换次数。

        ①发起sendfile()系统调用,操作系统由用户态空间切换到内核态空间(第一次上下文切换);

        ②通过DMA引擎将数据从磁盘拷贝到内核态空间的输入的socket缓冲区中(第一次拷贝);

        ③将数据从内核空间拷贝到与之关联的socket缓冲区(第二次拷贝);

        ④将socket缓冲区的数据拷贝到协议引擎中(第三次拷贝);

        ⑤sendfile()系统调用结束,操作系统由用户态空间切换到内核态空间(第二次上下文切换)。

        根据以上过程,一共有2次上下文切换、3次I/O拷贝,我们看到从用户空间到内核空间并没有出现数据拷贝,从操作系统角度来看,这个就是零拷贝。内核空间出现了复制的原因:通常的硬件在通过DMA访问时期望的是连续的内存空间。

        (2)mmap数据零拷贝原理

        如果需要对数据进行操作,Linux提供了mmap零拷贝来实现。

五、简述epoll和select的区别,epoll为何高效

1、区别

        (1)每次调用select都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多的时候会很大,而epoll保证了每个fd在整个过程中只会拷贝一次

        (2)每次调用select都需要在内核遍历传递进来的所有fd,而epoll只需要轮询一次fd集合,同时查看就绪链表中有没有就绪的fd就可以了

        (3)select支持的文件描述符数量太小,默认是1024,而epoll没有这个限制,它所支持的fd上限是最大可以打开文件的数目,这个数字一般远大于2048。

2、epoll高效的原因

        (1)select,poll实现需要自己不断轮询所有fd集合,直到设备就绪,期间可能要睡眠和唤醒多次交替,而epoll只要判断一下就绪链表是否为空即可,这节省了大量的CPU时间。

        (2)select,poll每次调用都要把fd集合从用户态往内核态拷贝一次,并且要把当前进程往设备等待队列中挂一次,而epoll只要一次拷贝,而且把当前进程往等待队列上挂也只挂一次,这也能节省不少的开销。

六、简述多路I/O复用技术有哪些及其区别

1、多路I/O复用技术

        selectpollepoll都是I/O多路复用的机制,I/O多路复用就是通过一种机制,可以监视多个文件描述符,一旦某个文件描述符就绪(一般是读就绪或者写就绪),能够通知应用程序进行相应的读写操作。

2、区别

        (1)poll和select不同,通过一个pollfd数组向内核传递需要关注的事件,于是没有描述符个数的限制,pollfd中的events字段和revents分别用于标示关注的事件和发生的事件,所以pollfd数组只需要被初始化一次;

        (2)select,poll实现需要自己不断轮询所有fd集合,直到设备就绪,期间可能要睡眠和唤醒多次交替,而epoll只要判断一下就绪链表是否为空即可,这节省了大量的CPU时间。

        (3)select,poll每次调用都要把fd集合从用户态往内核态拷贝一次,并且要把当前进程往设备等待队列中挂一次,而epoll只要一次拷贝,而且把当前进程往等待队列上挂也只挂一次,这也能节省不少的开销。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL第一阶段:多表查询、事务

继续我的MySQL之旅&#xff0c;继续上篇的DDL、DML、DQL、以及一些约束&#xff0c;该到了多表查询和事务的学习总结&#xff0c;以及相关的案例实现&#xff0c;为未来的复习以及深入的理解做好知识储备。 目录 多表查询 连接查询 内连接 外连接 子查询 事务 事务简介…

加油卡APP系统开发,线上发展优势分析

在当下社会中&#xff0c;汽车加油已经必不可少了&#xff0c;不管有什么出行计划&#xff0c;都需要提前给汽车加油或者中途加油。随着技术的发展&#xff0c;加油卡APP受到了有车一族的欢迎&#xff0c;大众可以在手机上给汽车加油&#xff0c;还能够享受诸多的优惠活动&…

python-阶乘和(赛氪OJ)

题目描述 求Sn​1!2!3!4!5!⋯n!的值&#xff0c;其中 &#x1d45b;n 是一个数字。输入格式&#xff1a; 输入一个整数 n。输出格式&#xff1a; 输出对应的 Sn​。 样例输入输出样例输入 5样例输出 153数据范围 对于 100% 的数据&#xff0c;保证1≤n≤20。来源/分类&#xff…

如何使用Python和Selenium解决reCAPTCHA

CAPTCHA已成为我们日常在线活动中重要的防御线。无论是登录账户、提交表单还是进行在线支付,CAPTCHA都在幕后保护我们的安全。然而,CAPTCHA有时可能会成为自动化的绊脚石,阻碍自动化测试、数据收集和效率提升。那么,如何以合法合理的方式绕过这些复杂的CAPTCHA挑战呢?在本文中…

导航不是GPS吗,有人用北斗吗?

在现代生活中&#xff0c;提到导航&#xff0c;人们脑海中最先浮现的往往是GPS。然而&#xff0c;近年来&#xff0c;中国自主研发的北斗导航系统&#xff08;BeiDou Navigation Satellite System, BDS&#xff09;正在迅速崛起&#xff0c;逐步占据全球导航市场的一席之地&…

2023年全国赛C题《 电容电感测量装置》设计报告

测量原理 参考下面网站的方案 bookmark 参考LCR测试仪&#xff0c;基本工作原理为给DUT加上正弦激励信号&#xff0c;然后测得该DUT两端的电压和流过DUT的电流&#xff0c;即可通过计算得到DUT的性质和参数。 对于一个理想电容&#xff0c;电流相位应该超前电容两端电压90。…

Java结合uniapp实现验证码(附Demo)

目录 前言1. Java2. uniapp 前言 对于Java的知识点推荐阅读&#xff1a; java框架 零基础从入门到精通的学习路线 附开源项目面经等&#xff08;超全&#xff09;【Java项目】实战CRUD的功能整理&#xff08;持续更新&#xff09; 本次的Demo主要以图片验证码的方式输入和接…

抖音矩阵管理系统功能说明:一站式掌握

在当下这个信息爆炸的时代&#xff0c;抖音作为短视频领域的佼佼者&#xff0c;其用户规模持续扩大&#xff0c;影响力日益增强。对于内容创作者和营销人员来说&#xff0c;如何高效管理抖音账号&#xff0c;实现内容的多平台分发和精准触达&#xff0c;成为了亟待解决的问题。…

【JAVA多线程】线程的状态控制

目录 1.JDK中的线程状态 2.基础操作 2.1关闭 2.2中断 2.3.等待、唤醒 2.4.阻塞、唤醒 1.JDK中的线程状态 在JDK的线程体系中线程一共6种状态&#xff1a; NEW&#xff08;新建&#xff09;: 当线程对象创建后&#xff0c;但尚未启动时&#xff0c;线程处于新建状态。RUN…

代码随想录算法训练营day8 | 344.反转字符串、541.反转字符串 II、卡码网:54.替换数字

文章目录 344.反转字符串思路 541.反转字符串 II思路 卡码网&#xff1a;54.替换数字思路复习&#xff1a;字符串 vs 数组 总结 今天是字符串专题的第一天&#xff0c;主要是一些基础的题目 344.反转字符串 建议&#xff1a; 本题是字符串基础题目&#xff0c;就是考察 revers…

链式法则和自动求导

向量链式法则 说明&#xff1a; 1.第一个式子&#xff0c; y是标量&#xff0c;u是标量&#xff0c;x是n维向量 2.第二个式子&#xff0c;y是标量&#xff0c;u是k维向量&#xff0c;x是n维向量&#xff0c;所以y对u求导是k维的行向量&#xff0c;u对x求导是k行n列的矩阵&…

Node 版本控制工具 NVM 的安装和使用(Windows)

遇到了一个项目&#xff0c;前端的node版本很低&#xff0c;需要我去降低node版本才能下载依赖运行&#xff0c;我当然不是傻乎乎的降版本了&#xff0c;而是使用node版本控制工具 NVM。 NVM&#xff08;Node Version Manager&#xff09; nvm 是一个命令行工具&#xff0c;用于…

【OSS对象存储】Springboot集成阿里云OSS + 私有化部署Minio

【OSS对象存储】Springboot集成阿里云OSS 私有化部署Minio 一、摘要二、POM依赖三、配置文件四、表结构设计五、代码实现5.1 代码包结构5.2 API封装5.3 增删改查 六、扩展6.1 Minio配置https访问 一、摘要 掌握阿里云OSS、私有化部署Minio两种对象存储的使用方式运用工厂策略…

STM32-寄存器ADC配置指南

目录 输入方式&#xff1a; 模拟看门狗功能&#xff1a; ADC中断 配置一个Demo 设置时钟 自校准 通道选择 采样时间选择 转换模式选择 断续模式 启动转换 软件触发 外部触发 转换结束 关于DMA 模拟看门狗 ​编辑ADC数据位置​编辑 在STM32F中&#xff0c;ADC可…

FM与AM的特点

1.是什么&#xff1f; FM&#xff08;调频&#xff09;&#xff1a;通过改变载波频率来传递信息AM&#xff08;调幅&#xff09;&#xff1a;通过改变载波的振幅来传递信息 2.分别有什么特点&#xff1f; 抗干扰能力&#xff1a; FM&#xff1a;由于FM信号的传输不依赖于载波的…

c++初阶知识——string类详解

目录 前言&#xff1a; 1.标准库中的string类 1.1 auto和范围for auto 范围for 1.2 string类常用接口说明 1.string类对象的常见构造 1.3 string类对象的访问及遍历操作 1.4. string类对象的修改操作 1.5 string类非成员函数 2.string类的模拟实现 2.1 经典的string…

【CI/CD】docker + Nginx自动化构建部署

CI/CD是什么 CI/CD 是持续集成&#xff08;Continuous Integration&#xff09;和持续部署&#xff08;Continuous Deployment&#xff09;或持续交付&#xff08;Continuous Delivery&#xff09;的缩写&#xff0c;它们是现代软件开发中用于自动化软件交付过程的实践。 1、…

自动驾驶系列—智能巡航辅助功能中的路口通行功能介绍

自动驾驶系列—智能巡航辅助功能中的车道中央保持功能介绍 自动驾驶系列—智能巡航辅助功能中的车道变换功能介绍 自动驾驶系列—智能巡航辅助功能中的横向避让功能介绍 自动驾驶系列—智能巡航辅助功能中的路口通行功能介绍 文章目录 2. 功能定义3. 功能原理4. 传感器架构5. 实…

【Redis进阶】集群

1. 集群分片算法 1.1 集群概述 首先对于"集群"这个概念是存在不同理解的&#xff1a; 广义的"集群"&#xff1a;表示由多台主机构成的分布式系统&#xff0c;称为"集群"狭义的"集群"&#xff1a;指的是redis提供的一种集群模式&…

牛客JS题(二)直角三角形

注释很详细&#xff0c;直接上代码 涉及知识点&#xff1a; repeat格式化字符串 题干&#xff1a; 我的答案 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"></head><body><div classtriangle><…