1.#defineMAX_DATA_SIZE(10)2.3.intmain()4.{5.unsignedinti=0;6.unsignedchardata[MAX_DATA_SIZE]={1,2,3,4,5,6,7,8,9,0};7.8.memcpy(&data[2],data,MAX_DATA_SIZE/2);9.10.return0;11.}123456789012121218901212345890其他结果都不对KEY:D解答:由于本题中data数组里直接放的是数字,直接强制转化为char类型,按照ASCII码进行查询,显然不会是这些数字了。
n、nlogn、nlognnlogn、nlogn、n^2nlogn、nlogn、nlognn、nlogn、n^2KEY:B6、关于互斥锁的如下表述错误的是()。
互斥锁的加锁和解锁必须由同一线程分别对应使用互斥锁只能为0/1互斥锁的解锁过程不需要关心顺序,只需要成对使用即可互斥锁用于线程的互斥KEY:C解答:互斥量和信号量的区别:互斥量用于线程的互斥,信号量用于线程的同步。
这是互斥量和信号量的根本区别,也就是互斥和同步之间的区别;互斥量值只能为0/1,信号量值可以为非负整数。
也就是说,一个互斥量只能用于一个资源的互斥访问,它不能实现多个资源的多线程互斥问题。
信号量可以实现多个同类资源的多线程互斥和同步。
当信号量为单值信号量是,也可以完成一个资源的互斥访问;互斥量的加锁和解锁必须由同一线程分别对应使用,信号量可以由一个线程释放,另一个线程得到。
这里区分一下互斥和同步:互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。
但互斥无法限制访问者对资源的访问顺序,即访问是无序的;同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。
在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。
少数情况是指可以允许多个访问者同时访问资源。
7、Linux在某目录下查找某字符串通常如下哪个指令?findgrepcat其他都不对KEY:A解答:Linux的find命令用来在指定目录下查找文件,可以使用-name选项来完成:1.find/home-name"*.txt"//不忽略大小写2.find/home-iname"*.txt"//忽略大小写8、多个进程按照顺序逐一来访问某个资源,这种制约关系称之为()。
调度协同互斥同步KEY:D9、支持多道程序的操作系统在运行过程中,不断地选择新进程运行来实现CPU的共享,但其中()不是引起操作系统选择新进程的直接原因。
10、()是操作系统分配资源的基本单位。
进程程序线程指令KEY:A11、执行下述的main函数后,输出结果是多少?1.intmain()2.{3.inti=10;4.5.switch(i){6.case9:i++;7.case10:i++;8.case11:i++;9.default:i++;10.}11.printf("result=%d\n",i);12.13.return0;14.}12131114KEY:B12、以下能对二维数组a进行完整初始化的语句是()。
inta[2][3]=((0,1,2),(3,4,5));inta[2][3]={{0,1,2},{3,4,5}};inta[2][3]={{0,1},{2,3},{4,5}};inta[2][3]={0,1,2,3,4};KEY:B13、下面程序的输出值,正确的是()。
1.#defineCALC(x,y)x*y+x2.3.intmain()4.{5.inta=CALC(2*3,3+2);6.printf("result=%d\n",a);7.8.return0;9.}26302436KEY:A14、下面程序的输出值,正确的是()。
1.voidswap(int*a,int*b){2.int*t;3.t=a;4.a=b;5.b=t;6.}7.8.intmain()9.{10.intx=1,y=2;11.int*p=&x,*q=&y;12.swap(p,q);13.printf("%d%d\n",*p,*q);14.15.return0;16.}11221221KEY:C解答:本题的swap函数是将形参中的a、b两个指针指向的地址交换了,实参p、q并没有变化。
可以比对一下:1.intx=1,y=2;2.3.swap(&x,&y);//没有效果4.voidswap(int*a,int*b){5.int*t;6.t=a;7.a=b;8.b=t;9.}10.11.swap(&x,&y);//有效果12.voidswap(int*a,int*b){13.intt;14.t=*a;15.*a=*b;16.*b=t;17.}15、假如test指针的值为0x12345678,则表达式test_p[1]的指针地址值是多少?1.chartest[8]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};2.int*test_p=(int*)test;0x123456780x1234567C0x123456790x1234567AKEY:B16、在C语言程序中,下面程序运行后,n的值是多少?1.intn=0;2.intf=17;3.n=4*f%3+1;392KEY:A17、下面那个操作可以将flag的bit[2](假定bit[31...0]对应flag的32位)置0?flag|=4flag^=4flag&=~4flag|=~4KEY:C18、下面程序的运行结果为?1.#defineTEST(a,b)a*b2.3.intmain()4.{5.inta=TEST(1+2,3);6.printf("result=%d\n",a);7.8.return0;9.}2379KEY:C19、对于堆、栈、队列描述错误的是()。
队列空间缓冲由进程申请,栈的空间缓冲由OS分配堆总是一棵完全二叉树堆的数据类型和队列相似队列先进先出,栈后进先出KEY:B20、以下对字符数组test赋值方式错误的是()。
tasklet工作队列软中断双向链表KEY:ABC解答:上半部是不能中断的,仅仅是响应中断;下半部是可以中断的。
对于适时要求高的,必须放在上半部。
下半部的实现主要是通过软中断、tasklet、工作队列来实现的。
上半部的功能是响应中断。
当中断发生时,它就把设备驱动程序中中断处理例程的下半部挂到设备的下半部执行队列中去,然后继续等待新的中断到来。
这样一来,上半部的执行速度就会很快,它就可以接受更多它负责的设备所产生的中断了。
上半部之所以快,是因为它是完全屏蔽中断的,如果它没有执行完,其他中断就不能及时地处理,只能等到这个中断处理程序执行完毕以后。
所以要尽可能多的对设备产生的中断进行服务和处理,中断处理程序就一定要快。
下半部的功能是处理比较复杂的过程。
下半部和上半部最大的区别是可中断,而上半部却不可中断。
下半部几乎完成了中断处理程序所有的事情,因为上半部只是将下半部排到了它们所负责的设备中断的处理队列中去,然后就不做其它的处理了。
下半部所负责的工作一般是查看设备以获得产生中断的事件信息,并根据这些信息(一般通过读设备上的寄存器得来)进行相应的处理。
下半部是可中断的,所以在运行期间,如果其它设备产生了中断,这个下半部可以暂时的中断掉,等到那个设备的上半部运行完了,再回头运行这个下半部。
下面对实现中断下半部工作的3种机制进行总结,便于在实际使用中决定使用哪种机制:1.intfun(inta[],short*ptr,int&c){2....3.}数组传递指针传递引用传递值传递KEY:BC23、关于链表,描述正确的选项有()。
在运行时可以动态添加物理空间不连续,空间开销更大查找元素不需要顺序查找可在任意节点位置插入元素KEY:ABD24、对运算符优先级的判断,正确的是()。
取余运算符%>加运算符+逻辑与运算符&&>赋值运算符=数组下标[]>自增运算符++左移运算符<<>大于运算符>KEY:ABCD25、能在Linux内核态执行的是()。
缺页中断时钟中断命令解释进程调度KEY:ABD解答:缺页中断和时钟中断都属于中断,在内核态执行。
进程调度属于系统调用,在内核态执行,命令解释程序属于命令接口,在用户态执行。
简答题1、Linux驱动连接硬件与应用,根据你对驱动加载的理解,回答如下问题:(1)insmod和modprobe都可以用来加载驱动模块,请描述这两者的差异。
(2)请给出三种以上Linux驱动模块加载失败的可能原因。
解答:modprobe和insmod类似,都是用来动态加载驱动模块的,区别在于modprobe可以解决loadmodule时的依赖关系,它是通过/lib/modules/#uname-r/modules.dep(.bb)文件来查找依赖关系的;而insmod不能解决依赖问题。
也就是说,如果你确定你要加载的驱动模块不依赖其他驱动模块的话,既可以insmod也可以modprobe,当然insmod可以在任何目录下执行,更方便一些。
而如果你要加载的驱动模块还依赖其他ko驱动模块的话,就只能将模块拷贝到上述的特定目录,depmod后再modprobe。
2、设计或开发Linux操作系统的内核时,你会考虑哪些基本的管理模块,并描述其作用。
解答:Linux内核的五大模块:进程调度模块、内存管理模块、文件系统模块、进程间通信模块、网络接口模块。
进程调度模块:用来负责控制进程对CPU资源的使用。
所采取的调度策略是各进程能够公平合理地访问CPU,同时保证内核能及时地执行硬件操作;内存管理模块:用于确保所有进程能够安全地共享机器主内存区,同时,内存管理模块还支持虚拟内存管理方式,使得Linux支持进程使用比实际内存空间更多的内存容量。
并可以利用文件系统,对暂时不用的内存数据块交换到外部存储设备上去,当需要时再交换回来;文件系统模块:用于支持对外部设备的驱动和存储。
虚拟文件系统模块通过向所有的外部存储设备提供一个通用的文件接口,隐藏了各种硬件设备的不同细节。
从而提供并支持与其它操作系统兼容的多种文件系统格式;进程间通信模块:用于支持多种进程间的信息交换方式;网络接口模块:提供对多种网络通信标准的访问并支持许多网络硬件。