Linux高级编程笔试题答案.docx
《Linux高级编程笔试题答案.docx》由会员分享,可在线阅读,更多相关《Linux高级编程笔试题答案.docx(6页珍藏版)》请在冰豆网上搜索。
Linux高级编程笔试题答案
高级编程笔试题答案
一、选择题
1.在网络字节序中,所谓”小端”(littleendian)说法正确的是(B)
A.高字节数据存放在低地址处,低字节数据存放在高地址处
B.低字节位数据存放在内存低地址处,高字节位数据存放在内存高地址处
C.和编译器相关
D.上述答案都不正确
2.C语言中,系统自动打开的文件是( D )
A. 二进制文件 B.随机文件
C.非缓冲文件 D.设备文件
3.TCP使用( B )进行流量控制。
A.3次握手法 B.窗口控制机制
C.自动重发机制 D.端口机制
4.TCP/IP层IP协议的服务是( C )
A.可靠服务 B.有确认的服务
C.无连接数据报 D.以上都不对
5.对于一个没有设置任何套接口选项的阻塞套接口,调用recv接收对方的数据,对方发送数据前突然断电,下列哪种情况将会发生( A)
A.recv永远不会返回 B.recv立刻返回-1
C.recv立刻返回0 D.recv在等待很长一段时间后返回-1
6.下列哪些关于套接口选项函数的说法是正确的(C)
A.SO_DONTLINGER选项是让TCP套接口不对数据进行缓存,调用send函数后立刻将数据发送出去;
B.调用SO_RCVBUF和SO_SNDBUF调整TCP窗口的大小;
C.SO_REUSEADDR选项允许套接口绑定在一个已经在使用的地址上;
D.SO_MAX_MSG_SIZE选项获取每次调用TCP套接口send时,所能发送的最大字节数;
二、问答题
1.fork和vfork的区别?
vfork用于创建一个新进程,而该进程的目的是exec一个新程序。
vfork与fork一样都创建一个子进程,但他并不把父进程地址空间完全复制到子进程中,因为子进程通常都会调用exec或(_exit),于是也就不会访问该地址空间。
vfork与fork的另一个区别是vfork保证子进程先运行,在它调用exec或_exit之后父进程才可能被调度运行。
vfork使用如下例:
#include
#include
#include
#include
int globvar=6;/*externalvariableininitializeddata*/
int
main(void)
{
int var;/*automaticvariableonthestack*/
pid_t pid;
var=88;
printf("beforevfork\n");/*wedon’tflushstdio*/
if((pid=vfork())<0)
{
perror("vforkerror");
}
elseif(pid==0)
{/*child*/
globvar++; /*modifyparent’svariables*/
var++;
_exit(0); /*childterminates*/
}
/*parentcontinueshere*/
printf("pid=%ld,glob=%d,var=%d\n",(long)getpid(),globvar,var);
exit(0);
}
2.excel协议族有哪些,举例函数原型?
externchar**environ;
intexecl(constchar*path,constchar*arg,...);
intexeclp(constchar*file,constchar*arg,...);
intexecle(constchar*path,constchar*arg,...,char*constenvp[]);
intexecv(constchar*path,char*constargv[]);
intexecvp(constchar*file,char*constargv[]);
intexecvpe(constchar*file,char*constargv[],char*constenvp[]);
3.创建线程、进程的函数是什么?
fork、vfork、pthread_create
4.线程间临界资源怎么保护?
条件变量的使用?
互斥锁、信号量
条件变量是线程中的东西,就是等待某一条件的发生,和信号一样。
具体的用法可参见XX百科文章:
5.编译有线程的文件要加什么参数?
-lpthread
6.线程与进程的区别?
线程是指进程内的一个执行单元,也是进程内的可调度实体。
与进程的区别:
a)地址空间:
进程内的一个执行单元;进程至少有一个线程;它们共享进程的地址空间;而进程有自己独立的地址空间;
b)资源拥有:
进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源;
c)线程是处理器调度的基本单位,但进程不是;
d)二者均可并发执行。
7.多进程和多线程的区别,分别在什么情景下用?
根据实际情况来判断,哪个更加合适就是哪个好
对比维度
多进程
多线程
总结
数据共享、同步
数据共享复杂,需要用IPC;数据是分开的,同步简单
因为共享进程数据,数据共享简单,但也是因为这个原因导致同步复杂
各有优势
内存、CPU
占用内存多,切换复杂,CPU利用率低
占用内存少,切换简单,CPU利用率高
线程占优
创建销毁、切换
创建销毁、切换复杂,速度慢
创建销毁、切换简单,速度很快
线程占优
编程、调试
编程简单,调试简单
编程复杂,调试复杂
进程占优
可靠性
进程间不会互相影响
一个线程挂掉将导致整个进程挂掉
进程占优
分布式
适应于多核、多机分布式;如果一台机器不够,扩展到多台机器比较简单
适应于多核分布式
进程占优
1)需要频繁创建销毁的优先用线程
原因请看上面的对比。
这种原则最常见的应用就是Web服务器了,来一个连接建立一个线程,断了就销毁线程,要是用进程,创建和销毁的代价是很难承受的
2)需要进行大量计算的优先使用线程
所谓大量计算,当然就是要耗费很多CPU,切换频繁了,这种情况下线程是最合适的。
这种原则最常见的是图像处理、算法处理。
3)强相关的处理用线程,弱相关的处理用进程
什么叫强相关、弱相关?
理论上很难定义,给个简单的例子就明白了。
一般的Server需要完成如下任务:
消息收发、消息处理。
“消息收发”和“消息处理”就是弱相关的任务,而“消息处理”里面可能又分为“消息解码”、“业务处理”,这两个任务相对来说相关性就要强多了。
因此“消息收发”和“消息处理”可以分进程设计,“消息解码”、“业务处理”可以分线程设计。
当然这种划分方式不是一成不变的,也可以根据实际情况进行调整。
4)可能要扩展到多机分布的用进程,多核分布的用线程
原因请看上面对比。
5)都满足需求的情况下,用你最熟悉、最拿手的方式
至于“数据共享、同步”、“编程、调试”、“可靠性”这几个维度的所谓的“复杂、简单”应该怎么取舍,我只能说:
没有明确的选择方法。
但我可以告诉你一个选择原则:
如果多进程和多线程都能够满足要求,那么选择你最熟悉、最拿手的那个。
需要提醒的是:
虽然我给了这么多的选择原则,但实际应用中基本上都是“进程+线程”的结合方式,千万不要真的陷入一种非此即彼的误区。
8.说出线程和进程的定义,为什么用多线程不用多进程?
线程和进程的定义可以参见PPT相关部分,用多线程而不使用多进程多半都是因为利用了线程比进程具有的优势,比如:
数据共享简单、创建销毁速度快,占用的资源少等优点。
9.创建信号量函数原型?
typedefvoid(*sighandler_t)(int);
sighandler_tsignal(intsignum,sighandler_thandler);
10.互斥的实现方法?
互斥锁和信号量
11.二进制信号量与互斥信号量的区别?
有什么作用?
1.互斥量用于线程的互斥,信号量用于线程的同步。
这是互斥量和信号量的根本区别,也就是互斥和同步之间的区别。
互斥:
是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。
但互斥无法限制访问者对资源的访问顺序,即访问是无序的。
同步:
是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。
在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。
少数情况是指可以允许多个访问者同时访问资源
以上区别是主要想记住的。
note:
信号量可以用来实现互斥量的功能
2.互斥量值只能为0/1,信号量值可以为非负整数。
也就是说,一个互斥量只能用于一个资源的互斥访问,它不能实现多个资源的多线程互斥问题。
信号量可以实现多个同类资源的多线程互斥和同步。
当信号量为单值信号量是,也可以完成一个资源的互斥访问。
3. 互斥量的加锁和解锁必须由同一线程分别对应使用,信号量可以由一个线程释放,另一个线程得到。
4.互斥锁应该加在线程内还是线程外?
加锁机制是对资源的保护,如果两个线程对同一个资源有竞争,则需要在两个线程之外初始化锁,而在线程内去获取锁,对资源进行访问,然后释放锁。
12.产生死锁的必要条件是什么?
解决死锁有几种方法?
产生死锁的必要条件:
a)互斥条件:
进程要求对所分配的资源进行排它性控制,即在一段时间内某资源仅为一进程所占用。
b)请求和保持条件:
当进程因请求资源而阻塞时,对已获得的资源保持不放。
c)不剥夺条件:
进程已获得的资源在未使用完之前,不能剥夺,只能在使用完时由自己释放。
d)环路等待条件:
在发生死锁时,必然存在一个进程--资源的环形链。
解决死锁的基本方法:
a)预防死锁:
资源一次性分配:
(破坏请求和保持条件)
可剥夺资源:
即当某进程新的资源未满足时,释放已占有的资源(破坏不可剥夺条件)
资源有序分配法:
系统给每类资源赋予一个编号,每一个进程按编号递增的顺序请求资源,释放则相反(破坏环路等待条件)