diff --git a/README_zh.md b/README_zh.md index cacf33e..d7b3a71 100644 --- a/README_zh.md +++ b/README_zh.md @@ -1,18 +1,19 @@ # 内存管理部件 - [内存管理部件](#内存管理部件) - - [简介](#简介) - - [目录](#目录) - - [框架](#框架) - - [进程回收优先级列表](#进程回收优先级列表) - - [回收策略/查杀策略](#回收策略查杀策略) - - [使用说明](#使用说明) - - [参数配置说明](#参数配置说明) + - [简介](#简介) + - [目录](#目录) + - [框架](#框架) + - [进程回收优先级列表](#进程回收优先级列表) + - [补充](#补充) + - [回收策略/查杀策略](#回收策略查杀策略) + - [使用说明](#使用说明) + - [参数配置说明](#参数配置说明) - [availbufferSize](#availbuffersize) - [ZswapdParam](#zswapdparam) - [killConfig](#killconfig) - [nandlife](#nandlife) - - [相关仓](#相关仓) + - [相关仓](#相关仓) ## 简介 @@ -82,6 +83,9 @@ | 260 | 连接着分布式设备的后台应用 | | 400 | 普通后台应用及无被任何进程关联的extension进程 | +#### 补充 +1. extension进程的优先级根据其关联进程组进行更新,其值在关联进程组最小优先级基础上增加100 + ### 回收策略/查杀策略 diff --git a/services/memmgrservice/include/reclaim_priority_manager/process_priority_info.h b/services/memmgrservice/include/reclaim_priority_manager/process_priority_info.h index 6b146e4..b03066d 100644 --- a/services/memmgrservice/include/reclaim_priority_manager/process_priority_info.h +++ b/services/memmgrservice/include/reclaim_priority_manager/process_priority_info.h @@ -39,15 +39,24 @@ public: bool isSuspendDelay; bool isEventStart; bool isDistDeviceConnected; + bool isExtension; int extensionBindStatus; // 0: unkown, 1:fg bind, 2:bg bind, 3:no bind std::set extensionConnectors; // contains all pid of connectors + std::set extensionProcessUids_; + std::set extensionConnectorUids_; void SetPriority(int targetPriority); int32_t ExtensionConnectorsCount(); void AddExtensionConnector(int32_t pid); void RemoveExtensionConnector(int32_t pid); + void AddExtensionProcessUid(int32_t uid); + void RemoveExtensionProcessUid(int32_t uid); + void AddExtensionConnectorUid(int32_t uid); + void RemoveExtensionConnectorUid(int32_t uid); bool ContainsConnector(int32_t pid); std::string ConnectorsToString(); + std::string ExtensionProcessUidToString(); + std::string ExtensionConnectorsUidToString(); }; } // namespace Memory } // namespace OHOS diff --git a/services/memmgrservice/include/reclaim_priority_manager/reclaim_priority_constants.h b/services/memmgrservice/include/reclaim_priority_manager/reclaim_priority_constants.h index 50f5840..945ec07 100644 --- a/services/memmgrservice/include/reclaim_priority_manager/reclaim_priority_constants.h +++ b/services/memmgrservice/include/reclaim_priority_manager/reclaim_priority_constants.h @@ -75,6 +75,7 @@ enum class AppStateUpdateReason { DIST_DEVICE_DISCONNECTED, BIND_EXTENSION, UNBIND_EXTENSION, + UPDATE_EXTENSION_PROCESS, }; enum class BundleState { diff --git a/services/memmgrservice/include/reclaim_priority_manager/reclaim_priority_manager.h b/services/memmgrservice/include/reclaim_priority_manager/reclaim_priority_manager.h index c3c5fea..64cf67f 100644 --- a/services/memmgrservice/include/reclaim_priority_manager/reclaim_priority_manager.h +++ b/services/memmgrservice/include/reclaim_priority_manager/reclaim_priority_manager.h @@ -157,6 +157,17 @@ private: bool IsKillableSystemApp(std::shared_ptr bundle); void NotifyKillableSystemAppsAdded(std::set &newKillableApps); bool IsImportantApp(std::shared_ptr bundle, int &dstPriority); + bool UpdateProcessForExtension(int32_t callerPid, int32_t callerUid, + const std::string &callerBundleName, pid_t pid, int bundleUid, const std::string &bundleName, + AppStateUpdateReason priorityReason); + bool UpdateConnectorsForExtension(int32_t callerPid, int32_t callerUid, + const std::string &callerBundleName, pid_t pid, int bundleUid, const std::string &bundleName, + AppStateUpdateReason priorityReason); + void UpdatePriorityByProcForExtension(ProcessPriorityInfo &proc); + void UpdatePriorityByProcConnector(ProcessPriorityInfo &proc); + bool UpdateReclaimPriorityByUid(int bundleUid, AppStateUpdateReason reason); + bool UpdateReclaimPriorityByUidInner(int bundleUid, AppStateUpdateReason reason); + bool HandleUpdateExtensionBundle(int bundleUid); static inline int GetOsAccountLocalIdFromUid(int bundleUid) { diff --git a/services/memmgrservice/src/reclaim_priority_manager/account_bundle_info.cpp b/services/memmgrservice/src/reclaim_priority_manager/account_bundle_info.cpp index 862f1ee..6ab72f4 100644 --- a/services/memmgrservice/src/reclaim_priority_manager/account_bundle_info.cpp +++ b/services/memmgrservice/src/reclaim_priority_manager/account_bundle_info.cpp @@ -36,7 +36,12 @@ bool AccountBundleInfo::HasBundle(int bundleUid) std::shared_ptr AccountBundleInfo::FindBundleById(int bundleUid) { - return bundleIdInfoMapping_.at(bundleUid); + auto iter = bundleIdInfoMapping_.find(bundleUid); + if (iter != bundleIdInfoMapping_.end()) { + return iter->second; + } + HILOGD("not found the bundle info"); + return nullptr; } void AccountBundleInfo::AddBundleToOsAccount(std::shared_ptr bundle) diff --git a/services/memmgrservice/src/reclaim_priority_manager/process_priority_info.cpp b/services/memmgrservice/src/reclaim_priority_manager/process_priority_info.cpp index b2837ce..4f44c76 100644 --- a/services/memmgrservice/src/reclaim_priority_manager/process_priority_info.cpp +++ b/services/memmgrservice/src/reclaim_priority_manager/process_priority_info.cpp @@ -35,6 +35,7 @@ ProcessPriorityInfo::ProcessPriorityInfo(pid_t pid, int bundleUid, int priority) this->isSuspendDelay = false; this->isEventStart = false; this->isDistDeviceConnected = false; + this->isExtension = false; this->extensionBindStatus = EXTENSION_STATUS_BIND_UNKOWN; } @@ -44,6 +45,7 @@ ProcessPriorityInfo::ProcessPriorityInfo(const ProcessPriorityInfo ©Process) this->pid_ = copyProcess.pid_; this->priority_ = copyProcess.priority_; this->isFreground = copyProcess.isFreground; + this->isExtension = copyProcess.isExtension; this->isBackgroundRunning = copyProcess.isBackgroundRunning; this->isSuspendDelay = copyProcess.isSuspendDelay; this->isEventStart = copyProcess.isEventStart; @@ -52,11 +54,19 @@ ProcessPriorityInfo::ProcessPriorityInfo(const ProcessPriorityInfo ©Process) for (auto connectors : copyProcess.extensionConnectors) { this->AddExtensionConnector(connectors); } + for (auto callerUid : copyProcess.extensionProcessUids_) { + this->AddExtensionProcessUid(callerUid); + } + for (auto connectorUid : copyProcess.extensionConnectorUids_) { + this->AddExtensionConnectorUid(connectorUid); + } } ProcessPriorityInfo::~ProcessPriorityInfo() { extensionConnectors.clear(); + extensionProcessUids_.clear(); + extensionConnectorUids_.clear(); } void ProcessPriorityInfo::SetPriority(int targetPriority) @@ -80,6 +90,26 @@ void ProcessPriorityInfo::RemoveExtensionConnector(int32_t pid) extensionConnectors.erase(pid); } +void ProcessPriorityInfo::AddExtensionProcessUid(int32_t uid) +{ + extensionProcessUids_.insert(uid); +} + +void ProcessPriorityInfo::RemoveExtensionProcessUid(int32_t uid) +{ + extensionProcessUids_.erase(uid); +} + +void ProcessPriorityInfo::AddExtensionConnectorUid(int32_t uid) +{ + extensionConnectorUids_.insert(uid); +} + +void ProcessPriorityInfo::RemoveExtensionConnectorUid(int32_t uid) +{ + extensionConnectorUids_.erase(uid); +} + bool ProcessPriorityInfo::ContainsConnector(int32_t pid) { return extensionConnectors.count(pid) != 0; @@ -95,5 +125,27 @@ std::string ProcessPriorityInfo::ConnectorsToString() ss << "]"; return ss.str(); } + +std::string ProcessPriorityInfo::ExtensionProcessUidToString() +{ + std::stringstream ss; + ss << "["; + for (auto callerUid : extensionProcessUids_) { + ss << callerUid << " "; + } + ss << "]"; + return ss.str(); +} + +std::string ProcessPriorityInfo::ExtensionConnectorsUidToString() +{ + std::stringstream ss; + ss << "["; + for (auto connectorUid : extensionConnectorUids_) { + ss << connectorUid << " "; + } + ss << "]"; + return ss.str(); +} } // namespace Memory } // namespace OHOS diff --git a/services/memmgrservice/src/reclaim_priority_manager/reclaim_priority_manager.cpp b/services/memmgrservice/src/reclaim_priority_manager/reclaim_priority_manager.cpp index 27b54e6..260fbe7 100644 --- a/services/memmgrservice/src/reclaim_priority_manager/reclaim_priority_manager.cpp +++ b/services/memmgrservice/src/reclaim_priority_manager/reclaim_priority_manager.cpp @@ -105,16 +105,17 @@ void ReclaimPriorityManager::Dump(int fd) } dprintf(fd, "-----------------------------------------------------------------\n\n"); - dprintf(fd, "priority list of all managed processes, status:(fg,bgtask,trantask,evt,dist,ext)\n"); + dprintf(fd, "priority list of all managed processes, status:(fg,bgtask,trantask,evt,dist,extb,ext)\n"); dprintf(fd, " pid uid bundle priority status\ - connnectors\n"); + connnectorpids connnectoruids processuids\n"); for (auto bundlePtr : totalBundlePrioSet_) { dprintf(fd, "|-----------------------------------------\n"); for (auto procEntry : bundlePtr->procs_) { ProcessPriorityInfo &proc = procEntry.second; - dprintf(fd, "|%8d %8d %42s %5d %d%d%d%d%d%d %30s\n", proc.pid_, bundlePtr->uid_, bundlePtr->name_.c_str(), + dprintf(fd, "|%8d %8d %42s %5d %d%d%d%d%d%d%d %30s %30s %30s\n", proc.pid_, bundlePtr->uid_, bundlePtr->name_.c_str(), proc.priority_, proc.isFreground, proc.isBackgroundRunning, proc.isSuspendDelay, proc.isEventStart, - proc.isDistDeviceConnected, proc.extensionBindStatus, proc.ConnectorsToString().c_str()); + proc.isDistDeviceConnected, proc.extensionBindStatus, proc.isExtension, proc.ConnectorsToString().c_str(), + proc.ExtensionConnectorsUidToString().c_str(), proc.ExtensionProcessUidToString().c_str()); } } dprintf(fd, "-----------------------------------------------------------------\n"); @@ -423,6 +424,17 @@ bool ReclaimPriorityManager::UpdateReclaimPriorityWithCaller(int32_t callerPid, return handler_->PostImmediateTask(updateReclaimPriorityCallerInnerFunc); } +bool ReclaimPriorityManager::UpdateReclaimPriorityByUid(int bundleUid, AppStateUpdateReason reason) +{ + if (!initialized_) { + HILOGE("has not been initialized_, skiped!"); + return false; + } + std::function updateReclaimPriorityByUidInnerFunc = + std::bind(&ReclaimPriorityManager::UpdateReclaimPriorityByUidInner, this, bundleUid, reason); + return handler_->PostImmediateTask(updateReclaimPriorityByUidInnerFunc); +} + sptr GetBundleMgr() { sptr saMgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager(); @@ -562,7 +574,7 @@ bool ReclaimPriorityManager::HandleApplicationSuspend(std::shared_ptrpriority_ <= RECLAIM_PRIORITY_KILLABLE_SYSTEM || IsKillableSystemApp(bundle)) { - HILOGI("%{public}s is system app, skip!", bundleName.c_str()); + HILOGD("%{public}s is system app, skip!", bundleName.c_str()); return true; } if (priorityReason == AppStateUpdateReason::BIND_EXTENSION) { proc.isFreground = false; // current process is a extension, it never be a fg app. + proc.isExtension = true; proc.AddExtensionConnector(callerPid); - HILOGI("add connector %{public}d to %{public}s(%{public}d,%{public}d), now connectors:%{public}s", callerPid, + proc.AddExtensionConnectorUid(callerUid); + HILOGD("add connector %{public}d to %{public}s(%{public}d,%{public}d), now connectors:%{public}s", callerPid, bundleName.c_str(), pid, bundleUid, proc.ConnectorsToString().c_str()); } else if (priorityReason == AppStateUpdateReason::UNBIND_EXTENSION) { proc.isFreground = false; // current process is a extension, it never be a fg app. + proc.isExtension = true; proc.RemoveExtensionConnector(callerPid); - HILOGI("del connector %{public}d from %{public}s(%{public}d,%{public}d), now connectors:%{public}s", callerPid, + proc.RemoveExtensionConnectorUid(callerUid); + HILOGD("del connector %{public}d from %{public}s(%{public}d,%{public}d), now connectors:%{public}s", callerPid, bundleName.c_str(), pid, bundleUid, proc.ConnectorsToString().c_str()); } AppAction action = AppAction::OTHERS; @@ -597,6 +613,66 @@ bool ReclaimPriorityManager::UpdateReclaimPriorityWithCallerInner(int32_t caller return ApplyReclaimPriority(bundle, pid, action); } +bool ReclaimPriorityManager::UpdateProcessForExtension(int32_t callerPid, int32_t callerUid, + const std::string &callerBundleName, pid_t pid, int bundleUid, const std::string &bundleName, + AppStateUpdateReason priorityReason) +{ + int callerAccountId = GetOsAccountLocalIdFromUid(callerUid); + if (!IsProcExist(callerPid, callerUid, callerAccountId)) { + HILOGE("caller process not exist and not to create it!!"); + return false; + } + std::shared_ptr callerAccount = FindOsAccountById(callerAccountId); + std::shared_ptr callerBundle = callerAccount->FindBundleById(callerUid); + ProcessPriorityInfo &callerProc = callerBundle->FindProcByPid(callerPid); + + if (priorityReason == AppStateUpdateReason::BIND_EXTENSION) { + callerProc.AddExtensionProcessUid(bundleUid); + HILOGD("add caller %{public}d to %{public}s(%{public}d,%{public}d), now calling:%{public}s", callerPid, + bundleName.c_str(), pid, bundleUid, callerProc.ExtensionProcessUidToString().c_str()); + } else if (priorityReason == AppStateUpdateReason::UNBIND_EXTENSION) { + callerProc.RemoveExtensionProcessUid(bundleUid); + HILOGD("del caller %{public}d from %{public}s(%{public}d,%{public}d), now calling:%{public}s ", callerPid, + bundleName.c_str(), pid, bundleUid, callerProc.ExtensionProcessUidToString().c_str()); + } + return true; +} + +bool ReclaimPriorityManager::UpdateReclaimPriorityByUidInner(int bundleUid, AppStateUpdateReason reason) +{ + bool ret = false; + if (reason == AppStateUpdateReason::UPDATE_EXTENSION_PROCESS) { + HILOGD("call HandleCreateProcess"); + ret = HandleUpdateExtensionBundle(bundleUid); + } + return ret; +} + +bool ReclaimPriorityManager::HandleUpdateExtensionBundle(int bundleUid) +{ + int accountId = GetOsAccountLocalIdFromUid(bundleUid); + std::shared_ptr accountPtr = FindOsAccountById(accountId); + if (accountPtr == nullptr || !accountPtr->HasBundle(bundleUid)) { + return false; + } + std::shared_ptr bundlePtr = accountPtr->FindBundleById(bundleUid); + for (auto i = bundlePtr->procs_.begin(); i != bundlePtr->procs_.end(); ++i) { + UpdatePriorityByProcConnector(i->second); + } + UpdateBundlePriority(bundlePtr); + return true; +} + +bool ReclaimPriorityManager::UpdateReclaimPriorityWithCallerInner(int32_t callerPid, int32_t callerUid, + const std::string &callerBundleName, pid_t pid, int bundleUid, const std::string &bundleName, + AppStateUpdateReason priorityReason) +{ + UpdateProcessForExtension(callerPid, callerUid, + callerBundleName, pid, bundleUid, bundleName, priorityReason); + return UpdateConnectorsForExtension(callerPid, callerUid, + callerBundleName, pid, bundleUid, bundleName, priorityReason); +} + bool ReclaimPriorityManager::UpdateReclaimPriorityInner(pid_t pid, int bundleUid, const std::string &bundleName, AppStateUpdateReason reason) { @@ -655,6 +731,35 @@ bool ReclaimPriorityManager::IsImportantApp(std::shared_ptr return false; } +void ReclaimPriorityManager::UpdatePriorityByProcForExtension(ProcessPriorityInfo &proc) +{ + for (auto callerUid : proc.extensionProcessUids_) { + UpdateReclaimPriorityByUid(callerUid, AppStateUpdateReason::UPDATE_EXTENSION_PROCESS); + } +} + +void ReclaimPriorityManager::UpdatePriorityByProcConnector(ProcessPriorityInfo &proc) +{ + if (proc.extensionConnectorUids_.size() == 0) { + return; + } + int minPriority = RECLAIM_PRIORITY_UNKNOWN; + for (auto connectorUid : proc.extensionConnectorUids_) { + int connectorAccountId = GetOsAccountLocalIdFromUid(connectorUid); + std::shared_ptr connectorAccount = FindOsAccountById(connectorAccountId); + if (connectorAccount == nullptr || !connectorAccount->HasBundle(connectorUid)) { + minPriority = 0; // native + continue; + } + std::shared_ptr connectorBundle = connectorAccount->FindBundleById(connectorUid); + for (auto procEntry : connectorBundle->procs_) { + ProcessPriorityInfo &connectorProc = procEntry.second; + minPriority = connectorProc.priority_ < minPriority ? connectorProc.priority_ : minPriority; + } + } + proc.SetPriority(minPriority + 100); +} + void ReclaimPriorityManager::UpdatePriorityByProcStatus(std::shared_ptr bundle, ProcessPriorityInfo &proc) { @@ -669,6 +774,7 @@ void ReclaimPriorityManager::UpdatePriorityByProcStatus(std::shared_ptr RECLAIM_PRIORITY_FOREGROUND) { proc.SetPriority(RECLAIM_PRIORITY_FOREGROUND); } + UpdatePriorityByProcForExtension(proc); } else { // is a background process int bgPriority = RECLAIM_PRIORITY_BACKGROUND; if(IsImportantApp(bundle, bgPriority)) { @@ -679,6 +785,7 @@ void ReclaimPriorityManager::UpdatePriorityByProcStatus(std::shared_ptr%{public}d",