一些Unix笔试题和面试题


Posted in 面试题 onSeptember 25, 2012
1. 简述Sun Workshop中的几个重要概念:event/handler, watchpoint, RTC。
2. 简述Solaris所实现的系统接口标准(至少两种),并说明feature test macros的功能和使用方法。
unix 标准有:ANSI C, IEEE POSIX, X/OPEN XPG3 和 FIPS.实际应用的有:System V Release 4, 4.3+BSD.
feature test macro: 头文件中定义了很多宏,有POSIX,XPG3的。当程序编译时如果希望只使用POSIX的定义而不使用其它定义,
那么就需定义常数_ P O S I X _ S O U R C E。
当该常数定义时,就能排除其它专有的定义。
常数_ P O S I X _ S O U R C E 及其对应的常数_ X O P E N _ S O U R C E 被称之为功能测试宏(f e a t u r e
test macro )。所有功能测试宏都以下划线开始。当要使用它们时,通常在c c 命令行中以下列方
式定义:
cc -D_POSIX_SOURCE file.c
这使得在C 程序包括任何头文件之前,定义了功能测试宏。如果我们仅想使用P O S I X . 1 定义,那么也可将源文件的第一行设置为:
#define _POSIX_SOURCE 1
另一个功能测试宏是:_ _STDC_ _,它由符合ANSI C 标准的编译程序自动定义。
这样就允许我们编写ANSI C 编译程序和非ANSI C 编译程序都能编译的程序。
例如,一个头文件可能会是:
#ifdef __STDC__
void *myfunc(const char *, int);
#else
void *myfunc();
#endif

3. 试比较系统调用和库函数的区别(重点说明返回值和内存分配)。
system call 是用户访问内核系统服务的接口,使内核为调用线程执行某种特定的功能。
每个system call 在标准C 库中设置一个具有同样名字的函数。
用户进程用标准C 调用序列来调用这些函数,然后,函数又用系统所要求的技术调用相应的内核服务。
然后执行某个产生软中断进入内核的机器指令。是于平台相关的。
library function 是将system call进行封装后提供的接口。实际上,用户也可以定制自己的library function.
大体上,systerm call 实现内存的分配,library function 实现内存的管理。

1)library function在调用system call时,system call不会申请静态空间存放调用结果。Library function
应该申请动态空间,将地址作为参数传入。这时,system call将结果写在动态空间中。
2)library function在调用system call时,system call每次将结果放在固定的静态空间中。用户得到的返回值在静态空间中,
如果用户要多次调用该函数,则应申请动态空间,将返回值拷贝到动态空间中。在下次调用时,静态空间被重新赋值。
3)library function在调用system call时,system call每次都为用户进程申请动态空间,赋值,将动态空间地址返回给用户。
这种情况下,需要用户在使用完后,释放内存。
4. 简述Solaris的进程及两级线程模型,并说明概念-核心所支持的调度类。
进程是含有一个用户程序环境的抽象,包括虚存环境、程序所需资源以及至少一个执行线程。
每个进程中至少有一个轻量级线程,它是进程中每个内核线程的虚拟执行环境。
轻量级进程允许进程中的每个内核线程,获得与同一进程中的其他内核线程无关的系统调用。
虽然在统一进程内切换多个线程是不耗资源的,但线程的创建和消除却很耗资源。另外,进程中的内核线程要求有一个轻量级进程,它含有消耗内和资源的堆栈。
因此,在每个进程中增加了一级线程管理用户线程–二级线程模型。
见下图:

solaris的调度类有:
TS(分时)–它是进程和进程中所有内核线程的缺省调度类。他根据当前处理器的使用情况动态改变进程的优先级。
进程优先级和时间量在每个时钟滴答时,或在一个I/O引起睡眠后的唤醒期间,根据分时调度表计算。TS类的优先级由0-59。
IA(交互类,增强的TS类)–它是由桌面视窗系统使用得调度类。用来提高目的视窗中线程的优先级。
SYS(系统类)–内核线程使用的系统类。优先级60-99
RT(实时类)–用于实现固定的优先级、固定的时间量调度。优先级100-159
5. 当使用vfork()创建的新进程(没有调用exec或exec不成功)要退出时,我们一般调用_exit()函数,为什么?
v f o r k 用于创建一个新进程,而该新进程的目的是e x e c 一个新程序。v f o r k 与f o r k 一样都创建一个子进程,
但是它并不将父进程的地址空间完全复制到子进程中,因为子进程会立即调用e x e c (或e x i t ),
不过在子进程调用e x e c 或e x i t 之前,它在父进程的空间中运行。v f o r k 保证子进程先运行,在它调用e x e c 或e x i t 之后父进
程才可能被调度运行。
e x i t 和_ e x i t 函数用于正常终止一个程序:_ e x i t 立即进入内核,e x i t 则先执行一些清除处理(包括调用执行各终止处理程序,关闭所有标准I / O 流等),然后进入内核。
_ e x i t 并不执行标准I / O 缓存的刷新操作。
如果用e x i t 而不是_ e x i t ,它刷新开关闭了所有标准I / O 流,这包括标准输出。
虽然这是由子进程执行的,但却是在父进程的地址空间中进行的,所以所有受到影响的标准I/O FILE 对象都是在父进程中的。
6. 什么是“zombie”进程?在我们的程序中如何防止“zombie”进程?(试说出其中的三种方法)
一个已经终止、但是其父进程尚未对其进行善后处理(获取终止子进程的有关信息、释放它仍占用的资源)的进程被称为僵死进程(z o m b i e )。
避免z o m b i e 的方法:
(1)在S V R 4 中,如果调用s i g n a l 或s i g s e t 将S I G C H L D 的配置设置为忽略,则不会产生僵死子进程。另外,使用S V R 4 版的s i g a c t i o n ,则可设置S A _ N O C L D WA I T 标
志(见表1 0 – 5 )以避免子进程僵死。(10.7)
(2)调用f o r k两次。程序8 – 5 实现了这一点。
(3)用waitpid等待子进程返回.
7. 以下代码是不可靠信号处理的经典例子之一,试说明其中的问题(包括细节):

8. 在信号(Signal)处理中,我们必须注意两个重要的问题:可重启动的系统调用和可重入函数。试说明以下两个问题:
a) 在Solaris中如何设置可重启动的系统调用标志(提示:使用sigaction)。
b) 什么是异步事件安全(Asyn-signal safe)函数?举例说明异步事件不安全的函数(即一般在信号处理程序中不能调用的函数)。(例外,提醒大家:在信号处理程序中注意保存errono)。

9. 在使用Pthread时,典型的代码如下:
pthread_attr_init( &attr );/* initialize attr with default attributes */
pthread_attr_setscope( &attr, PTHREAD_SCOPE_SYSTEM );
pthread_create( &tid, &attr, start_func, arg );
说明以上代码中的PTHREAD_SCOPE_SYSTEM所代表的含义。

10. 在Solaris中,用于线程间同步的机制主要包括:POSIX互斥锁(Mutex Lock)、POSIX读写锁(read-write lock)、POSIX信号量(semaphore)和POSIX条件变量(condition variable)。试简要说明以上几种同步机制的主要用途和区别。

11. 在Solaris中,POSIX互斥锁主要用于线程间同步。说明POSIX互斥锁用于进程间同步时的主要步骤。(提示:使用系统调用mmap and ftruncate, 注意cleanup)。
◆ 互斥锁

互斥锁(mutex)使得某一确定时刻只有一个线程可以访问保护中的数据。

◆ 读/写锁

采用读写锁,允许多个线程同时读访问共享数据区,但是只能有一个线程写访问
共享数据区。

绝大多数设备驱动程序不使用读写锁。这种锁比互斥锁慢,仅当经常出现多个线
程需要同时读访问共享数据而同时较少有写访问时,才采用读写锁,互斥锁此时可能
导致写访问延迟。参看rwlock(9F)了解更多信息。

◆ 信号灯

信号灯也是设备驱动程序编写中一种可选的线程同步机制,参看semaphore(9F)
了解更多细节。

◆ 线程同步

除了需要保护共享数据区外,驱动程序经常需要保持多线程同步执行。

◆ 条件变量

条件变量是线程同步的标准形式,与互斥锁配合使用。互斥锁用于确保检查条件
变量时是原子的,如果被检查的条件变量无变化则线程阻塞,等待条件变量变化信号
的唤醒。必须调用cv_init(9F)初始化条件变量,调用cv_destroy(9F)摧毁条件变量。

注意:条件变量例程类似SunOS 4.1中的sleep()和wakeup()例程。
代码举例 使用互斥锁和条件变量

————————————————————————–
static int xxread ( dev_t dev, struct uio * uiop, cred_t * credp )
{
struct xxstate * xsp;


mutex_enter( &xsp->mu );
while ( xsp->busy )
{
cv_wait( &xsp->cv, &xsp->mu );
}
xsp->busy = 1;
mutex_exit( &xsp->mu );
perform the data access
} /* end of xxread */

static u_int xxintr ( caddr_t arg )
{
struct xxstate * xsp = ( struct xxstate * )arg;

mutex_enter( &xsp->mu );
xsp->busy = 0;
cv_broadcast( &xsp->cv );
mutex_exit( &xsp->mu );
} /* end of xxintr */
————————————————————————–
12. 编写一个小程序,输入参数为一个文件名,它的功能描述如下:
a) 测试此文件是否为符号连接;如果不是,则打印错误信息后退出;
b) 读出此符号连接所指目标文件的文件名;
c) 测试此符号连接所指目标文件是否存在于文件系统中。
(提示:使用lstat, readlink)。

13. 说明基于TCP协议的服务器和客户端的主要步骤,重点阐明服务器和客户端的配合关系。(提示:可以使用时序图标明配合关系)。

Tags in this post...

面试题 相关文章推荐
面向对象编程的优势是什么
Dec 17 面试题
华为C++笔试题
Aug 05 面试题
写出SQL四条最基本的数据操作语句(DML)
Dec 12 面试题
.NET remoting中对象激活的两种方式
Jun 08 面试题
如何在.net Winform里面显示PDF文档
Sep 11 面试题
盛大二次面试题
Nov 18 面试题
this关键字的含义
Apr 08 面试题
Linux文件操作命令都有哪些
Jul 23 面试题
亿企通软件测试面试题
Apr 10 面试题
当当网软件测试笔试题
Nov 24 面试题
EJB的激活机制
Oct 25 面试题
四种会话跟踪技术
May 20 面试题
某/etc/fstab文件中的某行如下: /dev/had5 /mnt/dosdata msdos defaults,usrquota 1 2 请解释其含义
Apr 11 #面试题
在对linux系统分区进行格式化时需要对磁盘簇(或i节点密度)的大小进行选择,请说明选择的原则
Jan 13 #面试题
linux下进程间通信的方式
Jan 23 #面试题
linux系统都有哪些运行级别
Mar 26 #面试题
什么是符号链接,什么是硬链接?符号链接与硬链接的区别是什么?
May 03 #面试题
Linux内核产生并发的原因
Nov 08 #面试题
Linux如何为某个操作添加别名
Feb 05 #面试题
You might like
最令PHP初学者头痛的十四个问题
2006/07/12 PHP
PHP7.1实现的AES与RSA加密操作示例
2018/06/15 PHP
PHP设计模式之委托模式定义与用法简单示例
2018/08/13 PHP
使用Laravel中的查询构造器实现增删改查功能
2019/09/03 PHP
基于jquery的返回顶部效果(兼容IE6)
2011/01/17 Javascript
eval与window.eval的差别分析
2011/03/17 Javascript
原始的js代码和jquery对比体会
2013/09/10 Javascript
JS和JQUERY获取页面大小,滚动条位置,元素位置(示例代码)
2013/12/14 Javascript
用js提交表单解决一个页面有多个提交按钮的问题
2014/09/01 Javascript
js库Modernizr的介绍和使用
2015/05/07 Javascript
JavaScript编写页面半透明遮罩效果的简单示例
2016/05/09 Javascript
对javascript继承的理解
2016/10/11 Javascript
Vuex和前端缓存的整合策略详解
2017/05/09 Javascript
如何通过非数字与字符的方式实现PHP WebShell详解
2017/07/02 Javascript
Vue上传组件vue Simple Uploader的用法示例
2017/08/25 Javascript
ExtJs整合Echarts的示例代码
2018/02/27 Javascript
javascript使用正则实现去掉字符串前面的所有0
2018/07/23 Javascript
React+Antd+Redux实现待办事件的方法
2019/03/14 Javascript
用Vue编写抽象组件的方法
2019/05/06 Javascript
自动化Nginx服务器的反向代理的配置方法
2015/06/28 Python
python开发中module模块用法实例分析
2015/11/12 Python
对python:threading.Thread类的使用方法详解
2019/01/31 Python
python3 property装饰器实现原理与用法示例
2019/05/15 Python
FFrpc python客户端lib使用解析
2019/08/24 Python
使用PyTorch实现MNIST手写体识别代码
2020/01/18 Python
基于Python3.6中的OpenCV实现图片色彩空间的转换
2020/02/03 Python
俄罗斯品牌服装和鞋子的在线商店:KUPIVIP
2019/10/27 全球购物
为什么要有struct关键字
2012/05/08 面试题
do you have any Best Practice for testing
2016/06/04 面试题
Ajxa常见问题都有哪些
2014/03/26 面试题
大学自主招生自荐信
2013/12/16 职场文书
小学生开学第一课活动方案
2014/03/27 职场文书
工作岗位职责范本
2015/02/15 职场文书
详解MySQL中的pid与socket
2021/06/15 MySQL
浅谈mysql哪些情况会导致索引失效
2021/11/20 MySQL
Python first-order-model实现让照片动起来
2022/06/25 Python