android 7.0 解锁亮屏,Android7.0亮屏流程分析

亮屏的本质是改变屏幕的电源状态,经过一系列的调用会来到PowerManagerService中的updatePowerStateLocked()

1.PowerManagerService到DisplayPowerController

private void updatePowerStateLocked() {

if (!mSystemReady || mDirty == 0) {

return;

}

if (!Thread.holdsLock(mLock)) {

Slog.wtf(TAG, "Power manager lock was not held when calling updatePowerStateLocked");

}

try {

// Phase 0: Basic state updates.

updateIsPoweredLocked(mDirty);

updateStayOnLocked(mDirty);

updateScreenBrightnessBoostLocked(mDirty);

// Phase 1: Update wakefulness.

// Loop because the wake lock and user activity computations are influenced

// by changes in wakefulness.

final long now = SystemClock.uptimeMillis();

int dirtyPhase2 = 0;

for (;;) {

int dirtyPhase1 = mDirty;

dirtyPhase2 |= dirtyPhase1;

mDirty = 0;

updateWakeLockSummaryLocked(dirtyPhase1);

updateUserActivitySummaryLocked(now, dirtyPhase1);

if (!updateWakefulnessLocked(dirtyPhase1)) {

break;

}

}

// Phase 2: Update display power state.

boolean displayBecameReady = updateDisplayPowerStateLocked(dirtyPhase2);

// Phase 3: Update dream state (depends on display ready signal).

updateDreamLocked(dirtyPhase2, displayBecameReady);

// Phase 4: Send notifications, if needed.

finishWakefulnessChangeIfNeededLocked();

// Phase 5: Update suspend blocker.

// Because we might release the last suspend blocker here, we need to make sure

// we finished everything else first!

updateSuspendBlockerLocked();

} finally {}

}

然后经过函数updateDisplayPowerStateLocked来到DisplayPowerController的requestPowerState函数

public boolean requestPowerState(DisplayPowerRequest request,

boolean waitForNegativeProximity) {

synchronized (mLock) {

boolean changed = false;

if (waitForNegativeProximity

&& !mPendingWaitForNegativeProximityLocked) {

mPendingWaitForNegativeProximityLocked = true;

changed = true;

}

if (mPendingRequestLocked == null) {

mPendingRequestLocked = new DisplayPowerRequest(request);

changed = true;

} else if (!mPendingRequestLocked.equals(request)) {

mPendingRequestLocked.copyFrom(request);

changed = true;

}

if (changed) {

mDisplayReadyLocked = false;

}

if (changed && !mPendingRequestChangedLocked) {

mPendingRequestChangedLocked = true;

sendUpdatePowerStateLocked();

}

return mDisplayReadyLocked;

}

}

再次经过sendUpdatePowerStateLocked以及handler+meesage的消息,进入如下的switch结构

private final class DisplayControllerHandler extends Handler {

public DisplayControllerHandler(Looper looper) {

super(looper, null, true /*async*/);

}

@Override

public void handleMessage(Message msg) {

switch (msg.what) {

case MSG_UPDATE_POWER_STATE:

updatePowerState();

break;

case MSG_PROXIMITY_SENSOR_DEBOUNCED:

debounceProximitySensor();

break;

case MSG_SCREEN_ON_UNBLOCKED:

if (mPendingScreenOnUnblocker == msg.obj) {

unblockScreenOn();

updatePowerState();

}

break;

}

}

}

2.DisplayPowerController中的block机制

block的机制的存在是为了保证在屏幕亮时所有工作都已经准备好(如屏幕完成上电以及所有窗口绘制完成),所以前后需要执行两次的updatePowerState()才会使屏幕真正的亮起来,从PMS传递过来的消息会先走到MSG_UPDATE_POWER_STATE执行第一次updatePowerState(),其核心是走到animateScreenStateChange()

private void animateScreenStateChange(int target, boolean performScreenOffTransition) {

// If there is already an animation in progress, don't interfere with it.

if (mColorFadeOnAnimator.isStarted()

|| mColorFadeOffAnimator.isStarted()) {

if (target != Display.STATE_ON) {

return;

}

// If display state changed to on, proceed and stop the color fade and turn screen on.

mPendingScreenOff = false;

}

// If we were in the process of turning off the screen but didn't quite

// finish. Then finish up now to prevent a jarring transition back

// to screen on if we skipped blocking screen on as usual.

if (mPendingScreenOff && target != Display.STATE_OFF) {

setScreenState(Display.STATE_OFF);

mPendingScreenOff = false;

mPowerState.dismissColorFadeResources();

}

if (target == Display.STATE_ON) {

// Want screen on. The contents of the screen may not yet

// be visible if the color fade has not been dismissed because

// its last frame of animation is solid black.

if (!setScreenState(Display.STATE_ON)) {

return; // screen on blocked

}

if (USE_COLOR_FADE_ON_ANIMATION && mPowerRequest.isBrightOrDim()) {

// Perform screen on animation.

if (mPowerState.getColorFadeLevel() == 1.0f) {

mPowerState.dismissColorFade();

} else if (mPowerState.prepareColorFade(mContext,

mColorFadeFadesConfig ?

ColorFade.MODE_FADE :

ColorFade.MODE_WARM_UP)) {

mColorFadeOnAnimator.start();

} else {

mColorFadeOnAnimator.end();

}

} else {

// Skip screen on animation.

mPowerState.setColorFadeLevel(1.0f);

mPowerState.dismissColorFade();

}

} else if (target == Display.STATE_DOZE) {

// Want screen dozing.

// Wait for brightness animation to complete beforehand when entering doze

// from screen on to prevent a perceptible jump because brightness may operate

// differently when the display is configured for dozing.

if (mScreenBrightnessRampAnimator.isAnimating()

&& mPowerState.getScreenState() == Display.STATE_ON) {

return;

}

// Set screen state.

if (!setScreenState(Display.STATE_DOZE)) {

return; // screen on blocked

}

// Dismiss the black surface without fanfare.

mPowerState.setColorFadeLevel(1.0f);

mPowerState.dismissColorFade();

} else if (target == Display.STATE_DOZE_SUSPEND) {

// Want screen dozing and suspended.

// Wait for brightness animation to complete beforehand unless already

// suspended because we may not be able to change it after suspension.

if (mScreenBrightnessRampAnimator.isAnimating()

&& mPowerState.getScreenState() != Display.STATE_DOZE_SUSPEND) {

return;

}

// If not already suspending, temporarily set the state to doze until the

// screen on is unblocked, then suspend.

if (mPowerState.getScreenState() != Display.STATE_DOZE_SUSPEND) {

if (!setScreenState(Display.STATE_DOZE)) {

return; // screen on blocked

}

setScreenState(Display.STATE_DOZE_SUSPEND); // already on so can't block

}

// Dismiss the black surface without fanfare.

mPowerState.setColorFadeLevel(1.0f);

mPowerState.dismissColorFade();

} else {

// Want screen off.

mPendingScreenOff = true;

if (mPowerState.getColorFadeLevel() == 0.0f) {

// Turn the screen off.

// A black surface is already hiding the contents of the screen.

setScreenState(Display.STATE_OFF);

mPendingScreenOff = false;

mPowerState.dismissColorFadeResources();

} else if (performScreenOffTransition

&& mPowerState.prepareColorFade(mContext,

mColorFadeFadesConfig ?

ColorFade.MODE_FADE : ColorFade.MODE_COOL_DOWN)

&& mPowerState.getScreenState() != Display.STATE_OFF) {

// Perform the screen off animation.

mColorFadeOffAnimator.start();

} else {

// Skip the screen off animation and add a black surface to hide the

// contents of the screen.

mColorFadeOffAnimator.end();

}

}

}

mColorFadeOnAnimator与亮屏动画相关,默认是关闭的,这里不讨论,对于亮屏来说target == Display.STATE_ON为true,接着看函数setScreenState

private boolean setScreenState(int state) {

if (mPowerState.getScreenState() != state) {

final boolean wasOn = (mPowerState.getScreenState() != Display.STATE_OFF);

mPowerState.setScreenState(state);

// Tell battery stats about the transition.

try {

mBatteryStats.noteScreenState(state);

} catch (RemoteException ex) {

// same process

}

}

// Tell the window manager policy when the screen is turned off or on unless it's due

// to the proximity sensor. We temporarily block turning the screen on until the

// window manager is ready by leaving a black surface covering the screen.

// This surface is essentially the final state of the color fade animation and

// it is only removed once the window manager tells us that the activity has

// finished drawing underneath.

final boolean isOff = (state == Display.STATE_OFF);

if (isOff && mReportedScreenStateToPolicy != REPORTED_TO_POLICY_SCREEN_OFF

&& !mScreenOffBecauseOfProximity) {

mReportedScreenStateToPolicy = REPORTED_TO_POLICY_SCREEN_OFF;

unblockScreenOn();

mWindowManagerPolicy.screenTurnedOff();

} else if (!isOff && mReportedScreenStateToPolicy == REPORTED_TO_POLICY_SCREEN_OFF) {

mReportedScreenStateToPolicy = REPORTED_TO_POLICY_SCREEN_TURNING_ON;

if (mPowerState.getColorFadeLevel() == 0.0f) {

blockScreenOn();

} else {

unblockScreenOn();

}

mWindowManagerPolicy.screenTurningOn(mPendingScreenOnUnblocker);

}

// Return true if the screen isn't blocked.

return mPendingScreenOnUnblocker == null;

}

2.1blockScreenOn

其中,mPowerState.setScreenState(state)与屏幕上电有关,这个放在本篇后面讲,对于第一次updatePowerState,屏幕还未上电,即mPowerState.getColorFadeLevel() == 0.0f结果为true,执行blockScreenOn()

private void blockScreenOn() {

if (mPendingScreenOnUnblocker == null) {

Trace.asyncTraceBegin(Trace.TRACE_TAG_POWER, SCREEN_ON_BLOCKED_TRACE_NAME, 0);

mPendingScreenOnUnblocker = new ScreenOnUnblocker();

mScreenOnBlockStartRealTime = SystemClock.elapsedRealtime();

Slog.i(TAG, "Blocking screen on until initial contents have been drawn.");

}

}

blockscreenon的实质是new一个ScreenOnUnblocker对象,这个对象直到unblockscreen才会置为空,以此来实现block机制

2.2回调WMS

setScreenState在执行blockScreenOn之后会执行这一段话

mWindowManagerPolicy.screenTurningOn(mPendingScreenOnUnblocker);

WindowManagerPolicy的实现是PhoneWindowManager,所以继续看相关代码

@Override

public void screenTurningOn(final ScreenOnListener screenOnListener) {

updateScreenOffSleepToken(false);

synchronized (mLock) {

mScreenOnEarly = true;

mScreenOnFully = false;

mKeyguardDrawComplete = false;

mWindowManagerDrawComplete = false;

mScreenOnListener = screenOnListener;

if (mKeyguardDelegate != null) {

mHandler.removeMessages(MSG_KEYGUARD_DRAWN_TIMEOUT);

mHandler.sendEmptyMessageDelayed(MSG_KEYGUARD_DRAWN_TIMEOUT, 1000);

mKeyguardDelegate.onScreenTurningOn(mKeyguardDrawnCallback);

} else {

finishKeyguardDrawn();

}

}

}

其中,mKeyguardDelegate是用来向锁屏传递消息的对象,如果锁屏存在的话,会把mKeyguardDrawnCallback传递到锁屏中去,锁屏中进行相关判断,满足条件则运行callback中的方法,mKeyguardDrawnCallback中的方法最终依然是执行finishKeyguardDrawn(),所以直接看这个函数

private void finishKeyguardDrawn() {

synchronized (mLock) {

if (!mScreenOnEarly || mKeyguardDrawComplete) {

return; // We are not awake yet or we have already informed of this event.

}

mKeyguardDrawComplete = true;

if (mKeyguardDelegate != null) {

mHandler.removeMessages(MSG_KEYGUARD_DRAWN_TIMEOUT);

}

mWindowManagerDrawComplete = false;

}

// ... eventually calls finishWindowsDrawn which will finalize our screen turn on

// as well as enabling the orientation change logic/sensor.

mWindowManagerInternal.waitForAllWindowsDrawn(mWindowManagerDrawCallback,

WAITING_FOR_DRAWN_TIMEOUT);

}

mKeyguardDrawComplete的存在是为了防止重复调用,不过多讨论,finishKeyguardDrawn最后是走到了WindowManagerInternal里面,WindowManagerInternal的实现类是WindowManagerService

2.3窗口绘制检查

public void waitForAllWindowsDrawn(Runnable callback, long timeout) {

boolean allWindowsDrawn = false;

synchronized (mWindowMap) {

mWaitingForDrawnCallback = callback;

final WindowList windows = getDefaultWindowListLocked();

for (int winNdx = windows.size() - 1; winNdx >= 0; --winNdx) {

final WindowState win = windows.get(winNdx);

final boolean isForceHiding = mPolicy.isForceHiding(win.mAttrs);

final boolean keyguard = mPolicy.isKeyguardHostWindow(win.mAttrs);

if (win.isVisibleLw()

&& (win.mAppToken != null || isForceHiding || keyguard)) {

win.mWinAnimator.mDrawState = DRAW_PENDING;

// Force add to mResizingWindows.

win.mLastContentInsets.set(-1, -1, -1, -1);

mWaitingForDrawn.add(win);

// No need to wait for the windows below Keyguard.

if (isForceHiding) {

break;

}

}

}

mWindowPlacerLocked.requestTraversal();

mH.removeMessages(H.WAITING_FOR_DRAWN_TIMEOUT);

if (mWaitingForDrawn.isEmpty()) {

allWindowsDrawn = true;

} else {

mH.sendEmptyMessageDelayed(H.WAITING_FOR_DRAWN_TIMEOUT, timeout);

checkDrawnWindowsLocked();

}

}

if (allWindowsDrawn) {

callback.run();

}

}

这个函数会检查所有的窗口是否都绘制完全,同时启动窗口UI刷新流程,等待绘制的窗口放在mWaitingForDrawn里面,如果内容为空则表示窗口绘制完全,否则需要继续等待,并且还会发送一个延时1秒的message,防止窗口绘制超时导致屏幕无法亮起。

如果窗口都绘制完成,则会进入传过来的callback的run方法,具体看一下这个传过来的callback

final Runnable mWindowManagerDrawCallback = new Runnable() {

@Override

public void run() {

mHandler.sendEmptyMessage(MSG_WINDOW_MANAGER_DRAWN_COMPLETE);

}

};

来到如下函数

private void finishWindowsDrawn() {

synchronized (mLock) {

if (!mScreenOnEarly || mWindowManagerDrawComplete) {

return; // Screen is not turned on or we did already handle this case earlier.

}

mWindowManagerDrawComplete = true;

}

finishScreenTurningOn();

}

继续看

private void finishScreenTurningOn() {

synchronized (mLock) {

// We have just finished drawing screen content. Since the orientation listener

// gets only installed when all windows are drawn, we try to install it again.

updateOrientationListenerLp();

}

final ScreenOnListener listener;

final boolean enableScreen;

synchronized (mLock) {

if (mScreenOnFully || !mScreenOnEarly || !mWindowManagerDrawComplete

|| (mAwake && !mKeyguardDrawComplete)) {

return; // spurious or not ready yet

}

listener = mScreenOnListener;

mScreenOnListener = null;

mScreenOnFully = true;

// Remember the first time we draw the keyguard so we know when we're done with

// the main part of booting and can enable the screen and hide boot messages.

if (!mKeyguardDrawnOnce && mAwake) {

mKeyguardDrawnOnce = true;

enableScreen = true;

if (mBootMessageNeedsHiding) {

mBootMessageNeedsHiding = false;

hideBootMessages();

}

} else {

enableScreen = false;

}

}

if (listener != null) {

listener.onScreenOn();

}

if (enableScreen) {

try {

mWindowManager.enableScreenIfNeeded();

} catch (RemoteException unhandled) {

}

}

}

注意这里的listener,这个listener是一个ScreenOnListener对象,ScreenOnListener类的实现在DisplayPowerController中,所以通过这个listener,phoneWindowManager把窗口绘制完成的消息由传回了DisplayPowerController

private final class ScreenOnUnblocker implements WindowManagerPolicy.ScreenOnListener {

@Override

public void onScreenOn() {

Message msg = mHandler.obtainMessage(MSG_SCREEN_ON_UNBLOCKED, this);

msg.setAsynchronous(true);

mHandler.sendMessage(msg);

}

}

2.4unblockScreenOn

ScreenOnUnblocker中的onScreenOn方法最终会走到unblockScreenOn方法

private void unblockScreenOn() {

if (mPendingScreenOnUnblocker != null) {

mPendingScreenOnUnblocker = null;

long delay = SystemClock.elapsedRealtime() - mScreenOnBlockStartRealTime;

Slog.i(TAG, "Unblocked screen on after " + delay + " ms");

Trace.asyncTraceEnd(Trace.TRACE_TAG_POWER, SCREEN_ON_BLOCKED_TRACE_NAME, 0);

}

}

并且,unblockScreenOn之后会再一次updatePowerState(),调用DisplayPowerState中的相关方法设置亮度,屏幕最终亮起来

通过unblockScreenOn方法中的log也可以得到block的总时间,一般来说,只要blockscreen前后没有过多的消息传递,可以认为block时间就是亮屏时间

3.屏幕上电

在屏幕亮起来之前需要改变屏幕的电源状态,即给屏幕上电

前面说到,在DisplayPowerController设置电源状态的方法开头有这么一段

private boolean setScreenState(int state) {

if (mPowerState.getScreenState() != state) {

final boolean wasOn = (mPowerState.getScreenState() != Display.STATE_OFF);

mPowerState.setScreenState(state);

...

mPowerState是一个DisplayPowerState对象,继续看具体的实现

public void setScreenState(int state) {

if (mScreenState != state) {

mScreenState = state;

mScreenReady = false;

scheduleScreenUpdate();

}

}

mScreenState和mScreenReady会用于状态检查,然后通过scheduleScreenUpdate向底层发出给屏幕上电的命令,具体的流程比较长而且复杂,不一一说明,大致的调用流程是

DisplayPowerState

-DisplayManagerService

-LocalDisplayAdapter

-SurfaceControl

-HWComposer

屏幕的上电时间与硬件的时序相关,并且是影响亮屏总时间的一个非常重要的因素,

查看屏幕的上电时间可以通过搜索trace文件中的setPowerModeInternal查看或者搜索surfaceControl的log,setPowerMode

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

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

相关文章

concat函数显示小数点包括0

场景1:当小数点大于等于3位小于5位: select regexp_replace(concat(nvl(round(0.0001,4),0)*100,%),^.,0.)as rate from dual;例如:0.001-0.0001 场景2:当小数点小于等于2位: select concat(nvl(round(0.01,4),0)*1…

阿里云Elasticsearch的X-Pack:机器学习、安全保障和可视化

摘要: ELK是日志分析领域较为流行的技术选择,不少阿里云用户选择在ECS上搭建开源Elasticsearch。与自建开源Elastisearch相比,阿里云Elasticsearch做了性能优化,支持弹性扩容,并搭载了商业版组件X-Pack,为用…

Linux部署Web应用程序超链接下载中文名称文件404问题解决办法

超链接内容如下&#xff1a; <a href"jsp/plugin/用户手册.doc">用户手册</a>开发环境为Windows&#xff0c;Tomcat和WebSphere都用过&#xff0c;超链接都能正常下载 项目生产环境为Linux&#xff0c;由于Linux默认不支持中文&#xff0c;因此超链接下…

2017北京云栖大会:云效企业级协同研发专场议题揭秘!

摘要&#xff1a; 阿里巴巴原汁原味的研发协同平台是如何支撑双十一1682亿背后的研发协同&#xff1f;大中型企业如何完成公有云/专有云/混合云转型升级&#xff0c;实现高效协同研发&#xff1f; 阿里巴巴原汁原味的研发协同平台是如何支撑双十一1682亿背后的研发协同&#xf…

html5在线api,HTML5+ API Reference

Push模块管理推送消息功能&#xff0c;可以实现在线、离线的消息推送&#xff0c;通过plus.push可获取推送消息管理对象。方法&#xff1a;对象&#xff1a;ClientInfo: JSON对象&#xff0c;获取的客户端标识信息PushMessage: JSON对象&#xff0c;推送消息对象MessageOptions…

毋庸置疑,容器带来改变!

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 刘晶晶对于飞贷金融科技副总裁陈定玮而言&#xff0c;金融行业数据具有相较于其他行业更为严格的的高标准安全性要求&#xff0c;对容错的要求更为尤甚&#xff1b;此外是否能高效支撑飞贷金融科技的核心业务&#xff0c;尤其…

阿里云发布首款全球智能互联的网络产品——云骨干网

摘要&#xff1a; 12月13日&#xff0c;阿里发布全球首款智能互联的网络产品–云骨干网&#xff08;Cloud Backbone Network&#xff09;。这款产品能够分钟级构建多地域全球网络&#xff0c;并和混合云连成一体&#xff0c;打造具有企业级规模和通信力的智能云上骨干网络。12月…

matlab pca降维_手撸PCA(Python七行代码实现)

直接上代码&#xff1a;x np.random.rand(10,5) #随机生成一组样本 x - x.mean(axis0) # 见详注1 C x.T.dot(x) # 计算自协方差矩阵 lam,v lina.eig(C) # 特征分解&#xff0c;v是 new_index np.argsort(lam)[::-1] # 特征值排序&#xff0c;见详注2 A -v[:,n…

MaxCompute复杂数据分布的查询优化实践

摘要&#xff1a; 2017年中国大数据技术大会于12月7-9日在北京新云南皇冠假日酒店隆重举行, 大会就大数据时代社会各行业的智能化进程和行业实践展开深入讨论。 在12月8日的“大数据分析与生态系统”分论坛上&#xff0c;来自阿里巴巴计算平台事业部的高级技术专家少杰&#xf…

android开源tabview,TabBarView

声明一个TabBarView &#xff0c;同时将ViewPager传递给它&#xff1a;LayoutInflater inflator (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);View v inflator.inflate(R.layout.custom_ab, null);tabBarView (TabBarView) v.findViewById(R.i…

Linux 主机信息 总览

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…

AliOS Things异步事件框架Yloop

摘要&#xff1a; Yloop概要 Yloop是AliOS Things的异步事件框架。Yloop借鉴了&#xff0c;libiuv及嵌入式业界常见的event loop&#xff0c;综合考虑使用复杂性&#xff0c;性能&#xff0c;及footprint&#xff0c;实现了一个适合于MCU的事件调度机制。 Yloop概要 Yloop是Al…

这项技术,风头正劲,BAT要力捧!程序员:我彻底慌了...

人工智能离我们还遥远吗&#xff1f;近日&#xff0c;海底捞斥资1.5亿打造了中国首家火锅无人餐厅&#xff1b;阿里酝酿了两年之久的全球首家无人酒店也正式开始运营&#xff0c;百度无人车彻底量产。李彦宏称&#xff0c;这是中国第一款能够量产的无人驾驶乘用车。而阿里的这家…

joi模块验证日期格式_python datetime模块详解

一、datetime模块介绍通过print(dir(datetime))&#xff0c;我们可以看到模块内属性和类&#xff1a;[MAXYEAR, MINYEAR, __builtins__, __cached__, __doc__, __file__, __loader__, __name__, __package__, __spec__, date, datetime, datetime_CAPI, sys, time, timedelta, …

AliOS Things 基于组件化思想的多bin特性

摘要&#xff1a; 今年杭州云栖大会上&#xff0c;AliOS Things正式发布&#xff0c;其中有一个基于组件化思想的多bin特性&#xff0c;这是AliOS Things有专利保护的多bin fota升级解决方案的核心 今年杭州云栖大会上&#xff0c;AliOS Things正式发布&#xff0c;其中有一个基…

case计算机英语,计算机英语常用术语

小编为大家整理了。一起来学习吧!KB:等于1024 ByteMB:等于1024 KBGB&#xff1a;等于1024 MBByte:字节&#xff0c;等于8 bit***8个位的组合&#xff0c;共有256种电路状态***&#xff0c;计算机一个文字以8 bit来表示bit:位&#xff0c;计算机数据最基本的单位&#xff0c;有0…

查看linux是否为虚拟机,以及其它信息,cpu,主机型号,主板型号等

查看属于什么类型主机&#xff1f; dmidecode -s system-product-name物理机&#xff1a; [rootswnode1]# dmidecode -s system-product-name I840-GS虚拟机&#xff1a; [rootgnntdb DbBackup]# dmidecode -s system-product-name VMware Virtual Platform# 总核数 物理CP…

数据库风云:老骥伏枥,新秀辈出

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者&#xff1a;姜洪军“在数据库技术方面&#xff0c;亚马逊落后甲骨文10至20年”。2018年10月23日&#xff0c;甲骨文&#xff08;Oracle&#xff09;创始人、执行董事长拉里埃里森&#xff0c;在甲骨文举办的一次大会的主题演讲…

解读阿里云oss-android/ios-sdk 断点续传(多线程)

摘要&#xff1a; oss sdk 断点续传功能使用及其相关原理 前言 移动端现状 随着移动端设备的硬件水平的不断提高&#xff0c;如今的cpu&#xff0c;内存等方面都大大的超过了一般的pc电脑&#xff0c;因此在现今的程序中&#xff0c;合理的使用多线程去完成一些事情是非常有必…

云钻还在吗 苏宁怎么解除实名认证_快手7天怎么养号,5步简易养号方案送上

今天我们聊一聊&#xff0c;新注册的快手号&#xff0c;7天怎么养号&#xff1f;为什么要养号&#xff1f;什么情况下需要养号&#xff1f;一般来说&#xff0c;新账号、播放量不高、很少热门、违规等情况&#xff0c;都需要养号。养号有什么作用&#xff1f;养号的作用很多&am…