摘要:死锁应该有3个原因:1.独占资源2.循环等待3.不可剥夺网上看到的4个条件,实际上还是3个,因为请求和等待导致的死锁毕竟有点让人难堪,实际上的死锁多是因为请求等待导致的循环等待。在用户态,由于Linux提倡进程之间的公平,线程之间甚至没有优先级之分,每个进程/线程都会有机会执行,所以不会出现那种高优先级进程/线程抢占低优先级之后,由于低优先级进程/线程的等待导致的死锁,所以用户态还不需要关心这样的问题。用户态遇到的死锁主要是循环等待,退几步来说,可能就是在临界区sleep的死锁了,查这种死锁很简单,为锁添加计数值就可以。此外,之前提到pthread_mutex_t是具有优先级的,一个优先级比锁
阅读全文
摘要:看内核资料的时候,发现了一个内核级别的虚拟机,这个看起来非常不错的样子,由于我自己用的是kubuntu,所以我在ubuntu的主页找到了相关资料,share一下,这个东西各个发行版看起来是不同的。官网地址为:http://xen.org/,虽然提供相关源码,但还是需要内核选项支持,对于不懂细节的我等低手,还是退散为好,以下权且对ubuntu主页的那个做一个简要介绍,经测试,ubuntu主页的帮助也没有做到与时俱进,我就只说当前12.04支持的操作了。首先,很明显当然是安装,ubuntu内部已经加入了依赖关系,直接安装就好:sudo apt-get install xen-hypervisor-
阅读全文
摘要:遇到一些重口味的客户,非得要求所有平台上按Windows API封装函数,记下备忘。根据MSDN,Windows似乎很不愿意支持ioctl和fcntl,专门弄进来一个ioctlsocket,传递的三个命令分别是FIONBIO用于设置阻塞属性,FIONREAD用于读取缓冲区未读字节数,SIOCATMARK用来测试TCP的紧急指针,网上一搜,发现Linux上也是有对应的这三个cmd,一些人甚至将这三个命令视为套接字常用命令,对于我这样的标准拥护者,就查了一下POSIX标准,发现:FIONREAD这个是文件的通用操作,用来获取可读字节,归属于ioctl函数的命令FIONBIO已经被fcntl(fd,
阅读全文
摘要: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信号,但不
阅读全文
摘要:在上大学的时候,对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);这个宏的麻烦之处在于
阅读全文
摘要:传说中的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.快速求...
阅读全文
摘要:约瑟夫环问题,网上的解答都是一堆的数学字符,看着就不舒服,演示一下直观的算法(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+...
阅读全文
摘要: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 +
阅读全文
摘要:问题:(a)请编写实现malloc()内存分配函数功能一样的代码。(b)给出一个函数来复制两个字符串A和B。字符串A的后几个字节和字符串B的前几个字节重叠。想法:1.malloc的分配算法已经N多人研究过了,基于链表的内存池性能不太好,但算法简单,有三种,首次适配,下次适配,最佳适配;基于桶的内存池将等价类映射到桶里面,查找性能较好,据说对桶应用首次适配就可以达到渐进最优的内存利用率。2.如果没理解错,字符串A和B具有相同部分,需要复制类似于abcd,cdef这样的两个字符串,并且要求合并相同部分以得出abcdef。实现:1.基于链表的存储池,内存小时性能有点太差,可以体会下产生大量碎片时的程
阅读全文
摘要:问题:给出一个函数来输出一个字符串的所有排列。想法:排列算法流行的有递归,置换,字典序法。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...
阅读全文
摘要:问题:写一个函数,检查字符是否是整数,如果是,返回其整数值。(或者:怎样只用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 == '-&
阅读全文
摘要:问题:有一个整数数组,请求出两两之差绝对值最小的值(记住,只要得出最小值即可,不需要求出是哪两个数)。想法:1.最起码的想法自然就是穷举了,复杂度相当高,两个循环,O(n^2),其实也不是很高哦。2.适当变换一下题目的说法,两两绝对值之差最小,想象一下数轴,绝对值是两者距离,距离之差最小,就是数轴上的数距离最小,那排序就是很自然地想法了,排序之后的搜索过程复杂度为O(n),也就是说,如果采用搜索法,复杂度下限就是Ω(n)。接下来是排序算法,根据《算法导论》,基于比较的排序的渐进下限O(nlgn),目前性能最好最实用的当属快排了,应用快排之后的算法复杂度当为O(nlgn)。不基于比较的算法可以把
阅读全文
摘要:去笔试的时候,遇到一个回文题,想了好久,主要就是因为题目说验证一个int类型数是否为回文,之前写过却忘了,真是杯具,这次要写下来杜绝忘记。回文都是老题了,但是之前都是在说那啥字符串的回文,把首尾去掉,递归验证什么的,整数回文自然不应该用字符串那套,应该用堆栈。比如123321,一步步从后面出栈,就能得到一个123,两个数相等时就表示是回文了。如果是12321的话,堆栈卸出来123,后面这个数比较大时要么入栈一个3,要么出栈一个3,也就回文了。递归的解析也差不多,那个的数据结构叫做双头队列,头尾切掉,判断到最后一个元素,要么是字符,要么是空,只是整数要直接去掉最高位好像有点困难,当然也不是不行,
阅读全文