yaron's space

以技术为主

RSS订阅

  • 首页
  • LAMP与网站架构
  • Linux编程
  • 分布式数据存储
  • 编程语言与算法设计
  • 虚拟化技术KVM
  • 关于我
  • 订阅

关于const与volatile笔试题目的分析

十 17th

由admin发表在Linux编程 | 110 浏览

没有评论

昨天笔试遇到了关于c++中关于const与const_cast的题目,大概如下:

int main(int argc, char* argv[])
{
     const int a = 10;
     int * p = const_cast<int *>(&a);
     *p = 1;
     printf("%d %d\n", a, *p);
     return 0;
}

求上述程序的输出结果,正确答案是:10 1

分析如下:

首先可以确定是p和&a的地址是指向同一片内存区域的,理论上来说最后的输出结果应该是1 1
但是为什么会输出a的值为10呢? 猜测应该是const关键字的问题,可能编译器看到a为const型变量,所以在编译期就将所有的a直接替换为10了,这个是编译器做的一个优化,
下面简单的验证下:
直接使用下面的命令来看下编译后的汇编代码,关键部分的汇编如下:

        movl    %edi, -20(%rbp)
        movq    %rsi, -32(%rbp)
        movl    $10, -12(%rbp)
        leaq    -12(%rbp), %rax
        movq    %rax, -8(%rbp)
        movq    -8(%rbp), %rax
        movl    $1, (%rax)
        movq    -8(%rbp), %rax
        movl    (%rax), %edx
        movl    $10, %esi
        movl    $.LC0, %edi
        movl    $0, %eax
        call    printf
        movl    $0, %eax
        leave
        ret

显然%rax中存放的指针p的值,(%rax)代表间接寻址
在调用printf函数之前,将10放入%esi, (%rax)放入到%edx中,显然验证了上述的猜想

关于volatile关键字

如何避免编译器做这方面的优化呢?
一个常用的方法是将变量a加上关键字volatile,代表是”易变,每次都需要从内存中读取,这样上述程序的运行结果就是1 1了
当然修改常量变量的值不是好的编程习惯,尽量还是少用上述用法

const, const_cast, volatile

linux关于sort命令的高级用法(按多个列值进行排列)

十 8th

由admin发表在Linux编程 | 239 浏览

没有评论

如果单纯地使用sort按行进行排序比较简单,

但是使用sort按多个列值排列,同时使用tab作为分隔符,而且对于某些列需要进行逆序排列,这样sort命令写起来就比较麻烦了

比如下面的文件内容,使用[TAB]进行分割:

Group-ID   Category-ID   Text        Frequency
----------------------------------------------
200        1000          oranges     10
200        900           bananas     5
200        1000          pears       8
200        1000          lemons      10
200        900           figs        4
190        700           grapes      17

下面使用这些列进行排序(列4在列3之前进行排序,而且列4是逆序排列)

    * Group ID (integer)
    * Category ID (integer)
    * Frequency “sorted in reverse order” (integer)
    * Text (alpha-numeric)

排序后的结果应该为:

Group-ID   Category-ID   Text        Frequency
----------------------------------------------
190        700           grapes      17
200        900           bananas     5
200        900           figs        4
200        1000          lemons      10
200        1000          oranges     10
200        1000          pears       8

可以直接使用sort命令来解决这个问题:

sort -t $'\t' -k 1n,1 -k 2n,2 -k4rn,4 -k3,3 <my-file>

解释如下:

-t $'\t':指定TAB为分隔符
-k 1, 1: 按照第一列的值进行排序,如果只有一个1的话,相当于告诉sort从第一列开始直接到行尾排列
n:代表是数字顺序,默认情况下市字典序,如10<2
r: reverse 逆序排列,默认情况下市正序排列

所以最后的命令:sort -t $'\t' -k 1n,1 -k 2n,2 -k4rn,4 -k3,3 my-file

参考资料:

sort, 分割符, 多列排列

register、volatile、restrict 三关键字的用法[转载]

十 6th

由admin发表在编程语言与算法设计 | 50 浏览

没有评论

原文地址:register、volatile、restrict 三关键字的用法 – RaymondAmos的技术专栏 – CSDN博客.

register

使用修饰符register声明的变量属于寄存器存储类型。该类型与自动存储类型相似,具有自动存储时期、代码块作用域和内连接。声明为register 仅仅是一个请求,因此该变量仍然可能是普通的自动变量。无论哪种情况,用register修饰的变量都无法获取地址。如果没有被初始化,它的值是未定的。

volatile
volatile告诉编译器该被变量除了可被程序修改外,还可能被其他代理、线程修改。因此,当使用volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,而不使用寄存器中的缓存的值。比如,

val1=x;
val2=x;

如 果没有声明volatile,系统在给val2赋值的时候可能直接从寄存器读取x,而不是从内存的初始位置读取。那么在两次赋值之间,x完全有可能被被某 些编译器未知的因素更改(比如:操作系统、硬件或者其它线程等)。如果声明为volatile,编译器将不使用缓存,而是每次都从内存重新读取x。
restrict

restrict是c99引入的,它只可以用于限定指针,并表明指针是访问一个数据对象的唯一且初始的方式,考虑下面的例子:

int ar[10];
int * restrict restar=(int *)malloc(10*sizeof(int));
int *par=ar;

这里说明restar是访问由malloc()分配的内存的唯一且初始的方式。par就不是了。那么:

for(n=0;n<10;n++)
{
    par[n]+=5;
    restar[n]+=5;
    ar[n]*=2;
    par[n]+=3;
    restar[n]+=3;
}

因 为restar是访问分配的内存的唯一且初始的方式,那么编译器可以将上述对restar的操作进行优化:restar[n]+=8;。而par并不是访 问数组ar的唯一方式,因此并不能进行下面的优化:par[n]+=8;。因为在par[n]+=3前,ar[n]*=2进行了改变。使用了关键字 restric,编译器就可以放心地进行优化了。这个关键字据说来源于古老的FORTRAN。

总结

两个关键字:volatile和restrict,两者都是为了方便编译器的优化。

register, restrict, volatile

今天EMC笔试题目

九 25th

由admin发表在编程语言与算法设计 | 385 浏览

没有评论

两道的题目:

1. dup(int fd)和dup2(int fd1, int fd2)函数的区别:详细请见http://blog.donews.com/mutecat/archive/2007/09/20/1212178.aspx

2. 有关一致性哈希的算法设计

其他的是 多项选择题目,涉及的范围比较广,linux和语言层次的题目偏多一些吧

包括堆栈缓冲区溢出以及linux内核中container_of宏的实现,以及spinlock和虚拟内存的相关知识

关于container_of这个请参考我的前一篇blog: http://yaronspace.cn/blog/index.php/archives/1026

emc, 笔试题

debian系统sshd连接慢的解决办法

八 26th

由admin发表在Linux编程 | 58 浏览

没有评论

最近客户端连debian下sshd很慢,每次都需要等待半分钟左右,今天终于无法忍受了,上网找了下资料,把这个问题解决了

原因:

主要是debian在默认情况下开启了dns的反向解析,这个比较耗时

解决方法:

1. 编辑/etc/nsswitch.conf 找到hosts行,替换为

hosts: files dns [NOTFOUND=return]

2. 查看/etc/resolv.conf文件,查看dns地址是否设置正确,如果没有用,直接注掉即可

3. 重启sshd : 先kill掉,然后/usr/sbin/sshd 启功即可

debian, sshd, 连接慢

linux下多线程编程的几篇不错的博文

八 23rd

由admin发表在Linux编程 | 316 浏览

没有评论

1. 多线程服务器的常用编程模型

2. 多线程服务器的适用场合

3. 并发编程的 15 条建议(译)

4. C++ 多线程系统编程精要

选自陈硕的blog : http://blog.csdn.net/solstice

Linux编程, 多线程, 注意事项

查看 CPU, Memory, I/O and NetFlow[转载]

八 10th

由admin发表在Linux编程 | 100 浏览

没有评论

原文地址:http://blogread.cn/it/article.php?id=3908&f=sa

iostat 查看磁盘 I/O

[root@localhost ~]# iostat -d -x 2
                             extended device statistics
device mgr/s mgw/s    r/s    w/s    kr/s    kw/s   size queue   wait svc_t  %b
hda        0     0    0.0    0.9     0.1     5.4    6.3   0.0    4.7   0.9   0
                             extended device statistics
device mgr/s mgw/s    r/s    w/s    kr/s    kw/s   size queue   wait svc_t  %b
hda        0     3    0.0    2.0     0.0    20.0   10.0   0.0    0.8   0.5   0
 ......

命令释意: 查看磁盘 I/0 情况,且每两秒刷新一次

[root@localhost ~]# vmstat 5
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0    284  68700 165876 416748    0    0     0     5    1    1  0  0 100  0  0
 ......

命令释意: 查看CPU使用情况的命令, 每 5 秒刷新一次,最右侧列为 CPU 的占用率的数据

top 查看进程占有率

[root@localhost ~]# top

然后在 top 的命令内部命令栏输入shift+p or P

top - 13:38:52 up 102 days,  4:17,  1 user,  load average: 0.00, 0.00, 0.00
Tasks:  81 total,   2 running,  79 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   1035292k total,   966592k used,    68700k free,   165876k buffers
Swap:  2096472k total,      284k used,  2096188k free,   416760k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 4875 root      15   0  2192 1000  800 R  0.3  0.1   0:00.15 top
    1 root      15   0  2060  620  532 S  0.0  0.1   0:01.65 init
    2 root      RT  -5     0    0    0 S  0.0  0.0   0:00.00 migration/0
.......

命令释意: 查看进程处理器占用率情况,并对其进行排序

free 查看内存使用情况

[root@localhost ~]# free
             total       used       free     shared    buffers     cached
Mem:       1035292     966592      68700          0     165876     416768
-/+ buffers/cache:     383948     651344
Swap:      2096472        284    2096188

命令释意: 查看内存使用情况

top 查看进程内存使用

[root@localhost ~]# top

然后在 top 的命令内部命令栏输入shift+m or M

top - 13:48:52 up 102 days,  4:27,  1 user,  load average: 0.00, 0.01, 0.00
Tasks:  81 total,   2 running,  79 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.3%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   1035292k total,   966592k used,    68700k free,   165876k buffers
Swap:  2096472k total,      284k used,  2096188k free,   416784k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 4128 root      34  19  280m 266m 2112 S  0.0 26.4   1:48.40 yum-updatesd
 8314 www       18   0  171m  34m  34m S  0.0  3.4   0:06.03 memcacheq
 8280 www       15   0 88084  34m  588 S  0.0  3.4   0:01.23 memcached
10907 mysql     15   0  122m  16m 3892 S  0.0  1.7   0:25.29 mysqld
......

命令释意: 查看进程内存占用率情况,并对其进行排序
更多 >

iostat, linux命令, top, vmstat

[编程之美]随机数范围扩展方法总结

八 3rd

由admin发表在编程语言与算法设计 | 177 浏览

没有评论

问题描述

已知random3()这个随机数产生器生成[1, 3]范围的随机数,请用random3()构造random5()函数,生成[1, 5]的随机数?

问题分析

如何从[1-3]范围的数构造更大范围的数呢?同时满足这个更大范围的数出现概率是相同的,可以想到的运算包括两种:加法和乘法

考虑下面的表达式:

3 * (random3() – 1) + random3();

可以计算得到上述表达式的范围是[1, 9]  而且数的出现概率是相同的,即1/9

下面考虑如何从[1, 9]范围的数生成[1, 5]的数呢?

可以想到的方法就是 rejection sampling 方法,即生成[1, 9]的随机数,如果数的范围不在[1, 5]内,则重新取样

解决方法

int random5()
{
    int val = 0;
    do {
        val = 3 * (random3() - 1) + random3();
    } while (val > 5);
    return val;
}

归纳总结

将这个问题进一步抽象,已知random_m()随机数生成器的范围是[1, m] 求random_n()生成[1, n]范围的函数,m < n && n <= m *m
一般解法:

int random_n()
{
    int val = 0 ;
    int t; // t为n最大倍数,且满足 t &lt;= m * m     
    do {         
        val = m * (random_m() - 1) + random_m();     
    } while (val > t);
    return val;
}

参考资料:

http://stackoverflow.com/questions/137783/expand-a-random-range-from-1-5-to-1-7

编程之美, 随机数范围扩展方法

推荐firefox插件vimperator (用vim方式使用Firefox)

七 18th

由admin发表在业界趣闻轶事 | 233 浏览

没有评论

今天在逛水木的时候,发现这篇文章:http://www.newsmth.net/bbsrecon.php?id=8017

是对vimperator进行了介绍,原来国外哥们写的firefox插件,能够像使用Vim的方式来高效地使用firefox,下来来尝试了,效果不错!

下载地址:https://addons.mozilla.org/en-US/firefox/addon/vimperator/

常用命令(不断更新):

open: 在当前tab打开新的网址  open www.baidu.com

tabopen: 在新的tab打开网址

back: 后退键

forward:前进键

gt/gT:在tab间进行移动

d: 关闭当前tab

hjkl:上下移动网页或者光标

i(insert):进入insert模式,可以移动光标

/ :搜索网页的内容

总的来说很强大哈!!!

firefox, vim, vimperator

MySQL索引背后的数据结构及算法原理【好文】

七 18th

由admin发表在Mysql | 235 浏览

没有评论

这篇文章从mysql索引的内部结构B+树来分析如何来提高索引的性能,以及索引如何进行存储等方面,

写的比较通俗易懂,推荐!

地址:http://www.cnblogs.com/leoo2sk/archive/2011/07/10/mysql-index.html

Mysql, 索引结构
«12345»102030...最后一页 »
  • 分类目录

    • Java (49)
    • LAMP与网站架构 (56)
      • Mysql (7)
      • Php|Python (32)
      • WebServer (3)
    • Linux编程 (84)
    • project (5)
    • Project Management (15)
    • Test (8)
    • web-service (4)
    • wordpress (13)
    • Work Smartly (3)
    • 业界趣闻轶事 (43)
    • 分布式数据存储 (12)
    • 前端技术相关 (34)
    • 开源软件 (13)
    • 生活感悟 (11)
    • 编程语言与算法设计 (65)
    • 虚拟化技术KVM (12)
    • 面试题 (3)
  • 标签

    AC自动机 ajax algorithm c++ cmd dom4j dtree eclipse email firefox gdb gzip Java jquery js kfs kvm Linux编程 map Mysql php redis replace rest sheepdog shell stl string struts struts2 substring vim WebServer wordpress xml xpath 优化 前端技术相关 动态库 命令 弹出窗口 技巧 插件 源码分析 调试
  • 最近半年热门文章

    • vim使用技巧小结【继续更新】
    • gdb调试程序之监控内存【七】
    • 模板成员函数为什么不能是虚函数
    • 2011年xiao结
    • 2011年的最后一天
    • 使用 cron、bash 和 wget 监控 Web 服务器...
    • 水木ip显示地址的firefox插件推荐
    • 定时备份网站代码与数据的shell工具
    • 在Debian下安装Systemtap方法
  • 最近文章

    • 定时备份网站代码与数据的shell工具
    • 使用 cron、bash 和 wget 监控 Web 服务器的状态[转载]
    • 水木ip显示地址的firefox插件推荐
    • 在Debian下安装Systemtap方法
    • 2011年xiao结
    • 模板成员函数为什么不能是虚函数
    • gdb调试程序之监控内存【七】
    • 2011年的最后一天
    • vim使用技巧小结【继续更新】
    • 积攒人品
  • 近期评论

    • 晓晓 在 关于我 上的评论
    • jiazhoulvke 在 vim编辑多个文件的方法 上的评论
    • xh 在 关于我 上的评论
    • 钕铁硼磁铁厂家 在 一年又一年 上的评论
    • 钕铁硼磁铁厂家 在 yaronli排名还不错 上的评论
    • figo 在 【编程之美】单链表是否存在环以及环入口的位置【转载】 上的评论
    • 徐超 在 关于我 上的评论
    • 赫 在 KVM虚拟机在物理机间的迁移方法 上的评论
  • 文章存档

    • 2012 年四月 (1)
    • 2012 年三月 (5)
    • 2012 年二月 (1)
    • 2011 年十二月 (2)
    • 2011 年十一月 (1)
    • 2011 年十月 (3)
    • 2011 年九月 (1)
    • 2011 年八月 (4)
    • 2011 年七月 (5)
    • 2011 年六月 (3)
    • 2011 年五月 (5)
    • 2011 年四月 (7)
    • 2011 年三月 (12)
    • 2011 年二月 (10)
    • 2011 年一月 (6)
    • 2010 年十二月 (12)
    • 2010 年十一月 (18)
    • 2010 年十月 (15)
    • 2010 年九月 (16)
    • 2010 年八月 (14)
    • 2010 年七月 (10)
    • 2010 年六月 (20)
    • 2010 年五月 (15)
    • 2010 年四月 (15)
    • 2010 年三月 (23)
    • 2010 年二月 (12)
    • 2010 年一月 (21)
    • 2009 年十二月 (42)
    • 2009 年十一月 (55)
    • 2009 年十月 (16)
  • LAMP技术

    • kpumuk.info
    • php.net
    • php5研究
    • w3school.com
    • wordpress code
    • 国外的博客
  • 博客链接

    • 小芳邓的博客
    • 晓琳的技术博客
    • 董的博客
    • 靖难|魔都小码农
    • 韩晓的博客
    • 飞飞的博客
  • 开源站点

    • Thrift开源RPC框架协议
    • TIPI深入理解PHP内核
    • 开源中国社区
    • 淘宝开源平台
    • 端口映射工具portmap
  • 链接表

    • ChinaItLab
    • developerWorks 中国
    • Linux下C语言参考手册
    • 团购搜索-团一团
    • 律师咨询
  • 用户登录






    • 注册
    • 忘记你的密码?
版权所有 © 2009-2012 yaron's space| 备案/许可证编号为: 京ICP备09103585号
RSS订阅 1 顶端