收集的一些Unix笔试题和面试题(二)

2014-11-23 23:17:05 · 作者: · 浏览: 10
ck)、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协议的服务器和客户端的主要步骤,重点阐明服务器和客户端的配合关系。(提示:可以使用时序图标明配合关系)。