huyc

导航

随笔分类 -  小小技巧

觉得有点价值的东西
Linux避免死锁的一些机制
摘要:死锁应该有3个原因:1.独占资源2.循环等待3.不可剥夺网上看到的4个条件,实际上还是3个,因为请求和等待导致的死锁毕竟有点让人难堪,实际上的死锁多是因为请求等待导致的循环等待。在用户态,由于Linux提倡进程之间的公平,线程之间甚至没有优先级之分,每个进程/线程都会有机会执行,所以不会出现那种高优先级进程/线程抢占低优先级之后,由于低优先级进程/线程的等待导致的死锁,所以用户态还不需要关心这样的问题。用户态遇到的死锁主要是循环等待,退几步来说,可能就是在临界区sleep的死锁了,查这种死锁很简单,为锁添加计数值就可以。此外,之前提到pthread_mutex_t是具有优先级的,一个优先级比锁 阅读全文

posted @ 2012-12-18 17:24 huyc 阅读(6166) 评论(0) 推荐(0)

Linux Virtual Machines
摘要:看内核资料的时候,发现了一个内核级别的虚拟机,这个看起来非常不错的样子,由于我自己用的是kubuntu,所以我在ubuntu的主页找到了相关资料,share一下,这个东西各个发行版看起来是不同的。官网地址为:http://xen.org/,虽然提供相关源码,但还是需要内核选项支持,对于不懂细节的我等低手,还是退散为好,以下权且对ubuntu主页的那个做一个简要介绍,经测试,ubuntu主页的帮助也没有做到与时俱进,我就只说当前12.04支持的操作了。首先,很明显当然是安装,ubuntu内部已经加入了依赖关系,直接安装就好:sudo apt-get install xen-hypervisor- 阅读全文

posted @ 2012-11-27 15:20 huyc 阅读(310) 评论(0) 推荐(0)

ioctlsocket封装
摘要:遇到一些重口味的客户,非得要求所有平台上按Windows API封装函数,记下备忘。根据MSDN,Windows似乎很不愿意支持ioctl和fcntl,专门弄进来一个ioctlsocket,传递的三个命令分别是FIONBIO用于设置阻塞属性,FIONREAD用于读取缓冲区未读字节数,SIOCATMARK用来测试TCP的紧急指针,网上一搜,发现Linux上也是有对应的这三个cmd,一些人甚至将这三个命令视为套接字常用命令,对于我这样的标准拥护者,就查了一下POSIX标准,发现:FIONREAD这个是文件的通用操作,用来获取可读字节,归属于ioctl函数的命令FIONBIO已经被fcntl(fd, 阅读全文

posted @ 2012-11-26 17:09 huyc 阅读(601) 评论(0) 推荐(0)

KDE的若干快捷键,备忘
摘要:1.卷屏,ON/OFF,C-F2/C-F12.显示桌面,这个跟WIN的又不一样,桌面临时置顶,并不会把所有程序最小化,C-F123.显示程序,类似Gnome3里边SUPER-W的那种显示方式,C-F7/C-F9/C-F104.切换桌面,C-F8/C-F115.程序启动器,类似Win里边WIN+R的效果,所不同的是这个启动器会自己搜索PATH里面的可执行文件,A-F26.右键K按钮,编辑程序,可以为任意程序设置启动快捷键和启动参数7.文件浏览器里面按F4是可以打开终端的,按F3是可以像VIM那样分屏显示的,按F11可以随时去掉文件信息框的8.按A-F4可以向当前的GUI进程发送TERM信号,但不 阅读全文

posted @ 2012-11-24 14:07 huyc 阅读(3645) 评论(0) 推荐(0)

长度可变的C语言宏
摘要:在上大学的时候,对printf就有非常困惑的疑问,因为它的原型是这样的:int printf(const char *fmt, ...);现在则需要另外一个类似的东西:长度可变的宏定义以下是两种方案,clang和gcc均测试通过。CASE 1:ISO c99标准里边定义了一个预处理宏__VA_ARGS__,可以像这样来定义一个println:#define println(fmt, ...) printf(fmt"\n", __VA_ARGS__)println("%d", 1);println("%d", 2);这个宏的麻烦之处在于 阅读全文

posted @ 2012-10-26 16:28 huyc 阅读(574) 评论(0) 推荐(0)

快速求积,快速求幂,大指数取模
摘要:传说中的O(lgn)时间的快速算术算法和超大整数的取模算法。1.快速求积,a*b=a*2*b/2int fast_mul(int a, int b){ int m = 0; while(b){ if(b & 0x01){ //a*b = a+a(b-1) m += a; --b; }else{ //a*b = a*2*b/2 a <<= 1; b >>= 1; } } return m;}2.快速求... 阅读全文

posted @ 2011-10-31 12:20 huyc 阅读(1961) 评论(0) 推荐(0)

约瑟夫环问题
摘要:约瑟夫环问题,网上的解答都是一堆的数学字符,看着就不舒服,演示一下直观的算法(9,5):O (0+5)%2 = 0o O (0+5)%2 = 1O o o (1+5)%3 = 0o O o o (0+5)%4 = 1o O o o o (1+5)%5 = 1O o o o o o (1+5)%6 = 0o o o o o O o (0+5)%7 = 5o o O o o o o o (5+... 阅读全文

posted @ 2011-10-21 22:16 huyc 阅读(396) 评论(0) 推荐(0)

内存复制,交换排序,洗牌函数
摘要:1.string.h里面有一掇内存函数,其中两个是memcpy和memmove,据说两者是有差别的,前面那个是拷贝,区域重合时会覆盖数据;后面那个是移动,效率稍低,但是可以定住重合压力。来个memmove的演示代码:#include <stdio.h>/*移动src的siz个字节到dest,且当两个区域重合时也能正常移动*/void memory_move(char *dest, const char *src, size_t siz){ int off = 0; size_t i, j; if(dest >= src && dest < (src + 阅读全文

posted @ 2011-10-17 23:04 huyc 阅读(719) 评论(0) 推荐(0)

内存池和数据移动
摘要:问题:(a)请编写实现malloc()内存分配函数功能一样的代码。(b)给出一个函数来复制两个字符串A和B。字符串A的后几个字节和字符串B的前几个字节重叠。想法:1.malloc的分配算法已经N多人研究过了,基于链表的内存池性能不太好,但算法简单,有三种,首次适配,下次适配,最佳适配;基于桶的内存池将等价类映射到桶里面,查找性能较好,据说对桶应用首次适配就可以达到渐进最优的内存利用率。2.如果没理解错,字符串A和B具有相同部分,需要复制类似于abcd,cdef这样的两个字符串,并且要求合并相同部分以得出abcdef。实现:1.基于链表的存储池,内存小时性能有点太差,可以体会下产生大量碎片时的程 阅读全文

posted @ 2011-10-13 20:37 huyc 阅读(413) 评论(0) 推荐(0)

生成字符串排列
摘要:问题:给出一个函数来输出一个字符串的所有排列。想法:排列算法流行的有递归,置换,字典序法。1.递归算法,每个n排列是每个字符与n-1排列的结合。算法的核心部分是维持一个递归树,从树根到树叶的一条路径是一个排列。2.置换算法,基于置换群的理论,每完成一次置换生成一个排列。3.字典序法,每次生成排列的下一个排列,可以通过数值计数来模拟,当然也可以手工生成。实现:1.递归算法:#include <stdio.h>void swap(char *l, char *r){ char s = *l; *l = *r; *r = s;}void generate(char *buf, ch... 阅读全文

posted @ 2011-10-12 11:00 huyc 阅读(568) 评论(0) 推荐(0)

将字符串转换为数字
摘要:问题:写一个函数,检查字符是否是整数,如果是,返回其整数值。(或者:怎样只用4行代码编写出一个从字符串到长整形的函数?)想法:在不考虑负数的情况下,生成整数的基本做法就是不断做乘法,其实就是一个最基本的多项式:12345 = 1*10^4+2*10^3+3*10^2+4*10+5 = 10*(10*(10*(1*10+2)+3)+4)+5用程序很容易实现:#include <stdio.h>#include <ctype.h>int GetInt(const char *buf){ int r, sig; sig = 0; buf; if(*buf == '-& 阅读全文

posted @ 2011-10-11 18:53 huyc 阅读(497) 评论(0) 推荐(0)

寻找绝对值最小的对儿
摘要:问题:有一个整数数组,请求出两两之差绝对值最小的值(记住,只要得出最小值即可,不需要求出是哪两个数)。想法:1.最起码的想法自然就是穷举了,复杂度相当高,两个循环,O(n^2),其实也不是很高哦。2.适当变换一下题目的说法,两两绝对值之差最小,想象一下数轴,绝对值是两者距离,距离之差最小,就是数轴上的数距离最小,那排序就是很自然地想法了,排序之后的搜索过程复杂度为O(n),也就是说,如果采用搜索法,复杂度下限就是Ω(n)。接下来是排序算法,根据《算法导论》,基于比较的排序的渐进下限O(nlgn),目前性能最好最实用的当属快排了,应用快排之后的算法复杂度当为O(nlgn)。不基于比较的算法可以把 阅读全文

posted @ 2011-10-11 17:21 huyc 阅读(1524) 评论(0) 推荐(0)

整数回文验证
摘要:去笔试的时候,遇到一个回文题,想了好久,主要就是因为题目说验证一个int类型数是否为回文,之前写过却忘了,真是杯具,这次要写下来杜绝忘记。回文都是老题了,但是之前都是在说那啥字符串的回文,把首尾去掉,递归验证什么的,整数回文自然不应该用字符串那套,应该用堆栈。比如123321,一步步从后面出栈,就能得到一个123,两个数相等时就表示是回文了。如果是12321的话,堆栈卸出来123,后面这个数比较大时要么入栈一个3,要么出栈一个3,也就回文了。递归的解析也差不多,那个的数据结构叫做双头队列,头尾切掉,判断到最后一个元素,要么是字符,要么是空,只是整数要直接去掉最高位好像有点困难,当然也不是不行, 阅读全文

posted @ 2011-10-11 12:36 huyc 阅读(518) 评论(0) 推荐(0)