好一点小编带来了宁波市事业单位招聘网 南京市和宁波市事业编好考吗,希望能对大家有所帮助,一起来看看吧!
南京市和宁波市事业编好考吗
热门频道
首页
博客
研修院
VIP
APP
问答
下载
社区
推荐频道
活动
招聘
专题
打开CSDN APP
Copyright © 1999-2020, CSDN.NET, All Rights Reserved
打开APP
Windows 进程在指定CPU上运行 原创
2021-12-27 12:14:24
2点赞
imhikaru
码龄15年
关注
NUMA, CPU分组简介
传统SMP(Symmetric Multiprocessor)-对称多处理器架构, 多个CPU都是通过总线访问内存、I/0等资源。CPU多了以后,总线成为瓶颈。 于是出现NUMA架构(Non-Uniform Memory Access), 每个CPU节点配套高速访问的本地内存,I/O槽口等,亦可访问其他节点的内存,但要经过互联模块。 特点是本地内存的速度远高于远地内存。操作系统提供NUMA相关的API,让开发者更好地提升软件性能。参考资料 SMP、NUMA、MPP体系结构介绍 - victoryubo - 博客园
没有CPU分组之前的affinity API
// 设置进程相关性
BOOL SetProcessAffinityMask(
[in] HANDLE hProcess,
[in] DWORD_PTR dwProcessAffinityMask
);
// 获取进程相关性
BOOL GetProcessAffinityMask(
[in] HANDLE hProcess,
[out] PDWORD_PTR lpProcessAffinityMask,
[out] PDWORD_PTR lpSystemAffinityMask
);
// 设置线程相关性,成功时返回原来的mask,失败返回0, mask不可能为0
DWORD_PTR SetThreadAffinityMask(
[in] HANDLE hThread,
[in] DWORD_PTR dwThreadAffinityMask
);
/*
获取系统信息, 知道系统有哪些可用的逻辑处理器。
这是win32时代的API了,64位系统更准确的信息通过GetNativeSystemInfo去获取
To retrieve accurate information for an application running on WOW64, call the GetNativeSystemInfo function.
*/
void GetSystemInfo(
[out] LPSYSTEM_INFO lpSystemInfo
);
typedef struct _SYSTEM_INFO {
union {
DWORD dwOemId;
struct {
WORD wProcessorArchitecture;
WORD wReserved;
} DUMMYSTRUCTNAME;
} DUMMYUNIONNAME;
DWORD dwPageSize;
LPVOID lpMinimumApplicationAddress;
LPVOID lpMaximumApplicationAddress;
// 系统当前可用的CPU, 因为系统设置里可以关闭某些CPU, 所以会出现与dwNumberOfProcessors个数不匹配的情况。
DWORD_PTR dwActiveProcessorMask;
DWORD dwNumberOfProcessors; // 多少个逻辑核
DWORD dwProcessorType;
DWORD dwAllocationGranularity;
WORD wProcessorLevel;
WORD wProcessorRevision;
} SYSTEM_INFO, *LPSYSTEM_INFO;
/*
如果需要识别dwNumberOfProcessors中的是物理核还是超线程的逻辑核, 通过GetLogicalProcessorInformationEx去获取。
Note For information about the physical processors shared by logical processors, call GetLogicalProcessorInformationEx with the RelationshipType parameter set to RelationProcessorPackage (3).
*/
基本用法
SYSTEM_INFO sys_info;
memset(&sys_info, 0x0, sizeof(sys_info));
GetSystemInfo(&sys_info);
DWORD cpu_core_num = sys_info.dwNumberOfProcessors;
DWORD_PTR proc_mask = 0x60;
BOOL success = SetProcessAffinityMask(GetCurrentProcess(), proc_mask);
DWORD_PTR proc_mask;
DWORD_PTR system_mask;
BOOL success = GetProcessAffinityMask(GetCurrentProcess(), &proc_mask, &system_mask);
DWORD_PTR thread_mask = 0x1;
DWORD_PTR last_mask = SetThreadAffinityMask(GetCurrentThread(), thread_mask);
注意事项
如果使用c++11的std::thread线程,参数中线程句柄可以通过std::thread的native_handle()函数来获取。
没有找到直接获取当前线程的affinity的API。 可以通过SetThreadAffinityMask返回上一次的affinity, 再调用SetThreadAffinityMask还原。
设置失败,维持原来的affinity设置。
affinity超出系统可用CPU范围时, 调用失败。
affinity为0时, 调用失败。
当设置进程affinity后, 再设置超出已设进程affinity范围的线程的affinity时,SetThreadAffinityMask失败返回0。
当成功设置线程affinity后,再设置合法的进程affinity时,成功后会覆盖所有线程原有的affinity, 线程affinity变成与当前进程affinity一致。
支持CPU分组的affinity相关API
// 获取当前系统的最高NUMA节点索引, NUMA节点数就是返回的HighestNodeNumber + 1
// 只有一个CPU分组的系统也能调用, 返回TRUE, HighestNodeNumber被设置为0。
BOOL GetNumaHighestNodeNumber(
[out] PULONG HighestNodeNumber
);
// 获取NUMA节点的分组以及有效的mask范围。 但是这个API在64位系统,只能获取到调用线程所在的分组的mask,
// GetNumaNodeProcessorMaskEx没有这个限制, 建议用GetNumaNodeProcessorMaskEx代替。
BOOL GetNumaNodeProcessorMask(
[in] UCHAR Node,
[out] PULONGLONG ProcessorMask
);
// 获取任意合法NUMA节点的分组以及有效的mask范围。
BOOL GetNumaNodeProcessorMaskEx(
[in] USHORT Node,
[out] PGROUP_AFFINITY ProcessorMask
);
typedef struct _GROUP_AFFINITY {
KAFFINITY Mask;
WORD Group;
WORD Reserved[3];
} GROUP_AFFINITY, *PGROUP_AFFINITY;
// 获取当前进程, 一共在多少个分组里运行。 不同的线程,可以指定在不同的CPU分组上运行。
BOOL GetProcessGroupAffinity(
[in] HANDLE hProcess,
[in, out] PUSHORT GroupCount,
[out] PUSHORT GroupArray
);
// 设置线程的CPU亲缘性, 绑定在哪个CPU分组, 以及哪些CPU上运行。 可返回上一次的CPU分组和相关性信息。
BOOL SetThreadGroupAffinity(
[in] HANDLE hThread,
[in] const GROUP_AFFINITY *GroupAffinity,
[out, optional] PGROUP_AFFINITY PreviousGroupAffinity
);
基本用法
ULONG highest_node_num = 0;
BOOL num_success = GetNumaHighestNodeNumber(&highest_node_num);
if (num_success) {
ULONG numa_node_count = highest_node_num + 1;
printf("NUMA node count = %u\n", numa_node_count);
for (int node_index = 0; node_index < numa_node_count; node_index++) {
GROUP_AFFINITY group_affinity;
BOOL mask_success = GetNumaNodeProcessorMaskEx(node_index, &group_affinity);
if (mask_success) {
printf("The %d NUMA node group=%d mask=0x%llx\n", node_index + 1, (int)group_affinity.Group, group_affinity.Mask);
}
}
}
USHORT group_ary[4];
USHORT group_ary_size = 4;
BOOL success = GetProcessGroupAffinity(GetCurrentProcess(), &group_ary_size, group_ary);
GROUP_AFFINITY group_affinity;
memset(&group_affinity, 0x0, sizeof(group_affinity));
group_affinity.Group = 1;
group_affinity.Mask = 0x4;
GROUP_AFFINITY last_group_affinity;
BOOL success1 = SetThreadGroupAffinity(GetCurrentThread(), &group_affinity, &last_group_affinity);
BOOL success2 = SetThreadGroupAffinity(GetCurrentThread(), &group_affinity, NULL);
注意事项
如果使用c++11的std::thread线程,参数中线程句柄可以通过std::thread的native_handle()函数来获取。
每新起一个进程时,操作系统以轮循(round-robin)方式把进程分配到一个分组上运行。假如一共有2个分组,进程1分配到组0, 进程2分配到组1,进程3又分配到组0,..., 进程1,2,3可以是相同,也可以是不同的应用程序。
没有设置进程分组的API,只有设置线程分组的API。
新创建的线程都分配到与创建它的线程相同的组。假如一个线程的CPU分组、affinity修改后, 那么由这个线程创建出来的子线程分组与父线程一样。 但affinity为全集, 不继承父线程的affinity设置。
新创建的进程, 与创建它的线程的CPU分组和affinity都没有关系,仍是由系统来分配CPU分组。
SetThreadAffinityMask(不带group)跟SetThreadGroupAffinity(带group)的作用一样,唯一区别就是不能指定CPU分组,只在当前分组上操作。
当修改线程affinity并且未修改过CPU分组时,再设置进程affinity后会覆盖所有线程原有的affinity, 线程affinity变成与当前进程affinity一致。
当修改线程group affinity改变过CPU分组后,再也无法再设置进程的affinity, SetProcessAffinityMask会失败,错误码ERROR_INVALID_PARAMETER, 即使后面把线程的CPU分组改回来,也无法回到能够正常设置进程affinity的状态, 官方说明如下:
On a system with more than 64 processors,
if the calling process contains threads in more than one processor group,
the last error code is ERROR_INVALID_PARAMETER.
并且任务管理器也无法查看该进程的相关性信息,提示拒绝访问。
image.png
不同的线程,可以设置到不同的CPU分组上运行。并且可以配合NUMA相关的内存分配函数( VirtualAllocExNuma etc..),充分发挥多核以及快速访问本地内存的优势。
管理线程的组和affinity信息,方法一:经过一个统一接口去设置,设置成功后,记录下当时的分组和affinity信息;方法二:set来返回上一次的设置, 然后再还原。 从优雅的角度建议使用方法一。除非使用了别人的库,无法保证库的内部对线程的亲缘性做操作。
扩展功能--在多分组的Windows系统,如何修改进程的分组。
1. 所有模块都能修改。
所有线程通过SetThreadAffinity来控制亲缘性。在main函数入口处, 修改main函数主线程的CPU分组, 由于后面所有线程都是从main函数开始创建的,根据子线程与父线程CPU分组必定一致这个特性, 可以确保所有线程CPU分组就与main函数线程一致。有两个缺点,
设置的分组与进程开始分配的不一样,任务管理器将无法查看分组信息。
需要找到所有线程创建的地方,在创建时设置指定的affinity, 并且修改affinity时,还要找到所有线程,设置和修改。实现起来比较麻烦。
2. 存在一些模块,内部线程无法控制和设置亲缘性。
把模块包装成一个进程, 通过进程间通信来交互。然后通过修改进程的CPU分组和处理器亲缘来实现。无需关注模块内部有多少线程,确保整个子进程在指定的分组和和核心上调度。
SetProcessAffinityMask, 没有CPU分组的系统,可以这么做。有CPU分组的不行, 因为没有设置进程CPU分组的API, 只有线程才有。
通过作业对象(Job Object来实现), 作业对象是Windows系统提供的对加入作业的进程做特定限制的内核对象,可以对作业中的进程组统一做时间片分配,网络,CPU亲缘性设置等,作业相关的API支持设置分组以及核心的亲缘性。并且可以设置JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE标志,当作业对象释放,回收时(包括主进程崩溃),系统强制关闭所有相关进程。参考 作业对象 - Win32 apps | Microsoft Docs
实现步骤:
创建作业对象
通过传递进程句柄,把进程加入作业对象。
通过设置JobObjectGroupInformationEx信息类的配置,实现CPU亲缘性的限制。
Job Object相关API
// 创建作业对象
HANDLE CreateJobObjectA(
[in, optional] LPSECURITY_ATTRIBUTES lpJobAttributes,
[in, optional] LPCSTR lpName
);
// 把进程加入作业。
BOOL AssignProcessToJobObject(
[in] HANDLE hJob,
[in] HANDLE hProcess
);
// 设置作业的限制内容
BOOL SetInformationJobObject(
[in] HANDLE hJob,
[in] JOBOBJECTINFOCLASS JobObjectInformationClass,
[in] LPVOID lpJobObjectInformation,
[in] DWORD cbJobObjectInformationLength
);
// 查询作业的限制内容。
BOOL QueryInformationJobObject(
[in, optional] HANDLE hJob,
[in] JOBOBJECTINFOCLASS JobObjectInformationClass,
[out] LPVOID lpJobObjectInformation,
[in] DWORD cbJobObjectInformationLength,
[out, optional] LPDWORD lpReturnLength
);
实现方法
//========================= 创建进程 ============================//
char Proc_Path[] = "notepad.exe"; // 进程路径
STARTUPINFOA startup_info;
memset(&startup_info, 0x0, sizeof(startup_info));
startup_info.cb = sizeof(startup_info);
startup_info.wShowWindow = SW_SHOW;
PROCESS_INFORMATION proc_info;
memset(&proc_info, 0x0, sizeof(proc_info));
BOOL create_ok = CreateProcessA(
NULL,
Proc_Path,
NULL,
NULL,
TRUE,
CREATE_NEW_CONSOLE,
NULL,
NULL,
&startup_info,
&proc_info
);
//------------------------------------------------------------------------//
HANDLE job_handle = CreateJobObject(NULL, NULL); // 创建Job对象
BOOL add_job_ok = AssignProcessToJobObject(job_handle, proc_info.hProcess); // 把进程加入Job
//=========== 设置Job对象回收, 所有相关进程自动退出 ============//
JOBOBJECT_EXTENDED_LIMIT_INFORMATION limit_info;
memset(&limit_info, 0x0, sizeof(limit_info));
limit_info.BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE; // job句柄回收时,所有加入job的进程都会强制结束。
BOOL set_auto_kill_ok = SetInformationJobObject(
job_handle,
JobObjectExtendedLimitInformation,
&limit_info,
sizeof(limit_info)
);
//-----------------------------------------------------------------//
//================= 限制进程在指定的CPU分组中运行 =================//
{
USHORT cpu_group = 0;
//USHORT cpu_group = 1;
BOOL success = SetInformationJobObject(job_handle, JobObjectGroupInformation, &cpu_group, sizeof(cpu_group));
}
//-------------------------------------------------------------------//
//================= 限制进程在指定的CPU分组以及指定的核心中运行 =================//
{
GROUP_AFFINITY group_affinity;
memset(&group_affinity, 0x0, sizeof(group_affinity));
group_affinity.Group = 1;
group_affinity.Mask = 0xff;
BOOL success = SetInformationJobObject(job_handle, JobObjectGroupInformationEx, &group_affinity, sizeof(group_affinity));
}
//---------------------------------------------------------------------------------//
/*
释放job对象, 调用后,所有相关进程都会退出。
假如程序崩溃没调用释放, 由系统回收,也能达到结束所有相关进程的效果。
在多进程系统中,这个特性必用,应对出现僵尸子进程的现象。
*/
CloseHandle(job_handle);
注意事项
进程加入新创建的JobObject, 并且JobObject并未设置过group或者affinity限制, 会保留原来进程的group和affinity设置。
JobObject调用SetInformationJobObject设置进程的group或affinity后,会覆盖原来的SetProcessAffinityMask设置,并且后面再调用SetProcessAffinityMask会成功,但是实际上不会生效,还是以JobObject的限制为准。
JobObject调用SetInformationJobObject设置进程的group或affinity后,会覆盖原来线程的SetThreadGroupAffinity设置,所有线程的group和affinity与JobObject的设置一致。再次调用SetThreadGroupAffinity, 如果group和affinity范围在JobObject限制内,会成功并生效;如果group和affinity超出JobObject范围,设置会失败,Error Code为ERROR_GEN_FAILURE。
建议
设置group和affinity的方法只选择其中一种,避免混用导致迷惑。
如果系统只需对部分线程做CPU亲缘设置,使用SetThreadGroupAffinity即可。
如果系统本来就是多进程架构,或者引用了无法设置线程属性的第三方库,又有设置分组的需求,统一使用JobObject来限定CPU分组以及处理器亲缘属性。
打开CSDN APP,看更多技术内容
...%的问题_asdfgh0077的博客_无法访问或设置进程相关性
(1)windows下设置进程CPU相关性/亲合度,解决CPU使用率占用100%的问题 (2)
https://www.cnblogs.com/szxu/p/5599829.html
继续访问
多核计算机相关性如何设置,进程相关性设置繁琐,一条命令解决一核(cpu...
NODE 将首选非一致性内存结构(NUMA)节点指定为 十进制整数。 AFFINITY 将处理器关联掩码指定为十六进制数字。 进程被限制在这些处理器上运行。 将/AFFINITY 和 /NODE 结合使用时,会对关联掩码 ...
继续访问
C/C++实现linux和Windows查看系统、进程、服务的内存和CPU使用
遇到需求写的代码,没那么正规,但也请你尊重作者 C/C++实现linux和Windows查看系统、进程、服务的内存和CPU使用情况的源代码,生成的是静态链接库,Windows和Linux下经测试都可用,查看系统、指定名称的服务、指定名称的进程占用CPU和内存,查看方式不是通过程序中运行命令行的方式,而是采用系统提供的接口去查看内核状态 在开发中遇到需要查看这些信息的朋友可以去使用 如有疑问或好的建议请发送邮件至lion_liu_0301@163.com
热门推荐 如何设置进程(线程)在指定的CPU上运行
实现方法 进程与指定cpu绑定:SetProcessAffinityMask(GetCurrentProcess(), dwMask); 线程与指定cpu绑定:SetThreadAffinityMask(GetCurrentThread(),dwMask); dwMask为CPU序号的或运算值:1(0001)代表只运行在CPU1,2(0010)代表只运行在CPU2,3(0011)代表
继续访问
十一.自动根据CPU数目设置进程个数和绑定CPU亲缘性_尹吉欢的博客-CSDN...
1.为worker_processes增加参数auto。当设置成auto,tengine将自动启动与cpu数量相同的worker进程。 worker_processes auto 2.为worker_cpu_affinity增加参数auto和off。当设置成auto时,tengine将根据worker的数量自动配置cpu绑定位图。
继续访问
操作系统基本知识_旺仔 小馒头的博客
匿名管道只允许有亲缘关系的进程之间通信,也就是父子进程之间的通信,命名管道允许具有非亲缘关系的进程间通信。信号量: 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。信号量只有等待和发送两种操作。等待(P(sv))就是将其...
继续访问
centos 下进程/线程绑定到特定cpu核上运行
概述 现在大家使用的基本上都是多核cpu,一般是4核的。平时应用程序在运行时都是由操作系统管理的。操作系统对应用进程进行调度,使其在不同的核上轮番运行。 对于普通的应用,操作系统的默认调度机制是没有问题的。但是,当某个进程需要较高的运行效率时,就有必要考虑将其绑定到单独的核上运行,以减小由于在不同的核上调度造成的开销。 把某个进程/线程绑定到特定的cpu核上后,该进程就会一直在此核上运行,不...
继续访问
2.1.1进程的概念 组成和特征
目录思维导图进程的概念进程的组成PCB进程的组织方式链接方式索引方式进程的特征 思维导图 进程的概念 进程的组成 巧妙记忆 : 进程是一定有数据段,还有我们的程序,不然咋运行,所以要有程序段, 我们还需要一个管理者也就是PCB了。 注意: PCB就相当于进程的大脑,它是进程是否存在的唯一标志。 PCB 进程的组织方式 链接方式 索引方式 进程的特征 ...
继续访问
windows下设置进程CPU相关性/亲合度,解决CPU使用率占用100%的问题
某进程占用CPU资料100%造成系统卡死,解决方法: 打开 任务管理器,找到该进程,点右键“任务相关性”不要把全部cpu核心分配给它即可;缺点是:配置不会保存,程序重启后还需要再重新设置。 用 start / 命令启动你需要限制的程序,优点是能保存配置: 格式: start /affinity 0x? app.exe (?号自己改成任意数字启动后,在任务管理器中查看效...
继续访问
多核计算机相关性如何设置,进程相关性设置繁琐,一条命令解决一核(cpu)干活多核(cpu)人围观...
该楼层疑似违规已被系统折叠隐藏此楼查看此楼患了懒癌,没救了, CPU干活老喜欢围观,每次都得设置相关性...双路福音...--------------------------------------------------------设置详解------------------------------------------------------------例如:start /NODE 1 ...
继续访问
Windows多个独立程序分配指定核运行
@TOC多个独立项目分配到指定核内运行 最近用visual studio想把几个独立的项目分配到不同的核内运行,学习到了一个简单的方法分享给大家。 1.打开任务管理器-进程,找到运行的项目-转到详细信息 2.项目右击-设置相关性 3.项目右击-设置相关性,勾选想要跑的核 ...
继续访问
获取CPU处理器信息(GetLogicalProcessorInformation)
Retrieves information about logical processors and related hardware. To retrieve information about logical processors and related hardware, including processor groups, use the GetLogicalProces
继续访问
powershell实现设置程序相关性脚本
公司一直有台服务器cpu占用很高,分析出是恒生监控程序java占用很高,且三个java程序,仅其中一个很高,要恒生解决,一直未解决,导致每周重启,我司运维都要手动进行程序相关性设置,给运维带来麻烦。为解决运维重复劳动,拟看看是否可以脚本实现,通过对网上资料查询可通过powershell进行程序相关性设置。参考链接如下:
https://www.pstips.net/setting-process-r...
继续访问
Java面试手册――高频问题总结(二)
这里将Java*和垃圾回收的知识总结,放到(二)中。对Java平台的理解、Java基础知识、面向对象请参考Java面试手册――高频问题总结(一) 文章目录四、Java*1. Java*框架的基础接口有哪些?2. Collection 和 Collections 有什么区别?3. List、Set、Map是否继承自Collection接口?4. HashMap 和 HashTable 的区别?5. ArrayList、Vector 和 LinkedList 的区别是什么?6. Array 和 Array
继续访问
Win10如何设置相关性
为什么要设置相关性? 有一些老的游戏或者程序,没有针对多核cpu进行优化,运行的时候会出现卡顿,这个时候需要通过相关性的设置,让程序只使用一个cpu核心。 怎么设置相关性? win10以前的系统直接打开任务管理器,然后右击需要的程序就可以设置了。 Win10直接右击没有相关性的选项了,需要先右击选择“详细信息”,然后在新的视图里面找到要设置的程序,再右击,就可以找到相关性的...
继续访问
windows下设置线程亲和性(支持大于64核)
设置线程亲和性,通俗的说法就是将线程绑定到cpu上某一个或多个核上,此处的核是指逻辑核心,非物理核心。 物理核心与逻辑核心的关系,如果开启超线程,一般逻辑核心数=物理核心数*2。 一、SetThreadAffinityMask 微软帮助:
https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-setthreadaffinitymask
函数定义如下: DWORD_PTR SetThreadAffinityMask(HAND
继续访问
任务管理器修改器(修改任务管理器权限等)
修改权限,禁杀密码,监控进程... 被杀毒软件误认病毒,其实对电脑系统无任何影响...
【linux】把进程/线程绑定到特定cpu核上运行
目的 某个进程需要较高的运行效率时,就有必要考虑将其绑定到单独的核上运行,以减小由于在不同的核上调度造成的开销。 把某个进程/线程绑定到特定的cpu核上后,该进程就会一直在此核上运行,不会再*作系统调度到其他核上。但绑定的这个核还是可能会被调度运行其他应用程序的。 命令绑定 查看绑定情况 查看进程pid现在的绑核情况 taskset -p pid pid 2726's current affinity mask: 6 显示的十进制数字6--->转换为2进制是110,每个1对应一个cp
继续访问
最新发布 使用让进程跑在指定的CPU核心上(psexec与windows API)
psexec的-a选项就是用来指定进程到对应的CPU核心上的功能。 PsExec - Windows Sysinternals | Microsoft Docs 上面是文档。 windows API SetProcessAffinityMask function (winbase.h) - Win32 apps | Microsoft Docs SetThreadAffinityMask function (winbase.h) - Win32 apps | Microsoft Docs ..
继续访问
【进程保护】让程序禁止结束进程并提示拒绝访问,可调用API
类似于360,腾讯管家等在任务管理器中无法结束提示拒绝访问 使用驱动写的,支持WIN10,WIN8,WIN7等系统。所有程序都可调用,有API帮助教程 由于是驱动,所以打开的时候杀毒软件会报毒 可以用程序调用并且传入要保护的进程名即可,保护完成后程序自动退出(但是无法取消保护,不过程序自己可以正常退出) 压缩包里有GIF教程图片
修复任务管理器不能访问:
1)修复磁盘错误: 修复驱动器打开时出现 "打开方式" 对话框或 "无法找到'虾米'" 错误。 2)进行其他调整优化您的电脑,点击 "调整" 查看可用的调整。 3)修复任务管理器不能访问: 不能打开任务管理器?Disk Heal 只需点击一次即可修复。
无法访问或设置进程相关性
windows
c++
写评论
评论
7
2
踩
分享
以上就是好一点整理的宁波市事业单位招聘网 南京市和宁波市事业编好考吗相关内容,想要了解更多信息,敬请查阅好一点。