[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[系统相关] 调用外部process.exe执行处理器相关性设置的批处理怎样修改?

此批处理调用外部process.exe执行处理器相关性设置,默认把所有进程全部与第四核心相关(设置为1000),前面的CPU0(应设置为1),CPU1(应设置为10),CPU2(应设置为100)三个核心空出.

默认批处理:
  1. for /f "tokens=2" %%G in ('tasklist /nh') do process -a %%G 1000
复制代码
需修改为:

方式1:把所有进程设置为与CPU1,CPU2,CPU3相关,且平均相关到这三核中,每进程只占用其中的一个核,空出第一核心CPU0不用.

方式2:把除进程名为"xxx.exe"之外的所有进程设置为与CPU1,CPU2,CPU3相关,且平均相关到这三核中,每进程只占用其中的一个核,空出第一核心CPU0不用.

求教高手,这两种批处理的写法,谢谢!

对于LZ提供的 "默认批处理" 其目的是获得所有进程的PID提供给"一个第三方程序process"使用,
当然这是一个错误的且不安全的代码:
1. 明显的,对于带有空格与特殊字符(如:&)的进程无法获得PID.
2. 对于拥有r0级的进程 "system idle process.exe" 是不能随意更改的 (它也未必有能力更改)

google 简单介绍下process.exe:

Command Line Process Viewer/Killer/Suspender for Windows NT/2000/XP V2.03
Copyright(C) 2002-2003 [email]Craig.Peacock@beyondlogic.org[/email]
Usage: Process.exe [-v] [-t] [-c]
       Process.exe [-q] [Process Name/PID] [timeout sec(optional)]
       Process.exe [-k] [-s] [-r] [Process Name/PID]
       Process.exe [-p] [Process Name/PID] {RealTime|High|AboveNormal|
                                                Normal|BelowNormal|Low}
       Process.exe [-a] [Process Name/PID] [Mask(To Set)]
        -v    View Processes.                        查看进程
        -t    View Kernel and User CPU Times.        查看进程及其CPU耗时
        -c    View Process Creation Times.        查看进程创建时间
        -q    Send WM_CLOSE Message. Default timeout is 60 Sec        发送WM_CLOSE消息(即关闭),默认超时60s.
        -k    Kill Process. (Terminate)                强行关闭进程
        -s    Suspend Process.                        挂起进程
        -r    Resume Suspended Process.                恢复挂起的进程
        -p    Set Process Priority.                设置进程优先级
        -a    Get/Set Affinity Mask of Process.        CPU亲合力

CPU亲合力就是指在Linux系统中能够将一个或多个进程绑定到一个或多个处理器上运行.
一个进程的CPU亲合力掩码决定了该进程将在哪个或哪几个CPU上运行.在一个多处理器系统中,设置CPU亲合力的掩码可能会获得更好的性能.
一个CPU的亲合力掩码用一个cpu_set_t结构体来表示一个CPU集合,下面的几个宏分别对这个掩码集进行操作:
CPU_ZERO() 清空一个集合
CPU_SET()与CPU_CLR()分别对将一个给定的CPU号加到一个集合或者从一个集合中去掉.
CPU_ISSET()检查一个CPU号是否在这个集合中.
其实这几个的用法与select()函数那几个调用差不多.
下面两个函数就是最主要的了:
sched_setaffinity(pid_t pid, unsigned int cpusetsize, cpu_set_t *mask)
该函数设置进程为pid的这个进程,让它运行在mask所设定的CPU上.如果pid的值为0,则表示指定的是当前进程,使当前进程运行在mask所设定的那些CPU上.第二个参数cpusetsize是

mask所指定的数的长度.通常设定为sizeof(cpu_set_t).如果当前pid所指定的CPU此时没有运行在mask所指定的任意一个CPU上,则该指定的进程会从其它CPU上迁移到mask的指定的
在我的机器上sizeof(cpu_set_t)的大小为128,即一共有1024位.第一位代表一个CPU号.某一位为1则表示某进程可以运行在该位所代表的cpu上.例如
CPU_SET(1, &mask);
则mask所对应的第2位被设置为1.
此时如果printf("%d/n", mask.__bits[0]);就打印出2.表示第2位被置为1了.
  1. E:\DOS>Process.exe -a NOTEPAD.EXE
  2. Getting Affinity Mask for PID 2268 'NOTEPAD.EXE'
  3. System  : 0x000f 0b00000000000000000000000000001111  [4 Installed Processor(s)]
  4. Process : 0x000f 0b00000000000000000000000000001111
复制代码
这是4核心CPU下的记事本默认状态, 想只在No.4运行 "Process.exe -a NOTEPAD.EXE 1000"即可.

code就不写了,感觉没有实际意义.
“阿姐走了。。。可是。。。我。。。我愿意。”

TOP

本帖最后由 ddssfg 于 2011-8-15 13:26 编辑
这是4核心CPU下的记事本默认状态, 想只在No.4运行 "rocess.exe -a NOTEPAD.EXE 1000"即可.

code就不写了,感觉没有实际意义.hfg1977 发表于 2011-8-15 04:55


谢谢楼上的解答,我只是对相同文件名的进程有多个同时存在时,比喻svchost.exe就有好几个,用文件名来相关CPU核心时,却只能相关到其中一个线程,PID方式能全部相关(系统默认不让相关的除外),所以我请教,如何用获取PID方式进行这种进程的相关性设置,再次感谢!

另外,在以上的基础上,如果其中有一个进程不能设置相关时,如何把它排除在外.

TOP

  1. @echo off
  2. path=%path%;%~d0\DOS\网络;%~d0\DOS\command\第三方命令行程序;%~d0\DOS\command;%~d0\DOS\源码;%~d0\DOS\sysbkup
  3. :start ============================================================
  4. ::for /f "tokens=2" %%G in ('tasklist /nh') do process -a %%G 1000
  5. ::设置不被更改的过滤关键词
  6. set "Filter_char=Idle"
  7. tasklist /nh|findstr /vi "%Filter_char%">"%temp%\01.txt"
  8. set "cmdstr=type "%temp%\01.txt"^|sed "s/\([a-zA-Z0-9 .]\+[ ]\+\)\([0-9]\+\)\([ ]\+[0-9]\+[ ]\+[0-9,]\+ K\)/\1#\2/""
  9. for /f "tokens=1* delims=#" %%a in ('%cmdstr%') do (
  10. echo ++%%~nxa++ ++PID=%%b++
  11. if /i "%%~nxa"=="xxoo.exe" (process -a %%b 1000) else (process -a %%b 1111)
  12. echo ++%%~nxa++|findstr /i "xxoo love fuck cum 6+girls ass bed breasts"&&process -a %%b 1110
  13. )
  14. :end ==============================================================
  15. exit /b
复制代码
进程名与PID间用"#"分隔, 详细的进程CPU亲和力自行扩展.
“阿姐走了。。。可是。。。我。。。我愿意。”

TOP

本帖最后由 hfg1977 于 2011-8-15 15:03 编辑

额,网又卡了,刷了两次.
忘了说使用了 sed, 自己在论坛下吧.

如果不考虑进程名带 "空格" 的情况,就简单了:

方式1:把所有进程设置为与CPU1,CPU2,CPU3相关,且平均相关到这三核中,每进程只占用其中的一个核,空出第一核心CPU0不用.
方式2:把除进程名为"xxx.exe"之外的所有进程设置为与CPU1,CPU2,CPU3相关,且平均相关到这三核中,每进程只占用其中的一个核,空出第一核心CPU0不用.
  1. for /f "tokens=2" %%G in ('tasklist /nh') do process -a %%G 1110
复制代码
根本不用考虑 "平均相关到这三核中,每进程只占用其中的一个核" 系统会做的很好,无需干涉.
过滤设置参考LS code
“阿姐走了。。。可是。。。我。。。我愿意。”

TOP

本帖最后由 ddssfg 于 2011-8-15 15:48 编辑

谢谢楼上的解答,辛苦了 

确实不用考虑"空格"问题,可能是我表达不够清楚,设置为1110时,是每进程同时占用后面三个核心,空出第一核心,而我是需要每进程只占用其中一核,空出三核(比喻a.exe占用CPU1,空出CPU0,CPU2,CPU3;b.exe占用CPU2空出CPU0,CPU1,CPU3;c.exe占用CPU3空出CPU0,CPU1,CPU2)而自始至终CPU0空出备用.

另外过滤设置的LS CODE如何使用?请告知,我目前还在学习中,一些不太懂 (掩面低头...

TOP

再次诚心求高手指教.... 

TOP

返回列表