分类目录: 软件技术

华为终端最近挺热闹

酝酿了3个多月的华为Ascend P6终于在伦敦Roundhouse亮相,这一次在宣传和营销上可谓做足了功夫。昨晚失眠,索性就把发布会的视频翻出来过了一下。并没有微博和各个消费电子门户上面造势的那样惊艳,只能说是一部普通的手机罢了。牺牲了电池容量和本可以在去年就发布的时间点,换来了6.18mm的超薄厚度。K3V2始终是一个硬伤,这次发布会中没有强调P6是用的K3V2E。高通的骁龙系列都从4核心1.2GHZ发展到了枭龙800的4核心2GHZ+,覆盖了低中高端的所有需求。而华为的终端机型,无论处于哪个档次,一直使用K3V2,这样的做法让人看不出终端开始走向高端的趋势。

22257642_1371567595555_500

1.5GHZ 4核心CPU,720P HD 4.7英寸屏,2000mHa电池,前置500W像素、后置800W像素摄像头,2GRAM,从配置上面看不到任何“旗舰”的标志。这些配置都是去年的主流配置,在今年Q3相信各大厂商都会推出新的主流配置手机,这个配置会被甩到很远,而正是那时,P6才放量上市。加上细节问题百出的不争气Emotion UI,相比之下,恐怕消费者不会把P6放在首选的位置。余总承东1000万的销售量恐难以达到。

 

再来看一下,一直作为卖点的超薄、外观设计。不得不承认,P6的外观设计颠覆了之前的华为手机外观的印象。同事常笑谈,手机像情人,如果一个手机只是屏幕非常非常大,如美腿(Ascend Mate),只是厚度非常非常薄,如P6,就好象一个男人在夸她家的妹子胸大,只有胸大,相信没有人认为这是每个人都喜欢的美。外观设计的确比较出众,但是要想到这是一个“1000多人跨部门合作”的成果,这样外观必然是有一些标杆参照的,否则必然是一个各方妥协没有一致性的怪物。仔细看一下P6的外观,正面上方可以说是iPhone5的,下方是索尼一直坚持的双C倒角造型。金属外壳,可以看出为了打造旗舰,舍出了血本。2688的价格,如果真像发布会上面与S4和iPhone5对比的那样,那么也算是良心价了。这个价格应该是吸取了Ascend D2初期定价过高的教训,但是仍然过高了,相信不出一个月会有大幅的跳水。

 

总的来说,还是可以看到进步的,希望P6是一个终端的转折点,以P6为基础,将配置与主流机型拉齐打造出真正的旗舰。

| 1 分2 分3 分4 分5 分 (4.83- 6票) Loading ... Loading ... | 同时归档在:数码硬件 | 标签: , , |

发布一个改良后的轻量级下载工具

一直都觉得迅雷等工具太重了,即占用网络带宽又消耗系统资源。而且在下载源的出口速度普遍超过家庭宽带的速度时,p2p已经起不到下载提速的作用,甚至还会在下载完成后占用上传带宽。因此一直想找到一个最精简的下载工具,axel是目前发现的比较合适的。以后试着用脚本写一个类似的工具。

axel是linux下的多线程下载工具,工具支持多线程并发下载,支持断点续传。这里基于axel-2.4的源码,在cygwin下编译了Windows版本。基于gnu的开源license,发布一个Windows的版本。

编译好的软件包见文末的下载地址。

其中,mydownload.bat为启动程序,在使用之前只需要修改其中的目录即可:

@cd /d "C:\Users\t\Desktop"
@set maxcons=8

:renew
@set /p url=请输入下载路径:
@call D:\software\axel-2.4\axel.exe -n %maxcons% -a "%url%"
@echo finished!
@echo;
@echo;
@goto renew
@pause

axel.exe文件的路径和下载后文件存放的路径。即以上粉红色部分。

下载地址:http://codefine.co/wp-content/uploads/2013/06/axel-2.4.zip

| 1 分2 分3 分4 分5 分 (4.50- 6票) Loading ... Loading ... | 同时归档在:C/C++ |

通过/proc/stat文件信息,java实现计算cpu使用率

/proc/stat 文件内容:
[root@Shentar ~]# cat /proc/stat
cpu 602 0 2164 11445 2294 0 17 0 0
cpu0 306 0 1232 4553 2125 0 15 0 0
cpu1 295 0 932 6891 169 0 1 0 0
intr 7110 269 7 0 1 1 0 5 0 1 0 0 0 91 0 0 106 0 6521 0 108 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
ctxt 38984
btime 1368275792
processes 2713
procs_running 1
procs_blocked 0
[root@Shentar ~]#

第一行的数值表示的是CPU总的使用情况,所以我们只要用第一行的数字计算就可以了。下表解析第一行各数值的含义:

参数 解析(单位:jiffies)

(jiffies是内核中的一个全局变量,用来记录自系统启动一来产生的节拍数,在linux中,一个节拍大致可理解为操作系统进程调度的最小时间片,不同linux内核可能值有不同,通常在1ms到10ms之间)

user (38082) 从系统启动开始累计到当前时刻,处于用户态的运行时间,不包含 nice值为负进程。

nice (627) 从系统启动开始累计到当前时刻,nice值为负的进程所占用的CPU时间

system (27594) 从系统启动开始累计到当前时刻,处于核心态的运行时间

idle (893908) 从系统启动开始累计到当前时刻,除IO等待时间以外的其它等待时间iowait (12256) 从系统启动开始累计到当前时刻,IO等待时间(since 2.5.41)

irq (581) 从系统启动开始累计到当前时刻,硬中断时间(since 2.6.0-test4)

softirq (895) 从系统启动开始累计到当前时刻,软中断时间(since 2.6.0-test4)stealstolen(0) which is the time spent in other operating systems when running in a virtualized environment(since 2.6.11)

guest(0) which is the time spent running a virtual CPU for guest operating systems under the control of the Linux kernel(since 2.6.24)

结论:总的cpu时间totalCpuTime = user + nice + system + idle + iowait + irq + softirq + stealstolen + guest

计算时,采样两个时间点的数据,对于时间点1,记录总的cpu时间total1,记录空闲时间idle1,对于时间2,同样记录total2和idle2。

菜谱使用率为:cpuusage = 1 – (idle2 – idle1) / (total2 – total1)

注意,如果时间点1和时间点2间隔足够小(小于10ms),则可能出现total2 – total1为0,这样cpu使用率应该为0,而不是采用除法计算。

java代码如下:

阅读全文 »

| 1 分2 分3 分4 分5 分 (5.00- 3票) Loading ... Loading ... | 同时归档在:Java |

收藏一些配置

CPU Intel 酷睿i7 3770K(散) 1 ¥ 2000
主板 技嘉GA-B75-D3V(rev.1.1) 1 ¥ 769
内存 金士顿8GB DDR3 1600 1 ¥ 275
硬盘 希捷Barracuda XT 2TB 7200转 64MB SATA3(ST32000641AS) 1 ¥ 600
固态硬盘 三星SSD 840 Series SATA III(120GB) 1 ¥ 629
机箱 百盛C615 1 ¥ 118 ¥118 4家商家
电源 酷冷至尊战斧500(eXtreme Power Plus 500) 1 ¥ 359
散热器 超频三红海至尊版 1 ¥ 145
键鼠装 罗技MK330键鼠套装 1 ¥ 180
光驱 先锋DVR-XD11C 1 ¥ 349

20130308-212444.jpg

| 1 分2 分3 分4 分5 分 (4.67- 3票) Loading ... Loading ... | 同时归档在:数码硬件 |

Chrome 3月5号更新版本闪退

今天打开chrome浏览器后,提示有新版本可用。ios下的chrome不像pc版本更新得那么勤,看到有更新,迫不及待的点击了更新按钮。安装完成,却发现无法启动,确切的说是闪退。幸好还有safari,google了一下,发现遇到这个问题的还真不少。

Chrome闪退

有人提到是“下载插件”导致的,卸载了chrome download manager后,果然问题解决。appstore里大量的闪退不知道是不是也是这个原因导致的。

当初之所以将系统越狱也是因为需要安装这个插件,不能从浏览器下载文件这个没法忍受,而GOOGLE又不能发布一个越狱产品,相信这样个插件的市场很比较大,这是不是意味着chrome被一个小小的插件绑架了。不管闪退的原因是什么,这次chrome的损失应该是非常大的。当一个产品大规模用起来后,程序员真有一种如履薄冰的感觉。相信很快就有解决问题的新版本出来了。

| 1 分2 分3 分4 分5 分 (5.00- 3票) Loading ... Loading ... | 同时归档在:移动互联 | 标签: , |

system调用导致子进程socket句柄泄漏问题分析

关于fork和行缓冲的问题 中讨论了fork的一些特性,堆栈复制,确切的说是‘写时复制’。这篇将讨论资源的复制问题。

问题引出:A进程与B进程各自独立,都是服务器进程,常驻系统,互不相干。在某次重启A进程后,发现由于固定监听的端口被占用而无法启动。检查,发现是B进程占用了该端口,检查B进程代码,没有相关的打开该固定端口和打开随机端口的动作。问题百思不得其解。

最终,发现B进程不只是占用了该固定端口,还打开了很多本该只有A进程才会打开的句柄资源。很快联想到A是B的子进程,B是A fork之后在子进程中运行的。进一步分析,发现A进程有着类似于监控B进程的作用,在特定情况下,会调用B进程的监控脚本来重启B,调用时用的是system函数。

再来看system函数的实现,用fork产生一个子进程,在子进程中运行脚本,脚本启动B。B就这样降到了A的子孙辈,无论是第几代子孙,都会继承A的资源。

这样,当B重启之后,B也打开了只有A才会使用的端口,对B来说,它根本不使用这些资源,甚至不知道自己打开了哪些句柄,这非常不好。之后,某个时刻,当A重启时,A原来申请的资源会一一释放,但是已经被B继承的那份拷贝还处于打开状态,导致A启动时报端口冲突。

问题分析清楚,也就好解决了。解决的方案有:
1、重写system函数,再派生子进程后,运行脚本之前,将所有不需要的句柄关掉,一般的多进程服务端程序也都这么做。
2、发现java程序并没有打开父进程的资源,可以用java实现一个‘脚本调用器’,解决办法似乎不是特别优雅。
3、在申请资源的时候用fcntl将句柄设置为不被继承。

在分析方案的过程中也学习了vfork与fork的差别,vfork只是父子进程共享堆栈,但是句柄资源还是复制了。也分析了exec与fork的区别。都找不到完美的解决办法。

3方案解决当前问题最简单,但是容易留下坑。2方案总觉得很别扭。决定采用1。问题又来了,A进程本来就不是多进程的模式,因此它并没有集中管理资源,想要从代码中增加全局变量收集零散资源似乎很困难。想到了常用的lsof工具,这个工具不是可以列举任何进程的句柄吗?查阅其源代码,原来是读取proc虚拟文件系统下的数据来实现的。如法炮制,也用这个方法遍历本进程的fd目录,将得到的句柄一一记录,在关闭了proc目录后,将记录下来的句柄关闭,这时还会将已经关闭的proc目录的句柄又关闭一次,不过不会有什么问题。存在的问题是必须以root运行才能得到句柄列表。

奋笔疾书,写完了新的system函数,却发现脚本不能运行完成,总是在中间某个点就退出了。经过在脚本中反复打点,发现总是在同一行上面退出,这一行是一个shell函数调用,猜测,是不是新的system中指定的脚本解析器不支持函数?另外写测试程序,也不是这样的。继续找原因,原来这一行还使用了标准输入、输出、错误重定向。而标准输入输出已经在父进程中关闭了,重定向当然会有错误。保留0,1,2三个句柄后问题彻底解决。其实这三个句柄也是不能随意关闭的,一但句柄关闭后,系统会将句柄号分配给其他资源,这样如果代码中使用了重定向0,1,2,那后果会不堪设想。

| 1 分2 分3 分4 分5 分 (4.86- 7票) Loading ... Loading ... | 同时归档在:C/C++ | 标签: , , |

大整数乘法

很长时间都没写过代码了,试着写了这个常见的题目。整体思路:采用整形链表记录大整数的每一位,然后分别遍历乘数和被乘数的每一位,将每两个数字的乘积累加到结果的相应位上面。针对大整数类型,重载输入和输出流,重载乘法。

输出部分实现不是特别好。用STL的容器实现链表也许会简单的多。重载乘法的实现不合常理,本应该返回一个新的对象,为了简单起见,直接返回了新对象的指针;在计算乘法结果时使用了一个递归,理论上来说有可能深度过大,导致栈溢出;另外对于指针和应用的使用不规范。

具体代码:

阅读全文 »

| 1 分2 分3 分4 分5 分 (4.83- 6票) Loading ... Loading ... | 同时归档在:C/C++, 算法数据结构 |

全部日志列表

[archivist]
| 1 分2 分3 分4 分5 分 (5.00- 21票) Loading ... Loading ... | 同时归档在:建站技术 |

基于netlink的内核态与用户态异步并发消息处理模型

用户态采用select模型,初始化时建立多个netlinksocket,绑定完成之后,向内核发送握手消息,这样内核可以将已经建立的连接记住,以便后续选择可用的连接发送数据。初始化和握手完成之后,由内核主动向用户态发送数据,用户态主线程在各个socket句柄上面等待读事件的到来,当检测到读事件时,向线程池提交数据读取和处理任务。这样模拟一个连接池和事件分发模型,保证内核数据及时被读取到用户态程序并处理,能做到并发。

而内核态的netlink在接收数据时本身就是以系统调用的方式提供给业务层的发送接口,因此本身就是异步的,性能不是问题。内核态收到数据时,只需要提交给一个内核线程去处理即可。

原型代码如下:

阅读全文 »

| 1 分2 分3 分4 分5 分 (5.00- 7票) Loading ... Loading ... | 同时归档在:C/C++, Linux内核 |

监控dmesg实时输出

#!/bin/bash
end=`dmesg |wc -l`
while true
do
sleep 1
end2=`dmesg |wc -l`

if [ "$end" != "$end2" ]; then
dmesg |awk '{print NR, $0}'|tail -$((end2-end))
end=$end2
fi

if [ "$end" -ge 1000 ]
then
dmesg -c >/dev/null 2>&1
echo "**********************"
echo "*dmesg -c now; *"
echo "**********************"
end=`dmesg |wc -l`
fi

done

| 1 分2 分3 分4 分5 分 (5.00- 4票) Loading ... Loading ... | 同时归档在:实用脚本 |
返回顶部