从 Solaris 向 Linux on POWER 迁移指南(4)

来源:developworks 作者:developworks
  

GNU Make 与 Solaris Make

如果在源平台中使用 Solaris Make,为了在 Linux 中使用 GNU Make,需要修改 makefile。要获得 Solaris Make 和 GNU Make 之间差别的详细信息,请参阅 IBM 红皮书 “AIX 5L Porting Guide” 的第 6 章。

编译器选项

表 6 列出了 SUN Studio C/C++ 编译器广泛使用的编译器选项,以及 GNU Compiler Collection 和 IBM XL 编译器的等同选项:


表 6. 编译器选项

Sun Studio 选项 GNU GCC 选项 XL C/C++ 选项 说明
-# -v -v 指示编译器报告编译进度信息
-### -### -# 跟踪编译,而不调用任何东西
-dn -static -qstaticlink 指定静态链接
-dy (Default) (Default) 指定动态链接
-G -shared -qmkshrobj 生成共享对象,而不是生成动态链接可执行程序
-xmemalign -malign-natural、
-malign-power
-qalign 指定最大假定内存对齐(memory alignment),以及未对齐数据访问的行为
-xO1、-xO2、-xO3、-xO4、-xO5 -O、-O2、-O3 -O、-O2、-O3、-O4、-O5 编译过程中在所有级别上优化代码
-KPIC -fPIC -qpic=large 生成位置无关代码以用于共享库中(大模型)
-Kpic -fpic -qpic=small 生成位置无关代码以用于共享库中(小模型)
-mt -pthread Use _r invocation mode 编译和链接多线程代码
-R dirlist -Wl、-rpath、dirlist -Wl、-rpath、dirlist 构建可执行文件的动态库搜索路径
-xarch -mcpu、-march -qarch、-qtune 指定目标架构指令集合

XL C/C++ 编译器支持 GNU 编译器选项的一部分,从而有利于移植使用 GCC 和 g++ 编译器开发的应用程序。将 gxlc 或 gxlc++ 调用命令与 GNU 编译器选项一起使用来启用该支持。这些调用命令使用纯文本配置文件来控制 GNU-to-XL C/C++ 选项映射和默认值。您可以根据需求更改这些配置文件。参考 XL 编译器手册更多地了解 gxlc 和 gxlc++。

Solaris 线程和 NPTL

这一节将说明开发人员将多线程应用程序从 Solaris 迁移到 Linux 时会遇到的问题。

Solaris 支持两种线程实现:Solaris 线程和 POSIX 线程(pthreads)。有一些函数由 Solaris 线程 API 实现,而不是由 pthreads API 实现,反之亦然。对于那些符合以上情况的函数,关联的参数可能不符合。下列是仅受 Solaris 线程 API 支持的特性:

  • 创建守护进程线程的能力。守护进程线程不影响进程退出状态。进程可以通过调用 exit() 退出,也可以通过让进程中的每个非守护进程线程调用 thr_exit() 来退出。
  • 使用 thr_suspend() 和 thr_continue() 来暂停或继续线程执行的能力。注意 thr_suspend() 可以暂停目标线程,而不涉及线程可能拥有的锁。如果暂停线程调用某一个函数,而该函数需要已暂停的目标线程所拥有的锁,那么就会出现死锁。
  • 允许线程等待进程中任何未检验出的线程终止的能力。当 thr_join() 的第一个参数设为 0 时就会这样。如果将 pthread_join() 的第一个参数设为 0,程序将因段错误而终止。

表 7 将关键 Solaris 线程函数与 pthreads 函数进行了比较。对于其他 Solaris 线程函数,请参阅 SUN 的 “Multithreaded Porting Guide”(见 参考资料)。


表 7. 线程和 pthreads 函数

Solaris 线程 API Linux POSIX 线程 API 说明
thr_create() pthread_create() 创建新的控制线程
thr_exit() pthread_exit() 终止执行调用线程
thr_join() pthread_join() 暂停调用线程,直到目标线程完成
thr_kill() pthread_kill() 向其他线程发送信号
thr_self() pthread_self() 返回调用进程的线程 ID
thr_yield() sched_yield() 用其他线程替换当前线程
thr_getprio() pthread_getschedparam() 获取线程的优先级参数
thr_setprio() pthread_setschedparam() 修改线程的优先级参数
thr_getspecific() pthread_getspecific() 将新的线程特定值绑定到特定键
thr_setspecific() pthread_setspecific() 将新的线程特定值绑定到特定键
thr_getconcurrency() pthread_getconcurrency() 获取线程并发级别
thr_setconcurrency() pthread_setconcurrency() 设置线程并发级别
thr_sigsetmask() pthread_sigmask() 更改或检查调用线程的信号掩码
thr_keycreate() pthread_key_create() 创建确定线程特定数据的位置的键
N/A pthread_key_delete() 删除确定线程特定数据的位置的键
thr_suspend() N/A 暂停执行指定的线程
thr_continue() N/A 继续执行暂停的线程
fork1() fork() 常规分支
forkall() N/A 复制所有分支

在 Solaris 9 及其更早的版本中,fork() 的行为与 POSIX 线程中 fork() 的行为不同。在 POSIX 线程中,fork() 创建新的进程,复制子进程中的全部地址空间。不过,它只复制子进程中的调用线程。Solaris 线程 API 还提供复制所有分支语义的 forkall()。该函数复制子进程中的地址空间和所有线程。POSIX 线程标准不支持这个特性。

有一些 POSIX 线程例程在 Solaris 中可以实现,但在 Linux 中却无法实现,反之亦然。表 8 列出了这些例程:


表 8. POSIX 线程例程

例程 Solaris Linux
pthread_cond_reltimedwait_np y n
pthread_mutexattr_getrobust_np y n
pthread_mutexattr_setrobust_np y n
pthread_mutex_consistent_np y n
pthread_mutex_reltimedlock_np y n
pthread_rwlock_reltimedrdlock_np y n
pthread_rwlock_reltimedwrlock_np y n
pthread_attr_getaffinity_np n y
pthread_attr_setaffinity_np n y
pthread_cleanup_pop_restore_np n y
pthread_cleanup_push_defer_np n
时间:2009-10-19 21:24 来源:developworks 作者:developworks 原文链接

好文,顶一下
(1)
100%
文章真差,踩一下
(0)
0%
------分隔线----------------------------


把开源带在你的身边-精美linux小纪念品
无觅相关文章插件,快速提升流量