当前位置: 首页 > news >正文

IO-操作系统

用户态和内核态

        现代操作系统,为了保护系统的安全,都会划分出内核空间和用户空间,或者我们经常说的内核态和用户态。简单来说,就是划分为内核态和用户态两个等级,运行在用户态的进程大都是一些应用程序,能够访问的系统资源受到极大的限制。而运行在内核态的进程权限就非常大,可以"为所欲为”。
        这么做的目的是为了保护操作系统的底层资源,例如文件都要存在硬盘,但是如果用户编写的应用程序可以随意的操作硬盘的启动扇区,那就很容易把系统搞崩溃,分为内核态和用户态之后,用户态的应用程序就不能直接操作底层的硬件接口了,如果需要操作硬盘,比如存文件,那就必须经过内核态来协调。这样就可以对所有底层硬件的操作方式进行规范。
        有了用户态和内核态的划分后,应用程序就经常需要在用户态和内核态之间进行切换。例如程序要保存一个文件到硬盘,在程序执行的用户态,是不能直接操作磁盘的。只有切换到内核态才能真正去操作磁盘。
        内核态运行操作系统程序,操作硬件,用户态运行用户程序;当程序运行在 3 级特权级上时,可以称之为运行在用户态,当程序运行在 0 级特权级上时,称之为运行在内核态。
        特权级别
        R0、R1、R2 和 R3
        R0 相当于内核态,R3 相当于用户态;
        不同级别能够运行不同的指令集合;

IO

        IO,英文全称是 Input/Output,翻译过来就是输入/输出。我们听得挺多,就是磁盘 IO,网络 IO 等。
        IO 即输入/输出,到底谁是输入?谁是输出?IO 如果脱离了主体,会让人疑惑。

 

计算机角度的 IO

        我们常说的输入输出,比较直观的意思就是计算机的输入输出计算机就是主体
        计算机分成分为 5 个部分:运算器、控制器、存储器、输入设备、输出设备。

 

        输入设备是向计算机输入数据和信息的设备,键盘,鼠标都属于输入设备;输出设备是计算机硬件系统的终端设备,用于接收计算机数据的输出显示,一般显示器、打印机属于输出设备。

操作系统角度的 IO

        我们要将内存中的数据写入到磁盘的话,那么主体就是一个程序. 操作系统负责计算机的资源管理和进程的调度,我们电脑上跑着的应用程序,其实是需要经过操作系统,才能做一些特殊操作,如磁盘文件读写、内存的读写等等。
        真正的 IO 是在操作系统执行的。即应用程序的 IO 操作分为两种动作:IO 调用和 IO 执行。IO 调用是由进程(应用程序的运行态)发起,而 IO 执行是操作系统内核的工作。
        应用程序发起的一次 IO 操作包含两个阶段:
                IO 调用:应用程序进程向操作系统内核发起调用。
                IO 执行:操作系统内核完成 IO 操作。

 

IO 模型

阻塞 IO

        假设应用程序的进程发起 IO 调用,但是如果内核的数据还没准备好的话,那应用程序进程就一直在阻塞等待,一直等到内核数据准备好了,从内核拷贝到用户空间,才返回成功提示,此次 IO 操作,称之为阻塞 IO
        阻塞 IO 比较经典的应用就是阻塞 socket、Java BIO。阻塞 IO 的缺点就是:如果内核数据一直没准备好,那用户进程将一直阻塞,浪费性能,可以使用非阻塞IO 优化。

非阻塞 IO

        如果内核数据还没准备好,可以先返回错误信息给用户进程,让它不需要等待,而是通过轮询的方式再来请求。这就是非阻塞 IO。 

 

非阻塞 IO 的流程如下:
  • 应用进程向操作系统内核,发起 recvfrom( )读取数据。
  • 操作系统内核数据没有准备好,立即返回 EWOULDBLOCK 错误码。
  • 应用程序进程轮询调用,继续向操作系统内核发起 recvfrom 读取数据。
  • 操作系统内核数据准备好了,从内核缓冲区拷贝到用户空间。
  • 完成调用,返回成功提示。
        recvfrom()用来接收远程主机经指定的 socket 传来的数据,并把数据传到由参数buf 指向的内存空间.
        非阻塞 IO 模型,简称 NIO,Non-Blocking IO。它相对于阻塞 IO,虽然大幅提升了性能,但是它依然存在性能问题,即频繁的轮询,导致频繁的系统调用,同样会消耗大量的 CPU 资源。可以考虑 IO 复用模型,去解决这个问题。

IO 多路复用

概述

        既然 NIO 无效的轮询会导致 CPU 资源消耗,我们等到内核数据准备好了,主动通知应用进程再去进行系统调用。
        IO 复用模型核心思路:系统给我们提供一类函数(如 select、poll、epoll),它们可以同时监控多个 fd 的操作,任何一个返回内核数据就绪,应用进程再发起 recvfrom 系统调用。
        文件描述符 fd(File Descriptor),它是计算机科学中的一个术语,形式上是一个非负整数。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。

 IO 多路复用之 select

        应用进程通过调用 select 函数,可以同时监控多个 fd,在 select 函数监控的 fd中,只要有任何一个数据状态准备就绪了,select 函数就会返回可读状态,这时应用进程再发起 recvfrom( )请求去读取数据。
        非阻塞 IO 模型(NIO)中,需要 N(N>=1)次轮询系统调用,然而借助select 的 IO 多路复用模型,只需要发起一次询问就够了,大大优化了性能。
        但是呢,select 有几个缺点:
                监听的 IO 最大连接数有限,在 Linux 系统上一般为 1024。select 函数返回后,是通过遍历 fdset,找到就绪的描述符 fd。(仅知道有 I/O 事件发生,却不知是哪几个流,所以遍历所有流). 因为存在连接数限制,所以后来又提出了poll。与 select 相比,poll 解决了连接数限制问题。但是,select 和 poll 一样,还是需要通过遍历文件描述符来获取已经就绪的 socket。如果同时连接的大量客户端,在一时刻可能只有极少处于就绪状态,伴随着监视的描述符数量的增长,
效率也会线性下降
        因此经典的多路复用模型 epoll 诞生。

IO 多路复用之 epoll

        为了解决 select/poll 存在的问题,多路复用模型 epoll 诞生,它采用事件驱动来实现,流程图如下:
        epoll 先通过 epoll_ctl()来注册一个 fd(文件描述符),一旦基于某个 fd 就绪时,内核会采用回调机制,迅速激活这个 fd,当进程调用 epoll_wait()时便得到通知。这里去掉了遍历文件描述符的坑爹操作,而是采用监听事件回调的机制。
        这就是 epoll 的亮点。
总结一下 select、poll、epoll 的区别
        epoll 明显优化了 IO 的执行效率,但在进程调用 epoll_wait()时,仍然可能被阻塞。能不能不用我老是去问你数据是否准备就绪,等我发出请求后,你数据准备好了通知我就行了,这就诞生了信号驱动 IO 模型

IO 模型之信号驱动模型

        信号驱动不再用主动询问的方式去确认数据是否就绪,而是向内核发送一个信号,然后应用用户进程可以去做别的事,不用阻塞。当内核数据准备好后,再通过信号通知应用进程,数据准备好后的可读状态。应用用户进程收到信号之后,立即调用 recvfrom,去读取数据。
        信号驱动 IO 模型,在应用进程发出信号后,是立即返回的,不会阻塞进程。它已经有异步操作的感觉了。但是上面的流程图,发现数据复制到应用缓冲的时候,应用进程还是阻塞的。回过头来看下,不管是 BIO,还是 NIO,还是信号驱动,在数据从内核复制到应用缓冲的时候,都是阻塞的。

         还有没有优化方案呢?AIO(真正的异步 IO)!

异步 IO(AIO asynchronous IO)

        前面讲的 BIO,NIO 和信号驱动,在数据从内核复制到应用缓冲的时候,都是阻塞的,因此都不算是真正的异步。AIO 实现了 IO 全流程的非阻塞,就是应用进程发出系统调用后,是立即返回的,但是立即返回的不是处理结果,而是表示提交成功类似的意思。等内核数据准备好,将数据拷贝到用户进程缓冲区,发送信号通知用户进程 IO 操作执行完毕。
        流程如下:

 

        异步 IO 的优化思路很简单,只需要向内核发送一次请求,就可以完成数据状态询问和数据拷贝的所有操作,并且不用阻塞等待结果。日常开发中,有类似思想的业务场景:
        比如发起一笔批量转账,但是批量转账处理比较耗时,这时候后端可以先告知前端转账提交成功,等到结果处理完,再通知前端结果即可。
阻塞、非阻塞、同步、异步 IO 划分:

 

        一个通俗例子读懂 BIO、NIO、AIO
        同步阻塞(blocking-IO)简称 BIO
        同步非阻塞(non-blocking-IO)简称 NIO
        异步非阻塞(asynchronous-non-blocking-IO)简称 AIO
一个经典生活的例子:
BIO
        小明去吃同仁四季的椰子鸡,就这样在那里排队,等了一小时,轮到她了,然后才开始吃椰子鸡。
NIO
        小红也去同仁四季的椰子鸡,她一看要等挺久的,于是去逛会商场,每次逛一下,就跑回来看看,是不是轮到她了。于是最后她既购了物,又吃上椰子鸡了。
AIO
        小华一样,去吃椰子鸡,由于他是高级会员,所以店长说,你去商场随便逛会吧,等下有位置,我立马打电话给你。于是小华不用干巴巴坐着等,也不用每过一会儿就跑回来看有没有等到,最后也吃上了美味的椰子鸡
Java NIO 概述
        Java NIO(Non Blocking IO)是从 Java 1.4 版本开始引入的一个新的 IO API,可以替代标准的 Java IO API,NIO 支持面向缓冲区的、基于通道的 IO 操作。NIO 将以更加高效的方式进行文件的读写操作。

阻塞 IO(Blocking I/O BIO)

        通常在进行同步 I/O 操作时,如果读取数据,代码会阻塞直至有可供读取的数据。同样,写入调用将会阻塞直至数据能够写入。
        传统的 Server/Client 模式服务器会为每个客户端请求建立一个线程,由该线程单独负责处理一个客户请求。
        这种模式带来的一个问题就是线程数量的剧增,大量的线程会增大服务器的开销。大多数的实现为了避免这个问题,都采用了线程池模型,并设置线程池线程的最大数量,这由带来了新的问题,如果线程池中有 100 个线程,而有 100 个用户都在进行大文件下载,会导致第 101 个用户的请求无法及时处理,即便第 101 个用户只想请求一个几 KB 大小的页面。传统的 Server/Client 模式如下图所示:

非阻塞( non-blocking IO NIO) 

核心思想
        NIO 中非阻塞 I/O 调用不会被阻塞,核心是注册感兴趣的特定 I/O 事件,如可读数据到达,新的套接字连接等等,在发生特定事件时,系统再通知我们。
        NIO 中实现非阻塞 I/O 的核心对象就是 Selector.
        Selector 就是注册各种 I/O 事件地方,而且当我们感兴趣的事件发生时,就是这个对象告诉我们所发生的事件,如下图所示:
        从图中可以看出,当有读或写等任何注册的事件发生时,可以从 Selector 中获得相应的 SelectionKey,同时从 SelectionKey 中可以找到发生的事件和该事件所发生的具体的 SelectableChannel,以获得客户端发送过来的数据。
        非阻塞指的是 IO 事件本身不阻塞,但是获取 IO 事件的 select()方法是需要阻塞等待的.
        区别是 BIO 会阻塞在 IO 操作上,NIO 阻塞在事件获取上,没有事件就没有IO,从高层次看 IO 就不阻塞了.

NIO

Java NIO 核心部分组成
        Channels
        Buffers
        Selectors
        虽然 Java NIO 中除此之外还有很多类和组件,但 Channel,Buffer 和Selector 构成了核心的 API。其它组件,如 Pipe 和 FileLock,只不过是与三个核心组件共同使用的工具类。

Channel

        Channel,可以翻译成“通道”。Channel 和 IO 中的 Stream(流)是差不多一个等级的。只不过 Stream 是单向的,譬如:InputStream,OutputStream.
        而 Channel 是双向的,既可以用来进行读操作,又可以用来进行写操作。因为Channel 是全双工的,所以它可以比流更好地映射底层操作系统的 API。
        Channel 是一个对象,可以通过它读取和写入数据。所有数据都通过 Buffer对象来处理。你永远不会将字节直接写入通道中,相反,您是将数据写入包含一个或者多个字节的缓冲区。同样,您不会直接从通道中读取字节,而是将数据从通道读入缓冲区,再从缓冲区获取这个字节。
        NIO 中的 Channel 的主要实现有:
                FileChannel:从文件中读写数据
                DatagramChannel:通过 UDP 读写网络中的数据
                SocketChannel:通过 TCP 读写网络中的数据
                ServerSocketChannel:可以监听新进来的 TCP 连接

 

Buffer

        Java NIO 中的 Buffer 用于和 NIO 通道进行交互。数据是从通道读入缓冲区,从缓冲区写入到通道中的。
        缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存。这块内存被包装成 NIO Buffer 对象,并提供了一组方法,用来方便的访问该块内存。
        NIO 中的关键的 Buffer 实现有:
                ByteBuffer
                CharBuffer
                ShortBuffer
                IntBuffer
                LongBuffer
                FloatBuffer
                DoubleBuffer
        对数据的读取/写入需要使用 buffer,buffer 本质就是一个数组
        常用方法:
                ByteBuffer.allocate(1024); 创建字节数据
                byteBuffer.flip(); 翻转这个缓冲区,读操作前使用
                byteBuffer.clear(); 清除缓存,写操作前使用
一个基本的 NIO 案例
FileInputStream in = new FileInputStream("E:/source.txt");
FileOutputStream out = new FileOutputStream("E:/dest.txt");
FileChannel inchannel = in.getChannel();
FileChannel outchannel = out.getChannel();
ByteBuffer byteBuffer = ByteBuffer.allocate(1024);while(inchannel.read(byteBuffer)!=-1){byteBuffer.flip();outchannel.write(byteBuffer);byteBuffer.clear();}

Selector

        Selector 一般称为选择器。它是 Java NIO 核心组件中的一个,用于检查一个或多个 NIO Channel(通道)的状态是否处于可读、可写。如此可以实现单线程管理多个 channels,也就是可以管理多个网络链接。
        使用 Selector 的好处在于:使用更少的线程来就可以来处理通道了,相比使用多个线程,避免了线程上下文切换带来的开销。

 

相关文章:

39、BlackRose(VulnHub)

BlackRose 一、nmap二、web渗透 随便看看注册进去 账号:xxxxxx 密码:xxxxxx目录爆破 有很多特殊的目录,不过访问后都重定向了burpsuite改包进admin 查看xxxxxx用户数据包 抓一些xxxxxx用户的一些记录包,看看有什么可用的 signature=&command=id&indexcsrf=3cb58993…...

探索项目管理系统:解析五大功能,洞悉项目成功的关键

项目管理新手往往喜欢埋头苦干,殊不知优秀的项目经理已经熟练运用项目管理系统,让项目规划条理清晰。项目管理系统具备的功能,好用的项目管理系统都有这5大功能。分别是项目WBS分解、项目图表和报表、工时管理、团队协作、任务流程自动化。一、项目WBS分解 1.什么是项目WBS分…...

2024/4/27开发

讨论:讨论今天要干什么,但是有一个去陪女朋友去了,剩下两个下午都有一个预选赛,今天事情都很多,就考虑今天停工一天。...

详解Linux文件系统:ext4及更高版本

今天带大家了解一下ext4的历史,包括其与ext3和之前的其它文件系统之间的区别 大多数现代Linux发行版默认为ext 4文件系统,就像以前的Linux发行版默认为ext3、ext2,以及-如果追溯到足够远的话-ext。 如果您是Linux新手或者是文件系统新手,您可能会想知道ext 4给表带来了什么…...

java发送http请求

private void handleCartItems(List<CartVO> vos) {// 1.获取商品idSet<Long> itemIds = vos.stream().map(CartVO::getItemId).collect(Collectors.toSet());// 2.查询商品ResponseEntity<List<ItemDTO>> response = restTemplate.exchange( // 发送…...

vmware中安装centos7, 安装redis, 并通过可视化软件(RESP)连接

1. 虚拟机网络问题解决 刚安好的centos可能没有网卡(输入ip a 没有ip地址),此时需要进行如下操作 vi /etc/sysconfig/network-scripts/ifconfig-ens33修改成如下:ONBOOT=yes 然后重启网络服务:service network restart此时重新查看ip a就可以看到ip地址了 在本地ping虚拟机…...

IO-操作系统

用户态和内核态 现代操作系统&#xff0c;为了保护系统的安全&#xff0c;都会划分出内核空间和用户空间&#xff0c;或者我们经常说的内核态和用户态。简单来说&#xff0c;就是划分为内核态和用户态两个等级&#xff0c;运行在用户态的进程大都是一些应用程序&#xff0c;能够…...

Elasticsearch基本查询语法

先造点数据 基于elasticsearch7.10.0 POST /hotel {"mappings":{"properties":{"title":{"type":"text"},"city":{"type":"keyword"},"price":{"type":"double&q…...

百度地图入门

百度地图官网百度api 进入官网选择javascript API 里面有详细的教程&#xff0c; 跟着教程先登录注册一个个人开发账号 并创建一个应用获取ak 创建时js需要填白名单&#xff0c;如果是在本地运行填写localhost就好了 当你在控制台看到这个界面是代表创建成功了&#xff0c;…...

Endor Labs:2023年十大开源安全风险

近日&#xff0c;Endor Labs发布了一份新报告&#xff0c;确定了2023年的十大开源安全风险。报告显示&#xff0c;许多软件公司依赖于开源软件代码&#xff0c;但在如何衡量和处理与开源软件相关的风险和漏洞方面缺乏一致性。调查发现&#xff0c;在应用程序中超过80%的代码可能…...

linux 产生随机数 并遍历

1、产生随机数 varRANDOMvarRANDOM varRANDOMvar[ $var % 150 ] 2、产生不重复的随机数 $ entries($(shuf -i 0-149 -n 15)) $ echo “${entries[]}” 3、对随机数排序 $ entries($(shuf -i 0-149 -n 15 | sort -n)) $ echo “entries[]"12224549546678798393118119124140…...

OAuth2协议

OAuth2协议流程图协议角色和流程授权所需信息授权方式授权码模式&#xff08;authorization code&#xff09;参数简化模式密码模式客户端模式授权方式小结流程图 协议角色和流程 user-agent&#xff1a;浏览器或者手机App平台 资源所有者&#xff08;resourc owner&#xff0…...

Kafka在Mac下的安装与使用

mac 安装kafka安装kafka的原因安装kafka启动Zookeeper启动Kafka创建topic查看topic生产数据消费数据关闭zookeeper关闭kafka测试安装kafka的原因 用户微服务登录后需要向广告微服务中发送用户登录的信息以获取用户画像&#xff08;这个过程是异步的&#xff09;&#xff0c;故…...

Linux之sshd_config配置文件说明及实践

一、sshd_config文件说明 sshd_config 是 OpenSSH SSH 服务器守护进程配置文件&#xff0c;主要用于设置ssh server服务的相关参数&#xff0c;包括监听地址、监听端口、允许验证次数、是否允许root账户登录等等。sshd服务从/etc/ssh/sshd_config&#xff08;或命令行中用-f指定…...

如何将pdf大小压缩?怎么缩小pdf的文件大小?

PDF文件常常会因为内容的多样和丰富而导致文件过大&#xff0c;这个时候我们可以选择将pdf压缩大小&#xff0c;这样即使你的电脑中有大量PDF文档也不怕占用太多内存啦&#xff0c;今天分享给大家的是使用pdf在线压缩工具进行pdf压缩&#xff08;https://www.yasuotu.com/pdfya…...

WuThreat身份安全云-TVD每日漏洞情报-2023-03-28

漏洞名称:ABB RCCMD 硬编码密码漏洞 漏洞级别:严重 漏洞编号:CVE-2022-4126 相关涉及:RCCMD: 4.40之前230207 漏洞状态:未定义 参考链接:https://tvd.wuthreat.com/#/listDetail?TVD_IDTVD-2023-07407 漏洞名称:SOFTNEXT 垃圾邮件 SQR 代码注入 漏洞级别:高危 漏洞编号:CVE-2…...

在芯片设计行业,从项目的初期到交付,不同的岗位的工程师主要负责什么?

大家都知道在芯片设计行业&#xff0c;项目是至关重要的一环。从项目的初期到交付&#xff0c;不同的岗位的工程师在项目的各环节主要负责什么?他们是怎样配合的?下面看看资深工程师怎么说。 一个项目&#xff0c;从初期到交付的过程是比较漫长的。我们知道最早的时候&#…...

给你一个购物车模块,你会如何设计测试用例?【测试用例设计】

测试购物车 从使用场景上&#xff0c;把自己想象成一个使用购物车的人&#xff0c;模拟流程&#xff0c;可以主要从两个方面进行考虑&#xff1a; 涉及操作&#xff1a;增&#xff08;添加商品&#xff09;删&#xff08;删除商品&#xff09;改&#xff08;编辑、跳转商品&a…...

centos7配置pytorch和tensorflow

1、安装anaconda 1.1镜像源下载对应anaconda版本后传到服务器上 1.2进入对应文件夹 首先赋权再执行安装程序 chmod x Anaconda3-2022.10-Linux-x86_64.sh ./Anaconda3-2022.10-Linux-x86_64.sh chmod x Anaconda3-2022.10-Linux-x86_64.sh 1.3交互确认 确认许可协议&…...

libmemunreachable+malloc debug分析内存泄露

使用lsan遇到困难 一般使用lsan来查memleak效率最高&#xff0c;不过针对cameraserver hook到asan库时有一些其他的报错。 而且报错看起来还不太好解决&#xff1a; 看下如何针对camerasever使能lsan&#xff0c;后续研究。 使用libmemunreachablemallocdebug分析 原理 相关…...

关于Error和Exception的一些思考 小结

目录 1. ERROR 2. Exception 2.1 checked Exception 2.2 unchecked Exception 2.3 区别 3. 内存溢出 3.1 堆溢出 3.2 永久代/元空间溢出 3.3 方法栈溢出 Java中&#xff0c;所有的异常都有一个共同的父类&#xff1a;Throwable类。 Throwable类有两个重要的子类&#…...

Docker学习记录

阅读前请看一下&#xff1a;我是一个热衷于记录的人&#xff0c;每次写博客会反复研读&#xff0c;尽量不断提升博客质量。文章设置为仅粉丝可见&#xff0c;是因为写博客确实花了不少精力。希望互相进步谢谢&#xff01;&#xff01; 文章目录阅读前请看一下&#xff1a;我是一…...

@RefreshScope 和 @Scope的使用及源码解析

结论&#xff1a; Scope 1、Scope代表spring Bean对象的作用域&#xff0c;一般分为singleton、prototype、request、session、application。其中request、session、application的缓存在GenericWebApplicationContext.postProcessBeanFactory方法中创建 2、Scope的注解proxy…...

element ui通过formdata上传文件

ElementUI的upload组件手动上传&#xff0c;formdata表单数据 Excerpt 使用场景&#xff1a;选取好excel文件后&#xff0c;再把导入的excel文件和参数同时提交给服务器&#xff0c;需要用到文件的手动上传&#xff0c;但是直接拷贝官网的demo会出现问题&#xff0c;下面会具体…...

关于微信小程序安装npm的过程,从下载到小程序内部安装完成

1.先从官网下载nodejs 网站为Node.js (nodejs.org)&#xff0c;选择左边第一个2 然后一直next&#xff0c;选默认就行 选择自己喜欢的路径我的是D:\nodejs-v18.12.1 3 下载完成后&#xff0c;先在安装文件夹中新建两个文件夹 node_cache node_global 4 配置一下环境变量&…...

【游戏开发环境】Unity使用Mac电脑开发,开发环境的搭建(Mac mini M1 VSCode Git 好用工具)

文章目录 一、前言二、Unity下载安装三、VSCode 1、VSCode下载安装2、VSCode插件 2.1、unity3d-pack插件2.2、Bracket Pair Colorizer 2插件2.3、其他插件 3、代码无法提示与补全的问题 3.1、Windows解决办法3.2、Mac解决办法 3.2.1、安装Mono3.2.2、设置Omnisharp: Use Global…...

原神 Android 教程 —安卓版

准备材料 一台能读写 /system 分区的 Android 手机(或:一台安装了 Magisk 的 Android 手机) 有人搞出来免root端了,此条件不再必须私服客户端...

Windows安装配置tidevice

一直以来&#xff0c;iOS自动化的实现和执行都依赖Mac系统&#xff0c;其主要原因是因为需要通过Xcodebuild编译安装WDA (WebDriverAgent)到iOS设备中&#xff0c;通过WDA实现对被测应用进行操作。而Windows系统无法运行Xcode工具&#xff0c;所以无法运行iOS自动化测试&#x…...

关于Spring 的IoC和AOP的面试题,快看看你都能答上来哪些

推荐&#xff1a;前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。。 点击跳转到网站 &#x1f3e1; 博客首页&#xff1a;派 大 星 ⛳️ 欢迎关注 ❤️ 点赞 &#x1f392; 收藏 ✏️ 留言 &#x1f…...

Python Module — OpenAI ChatGPT API

目录 文章目录目录OpenAI Python SDKopenai.ChatCompletion 模块openai.ChatCompletion.create 函数OpenAI Python SDK 官方文档&#xff1a;https://platform.openai.com/docs/api-reference/introduction OpenAI Python SDK 用于开发与 OpenAI RESTful API 进行交互的客户端…...

Linux 0.11

调试介绍 Linux 0.11-调试 Linux 最早期的代码-36 启动跟踪 BIOS 加载 电脑启动&#xff0c;CPU指向0xFFFFFFF0处&#xff0c;这里正好是系统ROM BIOS存放的地址。即开始执行BIOS指令。为了保持向下兼容&#xff0c;就会把与原PC兼容的BIOS代码和数据复制到低端1M末端的64K…...

Elasticsearch 需要了解的都在这

ES选主过程&#xff1f;其实ES的选主过程其实没有很高深的算法加持&#xff0c;启动过程中对接点的ID进行排序&#xff0c;取ID最大节点作为Master节点&#xff0c;那么如果选出来的主节点中存储的元信息不是最新的怎么办&#xff1f;其实他是分了2个步骤做这件事&#xff0c;先…...

anaconda如何改变虚拟环境安装路径

1、查看anaconda的环境配置&#xff08;对应结果如下图所示&#xff09; conda config --show 或者 conda info 查看虚拟环境安装位置的结果如上图所示 2、修改配置语法 conda config --add key value #添加语法 conda config --remove key value #删除语法 其中&#xff0…...

基于opencv的边缘检测方法

1、梯度运算 用OpenCV的形态变换&#xff08; 膨胀、腐蚀、开运算和闭运算&#xff09;函数morphologyEx 梯度运算即膨胀结果-腐蚀结果&#xff1a; 【注意】对于二值图像来说&#xff0c;必须是前景图像为白色&#xff0c;背景为黑色&#xff0c;否则需要进行反二值化处理 …...

Mac环境变量配置(Java)

1.打开终端&#xff1a; 2.输入命令&#xff1a;【/usr/libexec/java_home -V】,查看默认的jdk下载地址&#xff08;绿色下划线的就是jdk默认路径&#xff09;&#xff08;注意⚠️&#xff1a;命令行终端是区分大小写的【-v 是不对的&#xff0c;必须是大写 -V】&#xff09; …...

Linux定时任务:编辑、查看、删除

查看定时任务文件所在位置&#xff08;通常情况下在/var/spool/cron/文件夹里&#xff0c;文件名通常是以创建者的用户名命名&#xff09; 注意&#xff1a;当前登录用户名为root&#xff1a; 1、编辑定时任务&#xff08;相当于自动在/var/spool/cron目录下,创建了一个 以当…...

昇腾AI机器人发布,12家企业、5家高校签约,昇腾AI开发者创享日全国巡展沈阳首站成功举办

“创未来&#xff0c;享非凡”昇腾AI开发者创享日2023年全国巡回首站活动成功举办&#xff0c;本次活动由辽宁省科技厅指导&#xff0c;由沈阳市科技局、浑南区人民政府、沈阳高新区管理委员会、华为技术有限公司共同主办&#xff0c;沈阳昇腾人工智能生态创新中心承办&#xf…...

基于 OpenCV 与 Java 两个语言版本实现获取某一图片特定区域的颜色对比度

本文目录一、什么是对比度二、什么是颜色直方图三、如何通过RGB计算颜色对比度什么是HSV、Lab颜色空间四、OpenCV代码五、Java代码5.1 平滑处理5.2 完整代码一、什么是对比度 对比度是指图像中不同区域之间的明暗差异程度&#xff0c;它是图像质量中的重要指标之一。除了颜色对…...

Springboot是什么

目录 为什么会要用springboot 1、之前 2、现在 springboot优点 springboot四大核心 自动装配介绍 1、自动装配作用是什么 2、自动装配原理 springboot starter是什么 1、starter作用 2、比如&#xff1a;我们想搭建java web框架 3、starter原理 SpringBootApplica…...

Mac M1通过VMWare Fusion安装Centos7记录(镜像和网络有大坑)

以前用linux系统基本都在我的服务器上或者是在win上进行&#xff0c;从没有在M1上进行创建&#xff0c;因此走了一些坑吧&#xff0c;这里会列出我的详细安装步骤。 下载镜像 镜像的下载网站&#xff1a;https://www.centos.org/download/ 在该网站中&#xff0c;不管是Every…...

Windows Server 2016远程桌面配置全过程

镜像下载 系统镜像网址 本次下载的是 Windows Server 2016 (Updated Feb 2018) (x64) - DVD (Chinese-Simplified) 远程桌面配置 Step 1 在开始菜单搜索服务&#xff0c;打开服务器管理器&#xff0c;点击右上角的管理按钮 Step 2 添加角色控制&#xff0c;点击下一步 S…...

js 数据类型

1.概念 数据类型指的是可以在程序中存储和操作的值的类型&#xff0c;每种编程语言都有其支持的数据类型&#xff0c;不同的数据类型用来存储不同的数据&#xff0c;例如文本、数值、图像等。 JavaScript 是一种动态类型的语言&#xff0c;在定义变量时不需要提前指定变量的类…...

No.020<软考>《(高项)备考大全》【第05章】项目范围管理

1 章节相关 1.1 考试相关 上午一般考3分左右&#xff0c;20下、21下、22上考案例分析 21上考论文写作&#xff0c;是案例、论文需要学习准备的重点 1.2 6个过程 &#xff08;1&#xff09;规划范围管理&#xff1a;对如何定义、确认和控制项目范围的过程进行描述。 &#x…...

LAMP架构之zabbix监控(2):zabbix基础操作

目录 一、zabbix监控节点添加和删除 &#xff08;1&#xff09;手动添加 &#xff08;2&#xff09;自动添加 &#xff08;3&#xff09;按照条件批量添加 &#xff08;4&#xff09;使用api工具进行管理 二、针对应用的zabbix监控 一、zabbix监控节点添加和删除 实验说明&a…...

九龙证券|重磅文章引爆两大板块!千亿煤炭龙头强势涨停!

A股今天走势分化&#xff0c;创业板指逆市拉升&#xff1b;港股走势疲弱&#xff0c;恒生科技指数一度跌超3%。 具体来看&#xff0c;A股方面&#xff0c;沪指弱势震荡下探&#xff0c;盘中一度跌超1%&#xff0c;午后跌幅收窄&#xff1b;创业板指走势微弱&#xff0c;午后涨超…...

OCR之论文笔记TrOCR

文章目录TrOCR: Transformer-based Optical Character Recognition with Pre-trained Models一. 简介二. TrOCR2.1. Encoder2.2 Decoder2.3 Model Initialiaztion2.4 Task Pipeline2.5 Pre-training2.6 Fine-tuning2.7 Data Augmentation三. 实验3.1 Data3.2 Settings3.2 Resul…...

静态路由+DHCP实验(四路由器八PC)

一.200.1.1.0/24子网划分 1.划分八个子网 2.选用前5个&#xff0c;第五个子网再划分4个子网作为骨干 二.规划路由 三.配置&#xff08;下一跳&#xff09; 1.先依次实现四个路由器之间全网可通 2.为路由器配置地址池&#xff0c;使用全局模式获取dhcp&#xff0c;指定网关…...

文件包含漏洞原理与实践

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 文件包含漏洞一、什么是文件包含漏洞&#xff1f;二、文件包含函数三、两种文件包含1、本地文件包含1.1 使用教程演示2、远程文件包含1.1 使…...

利用摄影测量进行地形建模的介绍

一、前言 从一个地方到另一个地方的地球表面由连续和突然的海拔变化组成&#xff0c;个人和社会都必须应对这些变化。 水从高山和丘陵向下流&#xff0c;从溪流流入河流&#xff0c;形成三角洲&#xff0c;最终汇入大海。 三维 (3D) 地面信息的获取和表示一直是与行星表面相关的…...

【Nginx】Nginx 常用的基础配置

文章目录一、基础配置二、隐藏 Nginx 版本信息三、禁止ip直接访问80端口四、启动 web 服务 (vue 项目为例)五、PC端和移动端使用不同的项目文件映射六、一个web服务&#xff0c;配置多个项目 (location 匹配路由区别)七、配置负载均衡八、SSL 配置 HTTPS一、基础配置 user …...

基于OpenCV的图片和视频人脸识别

目录 &#x1f969;前言 &#x1f356;环境使用 &#x1f356;模块使用 &#x1f356;模块介绍 &#x1f356;模块安装问题: &#x1f969;人脸检测 &#x1f356;Haar 级联的概念 &#x1f356;获取 Haar 级联数据 &#x1f357; 1.下载所需版本 &#x1f357; 2.安…...

比肩ChatGPT的国产AI:文心一言——有话说

&#x1f517; 运行环境&#xff1a;chatGPT&#xff0c;文心一言 &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 #### 防伪水印——左手の明天 #### &#x1f497; 大家好&am…...

剑指offer JZ77 按之字形顺序打印二叉树

Java JZ77 按之字形顺序打印二叉树 文章目录Java JZ77 按之字形顺序打印二叉树一、题目描述二、双栈法三、队列reverse()法使用双栈法和队列reverse()法解决剑指offer JZ77 按之字形顺序打印二叉树的问题。 一、题目描述 给定一个二叉树&#xff0c;返回该二叉树的之字形层序遍…...

【Azure 架构师学习笔记】-Azure Data Factory (5)-Managed VNet

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Data Factory】系列。 接上文【Azure 架构师学习笔记】-Azure Data Factory (4)-触发器详解-事件触发器 前言 PaaS服务默认都经过公网传输&#xff0c; 这对很多企业而言并不安全&#xff0c;那么就需要对其进行安全改…...

聚类算法层次聚类

###cluster.py #导入相应的包 import scipy import scipy.cluster.hierarchy as sch from scipy.cluster.vq import vq,kmeans,whiten import numpy as np import matplotlib.pylab as plt #生成待聚类的数据点,这里生成了20个点,每个点4维: pointsscipy.randn(20,4) #加一…...

大数据写入到Oracle数据库(批量插入数据)

开发中经常遇到批量插入数据的需求&#xff0c;为了提高开发效率大多会使用ORM架构&#xff0c;个别之处 才会手写SQL&#xff0c;我们使用C#.NET Core5.0开发&#xff0c;所以优先选择了微软的EF。 但是EF原生没有批量操作功能&#xff0c;需要自己扩展或使用第三方的扩展&am…...

【C++类和对象】探索static成员、友元以及内部类

&#x1f49e;&#x1f49e; 前言 hello hello~ &#xff0c;这里是大耳朵土土垚~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#x…...

C++下跨平台websocket库及使用示例

websocketpp库使用非常方便&#xff0c;开源&#xff0c;可跨平台&#xff0c;内部实现全部是head文件&#xff0c;无cpp&#xff0c;接口简单易用。源码路径比如 https://github.com/zaphoyd/websocketpp.git 使用方法是&#xff0c;先下载源码包并复制道工程的include目录下…...

Docker容器部署overleaf

overleaf在线版限制很多&#xff0c;好在开源&#xff0c;准备在本地Docker部署&#xff0c;网上翻了翻&#xff0c;似乎本地部署并非易事&#xff0c;我也尝试了一下&#xff0c;发现直接使用docker-compose拉官方最新镜像部署的确问题很多&#xff0c;不过最终还是完美解决。…...

AI 提示词生成器

https://prompt-generator.ilovecoke.cc/参考 AI 提示词生成器...

债券基金的分类

纯债基金&#xff0c;只买债券&#xff0c;不买股票&#xff0c;也不买可转债的债券基金。按照投资债券的久期长短&#xff0c;分为短债基金和长债基金。 短债基金只买到期时间只剩下一年(短期)或者还有1-3年(中期)的债券。因为这些债券到期时间比较近了&#xff0c;所以受利率…...

释放Stable Diffusion 无限可能

最近在整理大语言模型的系列内容&#xff0c;Stable Diffusion 是我下一篇博客的主题。关注 Stable Diffusion&#xff0c;是因为它是目前最受欢迎和影响力最大的多模态生成模型之一。Stable Diffusion 于 2022 年 8 月发布&#xff0c;主要用于根据文本的描述产生详细图像&…...