Android 传感器概述(二)

news2024/11/11 7:21:10

Android 传感器概述(二)

  • Android 传感器概述(二)
    • 运动传感器
    • 使用重力传感器
    • 使用线性加速度计
    • 使用旋转矢量传感器
    • 使用有效运动传感器
    • 使用计步器传感器
    • 使用步测器传感器
    • 使用原始数据
      • 使用加速度计
      • 使用陀螺仪
    • 使用未经校准的陀螺仪

Android 传感器概述(二)

大多数 Android 设备都有内置传感器,用来测量运动、屏幕方向和各种环境条件。这些传感器能够提供高度精确的原始数据,非常适合用来监测设备的三维移动或定位,或监测设备周围环境的变化。例如,游戏可以跟踪设备重力传感器的读数,以推断出复杂的用户手势和动作,如倾斜、摇晃、旋转或挥动。同样,天气应用可以使用设备的温度传感器和湿度传感器来计算和报告露点,旅行应用则可以使用地磁场传感器和加速度计来报告罗盘方位。

运动传感器

传感器的可能架构因传感器类型而异:

  • 重力、线性加速度、旋转矢量、有效运动、计步器和步测器传感器可能基于硬件,也可能基于软件。
  • 加速度计传感器和陀螺仪传感器始终基于硬件。

运动传感器在监控设备运动方面(例如倾斜、晃动、旋转或摆动)非常有用。该移动通常是用户直接输入的反映(例如,用户在游戏中驾驶汽车,或在游戏中控制球),但也可能反映设备所处的物理环境(例如,在开车时与你一起移动)。在第一种情况下,监控相对于设备参照系或应用参照系的运动;在第二种情况下,监控相对于世界参照系的运动。运动传感器本身通常不用于监视设备位置,但可以与其他传感器(例如地磁场传感器)一起使用,以确定设备相对于世界参照系的位置。

所有运动传感器都为每个SensorEvent返回传感器值的多维数组。例如,在单个传感器事件期间,加速度计返回三个坐标轴的加速力数据,而陀螺仪返回三个坐标轴的旋转速率数据。这些数据值与其他SensorEvent参数一起在float数组中 (values) 返回。

表 1. Android 平台支持的运动传感器。

传感器传感器事件数据说明度量单位
TYPE_ACCELEROMETERSensorEvent.values[0]沿 x 轴的加速力(包括重力)。米/秒2
SensorEvent.values[1]沿 y 轴的加速力(包括重力)。
SensorEvent.values[2]沿 z 轴的加速力(包括重力)。
TYPE_ACCELEROMETER_UNCALIBRATEDSensorEvent.values[0]沿 X 轴测量的加速度,没有任何偏差补偿。米/秒2
SensorEvent.values[1]沿 Y 轴测量的加速度,没有任何偏差补偿。
SensorEvent.values[2]沿 Z 轴测量的加速度,没有任何偏差补偿。
SensorEvent.values[3]沿 X 轴测量的加速度,并带有估算的偏差补偿。
SensorEvent.values[4]沿 Y 轴测量的加速度,并带有估算的偏差补偿。
SensorEvent.values[5]沿 Z 轴测量的加速度,并带有估算的偏差补偿。
TYPE_GRAVITYSensorEvent.values[0]沿 x 轴的重力。米/秒2
SensorEvent.values[1]沿 y 轴的重力。
SensorEvent.values[2]沿 z 轴的重力。
TYPE_GYROSCOPESensorEvent.values[0]绕 x 轴的旋转速率。弧度/秒
SensorEvent.values[1]绕 y 轴的旋转速率。
SensorEvent.values[2]绕 z 轴的旋转速率。
TYPE_GYROSCOPE_UNCALIBRATEDSensorEvent.values[0]绕 x 轴的旋转速率(无漂移补偿)。弧度/秒
SensorEvent.values[1]绕 y 轴的旋转速率(无漂移补偿)。
SensorEvent.values[2]绕 z 轴的旋转速率(无漂移补偿)。
SensorEvent.values[3]绕 x 轴的估算漂移。
SensorEvent.values[4]绕 y 轴的估算漂移。
SensorEvent.values[5]绕 z 轴的估算漂移。
TYPE_LINEAR_ACCELERATIONSensorEvent.values[0]沿 x 轴的加速力(不包括重力)。米/秒2
SensorEvent.values[1]沿 y 轴的加速力(不包括重力)。
SensorEvent.values[2]沿 z 轴的加速力(不包括重力)。
TYPE_ROTATION_VECTORSensorEvent.values[0]沿 x 轴的旋转矢量分量 (x * sin(θ/2))。无单位
SensorEvent.values[1]沿 y 轴的旋转矢量分量 (y * sin(θ/2))。
SensorEvent.values[2]沿 z 轴的旋转矢量分量 (z * sin(θ/2))。
SensorEvent.values[3]旋转矢量的标量分量 ((cos(θ/2))。1
TYPE_SIGNIFICANT_MOTION不适用不适用不适用
TYPE_STEP_COUNTERSensorEvent.values[0]已激活传感器最后一次重新启动以来用户迈出的步数。步数
TYPE_STEP_DETECTOR不适用不适用不适用

旋转矢量传感器和重力传感器是运动检测和监控的最常用传感器。旋转矢量传感器极具通用性,可用于各种与运动有关的任务,例如检测手势,监控角度变化,以及监控相对屏幕方向变化。例如,旋转矢量传感器是开发游戏、增强现实应用、二维或三维指南针,或者相机稳定应用的理想选择。在大多数情况下,使用这些传感器比使用加速度计和地磁场传感器或方向传感器更好。

使用重力传感器

重力传感器提供指示重力方向和大小的三维矢量。通常,此传感器用于确定设备在空间中的相对屏幕方向。以下代码展示如何获取默认重力传感器的实例:

private SensorManager sensorManager;
private Sensor sensor;
...
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY);

单位与加速度传感器所用的单位 (m/s2) 相同,坐标系与加速传感器使用的坐标系相同。

注意:当设备处于静止状态时,重力传感器的输出应与加速度计的输出相同。

使用线性加速度计

线性加速传感器为你提供了一个三维矢量,表示沿着每个设备轴的加速度(不包括重力)。可以使用此值执行手势检测。该值还可以用作惯性导航系统的输入值,该系统使用航位推测法。以下代码展示如何获取默认线性加速传感器的实例:

private SensorManager sensorManager;
private Sensor sensor;
...
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION);

从概念上讲,此传感器根据以下关系为你提供加速度数据:

linear acceleration = acceleration - acceleration due to gravity

如果想获取加速度数据而不受重力影响时,通常会使用此传感器。例如,可以使用此传感器查看汽车行驶的速度。线性加速度传感器始终具有一个偏移量,需要将其删除。最简单的方法是在应用中构建一个校准步骤。在校准期间,可以要求用户将设备放在桌子上,然后读取所有三个轴的偏移量。然后,可以从加速传感器的直接读数中减去该偏移量,以获得实际的线性加速度。

传感器坐标系与加速度传感器使用的坐标系相同,计量单位 (m/s2) 也相同。

使用旋转矢量传感器

旋转矢量将设备的屏幕方向表示为角度和轴的组合,其中设备已围绕轴(x、y 或 z)旋转了 θ 度。以下代码展示如何获取默认旋转矢量传感器的实例:

private SensorManager sensorManager;
private Sensor sensor;
...
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR);

旋转矢量的三个元素表示如下:
在这里插入图片描述
其中旋转矢量的大小等于 sin(θ/2),并且旋转矢量的方向等于旋转轴的方向。

旋转矢量的三个元素等于单位四元数(cos(θ/2)、xsin(θ/2)、ysin(θ/2)、z*sin(θ/2))的最后三个分量。旋转矢量的元素没有单位。x、y 和 z 轴的定义方法与加速传感器的定义方法相同。参考坐标系被定义为直接正交基础(见图)。该坐标系具有以下特征:

  • X 定义为矢量积 Y x Z。其在设备当前位置与地面相切,并大约指向东。
  • Y 在设备当前位置与地面相切,并指向地磁北极。
  • Z 指向天空并与地平面垂直。
    在这里插入图片描述

使用有效运动传感器

每次检测到有效运动时,有效运动传感器都会触发事件,然后将其禁用。有效运动是可能导致用户位置发生变化的运动;例如步行、骑自行车或坐在行驶的车上。以下代码展示如何获取默认有效运动传感器的实例以及如何注册事件侦听器:

private SensorManager sensorManager;
private Sensor sensor;
private TriggerEventListener triggerEventListener;
...
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_SIGNIFICANT_MOTION);

triggerEventListener = new TriggerEventListener() {
    @Override
    public void onTrigger(TriggerEvent event) {
        // Do work
    }
};

sensorManager.requestTriggerSensor(triggerEventListener, mSensor);

使用计步器传感器

计步器传感器提供自已激活传感器后最后一次重启以来用户迈出的步数。与步测器传感器相比,计步器的延迟时间更长(最多 10 秒),但精确度更高。

注意:必须声明 ACTIVITY_RECOGNITION 权限,以便你的应用在运行 Android 10 (API 级别 29) 或更高版本的设备上使用此传感器。

以下代码展示如何获取默认计步器传感器的实例:

private SensorManager sensorManager;
private Sensor sensor;
...
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER);

如要保护运行应用的设备上的电池,你应使用 JobScheduler 类,从而以特定的时间间隔从计步器传感器检索当前值。尽管不同类型的应用需要不同的传感器读取间隔,但是除非你的应用需要来自传感器的实时数据,否则应尽可能延长此间隔。

使用步测器传感器

每次用户迈步时,步测器传感器都会触发事件。延迟时间预计将低于 2 秒。

注意:必须声明 ACTIVITY_RECOGNITION 权限,以便你的应用在运行 Android 10 (API 级别 29) 或更高版本的设备上使用此传感器。

以下代码展示如何获取默认步测器传感器的实例:

private SensorManager sensorManager;
private Sensor sensor;
...
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_STEP_DETECTOR);

使用原始数据

以下传感器可为你的应用提供有关施加到设备的线性力和旋转力的原始数据。为了有效使用这些传感器的值,你需要从环境中滤除重力等因素。你可能还需要对值趋势应用平滑算法以减少噪声。

使用加速度计

加速度传感器测量施加到设备的加速度,包括重力。以下代码展示如何获取默认加速传感器的实例:

private SensorManager sensorManager;
private Sensor sensor;
  ...
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

从概念上讲,加速度传感器通过使用以下关系测量施加到传感器本身的力 (Fs) 来确定施加到设备的加速度 (Ad):
在这里插入图片描述
但是,重力始终根据以下关系影响测量的加速度:
在这里插入图片描述
因此,当设备位于桌子上(不加速)时,加速度计的读数为 g = 9.81 m/s2。同样,当设备自由落体并因此以 9.81 m/s2 的速度快速向地面加速时,其加速度计的读数为 g = 0 m/s2。因此,要测量设备的实际加速度,必须从加速度计数据中移除重力的作用。这可以通过应用高通滤波器来实现。相反,可以使用低通滤波器来隔离重力。以下示例展示如何执行此操作:

public void onSensorChanged(SensorEvent event){
    // In this example, alpha is calculated as t / (t + dT),
    // where t is the low-pass filter's time-constant and
    // dT is the event delivery rate.

    final float alpha = 0.8;

    // Isolate the force of gravity with the low-pass filter.
    gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0];
    gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1];
    gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2];

    // Remove the gravity contribution with the high-pass filter.
    linear_acceleration[0] = event.values[0] - gravity[0];
    linear_acceleration[1] = event.values[1] - gravity[1];
    linear_acceleration[2] = event.values[2] - gravity[2];
}

注意:你可以使用许多不同的技术来过滤传感器数据。以上代码示例使用简单的过滤器常数 (alpha) 来创建低通滤波器。此过滤器常数来自于一个时间常数 (t),该常数大致表示过滤器添加到传感器事件的延迟时间,以及传感器的事件传输率 (dt)。该代码示例使用 0.8 的 alpha 值进行演示。如果你使用此过滤方法,则可能需要选择其他 alpha 值。

加速度计使用标准的传感器坐标系。实际上,这意味着当设备以自然屏幕方向平放在桌子上时,以下条件适用:

  • 如果将设备推向左侧(因此向右移动),则 x 加速度值为正。
  • 如果将设备推到底部(因此它向远离您的方向移动),则 y 加速度值为正。
  • 如果您以 A m/s2 的加速度将设备推向天空,则 z 加速度值等于 A + 9.81,该值对应设备的加速度 (+A m/s2) 减去重力 (-9.81 m/s2)。
  • 固定设备的加速度值为 +9.81,该值对应设备的加速度(0 m/s2 减去重力 -9.81 m/s2)。

通常,如果要监控设备的运动,加速度计是一个很好的传感器。几乎所有运行 Android 的手机和平板电脑都具有加速度计,其功耗比其他运动传感器低约 10 倍。一个缺点是可能必须实现低通和高通滤波器,以消除重力并降低噪声。

使用陀螺仪

陀螺仪测量围绕设备的 x、y 和 z 轴的旋转速率(弧度/秒)。以下代码展示如何获取默认陀螺仪的实例:

private SensorManager sensorManager;
private Sensor sensor;
...
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);

传感器的坐标系与用于加速传感器的坐标系相同。逆时针方向旋转为正;也就是说,如果观察者从 x、y 或 z 轴上某个正位置看向位于原点的设备,则在该设备看起来是逆时针旋转的情况下,该观察者将报告正旋转。这是正向旋转的标准数学定义,与方向传感器使用的侧倾定义不同。

通常,陀螺仪的输出会随时间积分,以计算描述角度随时间步长变化的旋转。例如:

// Create a constant to convert nanoseconds to seconds.
private static final float NS2S = 1.0f / 1000000000.0f;
private final float[] deltaRotationVector = new float[4]();
private float timestamp;

public void onSensorChanged(SensorEvent event) {
    // This timestep's delta rotation to be multiplied by the current rotation
    // after computing it from the gyro sample data.
    if (timestamp != 0) {
      final float dT = (event.timestamp - timestamp) * NS2S;
      // Axis of the rotation sample, not normalized yet.
      float axisX = event.values[0];
      float axisY = event.values[1];
      float axisZ = event.values[2];

      // Calculate the angular speed of the sample
      float omegaMagnitude = sqrt(axisX*axisX + axisY*axisY + axisZ*axisZ);

      // Normalize the rotation vector if it's big enough to get the axis
      // (that is, EPSILON should represent your maximum allowable margin of error)
      if (omegaMagnitude > EPSILON) {
        axisX /= omegaMagnitude;
        axisY /= omegaMagnitude;
        axisZ /= omegaMagnitude;
      }

      // Integrate around this axis with the angular speed by the timestep
      // in order to get a delta rotation from this sample over the timestep
      // We will convert this axis-angle representation of the delta rotation
      // into a quaternion before turning it into the rotation matrix.
      float thetaOverTwo = omegaMagnitude * dT / 2.0f;
      float sinThetaOverTwo = sin(thetaOverTwo);
      float cosThetaOverTwo = cos(thetaOverTwo);
      deltaRotationVector[0] = sinThetaOverTwo * axisX;
      deltaRotationVector[1] = sinThetaOverTwo * axisY;
      deltaRotationVector[2] = sinThetaOverTwo * axisZ;
      deltaRotationVector[3] = cosThetaOverTwo;
    }
    timestamp = event.timestamp;
    float[] deltaRotationMatrix = new float[9];
    SensorManager.getRotationMatrixFromVector(deltaRotationMatrix, deltaRotationVector);
    // User code should concatenate the delta rotation we computed with the current rotation
    // in order to get the updated rotation.
    // rotationCurrent = rotationCurrent * deltaRotationMatrix;
}

标准陀螺仪可提供原始旋转数据,而无需对噪声和漂移(偏差)进行任何过滤或校正。实际上,陀螺仪的噪声和漂移会引入需要补偿的误差。通常,您可以通过监控其他传感器(例如重力传感器或加速度计)来确定漂移(偏差)和噪声。

使用未经校准的陀螺仪

未经校准的陀螺仪与陀螺仪类似,不同之处在于没有陀螺漂移补偿应用于旋转速率。出厂校准和温度补偿仍应用于旋转速率。未经校准的陀螺仪可用于后期处理和融合屏幕方向数据。通常,gyroscope_event.values[0] 将接近 uncalibrated_gyroscope_event.values[0] - uncalibrated_gyroscope_event.values[3]。即,

calibrated_x ~= uncalibrated_x - bias_estimate_x

注意:未经校准的传感器可提供更多的原始结果,并且可能会包含一定偏差,但其测量值包含的从应用的校正到校准的跳跃次数更少。某些应用可能更喜欢这些未经校准的结果,因为它们更平滑、更可靠。例如,如果应用尝试进​​行自己的传感器融合,则引入校准实际上可能会扭曲结果。

除了旋转速率外,未经校准的陀螺仪还会提供围绕每个轴的估算漂移。以下代码展示如何获取默认未经校准的陀螺仪的实例:

private SensorManager sensorManager;
private Sensor sensor;
...
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE_UNCALIBRATED);

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

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

相关文章

【数据结构】动图详解单向链表

目录 1.什么是链表 1.问题引入 2. 链表的概念及结构 3. 问题解决 2.单向链表接口的实现 1.接口1,2---头插,尾插 2. 接口3,4---头删,尾删 3. 接口5---查找 4. 接口6,7---插入,删除 5. 接口8---打印 6. 注意…

CVE-2021-36934提权复现

CVE-2021-369342021年7 月 20 日,微软确认了一个新的本地提权漏洞(CVE-2021-36934),被称为HiveNightmare。该漏洞由于Windows中多个系统文件的访问控制表(ACL)过于宽松,使得任何标准用户都可以从系统卷影副本中读取包括SAM、SYSETM、SECURITY…

Windows系统运行iOS设备管理软件iMazing2023

iMazing2023免费版是一款运行在Windows系统上的iOS设备管理软件,软件功能非常强大,界面简洁清晰,操作方便快捷,设计的非常有人性化,iMazing官方版为用户提供了多种设备管理功能,每一位用户都能以自己的形式…

MyISAM和InnoDB存储引擎的区别

目录前言存储引擎区别事务外键表单的存储数据查询效率数据更新效率如何选择前言 MyISAM和InnoDB是使用MySQL最常用的两种存储引擎,在5.5版本之前默认采用MyISAM存储引擎,从5.5开始采用InnoDB存储引擎。 存储引擎 存储引擎是:数据库管理系统…

小白如何快速入门Verilog HDL ?一文为你讲解清楚

在学习的过程中,无论学什么都不可能一蹴而就。都是从一个初步认识到慢慢了解再到精通掌握的过程,学习Verilog HDL语法也是一样的道理,首先你要清楚什么是Verilog HDL,然后结合实践再遵从理论,这样后面的学习才能理解的…

P1359 租用游艇

# 租用游艇 ## 题目描述 长江游艇俱乐部在长江上设置了 $n$ 个游艇出租站 $1,2,\cdots,n$。游客可在这些游艇出租站租用游艇,并在下游的任何一个游艇出租站归还游艇。游艇出租站 $i$ 到游艇出租站 $j$ 之间的租金为 $r(i,j)$($1\le i\lt j\le n$&#xf…

MPLS实验(1.31)

目标: 一、首先为公网的每个路由器配置对应的ip和环回并且用OSPF进行动态选路 r2: [r2]int gi 0/0/2 [r2-GigabitEthernet0/0/2]ip add 23.1.1.1 24 [r2-GigabitEthernet0/0/2]int lo0 [r2-LoopBack0]ip add 2.2.2.2 24 r3: [r3]int gi 0…

Oracle的学习心得和知识总结(十)|Oracle数据库PL/SQL语言循环控制语句之LOOP语句技术详解

目录结构 注:提前言明 本文借鉴了以下博主、书籍或网站的内容,其列表如下: 1、参考书籍:《Oracle Database SQL Language Reference》 2、参考书籍:《PostgreSQL中文手册》 3、EDB Postgres Advanced Server User Guid…

yolov5篇---yolov5训练pt模型并转换为rknn模型,部署在RK3588开发板上——从训练到部署全过程

yolov5训练pt模型并转换为rknn模型,部署在RK3588开发板上——从训练到部署全过程一、任务介绍二、实验过程2.1 使用正确版本的yolov5进行训练(平台:x86机器ubuntu22.04系统)2.2 best.pt转换为best.onnx(平台:x86机器ubuntu22.04系统)2.3 best…

2023年西安Java培训机构十强榜单出炉,快来看看哪家榜上有名~

关于“西安Java培训机构哪家好?”“如何选择适合自己的Java培训机构?”这类问题常常出现网络上,其实关于这类问题没有统一的答案,一千个人有一千个哈姆雷特,每个人关注的重点不一样,需求更是不同&#xff0…

投入3.6亿美元!加拿大启动国家量子战略

(图片来源:网络)量子科学和技术处于研究和创新的前沿,具有巨大的商业化潜力和突破性进展,包括更有效的药物设计、更好的气候预测、改进的导航系统和清洁技术的创新。加拿大政府支持这一新兴行业的持续发展,…

用队列实现栈+用栈实现队列+循环队列(oj题)

1.题目: 力扣https://leetcode.cn/problems/implement-stack-using-queues/ 思路: 核心思路: 1、入数据,往不为空的队列入、保持另一个队列为空 2、出数据的时候,依次出队头的数据,转移另一个队列保存。只剩最后一个事,Pop掉 typ…

【数据结构之排序系列】校招热门考点:快速排序

目录前言一、hoare版本1. 单排2. 单排的代码实现3. 综合排序的实现4. 测试二、挖坑法1. 单排2. 单排的代码实现3. 综合排序的实现4. 测试三、前后指针法1. 单排2. 单排的代码实现3. 综合排序的实现4. 测试四、快排的时间复杂度五、快排的优化1. 三数取中2. 小区间优化六、快排的…

[Vulnhub] DC-9

前言: 打了这么长时间,终于,DC系列1-9 靶机已经干完了。通过这九个靶机的历练,都是单靶机 感觉远远不足,但也不是没有收获,学到了一些工具和提权的简单利用,大概知道了什么是反弹shell&#xf…

UE实现人物角色沿样条线移动效果

文章目录 1.实现目标2.实现过程2.1 实现思路2.2 具体过程3.参考资料1.实现目标 实现人物角色Character按样条线Spline自动移动效果,GIF动图如下。 2.实现过程 2.1 实现思路 (1)获取某一时刻样条线上点的位置,直接使用GetLocationAtTime函数即可。 (2)实时更新Characte…

Python Windows Apache部署Django项目运行环境(含Mysql)以及解决过程中遇到的问题

上一篇请移步Python Windows Apache部署Django项目运行环境_水w的博客-CSDN博客 本文是在上一篇的基础上, 进行后续工作。 目录 一、配置数据库(MySQL) 1、Mysql配置 2、安装MySQL管理工具SQLyog 【解决过程中遇到的问题】 解决报错&am…

java泛型2

真正搞定泛型!!!------- >类型形参 所谓泛型,就是允许在定义类、接口、方法时使用类型形参,这个类型形参(或叫泛型)将在声明变量、创建对象、调用方法时动态地指定(即传入实际的类…

【看表情包学Linux】进程的概念 | 进程控制块 PCB | 父进程与子进程 | 进程 ID | task_struct

🤣 爆笑教程 👉 《看表情包学Linux》👈 猛戳订阅 🔥 💭 写在前面:本章我们将带着大家深入理解 "进程" 的概念,"进程" 这个概念其实使我们一直在接触的东西,只不…

一文深入搞懂 mmap 涉及的所有内容

内存映射,简而言之就是将内核空间的一段内存区域映射到用户空间。映射成功后,用户对这段内存区域的修改可以直接反映到内核空间,相反,内核空间对这段区域的修改也直接反映用户空间。那么对于内核空间与用户空间两者之间需要大量数…

一文讲清同步异步,消息队列,宏任务 微任务...

单线程多线程 什么是线程进程? 进程:是cpu分配资源的最小单位;(是能拥有资源和独立运行的最小单位) 线程: 是cpu调度的最小单位;(线程是建立在进程的基础上的一次程序运行单位,一…