我用Borland C ++编写了一个服务应用程序。 它工作正常。 在ServiceStart(TService * Sender,bool&Started)例程中,我调用mjwinrun来启动一个进程来处理macros。 这个过程没有用户界面,任何错误logging到一个文件。 它将继续运行,直到服务器重新启动,closures或使用任务pipe理器终止进程。 这是mjwinrun: –
int mjwinrun(AnsiString cmd) { STARTUPINFO mjstupinf; PROCESS_INFORMATION mjprcinf; memset(&mjstupinf,0,sizeof(STARTUPINFO)); mjstupinf.cb=sizeof(STARTUPINFO); if (!CreateProcess(NULL,cmd.c_str(),NULL,NULL,TRUE,0,NULL,GetCurrentDir().c_str(),&mjstupinf,&mjprcinf)) { LogMessage("Could not launch "+cmd); return -1; } CloseHandle(mjprcinf.hThread); CloseHandle(mjprcinf.hProcess); return mjprcinf.dwProcessId; }
cmd是启动macros队列处理器的命令行。 我使用了一个CPU /内存密集型的macros,并将它的时序写入文件。 这是我发现的:
1)如果在login会话中从命令行启动macros处理器,则无论运行的是哪个Windows核心,macros都将在6秒内完成。
2)如果macros处理器是从Vista核心或更低版本(使用上面的mjwinrun)启动的服务启动的,则macros在6秒内完成。
3)如果macros处理器是从在Windows 7内核或更高版本上启动的服务(使用上面的mjwinrun)启动的,则macros将在超过18秒内完成。
我已经尝试了CreateProcess的所有不同的标志,没有一个有所作为。 我已经尝试了所有不同的服务帐户,这没有任何区别。 我尝试设置任务,I / O和Page的各种优先级,但都没有区别。 就好像这个服务的产生的进程在某种程度上受到了限制,而不是以I / O方式,而是在CPU /内存使用方面。 任何想法在Windows 7以后发生了什么变化?
我隔离代码来重现这一点,它最终归结为调用数据库引擎来查找字段定义(TTable方法FindField和FieldByName)。 在服务应用程序而不是GUI应用程序上运行时,这些花费了很多时间。 我设计了自己的方法来存储从字段名称到字段定义的映射,因为我总是用中央例程打开我的数据库。 我使用了由每个表上的Tag属性索引的字符串数组(对于所有BCB对象是公共的),其中每个字符串由字段名;字段编号; 对,然后做了一个.POS的字段名来获得字段号。 fieldnumber被零填充到4的宽度。这只为整个应用程序及其所有数据库使用几百KB的RAM。 一旦到位,服务应用程序以与GUI应用程序相同的速度运行。 我唯一能想到的就是可以解释这一点,就是服务应用程序有一个固定的堆(我认为我默认读了48MBytes)为自己和他们产生的任何进程。 有了大量的字段,内存溢出,不得不在磁盘上的虚拟机。 GUI应用程序没有这样的限制,并能够完全在真实的内存中查找。 不过,我可能完全错了。 我学到的一件事就是FieldByName和FindField是可以调用的昂贵的TTable函数,现在我用我自己的机制取代了它们,这似乎更好,更快。 这是我的查找程序:
AnsiString fldsbytag[MXSPRTBLS+100]; TField *fldfromtag(TAdsTable *tbl,AnsiString fld) { int fi=fldsbytag[tbl->Tag].Pos(";"+fld.UpperCase()+";"),gi; if (fi==0) return tbl->FindField(fld); gi=StrToIntDef(fldsbytag[tbl->Tag].SubString(fi+fld.Length()+2,4),-1); if (gi<0 || gi>=tbl->Fields->Count) return tbl->FindField(fld); return tbl->Fields->Fields[gi]; }
如果没有更多的细节,就很难给出这个问题的权威答案。
然而,要考虑的一个因素是这里描述的Windows前台优先级提升。
你可能想阅读Russinovich关于进程/线程的书籍章节,特别是关于调度的内容。 你可以在网上找到这本书的PDF(有两本一起组成整本书)。 我相信最新的(或最新的)版本涵盖了Win 7的变化。