gdb的基本工作原理是什么?

On October 29, 2010, in linux, linux系统, by sponge

还是面某M的时候,面试官问我:“用过gdb么?” 答:“用过,调了两年bug了”。“那好,给我解释下gdb是怎么工作的?或者说跟内核什么地方有关系?”。

是阿,gdb凭什么可以调试一个程序?凭什么能够接管一个程序的运行?我以前也想过这样的问题,但是后来居然忘记去查看了。我想到了我们的二进制翻译器,想到了intel的pin,Dynamo。这些都是将翻译后的代码放到codecache中去运行,然后接管整个程序的执行。gdb是不是也一样呢?

如果真是这样,为什么我记得用gdb跑一个程序,这个程序会有一个单独的进程?gdb的attach功能又是怎么实现的?

想了想,我还是没有答上来。面试就是由这么一个又一个细节的小杯具最后汇集成一个大杯具。

那么,gdb到底是凭什么接管的一个进程的执行呢?其实,很简单,通过一个系统调用:ptrace。ptrace系统调用的原型如下:

Tagged with:
 

C语言的那些个关键字们

On October 28, 2010, in 语言学习, C语言, by sponge

最近感冒,昨天流着鼻涕去一直很想去的某M面试,居然还迟到了,一紧张,鼻涕不流了- -#

问的问题不难,都是基础,可是自己不争气,答的不怎么样,一直自诩C语言用的很不错,可是还是在基础上被鄙视- -!都是那些个关键字们阿~今天,让我挨个把C的关键字给详细的整一整,加深一下印象~

首先,C语言中到底有多少个关键字呢?木有错,ANSI C规定是32个! 他们分别是:auto double int struct break else long switch case enum register typedef char extern return union const float short unsigned continue for signed void default goto sizeof volatile do if while static。

别看那一堆了字母了,直接看下面的分类介绍:

第一类:数据类型关键字

Tagged with:
 

内存屏障什么的

On October 28, 2010, in linux, 系统结构, C语言, linux系统, by sponge

当你看到“内存屏障”四个字的时候,你的第一反应是什么?寄存器里取出了错误的值?ifence,sfence之类的指令?还是诸如volatile之类的关键字?好吧,我第一次看到这四个字的时候,脑子里浮现出的是魔兽争霸里绿油油的铺满苔藓的岩石屏障- -#,并且,当我搞明白内存屏障具体是什么,而且自认为对其很熟悉之后,我的第一反应依然是那几块绿油油的石头,而且很想上去A一把!

言归正传,先解释下什么是内存屏障。内存屏障是指“由于编译器的优化和缓存的使用,导致对内存的写入操作不能及时的反应出来,也就是说当完成对内存的写入操作之后,读取出来的可能是旧的内容”(摘自《独辟蹊径品内核》)。

概念就是概念,生硬的东西,懂的人能从中悟出点什么,不懂的人还是一头雾水。不要着急,我们先给内存屏障分下类,然后挨个来研究一番,等看完这篇文章,再回来读读概念,你就懂了!

内存屏障的分类:

  1. 编译器引起的内存屏障
  2. 缓存引起的内存屏障
  3. 乱序执行引起的内存屏障
Tagged with:
 

之所以说是一个解法,是因为这是我暂时能想到的线性时间复杂度的算法,需要遍历约2m遍,这里把算法列出来,仅供参考。

题目:

有一串首尾相连的珠子,共有m个,每一个珠子有一种颜色,并且颜色的总数不超过n(n<=10),求连续的珠子的颜色总数为n时,长度最小的区间。可简述思路或者给出伪代码,并且给出时间和空间复杂度分析。(baidu 2011校园招聘笔试题目)

拿到这个题目,我首先想到的是暴力搜索。即对每个珠子,都搜索以该珠子为结尾的最短符合题意的序列。但是这样比较的时间复杂度特别高,应该是m的指数,显然是不可取的,通过简单的分析我们能够发现,在搜索过程中,我们进行了许多冗余的比较。本着空间换时间的想法,我们有没有办法把这些比较记录下来,然后去掉这些冗余呢?答案是肯定的。

文章开始,先看一个结构体的代码: //爱立信2011笔试 360 2011笔试均涉及

struct node{
    int a;
    int b;
};

问:sizeof(Node)是多少? 答案很简单,在32位机器上,一个int是4个字节,两个int就是8个字节,sizeof(Node)就是8。

好的,上面那个答案确实是8,那么再看下面这个结构体:

struct node{
    char a;
    int b;
};

问:这个时候sizeof(Node)又是多少呢? int是4个字节,char是1个字节,答案是5?

Tagged with:
 

打印经过限定后的数字排列

On October 18, 2010, in 算法, 笔试面试, by sponge

题目:给定6个数字,1,2,2,3,4,5,打印所有的排列

要求:

  1. 所有的4均不会出现在排列的第4个位置
  2. 数字3和数字5不能相邻
  3. 排列不能重复。

实现思想:

采用回朔的方法便利所有可能的排列,其中把不符合题目要求的去除。需要额外注意的是,数字中出现了两个2,如果单纯的遍历,会打印两次2在某个位置的排列,要注意把这个重复给去除。

Tagged with:
 

问:101个榛子,每个重量都相等。有一天其中一个受到污染了,不知道变重还是变轻了,给一个天平,请问至少要称几次才能确定是变轻了还是变重了?
答案:

  1. 先取出一个,然后将剩下的等分成两份,没份50个;
  2. 将两份放到天平,如果重量相等,则说明被选出的那一个是受到污染的,将受到污染的同其他的任意一个比较,就能够得出答案。
  3. 如果天平不平衡,将重的一边再分成两份,每份25个,放到天平上,如果平衡,则说明受污染的在另外50个中,而另一份比较轻,所以受污染的比较轻。相反,如果不平衡,则说明受污染的在当前的50个中,则说明受污染的变重了。
Tagged with:
 

Unix/Linux下的stdout,stdin同stderr

On October 15, 2010, in linux, linux系统, by sponge

stdout, stdin, stderr的中文名字分别是标准输出标准输入标准错误

在Linux下,当一个用户进程被创建的时候,系统会自动为该进程创建三个数据流,也就是题目中所提到的这三个。那么什么是数据流呢(stream)?我们知道,一个程序要运行,需要有输入、输出,如果出错,还要能表现出自身的错误。这是就要从某个地方读入数据、将数据输出到某个地方,这就够成了数据流。

Tagged with:
 

X86中的浮点栈结构

On October 13, 2010, in 系统结构, by sponge

在介绍X86浮点栈结构之前,先说明一下X87,X87是IA_32体系结构中为提高浮点数据处理能力而增加的X87芯片系列数学协处理器,使用X87指令,X86指令集和X87指令集统称为X86指令集。可以简单的理解X87是一个浮点协处理器,是X86的浮点处理单元。

X86的浮点单元(X87 FPU)用作浮点数据处理,必然要使用寄存器,而且这个寄存器必然要同整点的不同。那么,在FPU中是怎么设计这些浮点寄存器呢?

实际上,X86的FPU中包含一个浮点寄存器栈,它包含了8个80位的可以直接进行浮点运算的寄存器,浮点数以双精度格式存储在这些寄存器中,无论是单精度、双精度还是整数等,被load到这些个寄存器中后,都会转化为双精度。FPU指令在使用这些寄存器的时候,是以一种“栈”的方式来使用,叫做“浮点寄存器栈”,其结构如下图所示:

Tagged with:
 

今天跟赶场子似的匆匆赶去北邮笔试,题目不是很难,不过满脑子的浆糊,然后就犯了点2~心里很不爽!心态阿心态!

看下面这个题目:

#include <stdio.h>
union{
        int i;
        char x[2];
}a;
 
int main(){
 
	a.x[0]=10;
	a.x[1]=1;
	printf("%d n", a.i);
 
}
Tagged with: