收到了2019中国联通校招录取通知甘肃的录取通知,有点纠结去不去

在 Linux 下玩《英雄无敌 3》游戏
在 Linux 下玩《英雄无敌 3》游戏
  作者:jiqing 邮箱:
  英雄无敌2和3都是英雄无敌系列的经典,你知道吗,英雄无敌3有Linux版的啊。 先来几张截图看看吧。
  怎么样?和Windows版的一样吗? 不过,这个Linux版并不是原公司做的,这个是可敬的洛基(loki)公司做的。
  洛基公司是个致力于开发linux游戏的公司,目标是增加linux的竞争力。 无疑,他们都是非常喜欢linux的一批人了。 可惜,公司已经倒闭,无法赢利公司就无法生存。 怎么linux的游戏市场就是打不开呢?是因为当时linux用户还少吧? 那么现在呢?
  下载和安装
  国内的用户可以到这里下载:
  感谢Ubuntu中文论坛提供的服务。
  下载完Heroes.of.Might.and.Magic.3.Linux.[].iso后, 按以下步骤安装:
  sudo mount -o loop Heroes.of.Might.and.Magic.3.Linux.[].iso /mnt
  cd /mnt
  sudo bash setup.sh
  将会启动安装的图形界面,有的机器也会启动文字安装界面。 安装的默认目录是/usr/local/games/Heroes3,你也可以更改。 安装的大小是可以定制的,如果你不安装声音、音乐和视频,安装大小都不到 100兆。
  安装迅速完成, 这时在命令行运行heroes3,就启动游戏了。 进去体验一下吧,很流畅吧,cpu占用非常之低,看来是基于timer实现的啊,我 我喜欢这样的游戏。  安装全屏补丁
  怎么回事?不能全屏。即使加了-f选项,也是在800x600的窗口中运行。
  运行一下heroes3 -v,现在的版本号是1.2。
  我们打一个1.3.1的补丁就可以了。
  就在我们上面提到的 中,有一个heroes3-1.3.1a-x86.run文件,大概 两兆多大小,这个就是补丁。 不过据说这个不行,要google下载另一个heroes3-1.3.1-x86.run, 注意到差别了吗,这个文件名中少一个a。另外这个大小只有1兆左右。
  现在运行sudo sh heroes3-1.3.1-x86.run,却发现以下错误。
  Verifying archive integrity...tail: cannot open `+6' for reading: No such file or directory
  Error in check sums
  下面就是我要讲的主要部分,怎么对补丁进行hack。
  用vim打开heroes3-1.3.1-x86.run,搜索 +6 ,发现是作为tail的参数。 表示从文件第六行的内容。 但是这样使用参数是错误的,正确的使用方法是 tail --lines=+6 。 所以把 +6 的部分都改正为 --lines=+6 。 这样 tail: cannot open `+6' for reading: No such file or directory 的错误就消除了。
  再次运行sudo sh heroes-1.3.1-x86.run,仍然有如下错误
  Error in check sums
  在heroes-1.3.1-x86.run中搜索,找到那个地方。
  大概是102行,注释掉以下部分。
  #[ $sum1 -ne $CRCsum ] && {
  #& $echo Error in check sums $sum1 $CRCsum
  #& eval $ exit 2;
  再次 sudo sh heroes3-1.3.1-x86.run ,结果如下:
  Verifying archive integrity...OK
  Uncompressing Heroes of Might & Magic III for Linux: patch 1.3.1
  trap: 126: cd / /bin/rm -rf $ exit $res: bad trap
  搜索trap,只在一个地方出现,
  [ "$keep" = y ] || trap 'cd / /bin/rm -rf $ exit $res'
  trap什么意思,我不太明白,因为下面还有一行
  [ "$keep" = y ] || { cd / /bin/rm -rf $ }
  所以我认为trap这行没有实际作用,注释掉
  #[ "$keep" = y ] || trap 'cd / /bin/rm -rf $ exit $res'
  保存,运行 sudo ./heroes3-1.3.1-x86.run --keep 。成了!
  Verifying archive integrity...OK
  Uncompressing Heroes of Might & Magic III for Linux: patch 1.3.1.....
  ***********************************************************************
  This script will install the 1.3.1 patch for Heroes of Might & Magic III
  You need an exiting installation of the game and sufficient
  write access permissions to proceed.
  This patch is for a x86 system
  You are running a x86 system
  Please enter the Heroes III installation directory [/usr/local/games/Heroes3] :
  Patching heroes3 ...
  Successfully upgraded Heroes III to version 1.3.1 !
  Please read the file README.patch13 in /usr/local/games/Heroes3 for details about this patch.
  Enjoy the game !
  检验一下, heroes3 -v :
  Heroes of Might and Magic III Linux 1.3.1
  - Mar& 7 2000
  Built with flags:
  -DUNIX
  Built with glibc-2.1
  OK,升级成功!运行 heroes3 ,不加参数,默认是全屏的。 如果要在窗口内运行,就 heroes3 -w 。
  Enjoy the game!
  更新: 想省事的朋友可以在这里下载我修改过的全屏补丁。
H3C认证Java认证Oracle认证
基础英语软考英语项目管理英语职场英语
.NETPowerBuilderWeb开发游戏开发Perl
二级模拟试题一级模拟试题一级考试经验四级考试资料
软件测试软件外包系统分析与建模敏捷开发
法律法规历年试题软考英语网络管理员系统架构设计师信息系统监理师
高级通信工程师考试大纲设备环境综合能力
路由技术网络存储无线网络网络设备
CPMP考试prince2认证项目范围管理项目配置管理项目管理案例项目经理项目干系人管理
职称考试题目
招生信息考研政治
网络安全安全设置工具使用手机安全
生物识别传感器物联网传输层物联网前沿技术物联网案例分析
Java核心技术J2ME教程
Linux系统管理Linux编程Linux安全AIX教程
Windows系统管理Windows教程Windows网络管理Windows故障
数据库开发Sybase数据库Informix数据库
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&后使用快捷导航没有帐号?
合作网站账号登录
查看: 65718|回复: 11
UID4950173在线时间20 小时帖子阅读权限30注册时间最后登录积分51星光0 经验51 人气0 钻石20 金币149
Lv.3 时明时暗, 积分 51, 距离下一级还需 149 积分
UID4950173星光0 经验51 人气0 钻石20
!:我只发这一家&&严禁转载到多玩论坛
本次测试用LOL客户端为美服最新版客户端
其他客户端未经测试 有需求可以去winqh提建议
为也尽量测试看看
本次延时使用Ubuntu12.04最新版系统
我们只要按照一下步骤照做就好
Step 1: Install Wine1.4 and Winetricks
*安装wine1.4和winetricks
code: sudo add-apt-repository ppa:ubuntu-wine/ppa
添加wine的PPA源(12.04默认有1.4源&&旧版本需要添加)
code: sudo apt-get update
进行apt-get的软件目录更新
code: sudo apt-get install wine1.4
(for Ubuntu12.04 : sudo apt-get install wine)
安装wine1.4&&Ubuntu12.04默认wine就为1.4版本
code: sudo apt-get install winetricks
安装winetricks
Step 2: Install Winetricks Extra Components
*安装运行库
code: winetricks vcrun2005
安装vc++ 2005运行库
code: winetricks wininet
安装inet运行库
code: winetricks ie6
安装IE6/WMP/OL
code: winetricks d3dx9
安装DirectX9
code: winetricks corefonts
安装wine字体 以保证不出现口口
code: winetricks adobeair
安装Adobe Air运行库
Step 3: Change Wine1.4 Settings to &Windows 7&
*设置wine的运行环境为Windows7
code: winecfg
打开wine设置窗口
Then, change the Windows Version Setting to &Windows 7&
设置运行windows环境为windows7
Step 4: Move a Previous Install of LoL
*移动游戏目录到wine目录下或者进行游戏的安装
You should place the folder (Riot Games) into the following location:
Make sure you replace [USER] with the correct name.
ALSO, .wine is sometimes hidden from view, so you may have to find it.
必须保证wine的Username和Linux的用户名相同
-------------------------------------------------------------------------------------------------------------------------------
Now that you have completed the above tasks, you will now have to open the LoL Launcher. To do that, you will have to type the following two lines of code into a terminal every time you want to play LoL.
以上无视掉 往下看
code: cd &/home/[USER]/.wine/dosdevices/c:/Program Files/Riot Games/League of Legends/RADS/system&
(changes directory to where you have LoL folder installed)
移动到英雄联盟的主目录的/League of Legends/RADS/system文件夹下&&
code: WINEDEBUG=+ntdll wine &rads_user_kernel.exe& run lol_launcher $(ls ../projects/lol_launcher/releases/) LoLLauncher.exe
运行这段命令:&WINEDEBUG=+ntdll wine &rads_user_kernel.exe& run lol_launcher $(ls ../projects/lol_launcher/releases/) LoLLauncher.exe&
The League of Legends launcher should now appear and begin updating.
然后就出现更新界面啦
CONGRATULATIONS on your new install of League of Legends on Linux!
然后你就可以在Linux玩LOL啦
19:39 上传
19:39 上传
19:39 上传
[ 本帖最后由 cq50173) 于
19:41 编辑 ]
技术宅拯救世界
谢谢你分享
总评分:&金币 + 100&
钻石 + 20&
UID在线时间2257 小时帖子阅读权限100注册时间最后登录积分6058星光1 经验5958 人气26 钻石94 金币5887
没有不变的永远,只有坚持的瞬间
Lv.10 北辰光耀, 积分 6058, 距离下一级还需 1942 积分
UID星光1 经验5958 人气26 钻石94
谢谢分享啊。但国内用linux系统的玩家应该不多。
& &快乐游戏,享受人生!
UID1143369在线时间2785 小时帖子阅读权限110注册时间最后登录积分8399星光4 经验12368 人气741 钻石1309 金币10622 德玛西亚之力187
杀杀杀杀!
Lv.11 照亮一方, 积分 8399, 距离下一级还需 1601 积分
UID1143369星光4 经验12368 人气741 钻石1309 德玛西亚之力187
美服可以,国服不行,TP过不去,也可能和设置有关
不过反TP补丁还可以用
腾讯官方说,TP不支持win8是因为体验版,我们程序员很懒,等正式版吧
但是TP不支持linux啥意思。。。开源的玩意就永远是体验版了么。。。。
UID在线时间5443 小时帖子阅读权限150注册时间最后登录积分8599星光6 经验14801 人气533 钻石902 金币298838 德玛西亚之力220
spread the word
UID星光6 经验14801 人气533 钻石902 德玛西亚之力220
红色字亮了
Kill me now,or get the hell out of my way
UID1318897在线时间44 小时帖子阅读权限50注册时间最后登录积分558星光0 经验558 人气0 钻石0 金币392
Lv.5 点点澄明, 积分 558, 距离下一级还需 442 积分
UID1318897星光0 经验558 人气0 钻石0
WINEDEBUG=+ntdll wine &rads_user_kernel.exe& run lol_launcher $(ls ../projects/lol_launcher/releases/) LoLLauncher.exe
这个命令是什么意思
我的lol就一个文件夹LOL,我用wine lol.launcher.exe 直接失败
还有64位的ubuntu显示 winetricks ie6 不成功
楼主求解答
UID在线时间715 小时帖子阅读权限90注册时间最后登录积分5197星光0 经验5197 人气12 钻石105 金币4865
Lv.9 子夜向标, 积分 5197, 距离下一级还需 303 积分
UID星光0 经验5197 人气12 钻石105
技术宅拯救世界
UID8427997在线时间13 小时帖子阅读权限30注册时间最后登录积分89星光0 经验89 人气0 钻石0 金币89
Lv.3 时明时暗, 积分 89, 距离下一级还需 111 积分
UID8427997星光0 经验89 人气0 钻石0
winetricks ie6 没有64位的怎么办?
winetricks ie6 没有64位的怎么办?
UID8427997在线时间13 小时帖子阅读权限30注册时间最后登录积分89星光0 经验89 人气0 钻石0 金币89
Lv.3 时明时暗, 积分 89, 距离下一级还需 111 积分
UID8427997星光0 经验89 人气0 钻石0
回复 1楼【楼主】 cq 的帖子
winetricks ie6 没有64位的怎么办?
UID在线时间289 小时帖子阅读权限50注册时间最后登录积分862星光0 经验862 人气5 钻石171 金币408
Lv.5 点点澄明, 积分 862, 距离下一级还需 138 积分
UID星光0 经验862 人气5 钻石171
本来就是转过来的 还有脸写红字 真当自己是技术宅了? 你要有那本事就不截美服图片了
UID25143在线时间1247 小时帖子阅读权限90注册时间最后登录积分4891星光0 经验4891 人气4 钻石497 金币4556
HEROINE PLAYER
Lv.9 子夜向标, 积分 4891, 距离下一级还需 609 积分
UID25143星光0 经验4891 人气4 钻石497
原帖由 LOl大头 于
20:31 发表
本来就是转过来的 还有脸写红字 真当自己是技术宅了? 你要有那本事就不截美服图片了
无聊去求证了一下出处,结果发现这关键词太强大了
23:07 上传
23:07 上传
23:07 上传
23:07 上传
后面N页也是各种门户官网,涉及各行各业,我完全被惊到了
[ 本帖最后由 bytran (25143) 于
23:09 编辑 ]
UID在线时间7 小时帖子阅读权限20注册时间最后登录积分42星光0 经验42 人气0 钻石0 金币41
Lv.2 若有似无, 积分 42, 距离下一级还需 8 积分
UID星光0 经验42 人气0 钻石0
回复 1楼【楼主】 cq 的帖子
wine&&目录在哪?& &游戏 “安装目录”指导一下d:\????& &, 找了半天没找到,&&不要喷啊,新手玩linux系统。
UID6707806在线时间233 小时帖子阅读权限50注册时间最后登录积分627星光0 经验627 人气1 钻石162 金币453
Lv.5 点点澄明, 积分 627, 距离下一级还需 373 积分
UID6707806星光0 经验627 人气1 钻石162
省省吧,用LINUX还想着windows的事,你们都蛋疼的。
每日话题什么的,最喜欢了!
论坛最佳活跃用户
论坛最佳活跃用户
要灿烂,要引人夺目。
要灿烂,要引人夺目。
Powered by
Designed bysunzeduo 的BLOG
用户名:sunzeduo
文章数:199
评论数:69
访问量:122850
注册日期:
阅读量:5863
阅读量:12276
阅读量:409161
阅读量:1097373
51CTO推荐博文
这里我们主要介绍进程的状态,进程的状态可以通过/proc/PID/status来查看,也可以通过/proc/PID/stat来查看。如果说到工具大家用的最多的ps也可以看到进程的信息。这里我们通过/proc/PID/status来分析进程的信息。在2.6.18之后的内核,多了capibilty/cpusets等信息.&查看进程状态信息如下:more statusName:&& rsyslogdState:& S (sleeping)Tgid:&& 987Pid:&&& 987PPid:&& 1TracerPid:&&&&& 0Uid:&&& 0&&&&&& 0&&&&&& 0&&&&&& 0Gid:&&& 0&&&&&& 0&&&&&& 0&&&&&& 0Utrace: 0FDSize: 32Groups:VmPeak:&&& 36528 kBVmSize:&&& 36528 kBVmLck:&&&&&&&& 0 kBVmHWM:&&&&& 1432 kBVmRSS:&&&&& 1420 kBVmData:&&& 33980 kBVmStk:&&&&&&& 88 kBVmExe:&&&&&& 320 kBVmLib:&&&&& 2044 kBVmPTE:&&&&&&& 56 kBVmSwap:&&&&&&& 0 kBThreads:&&&&&&& 3SigQ:&& 1/7954SigPnd: 0000ShdPnd: 0000SigBlk: 0000SigIgn: 1206SigCgt: 4c21CapInh: 0000CapPrm: ffffffffffffffffCapEff: ffffffffffffffffCapBnd: ffffffffffffffffCpus_allowed:&& 3Cpus_allowed_list:&&&&& 0-1Mems_allowed:&& 1Mems_allowed_list:&&&&& 0voluntary_ctxt_switches:&&&&&&& 1nonvoluntary_ctxt_switches:&&& &0&Name:&& rsyslogd解释:进程名&State:& S (sleeping)解释:进程的状态我们前文已经做了很详细的分析,各进程的状态代表的意义如下:R (running)", "S (sleeping)", "D (disk sleep)", "T (stopped)", "T(tracing stop)", "Z (zombie)", or "X (dead)"&Tgid:&& 987解释:Tgid是线程组的ID,一个线程一定属于一个线程组(进程组).&Pid:&&& 987解释:这个是进程的ID,更准确的说应该是线程的ID.例如:UID&& PID& &PPID &LWP& C NLWP STIME TTY&&&&&&&&& TIME CMDroot&& 987&&&& 1&& &987& 0&&& 3 00:18 ?&&&&&&& 00:00:00 /sbin/rsyslogd -c 4root&& 987&&&& 1&& &989& 0&&& 3 00:18 ?&&&&&&& 00:00:00 /sbin/rsyslogd -c 4root&& 987&&&& 1&& &990& 0&&& 3 00:18 ?&&&&&&& 00:00:00 /sbin/rsyslogd -c 4&注:/proc/pid/status中的Pid就是ps命令的LWP列输出,PID一列其实是进程组,而LWP是轻量级进程,也就是线程,因为所有的进程必须一个线程,那就是它自己.&PPid: &&1解释:当前进程的父进程&TracerPid:&& 0解释:跟踪当前进程的进程ID,如果是0,表示没有跟踪.例如:用strace跟踪top程序strace top&查看top进程ps -axjfPPID&& PID& PGID&& SID TTY&&&&& TPGID STAT&& UID&& TIME COMMAND&&
pts/2&&&& 2500 S+&&&&&& 0&& 0:00&&&&&&&&& \_ strace top&&
pts/2&&&& 2500 S+&&&&&& 0&& 0:00&&&&&&&&&&&&& \_ top&&查看top进程的TracerPid位cat /proc/2501/statstat&&& statm&& status&test1:/proc/2431# cat /proc/2501/statusName:&& topState:& S (sleeping)Tgid:&& 2501Pid:&&& 2501PPid:&& 2500TracerPid:&&&&& 2500&&Uid:&&& 0&&&&&& 0&&&&&& 0&&&&&& 0Gid:&&& 0&&&&&& 0&&&&&& 0&&&&&& 0解释:第一列数字(RUID):实际用户ID,指的是进程执行者是谁.第二列数字(EUID):有效用户ID,指进程执行时对文件的访问权限.第三列数字(SUID):保存设置用户ID,作为effective user ID的副本,在执行exec调用时后能重新恢复原来的effectiv user ID.第四列数字(FSUID):目前进程的文件系统的用户识别码.一般情况下,文件系统的用户识别码(fsuid)与有效的用户识别码(euid)是相同的.这里重点说明RUID和EUID,我们用test用户启动top,如下:终端1)su - testtop&&查看该进程的EUID和RUID,如下:终端2)cat /proc/`pgrep top|grep -v grep`/status前面略Uid:&&& 1002&&& 1002&&& 1002&&& 1002Gid:&&& 1003&&& 1003&&& 1003&&& 1003后面略&&注:这里我们看到进程的RUID和EUID都变成了1002.&&我们将程序top加上setuid权限,如下:chmod +s /usr/bin/top&&重新运行top程序,并查看它的RUID和EUID,如下:cat /proc/`pgrep top|grep -v grep`/status前面略Uid:&&& 1002&&& 0&&&&&& 0&&&&&& 0Gid:&&& 1003&&& 0&&&&&& 0&&&&&& 0后面略&注:我们看到RUID还是1002,说明程序是由test用户(UID=1002)启动的,而程序设定了setuid,那么在程序运行时是用程序的owner权限来运行程序,而不是启动的用户权限.由于top的owner是root,那么它的EUID是0.&FDSize: 32解释:FDSize是当前分配的文件描述符,这个值不是当前进程使用文件描述符的上限.我们看到这里是32,但实际并没有分配32个文件,如下:ls -l /proc/`pgrep rsyslogd|grep -v grep`/fd&&total 0lrwx------ 1 root root 64
20:03 0 -& socket:[5741]l-wx------ 1 root root 64
20:03 1 -& /var/log/auth.logl-wx------ 1 root root 64
20:03 10 -& /var/log/mail.errl-wx------ 1 root root 64
20:03 11 -& /var/log/news/news.critl-wx------ 1 root root 64
20:03 12 -& /var/log/news/news.errl-wx------ 1 root root 64
20:03 13 -& /var/log/news/news.noticel-wx------ 1 root root 64
20:03 14 -& /var/log/debugl-wx------ 1 root root 64
20:03 15 -& /var/log/messageslrwx------ 1 root root 64
20:03 16 -& /dev/xconsolelr-x------ 1 root root 64
20:03 17 -& /proc/kmsgl-wx------ 1 root root 64
20:03 2 -& /var/log/syslogl-wx------ 1 root root 64
20:03 3 -& /var/log/daemon.logl-wx------ 1 root root 64
20:03 4 -& /var/log/kern.logl-wx------ 1 root root 64
20:03 5 -& /var/log/lpr.logl-wx------ 1 root root 64
20:03 6 -& /var/log/mail.logl-wx------ 1 root root 64
20:03 7 -& /var/log/user.logl-wx------ 1 root root 64
20:03 8 -& /var/l-wx------ 1 root root 64
20:03 9 -& /var/log/mail.warn我们看到这里只用到了18个文件描述符.而如果超过32个文件描述符,将以32进行递增,如果是64位系统,将以64进行递增.FDSize这个值不会减少,如果我们程序打开了300个文件,并不会因为关闭文件,而减少FDSize这个值.&Groups: 0解释:这里的groups表示启动这个进程的用户所在的组.我们当前的用户test,现在在两个组()里面,如下:iduid=1002(test) gid=1002(nagcmd) groups=1000(chenkuo),1002(nagcmd)&&用test用户启动top程序,并查看它的groups,如下:终端1top&&终端2cat /proc/`pgrep top|grep -v grep`/status截取信息如下:Groups: VmPeak:&&& 36528 kB解释:这里的VmPeak代表当前进程运行过程中占用内存的峰值.我们用下面的程序申请内存,然后释放内存,最后通pause()函数中止程序的运行,程序源码如下:&#include &stdio.h&#include &string.h&#include &stdlib.h&#include &unistd.h&&int main(int argc, char *argv[]){&&&&&&& if (argc != 2)&&&&&&&&&&&&&&& exit (0);&&&&&&&& size_t mb = strtoul(argv[1],NULL,0);&&&&&&&& size_t nbytes = mb * 0x100000;&&&&&&& char *ptr = (char *) malloc(nbytes);&&&&&&& if (ptr == NULL){&&&&&&&&&&&&&&& perror("malloc");&&&&&&&&&&&&&&& exit (EXIT_FAILURE);&&&&&&& }&&&&&&&& printf("allocated %d mb\n", mb);&&&&&&& free(ptr);&&&&&&& pause();&&&&&&& return 0;}&gcc callmem.c -o callmem&./callmem 10allocated 10 mb&终端2我们打开status文件,查看VmPeak值,如下:cat /proc/`pgrep callmem|grep -v grep`/statusName:&& callmemState:& S (sleeping)Tgid:&& 2930Pid:&&& 2930PPid:&& 2831TracerPid:&&&&& 0Uid:&&& 1002&&& 1002&&& 1002&&& 1002Gid:&&& 1002&&& 1002&&& 1002&&& 1002FDSize: 256Groups: VmPeak:&&& 11852 kBVmSize:&&&& 1608 kBVmLck:&&&&&&&& 0 kBVmHWM:&&&&&& 396 kBVmRSS:&&&&&& 396 kBVmData:&&&&&& 28 kBVmStk:&&&&&&& 84 kBVmExe:&&&&&&&& 4 kBVmLib:&&&&& 1468 kBVmPTE:&&&&&&& 12 kB下面略注:我们看到程序申请了10240kb(10MB)的内存,VmPeak的值为11852kb,为什么不是10MB呢,因为除了我们申请的内存外,程序还会为加载动态链接库而占用内存.&VmSize:&&& 36528 kB解释:VmSize代表进程现在正在占用的内存这个值与pmap pid的值基本一致,如果略有不同,可能是内存裂缝所造成的.&VmLck:&&&&&&&& 0 kB解释:VmLck代表进程已经锁住的物理内存的大小.锁住的物理内存不能交换到硬盘.我们用下面的程序进行测试,如下:#include &stdio.h&#include &sys/mman.h&&int main(int argc, char* argv[]){&&&&&&& char array[2048];&&&&&&&& if (mlock((const void *)array, sizeof(array)) == -1) {&&&&&&&&&&&&&&& perror("mlock: ");&&&&&&&&&&&&&&& return -1;&&&&&&& }&&&&&&&& printf("success to lock stack mem at: %p, len=%zd\n", array, sizeof(array));&&&&&&&& sleep(60);&&&&&&& if (munlock((const void *)array, sizeof(array)) == -1) {&&&&&&&&&&&&&&& perror("munlock: ");&&&&&&&&&&&&&&& return -1;&&&&&&& }&&&&&&&& printf("success to unlock stack mem at: %p, len=%zd\n", array, sizeof(array));&&&&&&&& return 0;}&&编译后运行:gcc memlock.c -o memlock&我们这里将2048个字节的数组地址空间锁定到了物理内存中.接下来我们看下Vmlck值的变化,如下:cat /proc/`pgrep memlock|grep -v grep`/statusName:&& memlockState:& S (sleeping)Tgid:&& 3249Pid:&&& 3249PPid:&& 3139TracerPid:&&&&& 0Uid:&&& 0&&&&&& 0&&&&&& 0&&&&&& 0Gid:&&& 0&&&&&& 0&&&&&& 0&&&&&& 0FDSize: 256Groups: 0VmPeak:&&&& 1624 kBVmSize:&&&& 1608 kBVmLck:&&&&&&&& 4 kBVmHWM:&&&&&& 356 kBVmRSS:&&&&&& 356 kBVmData:&&&&&& 28 kBVmStk:&&&&&&& 84 kBVmExe:&& &&&&&&4 kBVmLib:&&&&& 1468 kBVmPTE:&&&&&&& 16 kB&我们看到Vmlck的值为4Kb,这是因为分配的最少单位是4KB,以后每次递增都是4KB的整数倍.&VmHWM:&&&&& 1432 kBVmRSS:&&&&& 1420 kB解释:VmHWM是程序得到分配到物理内存的峰值.VmRSS是程序现在使用的物理内存.我们用下面的程序进行测试,如下:#include &stdio.h&#include &string.h&#include &stdlib.h&#include &unistd.h&&int main (int argc, char *argv[]){&&&&&&& if (argc != 2)&&&&&&&&&&&&&&& exit (0);&&&&&&&& size_t mb = strtoul(argv[1],NULL,0);&&&&&&&& size_t nbytes = mb * 0x100000;&&&&&&& char *ptr = (char *) malloc(nbytes);&&&&&&& if (ptr == NULL){&&&&&&&&&&&&&&& perror("malloc");&&&&&&&&&&&&&&& exit (EXIT_FAILURE);&&&&&&& }&&&&&&&& size_&&&&&&& const size_t stride = sysconf(_SC_PAGE_SIZE);&&&&&&& for (i = 0;i & i+= stride) {&&&&&&&&&&&&&&& ptr[i] = 0;&&&&&&& }&&&&&&&& printf("allocated %d mb\n", mb);&&&&&&& pause();&&&&&&& return 0;}编译:gcc callmem.c -o test注意这个程序在每页都修改一个字节的数据,导致系统必须为它分配占用物理内存.&首先我们查看当前的内存,如下:free -m&&&&&&&&&&&& total&&&&&& used&&&&&& free&&&& shared&&& buffers&&&& cachedMem:&&&&&&&&&& 503&&&&&&&& 18&&&&&&& 484&&&&&&&&& 0&&&&&&&&& 0&& &&&&&&&5-/+ buffers/cache:&&&&&&&& 12&&&&&&& 490Swap:&&&&&&&& 7632&&&&&&&&& 7&&&&&& 7624&我们看到当前有490MB的空闲物理内存.运行callmem分配450MB的物理内存,如下:./test 450&[1] 2402allocated 450 mb&我们查看进程的VmHWM和VmRSS,如下:cat /proc/`pgrep test`/status略VmHWM:&&& 461208 kBVmRSS:&&& 461208 kB略我们看到此时VmHWM和VmRSS是一样的,表示占用了460MB左右的物理内存(因为它会用到动态链接库等).&下面我们查看当前的内存使用情况,如下:free -m&&&&&&&&&&&& total&&&&&& used&&&&&& free&&&& shared&&& buffers&&&& cachedMem:&&&&&&&&&& 503&&&&&&& 470&&&&&&&& 33&&&&&&&&& 0&&&&&&&&& 0&&&&&&&&& 6-/+ buffers/cache:&&&&&&& 463&&&&&&&& 40Swap:&&&&&&&& 7632&&&&&&&&& 7&&&&&& 7625&我们看到还有40MB空闲物理内存.我们下面再申请100MB的内存,此时系统会通过物理内存和SWAP的置换操作,把第1次运行的test进程所占用的物理内存置换到SWAP,把空出来的物理内存分配给第2次运行的程序,如下:mv test test1./test1 100&[1] 2419allocated 100 mb&再次查看test进程所占用的物理内存,如下:cat /proc/`pgrep test`/status略VmHWM:&&& 461208 kBVmRSS:&&& 386704 kB略&最后我们看到VmHWM没有变化,因为它表示的是该进程所占用物理内存的峰值,不会因为把内存置换到SWAP,而做改变.而VmRSS则由461208KB变成了386704KB,说明它占用的物理内存因为置换所以减少.&VmData:&&& 33980 kBVmStk:&&&&&&& 88 kBVmExe:&&&&&& 320 kBVmLib:&&&&& 2044 kB&解释:VmData:表示进程数据段的大小.VmStk:表示进程堆栈段的大小.VmExe:表示进程代码的大小.VmLib:表示进程所使用LIB库的大小.&关于代码段,堆栈段,数据段:代码段可以为机器中运行同一程序的数个进程共享堆栈段存放的是子程序(函数)的返回地址、子程序的参数及程序的局部变量数据段则存放程序的全局变量、常数以及动态数据分配的数据空间(比如用malloc函数申请的内存)与代码段不同,如果系统中同时运行多个相同的程序,它们不能使用同一堆栈段和数据段.&注意:堆栈段代表的是程序中的堆区(stack),堆区一般是编译器自动分配释放的.我们用malloc申请的内存,它占用的其实是栈区(heap),栈区一般是程序员自已分配释放的,而栈区在这里属于数据段,所以我们看到上面测试程序通过调用malloc函数后,VmData一值有了很大的变化.&VmPTE:&&&&&&& 56 kBVmSwap:&&&&&&& 0 kB&&VmPTE:&&&&&&& 56 kB解释:占用的页表的大小.&&VmSwap:&&&&&&&&&&&&&&&&&&&&&&&&&&& 0 kB解释:进程占用Swap的大小.&Threads:&&&&&&& 3解释:表示当前进程组有3个线程.&&SigQ:&& 1/7954解释:表示当前待处理信号的个数,我们用下面和程序进行测试,如下:#include &stdio.h&#include &string.h&#include &stdlib.h&#include &signal.h&#include &unistd.h&&volatile int done = 0;&void handler (int sig){& const char *str = "handled...\n";& write (1, str, strlen(str));& done = 1;}&void child(void){&& for (i = 0; i & 3; i++){&&& kill(getppid(), SIGRTMIN);&&& printf("child - BANG!\n");& }& exit (0);}&int main (int argc, char *argv[]){& signal (SIGRTMIN, handler);& sigset_t newset,&& sigfillset(&newset);& sigprocmask(SIG_BLOCK, &newset, &oldset);&& pid_t pid = fork();& if (pid == 0)& child();&& printf("parent sleeping \n");&& int r = sleep(30);&& printf("woke up! r=%d\n", r);&& sigprocmask(SIG_SETMASK, &oldset, NULL);&& while (!done){& };&& printf("exiting\n");& exit(0);}&编译:gcc sig.c -o sig本程序会发达三次信号,此后进入sleep,我们可以在这期间来查看待处理信号的个数,如下:./sigparent sleepingchild - BANG!child - BANG!child - BANG!woke up! r=0handled...handled...handled...exiting&cat /proc/`pgrep sig`/status略SigQ:&& 4/略&我们发送了三次信号,这里为什么是4呢,因为我们用了fork派生了子进程,子进程结束后会发送SIGCHLD信号.所以这里有4个信号待处理.&SigPnd: 0000ShdPnd: 0000SigBlk: 0000SigIgn: 1206SigCgt: 4c21解释:SigPnd:屏蔽位,存储了该线程的待处理信号,等同于线程的PENDING信号.ShnPnd:屏蔽位,存储了该线程组的待处理信号.等同于进程组的PENDING信号.SigBlk:存放被阻塞的信号,等同于BLOCKED信号.SigIgn:存放被忽略的信号,等同于IGNORED信号.SigCgt:存放捕获的信号,等同于CAUGHT信号.&CapInh: 0000CapPrm: ffffffffffffffffCapEff: ffffffffffffffffCapBnd: ffffffffffffffff解释:CapEff:当一个进程要进行某个特权操作时,操作系统会检查cap_effective的对应位是否有效,而不再是检查进程的有效UID是否为0.CapPrm:表示进程能够使用的能力,在cap_permitted中可以包含cap_effective中没有的能力,这些能力是被进程自己临时放弃的,也可以说cap_effective是cap_permitted的一个子集.CapInh:表示能够被当前进程执行的程序继承的能力.CapBnd:是系统的边界能力,我们无法改变它.&Cpus_allowed:&& 3Cpus_allowed_list:&&&&& 0-1解释:Cpus_allowed:3指出该进程可以使用CPU的亲和性掩码,因为我们指定为两块CPU,所以这里就是3,如果该进程指定为4个CPU(如果有话),这里就是F(1111).Cpus_allowed_list:0-1指出该进程可以使用CPU的列表,这里是0-1.Mems_allowed:&& 1Mems_allowed_list:&&&&& 0内存同CPU一样,进程rsyslogd只是使用了结点0的内存资源.&我们这里调整该进程到CPU0,如下:taskset -p 1 987pid 987's current affinity mask: 3pid 987's new affinity mask: 1&cat /proc/987/status略Cpus_allowed:&& 1Cpus_allowed_list:&&&&& 0Mems_allowed:&& 1Mems_allowed_list:&& &&&0注:我们看到Cpus_allowed/Cpus_allowed_list较之前有了变化.Cpus_allowed由3变成了1.表明我们只会用CPU0.&voluntary_ctxt_switches:&&&&&&& 1nonvoluntary_ctxt_switches:&&&& 0&voluntary_ctxt_switches表示进程主动切换的次数.nonvoluntary_ctxt_switches表示进程被动切换的次数.&首先查看一下当前进程,如下:echo $$1544&执行如下命令:while ((1)); do echo 1; sleep 1; done&查看该进程的主动切换与被动切换,如下:cat status略voluntary_ctxt_switches:&&&&&&& 949nonvoluntary_ctxt_switches:&&&& 55我们看到主动切换和被动切换有了明显的变化.
了这篇文章
类别:┆阅读(0)┆评论(0)

我要回帖

更多关于 2019中国联通校招录取通知甘肃 的文章

 

随机推荐