reactos操作系统实现(34)
现在就来分析第一阶段的进程管理器初始化函数PspInitPhase0,如下: #001 BOOLEAN #002 NTAPI #003 PspInitPhase0(IN PLOADER_PARAMETER_BLOCK LoaderBlock) #004 { #005 NTSTATUS Status; #006 OBJECT_ATTRIBUTES ObjectAttributes; #007 HANDLE SysThreadHandle; #008 PETHREAD SysThread; #009 MM_SYSTEMSIZE SystemSize; #010 UNICODE_STRING Name; #011 OBJECT_TYPE_INITIALIZER ObjectTypeInitializer; #012 ULONG i; #013
获取系统物理内存的大小。 #014 /* Get the system size */ #015 SystemSize = MmQuerySystemSize(); #016
下面根据内存大小来做进程管理器进程个数设置。 #017 /* Setup some memory options */ #018 PspDefaultPagefileLimit = -1; #019 switch (SystemSize) #020 {
中等规模系统内存。 #021 /* Medimum systems */ #022 case MmMediumSystem: #023 #024 /* Increase the WS sizes a bit */ #025 PsMinimumWorkingSet += 10; #026 PsMaximumWorkingSet += 100; #027
大规模系统内存。 #028 /* Large systems */ #029 case MmLargeSystem: #030 #031 /* Increase the WS sizes a bit more */ #032 PsMinimumWorkingSet += 30; #033 PsMaximumWorkingSet += 300; #034
最小的,就使用默认参数。 #035 /* Small and other systems */ #036 default: #037 break; #038 }
通过上面这段代码,就可以看到Reactos会根据内存大小来选择不同的进程个数,以便达到优化系统性能。在一个内存过少的设备里,是不可能创建很多并发进程的。
把所有线程、进程和文件加载通知设置为空。 #039 #040 /* Setup callbacks */ #041 for (i = 0; i < PSP_MAX_CREATE_THREAD_NOTIFY; i++) #042 { #043 ExInitializeCallBack(&PspThreadNotifyRoutine[i]); #044 } #045 for (i = 0; i < PSP_MAX_CREATE_PROCESS_NOTIFY; i++) #046 { #047 ExInitializeCallBack(&PspProcessNotifyRoutine[i]); #048 } #049 for (i = 0; i < PSP_MAX_LOAD_IMAGE_NOTIFY; i++) #050 { #051 ExInitializeCallBack(&PspLoadImageNotifyRoutine[i]); #052 } #053
设置进程调度表。比如进程是多长时间就轮转一次,还是实时地运行一个线程。 #054 /* Setup the quantum table */ #055 PsChangeQuantumTable(FALSE,PsRawPrioritySeparation); #056
下面设置分页内存和非分页内存使用限制。 #057 /* Set quota settings */ #058 if (!PspDefaultPagedLimit) PspDefaultPagedLimit = 0; #059 if (!PspDefaultNonPagedLimit) PspDefaultNonPagedLimit = 0; #060 if (!(PspDefaultNonPagedLimit) && !(PspDefaultPagedLimit)) #061 { #062 /* Enable give-backs */ #063 PspDoingGiveBacks = TRUE; #064 } #065 else #066 { #067 /* Disable them */ #068 PspDoingGiveBacks = FALSE; #069 } #070
现在只能分配1MB内存页面。 #071 /* Now multiply limits by 1MB */ #072 PspDefaultPagedLimit <<= 20; #073 PspDefaultNonPagedLimit <<= 20; #074 if (PspDefaultPagefileLimit != -1U) PspDefaultPagefileLimit <<= 20; #075 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |