89、线程同步的方法:信号量、条件变量、互斥锁。 90、for(i=0;i<2,i<3,i<4;i++)
printf(\\\n\输出:0,1,2,3。
100、物理地址,虚拟地址,逻辑地址和总线地址的区别
逻辑地址(Logical Address)是指由程序产生的与段相关的偏移地址部分。
例如,你在进行C语言指针编程中,可以读取指针变量本身值(&操作),实际上这个值就是逻辑地址,
它是相对于你当前进程数据段的地址,不和绝对物理地址相干。只有在Intel实模式下, 逻辑地址才和物理地址相等(因为实模式没有分段或分页机制, Cpu不进行自动地址转换); 逻辑也就是在Intel 保护模式下程序执行代码段限长内的偏移地址(假定代码段、数据段如果完全一样)。
应用程序员仅需与逻辑地址打交道,而分段和分页机制对您来说是完全透明的,仅由系统编程人员涉及。
应用程序员虽然自己可以直接操作内存,那也只能在操作系统给你分配的内存段操作。 线性地址(Linear Address)是逻辑地址到物理地址变换之间的中间层。程序代码会产生逻辑地址,
或者说是段中的偏移地址,加上相应段的基地址就生成了一个线性地址。如果启用了分页机制, 那么线性地址可以再经变换以产生一个物理地址。若没有启用分页机制,那么线性地址直接就是物理地址。
Intel 80386的线性地址空间容量为4G(2的32次方即32根地址总线寻址)。
物理地址(Physical Address) 是指出现在CPU外部地址总线上的寻址物理内存的地址信号,是地址变换的最终结果地址。
如果启用了分页机制,那么线性地址会使用页目录和页表中的项变换成物理地址。 如果没有启用分页机制,那么线性地址就直接成为物理地址了。
在x86下,外设的i/o地址是独立的,即有专门的指令访问外设i/o,i/o地址就是你所说的“总线地址”。
而“物理地址”就是ram地址。在arm中,i/o和ram统一编址,但linux为了统一各个平台,仍然保留这个概念,其实就是物理地址。
101、编写内核程序中申请内存和编写应用程序时申请内存有什么区别
应用程序使用C函数库中的内存分配函数malloc()申请内存内核会为进程使用的代码和数据空间维护一个当前位置的值brk,
这个值保存在每个进程的数据结构中。它指出了进程代码和数据(包括动态分配的数据空间)在进程地址空间中的末端位置。
当malloc()函数为程序分配内存时,它会通过系统调用brk()把程序要求新增的空间长度通知内核,
内核代码从而可以根据malloc()所提供的信息来更新brk的值,但此时并不为新申请的空间映射物理内存页面。
只有当程序寻址到某个不存在对应物理页面的地址时,内核才会进行相关物理内存页面的映射操作。
当用户使用内存释放函数free()动态释放已申请的内存块时,c库中的内存管理函数就会把所释放的内存块标记为空闲,
以备程序再次申请内存时使用。在这个过程中内核为该进程所分配的这个物理页面并不会被释放掉。
只有当进程最终结束时内核才会全面收回已分配和映射到该进程地址空间范围内的所有物理内存页面。
102、如何用C语言实现读写寄存器变量
#define rBANKCON0 (*(volatile unsigned long *)0x48000004) rBankCON0 = 0x12;
103、sscanf(\\\buf); 1234 sscanf(\asdfga\]\buf); 123456
sscanf(\\buf); 123456aafsdf sscanf(\\buf); 123afsdf 104、char* s=\ s[0]='B'; printf(\ 有什么错?
\是字符串常量。s是指针,指向这个字符串常量,所以声明s的时候就有问题。 cosnt char* s=\
然后又因为是常量,所以对是s[0]的赋值操作是不合法的。
105、数组a[N],存放了1至N-1个数,其中某个数重复一次。写一个函数,找出被重复的数字.时间复杂度必须为o(N)函数原型:
int do_dup(int a[],int N) int do_dup(int a[],int N)//a[0]为监视哨 { {
int i; int temp;
int s; while (a[0]!=a[a[0]]) int num; {
for(i=0;i num=s-N*(N-1)/2;(num即为重复数) a[temp]=temp; } } return a[0]; } 106、tcp/udp是属于哪一层?tcp/udp有何优缺点? tcp /udp属于运输层 TCP 服务提供了数据流传输、可靠性、有效流控制、全双工操作和多路复用技术等。 与 TCP 不同, UDP 并不提供对 IP 协议的可靠机制、流控制以及错误恢复功能等。由于 UDP 比较简单, UDP 头包含很少的字节,比 TCP 负载消耗少。 tcp: 提供稳定的传输服务,有流量控制,缺点是包头大,冗余性不好 udp: 不提供稳定的服务,包头小,开销小 107、 char a = 100; char b = 150;//10010110//01101010 unsigned char c ; c = (a < b)? a:b; --》 c=150; 108、应用程序ping发出的是ICMP请求报文 109、在C语言中memcpy和memmove是一样的吗? memmove()与memcpy()一样都是用来拷贝src所指向内存内容前n个字节到dest所指的地址上,不同是,当src和dest所指的内存区域重叠时, memmove()仍然可以正确处理,不过执行效率上略慢些。 110、C语言程序代码优化方法 * 选择合适的算法和数据结构 * 使用尽量小的数据类型 * 使用自加、自减指令 * 减少运算的强度 求余运算(a=a%8改为a=a&7) 平方运算(a=pow(a,2.0)改为a=a*a) 用移位实现乘除法运算 * 延时函数的自加改为自减 * switch语句中根据发生频率来进行case排序 111、找出一个字符串中一个最长的连续的数字,并标注出位置和个数。 void main() { char input[100]; char output[100] = {0}; int count = 0, maxlen = 0, i = 0; char *in=input, *out=output,*temp=NULL,*final=NULL; printf(\input string(length under 100):\\n\ scanf(\input); printf(\string is %s\\n\input); while(*in!='\\0') { if(*in>='0'&&*in<='9') { count=0; temp=in; for(;(*in>='0')&&(*in<='9');in++) count++; if (maxlen maxlen=count; =temp; } } in++; } for(i=0; i printf(\is %d\\n\maxlen); printf(\is %s\\n\output); } 112、写出螺旋矩阵 void Matrix(int m,int n) //顺时针 { int i,j,a=1; int s[100][100]; int small = (m { for(j=i;j if(small & 1) { if(m for(i=k;i for(i=k;i for(i=0;i for(j=0;j 113、int *a = (int *)2; printf(\答案是2+3*4=14;int类型地址加1 相当于加4个字节 114、main() { char a,b,c,d; scanf(\ c=getchar();d=getchar(); printf(\