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

嵌入式Linux应用开发-驱动大全-第一章同步与互斥④

嵌入式Linux应用开发-驱动大全-第一章同步与互斥④

  • 第一章 同步与互斥④
    • 1.5 自旋锁spinlock的实现
      • 1.5.1 自旋锁的内核结构体
      • 1.5.2 spinlock在UP系统中的实现
      • 1.5.3 spinlock在SMP系统中的实现
    • 1.6 信号量semaphore的实现
      • 1.6.1 semaphore的内核结构体
      • 1.6.2 down函数的实现
      • 1.6.3 up函数的实现
    • 1.7 互斥量mutex的实现
      • 1.7.1 mutex的内核结构体
      • 1.7.2 mutex_lock函数的实现
        • 1.7.2.1 fastpath
        • 1.7.2.2 slowpath
      • 1.7.3 mutex_unlock函数的实现
        • 1.7.3.1 fastpath
        • 1.7.3.2 slowpath

第一章 同步与互斥④

在这里插入图片描述

1.5 自旋锁spinlock的实现

自旋锁,顾名思义:自己在原地打转,等待资源可用,一旦可用就上锁霸占它。
问题来了,假设别人已经上锁了,你原地打转会占住 CPU资源了,别的程序怎么运行?它没有 CPU怎么解锁?
这个问题,有 2个答案:
① 原地打转的是 CPU x,以后 CPU y会解锁:这涉及多个 CPU,适用于 SMP系统;
② 对于单 CPU系统,自旋锁的“自旋”功能就去掉了:只剩下禁止抢占、禁止中断
我先禁止别的线程来打断我(preempt_disable),我慢慢享用临界资源,用完再使能系统抢占(preempt_enable),这样别人就可以来抢资源了。
注意:SMP就是 Symmetric Multi-Processors,对称多处理器;UP即 Uni-Processor,系统只有一个单核 CPU。
要理解 spinlock,要通过 2个情景来分析:
① 一开始,怎么争抢资源?不能 2个程序都抢到。 这挺好解决,使用原子变量就可以实现。
② 某个程序已经获得资源,怎么防止别人来同时使用这个资源。
这是使用 spinlock时要注意的地方,对应会有不同的衍生函数(_bh/_irq/_irqsave/_restore)。

1.5.1 自旋锁的内核结构体

spinlock对应的结构体如下定义,不同的架构可能有不同的实现:
在这里插入图片描述

上述__raw_tickets结构体中有 owner、next两个成员,这是在 SMP系统中实现 spinlock的关键。

1.5.2 spinlock在UP系统中的实现

对于“自旋锁”,它的本意是:如果还没获得锁,我就原地打转等待。等待谁释放锁? ① 其他 CPU
② 其他进程/线程
对于单 CPU系统,没有“其他 CPU”;如果内核不支持 preempt,当前在内核态执行的线程也不可能被其他线程抢占,也就“没有其他进程/线程”。所以,对于不支持 preempt的单 CPU系统,spin_lock是空函数,不需要做其他事情。
如果单 CPU系统的内核支持 preempt,即当前线程正在执行内核态函数时,它是有可能被别的线程抢占的。这时 spin_lock的实现就是调用“preempt_disable()”:你想抢我,我干脆禁止你运行。
在 UP系统中,spin_lock函数定义如下:
在这里插入图片描述

从以上代码可知,在 UP系统中 spin_lock()就退化为 preempt_disable(),如果用的内核不支持 preempt,那么 spin_lock()什么事都不用做。
对于 spin_lock_irq(),在 UP系统中就退化为 local_irq_disable()和 preempt_disable(),如下图所示:
在这里插入图片描述
假设程序 A要访问临界资源,可能会有中断也来访问临界资源,可能会有程序 B也来访问临界资源,那么使用 spin_lock_irq()来保护临界资源:先禁止中断防止中断来抢,再禁止 preempt防止其他进程来抢。
对于 spin_lock_bh(),在 UP系统中就退化为禁止软件中断和 preempt_disable(),如下图所示:
在这里插入图片描述

对于 spin_lock_irqsave,它跟 spin_lock_irq类似,只不过它是先保存中断状态再禁止中断,如下:
在这里插入图片描述

对应的 spin_unlock函数就不再讲解。

1.5.3 spinlock在SMP系统中的实现

要让多 CPU中只能有一个获得临界资源,使用原子变量就可以实现。但是还要保证公平,先到先得。比如有 CPU0、CPU1、CPU2都调用 spin_lock想获得临界资源,谁先申请谁先获得。
要想理解 SMP系统中 spinlock的实现,得举一个例子。感谢这篇文章:
Linux内核同步机制之(四):spin lock
http://www.wowotech.net/kernel_synchronization/spinlock.html
wowotech真是一个神奇的网站,里面 Linux文章的作者统一标为“linuxer”,牛!
我借用这篇文章的例子讲解,餐厅里只有一个座位,去吃饭的人都得先取号、等叫号。注意,有 2个动作:顾客从取号机取号,电子叫号牌叫号。
① 一开始取号机待取号码为 0
② 顾客 A从取号机得到号码 0,电子叫号牌显示 0,顾客 A上座;
取号机显示下一个待取号码为 1。
③ 顾客 B从取号机得到号码 1,电子叫号牌还显示为 0,顾客 B等待;
取号机显示下一个待取号码为 2。
④ 顾客 C从取号机得到号码 2,电子叫号牌还显示为 0,顾客 C等待;
取号机显示下一个待取号码为 3。
⑤ 顾客 A吃完离座,电子叫号牌显示为 1,顾客 B的号码等于 1,他上座;
⑥ 顾客 B吃完离座,电子叫号牌显示为 2,顾客 C的号码等于 2,他上座;
在这个例子中有 2个号码:取号机显示的“下一个号码”,顾客取号后它会自动加 1;电子叫号牌显示
“当前号码”,顾客离座后它会自动加 1。某个客户手上拿到的号码等于电子叫号牌的号码时,该客户上座。 在这个过程中,即使顾客 B、C同时到店,只要保证他们从取号机上得到的号码不同,他们就不会打架。
所以,关键点在于:取号机的号码发放,必须互斥,保证客户的号码互不相同。而电子叫号牌上号码的变动不需要保护,只有顾客离开后它才会变化,没人争抢它。
在 ARMv6及以上的 ARM架构中,支持 SMP系统。它的 spinlock结构体定义如下:
在这里插入图片描述

owner就相当于电子叫号牌,现在谁在吃饭。next就当于于取号机,下一个号码是什么。每一个 CPU从取号机上取到的号码保存在 spin_lock函数中的局部变量里。
spin_lock函数调用关系如下,核心是 arch_spin_lock:
在这里插入图片描述

arch_spin_lock代码如下:
在这里插入图片描述

图中的注释把原理讲得非常清楚了,即使不同的个体去同时取号,也可以保证取到的号码各不相同。

假设第 1个程序取到了号码,它访问了临界资源后,调用 spin_unlock,代码如下:
在这里插入图片描述

假如有其他程序正在 spin_lock函数中循环等待,它就会立刻判断自己手上的 next是否等于lock->tickets.owner,如果相等就表示输到它获得了锁。
深入分析_linux_spinlock_实现机制
https://blog.csdn.net/electrombile/article/details/51289813
深入分析 Linux自旋锁
http://blog.chinaunix.net/uid-20543672-id-3252604.html
Linux内核同步机制之(四):spin lock
http://www.wowotech.net/kernel_synchronization/spinlock.html

1.6 信号量semaphore的实现

1.6.1 semaphore的内核结构体

注意:这是信号量,不是信号。在前面学习异步通知时,驱动程序给应用程序发信号。现在我们讲的信号量是一种同步、互斥机制。
信号量的定义及操作函数都在 Linux内核文件 include\linux\semaphore.h中定义,如下:
在这里插入图片描述

初始化 semaphore之后,就可以使用 down函数或其他衍生版本来获取信号量,使用 up函数释放信号量。我们只分析 down、up函数的实现。

1.6.2 down函数的实现

如果 semaphore中的 count大于 0,那么 down函数就可以获得信号量;否则就休眠。在读取、修改 count时,要使用 spinlock来实现互斥。
休眠时,要把当前进程放在 semaphore的 wait_list链表中,别的进程释放信号量时去 wait_list中把进程取出、唤醒。
代码如下:
在这里插入图片描述

1.6.3 up函数的实现

如果有其他进程在等待信号量,则 count值无需调整,直接取出第 1个等待信号量的进程,把信号量给它,共把它唤醒。
如果没有其他进程在等待信号量,则调整 count。
整个过程需要使用 spinlock来保护,代码如下:
在这里插入图片描述

1.7 互斥量mutex的实现

1.7.1 mutex的内核结构体

mutex的定义及操作函数都在 Linux内核文件 include\linux\mutex.h中定义,如下:
在这里插入图片描述

初始化 mutex之后,就可以使用 mutex_lock函数或其他衍生版本来获取信号量,使用 mutex_unlock函数释放信号量。我们只分析 mutex_lock、mutex_unlock函数的实现。
这里要堪误一下:前面的视频里我们说 mutex中的 owner是用来记录获得 mutex的进程,以后必须由它来释放 mutex。这是错的!
从上面的代码可知,owner并不一定存在!
owner有 2个用途:debug(CONFIG_DEBUG_MUTEXES)或 spin_on_owner(CONFIG_MUTEX_SPIN_ON_OWNER)。 什么叫 spin on owner?
我们使用mutex的目的一般是用来保护一小段代码,这段代码运行的时间很快。这意味着一个获得mutex的进程,可能很快就会释放掉 mutex。
针对这点可以进行优化,特别是当前获得 mutex的进程是在别的 CPU上运行、并且“我”是唯一等待这个 mutex的进程。在这种情况下,那“我”就原地 spin等待吧:懒得去休眠了,休眠又唤醒就太慢了。
所以,mutex是做了特殊的优化,比 semaphore效率更高。但是在代码上,并没有要求“谁获得 mutex,就必须由谁释放 mutex”,只是在使用惯例上是“谁获得 mutex,就必须由谁释放 mutex”。

1.7.2 mutex_lock函数的实现

1.7.2.1 fastpath

mutex的设计非常精巧,比 semaphore复杂,但是更高效。
首先要知道 mutex的操作函数中有 fastpath、slowpath两条路径(快速、慢速):如果 fastpath成功,就不必使用 slowpath。
怎么理解?
这需要把 metex中的 count值再扩展一下,之前说它只有 1、0两个取值,1表示 unlocked,0表示locked,还有一类值“负数”表示“locked,并且可能有其他程序在等待”。
代码如下:
在这里插入图片描述

先看看 fastpath的函数:__mutex_fastpath_lock,这个函数在下面 2个文件中都有定义:

include/asm-generic/mutex-xchg.h 
include/asm-generic/mutex-dec.h 

使用哪一个文件呢?看看 arch/arm/include/asm/mutex.h,内容如下:

#if __LINUX_ARM_ARCH__ < 6 
#include <asm-generic/mutex-xchg.h> 
#else 
#include <asm-generic/mutex-dec.h> 
#endif 

所以,对于 ARMv6以下的架构,使用 include/asm-generic/mutex-xchg.h中的__mutex_fastpath_lock函数;对于 ARMv6及以上的架构,使用 include/asm-generic/mutex-dec.h中的__mutex_fastpath_lock函数。这 2个文件中的__mutex_fastpath_lock函数是类似的,mutex-dec.h中的代码如下:
在这里插入图片描述

大部分情况下,mutex当前值都是 1,所以通过 fastpath函数可以非常快速地获得 mutex。

1.7.2.2 slowpath

如果 mutex当前值是 0或负数,则需要调用__mutex_lock_slowpath慢慢处理:可能会休眠等待。
在这里插入图片描述

__mutex_lock_common函数也是在内核文件 kernel/locking/mutex.c中实现的,下面分段讲解。
① 分析第一段代码:
在这里插入图片描述

② 分析第二段代码:
在这里插入图片描述

③ 分析第三段代码:
在这里插入图片描述

这个 wait_list是 FIFO(Firt In Firs Out),谁先排队,谁就可以先得到 mutex。

④ 分析第四段代码:for循环,这是重点
在这里插入图片描述

⑤ 分析第五段代码:收尾工作
在这里插入图片描述

1.7.3 mutex_unlock函数的实现

mutex_unlock函数中也有 fastpath、slowpath两条路径(快速、慢速):如果 fastpath成功,就不必使用 slowpath。
代码如下:
在这里插入图片描述

1.7.3.1 fastpath

先看看 fastpath的函数:__mutex_fastpath_lock,这个函数在下面 2个文件中都有定义:

include/asm-generic/mutex-xchg.h 
include/asm-generic/mutex-dec.h 

使用哪一个文件呢?看看 arch/arm/include/asm/mutex.h,内容如下:

#if __LINUX_ARM_ARCH__ < 6 
#include <asm-generic/mutex-xchg.h> 
#else 
#include <asm-generic/mutex-dec.h> 
#endif 

所以,对于 ARMv6以下的架构,使用 include/asm-generic/mutex-xchg.h中的__mutex_fastpath_lock函数;对于 ARMv6及以上的架构,使用 include/asm-generic/mutex-dec.h中的__mutex_fastpath_lock函数。这 2个文件中的__mutex_fastpath_lock函数是类似的,mutex-dec.h中的代码如下:

大部分情况下,加 1后 mutex的值都是 1,表示无人等待 mutex,所以通过 fastpath函数直接增加 mutex的 count值为 1就可以了。
如果 mutex的值加 1后还在这里插入图片描述
是小于等于 0,就表示有人在等待 mutex,需要去 wait_list把它取出唤醒,这需要用到 slowpath的函数:__mutex_unlock_slowpath。

1.7.3.2 slowpath

如果 mutex当前值是 0或负数,则需要调用__mutex_unlock_slowpath慢慢处理:需要唤醒其他进程。
在这里插入图片描述

__mutex_unlock_common_slowpath函数代码如下,主要工作就是从 wait_list中取出并唤醒第 1个进程:
在这里插入图片描述

相关文章:

嵌入式Linux应用开发-驱动大全-第一章同步与互斥④

嵌入式Linux应用开发-驱动大全-第一章同步与互斥④ 第一章 同步与互斥④1.5 自旋锁spinlock的实现1.5.1 自旋锁的内核结构体1.5.2 spinlock在UP系统中的实现1.5.3 spinlock在SMP系统中的实现 1.6 信号量semaphore的实现1.6.1 semaphore的内核结构体1.6.2 down函数的实现1.6.3 u…...

算法-数学-斜率-直线上最多的点数

算法-数学-斜率-直线上最多的点数 1 题目概述 1.1 题目出处 https://leetcode.cn/problems/max-points-on-a-line/ 1.2 题目描述 给你一个数组 points &#xff0c;其中 points[i] [xi, yi] 表示 X-Y 平面上的一个点。求最多有多少个点在同一条直线上。 2 暴力搜索斜率…...

项目进展(五)-修复PCB电路板,学习32位ADC芯片ADS1285

一、前言 上个月29号放假了&#xff0c;和朋友一起去了南京(人是真滴多)&#xff0c;师兄晚放假几天&#xff0c;结果在测试时不小心把12V和GND碰触到一起了&#xff0c;导致12V短路&#xff0c;电路板几乎瘫痪了。 今天下午到学校之后就开始着手寻找问题和修复&#xff0c;最…...

(三) Markdown插入互联网或本地视频解决方案

前言 不论博客系统是WordPress还是Typecho&#xff0c;绕不开的是两种书写语言&#xff0c;一种称之为富文本&#xff0c;一种叫做Markdown。 Markdown有很多好处&#xff0c;也有很多坏处&#xff0c;比如Markdown本身不具备段落居中的功能&#xff0c;以及Markdown也不具有…...

HPA (Horizontal Pod Autoscaler) In K8s

城市红绿灯智能调节 没准正在建设中哈哈哈 作为一位城市观察者和设计师&#xff0c;我想借助Kubernetes的HPA机制思想来描述城市红绿灯自动调节的场景。 在这个故事中&#xff0c;我们的城市面临着日益增长的交通流量和挤塞问题。为了应对这一挑战&#xff0c;城市决定引入智能…...

Ubuntu安装samba服务器

为了window系统下能够像访问本地目录一样访问ubuntu系统下的目录&#xff0c;这里我通过安装samba服务器&#xff0c;将ubuntu系统的文件目录通过网络挂载的方式共享出来&#xff0c;以便在window下就能够对ubuntu系统的文件进行读写等访问操作&#xff0c;这里记录一下samba服…...

[SpringBoot] 8. aop 获取 request response

最近开发有一个需求需要在 aop 中获取request response &#xff0c;搜索许久没有答案&#xff0c;故此记录&#x1f4dd;&#xff5e; aop 获取 package com.example.easy_im.aop;import com.example.easy_im.Context; import jakarta.servlet.http.HttpServletRequest; impo…...

同学苹果ios的ipa文件应用企业代签选择签名商看看这篇文章你再去吧

同学我们要知道随着互联网的发展&#xff0c;苹果应用市场的火爆&#xff0c;越来越多的开发者加入到苹果应用开发行业中来。同时&#xff0c;苹果应用市场上的应用也在不断增多&#xff0c;用户数量也在不断增加&#xff0c;苹果应用代签是指通过第三方公司为开发者的应用进行…...

【PyCharm Community Edition】:excel操作

Excel操作 相关模块openpyxlxlrdshutil 实例 相关模块 openpyxl 可以对.xlsx,.xlsm,.xltx,.xltm文件格式操作 打开文件&#xff1a;wb_xlsx openpyxl.load_workbook(“文件名”)新建文件&#xff1a;wb_xlsx openpyxl.Workbook()新建sheet表&#xff1a;wb_xlsx_sheet wb…...

证书显示未受信任,生成的证书过期

此时若是导入证书后&#xff0c;证书显示未受信任&#xff0c;则说明我们缺失最新的AppleWWDRCA证书 解决方案&#xff1a; 重新下载AppleWWDRCA并安装。即下载最新的AppleWWDRCA证书&#xff0c;双击安装到“登录”项的钥匙串下&#xff1b;然后再安装你的开发证书或者发布证书…...

VS+Qt+C++ GDAL读取tif图像数据显示

程序示例精选 VSQtC GDAL读取tif图像数据显示 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《VSQtC GDAL读取tif图像数据显示》编写代码&#xff0c;代码整洁&#xff0c;规则&#xff0c;…...

CSS 选择器-认识并应用选择器

CSS选择器是用来定位HTML或XML文档中的元素的模式。以下是一些常见的CSS选择器&#xff0c;以及对应的样例代码&#xff1a; 标签选择器&#xff1a;选择所有指定标签的元素。 示例代码&#xff1a; p {font-size: 16px; }类选择器&#xff1a;选择所有指定类名的元素。 示…...

【教程】Autojs使用OpenCV进行SIFT/BRISK等算法进行图像匹配

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] 此代码可以替代内置的images.findImage函数使用&#xff0c;但可能会误匹配&#xff0c;如果是对匹配结果要求比较高的&#xff0c;还是得谨慎使用。 runtime.images.initOpenCvIfNeeded(); importClass(java.uti…...

[庆国庆 迎国庆 发文]云计算的概念

庆国庆 迎国庆 国庆发文100%可得专属勋章 一年仅有一次哦 不要错过啦 去发布 https://activity.csdn.net/creatActivity?id10567&spm1011.2480.3001.6900 https://mp.csdn.net/edit?activity_id10567&spm1057.2600.3001.9674 云计算&#xff08;cloud computing&…...

计算机网络-计算机网络体系结构-概述,模型

目录 一、计算机网络概述 二、性能指标 速率 带宽 吞吐量 时延 往返时延RTT 利用率 三、计算机网络体系结构 分层结构 IOS模型 应用层-> 表示层-> 会话层-> 传输层-> 网络层-> 数据链路层-> 物理层-> TCP/IP模型 一、计算机网络概述 计…...

对示例程序spinner_asyncio.py进行修改使其能运行

学习《流畅的python》第18章 使用asyncio包处理并发&#xff0c;运行示例18-2 spinner_asyncio.py的时候&#xff0c;程序报错如下&#xff1a; D:\fluentPy\chapter17>python spinner_asyncio.py File "D:\fluentPy\chapter17\spinner_asyncio.py", line 30 …...

Linux命令(93)之head

linux命令之head 1.head介绍 linux命令head用来查看文件的前N行内容&#xff1b;默认head查看前10行 2.head用法 head [参数] 文件 head常用参数 参数说明-n从头显示N行&#xff0c;默认显示10行&#xff0c;可以不写-q隐藏文件名&#xff0c;在查看两个及以上文件名的情况…...

使用Visual Studio调试排查Windows系统程序audiodg.exe频繁弹出报错

VC常用功能开发汇总&#xff08;专栏文章列表&#xff0c;欢迎订阅&#xff0c;持续更新...&#xff09;https://blog.csdn.net/chenlycly/article/details/124272585C软件异常排查从入门到精通系列教程&#xff08;专栏文章列表&#xff0c;欢迎订阅&#xff0c;持续更新...&a…...

WebSocket实战之六心跳重连机制

一、前言 WebSocket应用部署到生产环境&#xff0c;我们除了会碰到因为经过代理服务器无法连接的问题&#xff08;注&#xff1a;该问题可以通过搭建WSS来解决&#xff0c;具体配置请看 WebSocket实战之四WSS配置 &#xff09;&#xff0c;另外一个问题就是外网环境不稳定经常…...

Webpack 基础入门以及接入 CSS、Typescript、Babel

一、什么是 Webpack Webpack 是一款 JS 模块化开发的技术框架&#xff0c;其运作原理是将多个 JS 文件关联起来构成可运行的应用程序。 Webpack 拥有丰富的 plugins / loaders 插件生态圈&#xff0c;可以让 js 识别不同的语言如 .css, .scss, .sass, .json, .xml, .ts, .vue…...

postgresql-自增字段

postgresql-自增字段 标识列IdentitySerial类型Sequence序列 标识列Identity -- 测试表 create table t_user( -- 标识列自增字段user_id integer generated always as identity primary key,user_name varchar(50) not null unique );-- 自动生成序列 CREATE SEQUENCE public…...

SpringBoot中使用Servlet和Filter

为什么要把Servlet和Filter写在一起,因为使用方式很相似 两种方式 第一种,使用Servlet和Filter 使用Servlet 继承HttpServlet 注册Servlet 使用Filter 1.自定义过滤器 2.注册过滤器 这里注意一点 使用/**无效 至少我这2.4.5版本是这样 过滤所有请求用/* 那么其实还有…...

Monkey命令

shell, monkey, system, Android, 文件系统Monkey, 示例, 简介 一、Monkey测试简介 Monkey测试是Android平台自动化测试的一种手段&#xff0c;通过Monkey程序模拟用户触摸屏幕、滑动Trackball、按键等操作来对设备上的程序进行压 力测试&#xff0c;检测程序多久的时间会发生…...

力扣 -- 279. 完全平方数(完全背包问题)

解题步骤&#xff1a; 参考代码&#xff1a; 未优化代码&#xff1a; class Solution { public:int numSquares(int n) {const int INF0x3f3f3f3f;int msqrt(n);//多开一行&#xff0c;多开一列vector<vector<int>> dp(m1,vector<int>(n1));//初始化第一行…...

在将对象 => JSON格式时,无法序列化部分属性

问题现象: 在ssm项目中&#xff0c;一个controller返回Msg对象&#xff08;自定义对象&#xff0c;包含三个属性&#xff0c;int code&#xff1b;String msg&#xff1b;HashMap map&#xff1b;同时这三个属性都有对应的get和set方法&#xff09;&#xff0c;我的map属性里面…...

用python表格初级尝试

Excel&#xff0c;我的野心 当我输入3,2 就表示在第3行第2列。的单元格输入数据input输入表头 &#xff08;input内除了/&#xff0c;空格 回车 标点符号等 全部作为单元格分隔符&#xff09;由我设置input输入的是行or列 给选项 1. 行 2. 列默认回车或没输入值是列由我设置起…...

【单片机】16-LCD1602和12864显示器

1.LCD显示器相关背景 1.LCD简介 &#xff08;1&#xff09;显示器&#xff0c;常见显示器&#xff1a;电视&#xff0c;电脑 &#xff08;2&#xff09;LCD&#xff08;Liquid Crystal Display&#xff09;&#xff0c;液晶显示器&#xff0c;原理介绍 &#xff08;3&#xff…...

AUTOSAR从入门到精通-基于 CAN 总线的汽车发电机智能调节器(下)

目录 4.4.3 CAN 通信软件实现 汽车发电机智能调节器试验与结果分析 5.1 试验方案设计...

Windows下Tensorflow docker python开发环境搭建

前置条件 windows10 更新到较新的版本&#xff0c;硬件支持Hyper-V。 参考&#xff1a;https://learn.microsoft.com/zh-cn/windows/wsl/install 启用WSL 在Powershell中输入如下指令&#xff1a; dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsys…...

idea常用快捷键 idea搜索快捷键

常用快捷键 IntelliJ IDEA 是一款流行的 Java 集成开发环境&#xff08;IDE&#xff09;&#xff0c;有许多常用的快捷键可以帮助开发者提高效率。以下是一些常用的 IntelliJ IDEA 快捷键&#xff1a; CtrlSpace&#xff1a;基本代码补全&#xff0c;用于输入任何东西&#x…...

在新闻网站做采编/品牌策划与推广

1、清单文件AndroidManifest.xml需要添加SD卡的读取和写入权限2、MainActivity.java package com.t20.camera;import java.io.File; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date;import android.net.Uri; import android.os.Bundle;…...

8网站建设做网站/站长工具ping检测

奇门遁甲的起局&#xff0c;应用拆补还是置闰好呢&#xff1f;这个说不清楚&#xff0c;但看起来&#xff0c;在占卜方面&#xff0c;并不是分别得很清楚&#xff0c;因为飞盘者有之&#xff0c;排盘者有之&#xff0c;拆补者有之&#xff0c;置闰者有之&#xff0c;说只有一种…...

做产品网站费用/深圳网络推广解决方案

Div1 534 我可能还太菜了.jpg果然我只是Div 2 选手A &#xff08;这题是Div1吗... 直接构造&#xff1a;竖着放的在第一行和第二行&#xff0c;然后横着放的时候直接放在第三行就行。 #include <cstdio> #include <algorithm> #include <cmath> #include <…...

用php制作动态网站/个人网站制作流程

根据医学和我的体验、观察&#xff0c;一个人真正睡着觉最多只有三个钟头&#xff0c;其余都是浪费时间&#xff0c;躺在枕头上做梦&#xff0c;没有哪个人不做梦。至于醒来觉得自己没有做梦&#xff0c;那是因为他忘记了。 正午&#xff08;即中午12点&#xff09;只要闭眼真…...

注册网站不用手机短信验证的网站/sem和seo有什么区别

1,ERROR:ORA-12560: TNS:protocol adapter error listener没有启动,在数据库所在的服务器上启动listener: lsnrctl start 2,ERROR: ORA-01033: ORACLE initialization or shutdown in progress Oracle没有处于open状态,只能以sysdba连接,普通用户连接的时候出现这个错误. 3…...

网站建设服务器有哪些/外贸建站公司

使用环境&#xff1a; python 3.5 原因&#xff1a; docx包中导入该模块&#xff0c;而python3.x版本移除exceptions模块。即docx包没有适配python3 解决办法&#xff1a; 1.使用管理员身份打开cmd&#xff0c;进行卸载docx&#xff0c;pip uninstall docx 2.下载python_doc…...