没有合适的资源?快使用搜索试试~ 我知道了~
首页Linux系统下的高效多线程编程入门
在Linux系统下的多线程编程入门中,本文档探讨了多线程技术在现代操作系统中的应用和优势。虽然进程概念在早期就已经存在,但多线程的引入是为了提供更为高效的多任务处理方式。相比于传统的进程,线程有以下几个显著特点: 1. 资源节省:在Linux系统中,每个新进程需要独立的地址空间,消耗大量资源。相比之下,线程共享同一进程的地址空间,启动线程所需的内存空间远少于创建进程,同时线程之间的切换时间较短,提高了系统的资源利用率。 2. 方便的通信:线程间的通信更为直接,由于它们共享数据空间,数据传递不再是通过通信机制,而是直接访问,这大大减少了时间和复杂性。然而,这也意味着需要特别注意线程安全问题,如同步和互斥访问,以防止数据冲突。 3. 提高响应性:多线程对于需要高交互性的图形用户界面特别有用。通过将耗时操作放入独立线程,主线程能够保持活跃,即使长时间运行的任务不会阻塞用户界面的响应。 4. 利用多CPU:在多CPU系统中,多线程技术可以充分利用硬件资源。当线程数量不超过CPU数量时,操作系统会自动将线程分发到不同的处理器上,提高整体性能。 5. 优化程序结构:复杂的进程可以通过分解为多个线程,每个线程负责特定功能,从而简化程序设计,易于理解和维护。 Linux系统下的多线程编程为开发者提供了高效、灵活和响应迅速的编程手段,但在实际应用中,理解和处理好线程同步、互斥和数据一致性问题是至关重要的。学习和掌握多线程编程技巧是提高Linux应用程序性能和可扩展性的重要步骤。
资源详情
资源推荐
![](https://csdnimg.cn/release/download_crawler_static/88048994/bg10.jpg)
16
PRINTF(2,3);
extern char *hoed_buf_strcat(hoed_buf_t *, const char *append);
extern char *hoed_buf_cat_sprintf(hoed_buf_t *, const char *format, ...)
PRINTF(2,3);
#endif /* HOED_BUF_H */
称为杀手级的 Linux 应用程序
对 Murray 来说,有两个杀手级的 Linux 应用程序: Emacs 和 Netscape Navigator 。
“ Emacs 或许是给人印象最深而且广为应用的基于 Linux 的应用程序 ” ,他说。 “ 另一个是
Netscape Navigator 。 有一次 , 我们要支持 20 多种 UNIX , 我在 Linux 上完成了所有的工作 ”
。
他继续说, “ 有趣的是,基于 Linux 的应用程序可能运行于许多不同风格的 UNIX 系
统上,甚至安装了 Cygwin 的 Windows 系统。 ”
Linux 的未来如何 ?
当前 , Murray 正在进行的 Linux 项目有好几个 , 从支持电子邮件 、 消息和共享数据库
的分布式办公应用程序到使用标准工具的网络应用程序 ( 标准工具包括 : Apache/Tomcat, PHP,
PostgreSQL, MySQL, 和 Linux) 。 Murray 有他自己的公司专门为网络服务和网络应用提供
主机服务。
对 Murray 来说,得益于 Linux 强大功能的应用程序的列表在不断地增长。 “ 有很多 ”
,
他说。 “ Oracle, WebSphere, Apache, PostgresQL, MySQL, Cyrus IMAP... 这个列表很长而且在
不断增长。 ”
对 Murray 来说, Linux 到此为止了。 “ 我们所有的服务器都运行 Linux ;不管目标平
台如何 , 我们主要的开发都在 Linux 上进行 ; 我们把 Linux 推荐给用户来运行服务器应用
程序 ” , 他说 。 “ Linux 快速发展的步伐 , 开放源代码组织对它的广泛支持 , 低廉的开发费用
,
如果把这些结合在一起,您就知道它是一个难以击败的平台 ” 。
深入浅出 Linux
Linux
Linux
Linux 设备驱动编程之引言
2006-10-16 13:00 作者: 宋宝华 出处: 天极开发 责任编辑: 方舟
相关专题: Linux 设备驱动程序开发入门
目前, Linux 软件工程师大致可分为两个层次:
( 1 ) Linux 应用软件工程师 ( Application Software Engineer ) : 主要利用 C 库函数和 Linux AP I
进行应用软件的编写;
( 2 ) Linux 固件工程师 ( Firmware Engineer ) :主要进行 Bootloader 、 Linux 的移植及 Linu x
设备驱动程序的设计。
一般而言 , 固件工程师的要求要高于应用软件工程师的层次 , 而其中的 Linux 设备驱动
编程又是 Linux 程序设计中比较复杂的部分 ,究其原因,主要包括如下几个方面:
( 1 )设备驱动属于 Linux 内核的部分,编写 Linux 设备驱动需要有一定的 Linux 操作系统
内核基础;
( 2 )编写 Linux 设备驱动需要对硬件的原理有相当的了解,大多数情况下我们是针对一个
特定的嵌入式硬件平台编写驱动的;
( 3 ) Linux 设备驱动中广泛涉及到多进程并发的同步、互斥等控制,容易出现 bug ;
( 4 ) 由于属于内核的一部分, Linux 设备驱动的调试也相当复杂。
![](https://csdnimg.cn/release/download_crawler_static/88048994/bg11.jpg)
17
目前 , 市面上的 Linux 设备驱动程序参考书籍非常稀缺 , 少有的经典是由 Linux 社区的
三位领导者 Jonathan Corbet 、 Alessandro Rubini 、 Greg Kroah-Hartman 编写的《 Linux Device
Drivers 》 ( 目前该书已经出版到第 3 版 , 中文译本由中国电力出版社出版 ) 。 该书将 Linux 设
备驱动编写技术进行了较系统的展现 , 但是该书所列举实例的背景过于复杂 , 使得读者需要
将过多的精力投放于对例子背景的理解上 , 很难完全集中精力于 Linux 驱动程序本身 。 往往
需要将此书翻来覆去地研读许多遍,才能有较深的体会。
( 《 Linux Device Drivers 》中英文版封面)
本文将仍然秉承 《 Linux Device Drivers 》 一书以实例为主的风格 , 但是实例的背景将非
常简单,以求使读者能将集中精力于 Linux 设备驱动本身,理解 Linux 内核模块、 Linux 设
备驱动的结构、 Linux 设备驱动中的并发控制等内容。另外,与《 Linux Device Drivers 》所
不同的是 , 针对设备驱动的实例 , 本文还给出了用户态的程序来访问该设备 , 展现设备驱动
的运行情况及用户态和内核态的交互。相信阅读完本文将为您领悟《 Linux Device Drivers
》
一书中的内容打下很好的基础。
本文中的例程除引用的以外皆由笔者亲自调试通过 , 主要基于的内核版本为 Linux 2.4
,
例子要在其他内核上运行只需要做少量的修改。
构建本文例程运行平台的一个较好方法是:在 Windows 平台上安装 VMWare 虚拟机,
并在 VMWare 虚拟机上安装 Red Hat 。 注意安装的过程中应该选中 " 开发工具 " 和 " 内核开发 "
二项 ( 如果本文的例程要在特定的嵌入式系统中运行 , 还应安装相应的交叉编译器 , 并包含
相应的 Linux 源代码 ) ,如下图:
![](https://csdnimg.cn/release/download_crawler_static/88048994/bg12.jpg)
18
深入浅出 Linux
Linux
Linux
Linux 设备驱动编程之内核模块
2006-10-17 15:36 作者: 宋宝华 出处: 天极开发 责任编辑: 方舟
相关专题: Linux 设备驱动程序开发入门
Linux 设备驱动属于内核的一部分, Linux 内核的一个模块可以以两种方式被编译和加
载:
( 1 )直接编译进 Linux 内核,随同 Linux 启动时加载;
( 2 )编译成一个可加载和删除的模块,使用 insmod 加载( modprobe 和 insmod 命令类似
,
但依赖于相关的配置文件 ) , rmmod 删除 。 这种方式控制了内核的大小 , 而模块一旦被插入
内核,它就和内核其他部分一样。
下面我们给出一个内核模块的例子:
![](https://csdnimg.cn/release/download_crawler_static/88048994/bg13.jpg)
19
#include <linux/module.h> // 所有模块都需要的头文件
#include <linux/init.h> // init&exit 相关宏
MODULE_LICENSE("GPL");
static int __init hello_init (void)
{
printk("Hello module init\n");
return 0;
}
static void __exit hello_exit (void)
{
printk("Hello module exit\n");
}
module_init(hello_init);
module_exit(hello_exit);
分析上述程序, 发现一个 Linux 内核模块需包含模块初始化和模块卸载函数,前者 在
insmod 的时候运行,后者在 rmmod 的时候运行。 初始化与卸载函数必须在宏 module_ini t
和 module_exit 使用前定义,否则会出现编译错误。
程序中的 MODULE_LICENSE("GPL") 用于声明模块的许可证。
如果要把上述程序编译为一个运行时加载和删除的模块,则编译命令为:
gcc -D__KERNEL__ -DMODULE -DLINUX -I /usr/local/src/linux2.4/include -c -o
hello.o hello.c
由此可见, Linux 内核模块的编译需要给 gcc 指示 -D__KERNEL__ -DMODULE
-DLINUX 参数 。 -I 选项跟着 Linux 内核源代码中 Include 目录的路径。
下列命令将可加载 hello 模块:
insmod ./hello.o
下列命令完成相反过程:
rmmod hello
如果要将其直接编译入 Linux 内核 , 则需要将源代码文件拷贝入 Linux 内核源代码的相
应路径里,并修改 Makefile 。
我们有必要补充一下 Linux 内核编程的一些基本知识:
内存
在 Linux 内核模式下 ,我们不能使用用户态的 malloc() 和 free() 函数申请和释放内存 。 进
行内核编程时, 最常用的内存申请和释放函数为在 include/linux/kernel.h 文件中声明 的
kmalloc() 和 kfree() ,其原型为:
void *kmalloc(unsigned int len, int priority);
void kfree(void *__ptr);
![](https://csdnimg.cn/release/download_crawler_static/88048994/bg14.jpg)
20
kmalloc 的 priority 参数通常设置为 GFP_KERNEL ,如果在中断服务程序里申请内存则
要用 GFP_ATOMIC 参数,因为使用 GFP_KERNEL 参数可能会引起睡眠,不能用于非进程
上下文中(在中断中是不允许睡眠的 ) 。
由于内核态和用户态使用不同的内存定义,所以二者之间不能直接访问对方的内存 。 而
应该使用 Linux 中的用户和内核态内存交互函数 (这些函数在 include/asm/uaccess.h 中被声
明 ) :
unsigned long copy_from_user (void *to, const void *from, unsigned long n);
unsigned long copy_to_user (void * to, void * from, unsigned long len);
copy_from_user 、 copy_to_user 函数返回不能被复制的字节数,因此,如果完全复制成
功,返回值为 0 。
include/asm/uaccess. h 中定义 的 put_use r 和 get_use r 用于内核空间和用户空间的单值交互
(如 char 、 int 、 long ) 。
这里给出的仅仅是关于内核中内存管理的皮毛,关于 Linux 内存管理的更多细节知识
,
我们会在本文第 9 节《内存与 I/O 操作》进行更加深入地介绍。
输出
在内核编程中 ,我们不能使用用户态 C 库函数中的 printf() 函数输出信息,而 只能使 用
printk() 。但是,内核中 printk() 函数的设计目的并不是为了和用户交流,它实际上是内核的
一种日志机制,用来记录下日志信息或者给出警告提示。
每个 printk 都会有个优先级 , 内核一共有 8 个优先级 , 它们都有对应的宏定义 。 如果未
指定优先级,内核会选择默认的优先级 DEFAULT_MESSAGE_LOGLEVEL 。如果优先级数
字比 int console_loglevel 变量小的话 , 消息就会打印到控制台上 。 如果 syslogd 和 klogd 守护
进程 在运行的话 , 则不管是否向控制台输出 , 消息都会被追加进 /var/log/messages 文件 。 klogd
只处理内核消息, syslogd 处理其他系统消息 ,比如应用程序。
模块参数
2.4 内核下, include/linux/module.h 中定义的宏 MODULE_PARM(var,type) 用于向模块
传递命令行参数。 var 为接受参数值的变量名, type 为采取如下格式的字符串
[min[-max]]{b,h,i,l,s} 。 min 及 max 用于表示当参数为数组类型时 , 允许输入的数组元素的个
数范围; b : byte ; h : short ; i : int ; l : long ; s : string 。
在装载内核模块时,用户可以向模块传递一些参数:
insmod modname var=value
如果用户未指定参数, var 将使用模块内定义的缺省值。
深入浅出 Linux 设备驱动之字符设备驱动程序
2006-10-18 13:51 作者: 宋宝华 出处: 天极软件 责任编辑: 方舟
相关专题: Linux 设备驱动程序开发入门
Linux 下的设备驱动程序被组织为一组完成不同任务的函数的集合 , 通过这些函数使 得
Windows 的设备操作犹如文件一般 。 在应用程序看来 , 硬件设备只是一个设备文件 , 应用程
序可以象操作普通文件一样对硬件设备进行操作 , 如 open () 、 close () 、 read () 、 write () 等
。
Linux 主要将设备分为二类 : 字符设备和块设备 。 字符设备是指设备发送和接收数据以字符
的形式进行;而块设备则以整个数据缓冲区的形式进行。字符设备的驱动相对比较简单。
剩余170页未读,继续阅读
![.exe](https://img-home.csdnimg.cn/images/20210720083646.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://profile-avatar.csdnimg.cn/5d3d17b770eb4c6785682f01b138d5bc_z9894.jpg!1)
悠闲饭团
- 粉丝: 168
- 资源: 3329
上传资源 快速赚钱
我的内容管理 收起
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
会员权益专享
最新资源
- 利用迪杰斯特拉算法的全国交通咨询系统设计与实现
- 全国交通咨询系统C++实现源码解析
- DFT与FFT应用:信号频谱分析实验
- MATLAB图论算法实现:最小费用最大流
- MATLAB常用命令完全指南
- 共创智慧灯杆数据运营公司——抢占5G市场
- 中山农情统计分析系统项目实施与管理策略
- XX省中小学智慧校园建设实施方案
- 中山农情统计分析系统项目实施方案
- MATLAB函数详解:从Text到Size的实用指南
- 考虑速度与加速度限制的工业机器人轨迹规划与实时补偿算法
- Matlab进行统计回归分析:从单因素到双因素方差分析
- 智慧灯杆数据运营公司策划书:抢占5G市场,打造智慧城市新载体
- Photoshop基础与色彩知识:信息时代的PS认证考试全攻略
- Photoshop技能测试:核心概念与操作
- Photoshop试题与答案详解
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)