首页 | 资讯动态 | linux基础 | 系统管理 | 网络管理 | 编程开发 | linux数据库 | 服务器技术 | linux相关 | linux认证 | 嵌入式 | 下载中心 | 专题 | linux招聘 | 镜像站
OKLinux中文技术站
·设为首页
·加入收藏
·联系我们
系统管理: 中文环境 系统管理 桌面应用 内核技术 | Linux基础: 基础入门 安装配置 常用命令 经验技巧 软件应用 | Linux数据库: Mysql Postgre Oracle DB2 Sybase other
网络管理: 网络安全 网络应用 Linux服务器 环境配置 黑客安全 | 编程开发: PHP CC++ Python Perl Shell 嵌入式开发 java jsp | PHP技术: PHP基础 PHP技巧 PHP应用 PHP文摘
Linux资讯 Linux招聘 Linux专题 Apache | Linux相关: 硬件相关 Linux解决方案 Linux认证 企业应用 其它Unix | 相关下载: 资料下载 参考手册 开发工具 服务器类 软路由 其它
 技术搜索:
会员中心 注册会员 高级搜索  
  → 当前位置:首页>网络管理>linux服务器>正文

Linux系统下实现多线程客户/服务器

http://www.oklinux.cn  2006-10-25  来源: ChinaITLab收集整理   会员收藏  游客收藏  【 】 

在传统的Unix模型中,当一个进程需要由另一个实体执行某件事时,该进程派生(fork)一个子进程,让子进程去进行处理。Unix下的大多数网络服务器程序都是这么编写的,即父进程接受连接,派生子进程,子进程处理与客户的交互。

虽然这种模型很多年来使用得很好,但是fork时有一些问题:

1. fork是昂贵的。内存映像要从父进程拷贝到子进程,所有描述字要在子进程中复制等等。目前有的Unix实现使用一种叫做写时拷贝(copy-on-write)的技术,可避免父进程数据空间向子进程的拷贝。尽管有这种优化技术,fork仍然是昂贵的。

2. fork子进程后,需要用进程间通信(IPC)在父子进程之间传递信息。Fork之前的信息容易传递,因为子进程从一开始就有父进程数据空间及所有描述字的拷贝。但是从子进程返回信息给父进程需要做更多的工作。

线程有助于解决这两个问题。线程有时被称为轻权进程(lightweight process),因为线程比进程“轻权”,一般来说,创建一个线程要比创建一个进程快10~100倍。

一个进程中的所有线程共享相同的全局内存,这使得线程很容易共享信息,但是这种简易性也带来了同步问题。

一个进程中的所有线程不仅共享全局变量,而且共享:进程指令、大多数数据、打开的文件(如描述字)、信号处理程序和信号处置、当前工作目录、用户ID和组ID。但是每个线程有自己的线程ID、寄存器集合(包括程序计数器和栈指针)、栈(用于存放局部变量和返回地址)、error、信号掩码、优先级。在Linux中线程编程符合Posix.1标准,称为Pthreads。所有的pthread函数都以pthread_开头。以下先讲述5个基本线程函数,在调用它们前均要包括pthread.h头文件。然后再给出用它们编写的一个TCP客户/服务器程序例子。

第一个函数:

int pthread_create 
(pthread_t *tid,const pthread_attr_t *attr,void *
      (*func)(void *),void *arg);

一个进程中的每个线程都由一个线程ID(thread ID)标识,其数据类型是pthread_t(常常是unsigned int)。如果新的线程创建成功,其ID将通过tid指针返回。

每个线程都有很多属性:优先级、起始栈大小、是否应该是一个守护线程等等,当创建线程时,我们可通过初始化一个pthread_attr_t变量说明这些属性以覆盖缺省值。我们通常使用缺省值,在这种情况下,我们将attr参数说明为空指针。

最后,当创建一个线程时,我们要说明一个它将执行的函数。线程以调用该函数开始,然后或者显式地终止(调用pthread_exit)或者隐式地终止(让该函数返回)。函数的地址由func参数指定,该函数的调用参数是一个指针arg,如果我们需要多个调用参数,我们必须将它们打包成一个结构,然后将其地址当作唯一的参数传递给起始函数。

在func和arg的声明中,func函数取一个通用指针(void *)参数,并返回一个通用指针(void *),这就使得我们可以传递一个指针(指向任何我们想要指向的东西)给线程,由线程返回一个指针(同样指向任何我们想要指向的东西)。调用成功,返回0,出错时返回正Exxx值。Pthread函数不设置errno。

第二个函数:

int pthread_join(pthread_t tid,void **status);

该函数等待一个线程终止。把线程和进程相比,pthread_creat类似于fork,而pthread_join类似于waitpid。我们必须要等待线程的tid,很可惜,我们没有办法等待任意一个线程结束。如果status指针非空,线程的返回值(一个指向某个对象的指针)将存放在status指向的位置。

第三个函数:

pthread_t pthread_self(void);

线程都有一个ID以在给定的进程内标识自己。线程ID由pthread_creat返回,我们可以pthread_self取得自己的线程ID。

第四个函数:

int pthread_detach(pthread_t tid);

线程或者是可汇合的(joinable)或者是脱离的(detached)。当可汇合的线程终止时,其线程ID和退出状态将保留,直到另外一个线程调用pthread_join。脱离的线程则像守护进程:当它终止时,所有的资源都释放,我们不能等待它终止。如果一个线程需要知道另一个线程什么时候终止,最好保留第二个线程的可汇合性。Pthread_detach函数将指定的线程变为脱离的。该函数通常被想脱离自己的线程调用,如:pthread_detach (pthread_self ( ));

 

[1] [2] [3] 下一页  

共7页: 上一页 1 [2] [3] [4] [5] [6] [7] 下一页

上一篇:指导:Linux服务器集群技术概述   下一篇:RedHatAS4 WEB服务及虚拟主机配置指南


收藏于收藏夹】 【评论】 【推荐】 【打印】 【关闭
相关文档
·RedHatAS4 WEB服务及虚拟主机配置指南
·指导:Linux服务器集群技术概述
·UBUNTU里架设SquirrelMail邮件服务器
·超全的NFS server教程手册
·ldap大容量邮件系统数据库应用指南
·Web站点崩溃的原因总结
·简单架设Jabber 局域网即时通讯服务器
·FreeBSD 6.0-下建立高速DNS缓存服务器
·实例教你在Linux下建立代理服务器
·Linux系统中搭建LAMP动态博客网站
·Linux服务器存储空间巧妙管理
·手把手教你配Liunx流媒体服务器(上)
·Linux中建立安全的ProFTPD应用经验谈
·Linux NFS(网络文件系统)服务器性能优化
·浅析Apache服务器中SSI和CGI设定方法
·用gnump3d架设流体服务器
发表评论
密码: 匿名评论
评论内容:

(不超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规)
 
  最新文档
·Linux下NTOP的安装过程
·SUSE 10.1下安装配置Tomcat服务器
·Linux与Windows下Samba设置实例解析
·Linux环境下配置OPENVZ 虚拟机实例讲解
·在Windows下远程关掉Linux主机
·Ubuntu下通过SSH远程登录服务器的方法
·Linux平台下安装配置Tor中继服务器过程
·SUSE 10下安装PHP MySQL Apache(英文
·Ubuntu下安装tftp服务器的步骤
·Debian安装LAMP网络开发平台
·Linux主机限制用户进程CPU占用率
·用NTOP监控Linux服务器网络状态
  阅读排行
·详解远程SHELL下安装配置RedHat ES 5的
·Linux服务器存储空间巧妙管理
·安装大型Linux集群(4):节点安装和 GPFS
·LVS集群学习笔记(NAT\DR\IP tunnel)
·Xen和虚拟化技术学习指南
·Linux系统邮件服务器常见错误报告列表
·基于Linux的集群环境构建过程
·在Linux上用LVS搭建负载均衡的集群服务
·在AS4上架设QMAIL+反病毒垃圾模块的方
·linux下文件服务Vsftp详细介绍
·安装大型Linux集群(1): 简介和硬件配置
·RedHatAS4 WEB服务及虚拟主机配置指南
·Linux小型日程表挑战大型群件
·安装大型Linux集群(3):存储和共享文件
·UBUNTU里架设SquirrelMail邮件服务器
网摘收藏: