关于驱动中的并发
来源:互联网 发布:健身社交软件 编辑:程序博客网 时间:2024/06/03 07:11
内核编程中,我们不能使用用户态的c库函数的printf()函数输出信息,而只能使用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为字符串;
进程驱动中的并发控制
当多个线程同时访问相同的资源时(驱动程序中的全局变量是一种典型的共享资源,可能会引发竞态,因此我们必须对共享资源进行并发控制;最常用的解决并发控制的方法是自旋锁和信号量;
与信号量有关的API:
定义信号量: struct semaphore sem;
初始化信号量 void sema_init(struct semaphore *sem,int val); //初始化信号量,并设置信号量sem的值为val;
初始化互斥锁void init_MUTEX(struct semaphore *sem);//这个函数用来初始化一个互斥锁,但它把信号量sem的值设置为1,等同于sema_init(struct semaphore *sem,1)
初始化互斥锁:void init_MUTEX_LOCKED(struct semaphore *sem);//该函数也用于初始化一个互斥锁,但它把信号量sem的值设置为0,等同于sema_init(struct semaphore *sem,0);
获得信号量:void down(struct semaphore * sem);//该函数用于获得信号量sem,它会导致睡眠,因此不能在中断上下文长期使用
int down_interruptible(struct semaphore *sem);//该函数功能与down类似,不同之处为down不能被信号打断,但 down_interruptible能被信号打断;
int down_trylock(struct semaphore *sem);//该函数尝试获得信号量sem,如果能够立刻获得,它就获得该信号量并返回0,否则,返回非0值,它不会导致调用者睡眠,可以在中断上下文使用;
释放信号量 void up(struct semaphore *sem);//该函数释放信号量sem,唤醒等待者
与自旋锁有关的API主要有:
定义自旋锁:spinlock_t spin;
初始化自旋锁:spin_lock_init(lock); //该宏用于动态初始化自旋锁lock
获得自旋锁:spin_lock(lock);//该宏用于获得自旋锁lock,如果能够立即获得自旋锁,它马上返回,否则,它将自旋在那里,直到该自旋锁的持有者释放
spin_trylock(lock);//该宏尝试获得自旋锁lock,如果能立即获得锁,它获得并返回真,否则立即返回假,实际上,可以不再原地打转了
释放自旋锁:spin_unlock(lock);//该宏释放自旋锁lock,它与spin_trylock或spin_lock配对使用
int register_chrdev(unsigned int major,const char * name,struct file_operations *fops);//注册字符设备,如果major!=0表示系统静态分配注册设备号,=0表示动态分配注册设备号,major:主设备号,name为设备名,fops表示包含基本函数入口的设备结构体
如何实现阻塞操作;
在执行设备操作时,若不能获取资源,则进程挂起直到满足可操作的条件再进行操作,非阻塞操作的进程在不能进行设备操作时,并不挂起。
被挂起的进程进入sleep状态,被从调度器的运行队列移走,直到等待的进程被满足;
我们可以通过等待队列(wait queue)来实现阻塞操作,它以队列为基础数据结构,与进程调度机制紧密结合,能够用于实现核心的异步事件通知机制,
等待队列可以用来同步对系统资源的访问,
- 关于驱动中的并发
- linux驱动中的并发控制
- LINUX驱动中的并发控制
- Linux驱动中的并发控制
- 设备驱动中的并发控制
- Linux设备驱动中的并发
- 关于性能测试中的并发
- Linux设备驱动中的并发控制
- Linux设备驱动中的并发控制
- Linux 设备驱动中的并发控制
- linux设备驱动中的并发控制
- Linux设备驱动中的并发控制
- 4.设备驱动中的并发控制
- Linux设备驱动中的并发控制总结
- linux设备驱动中的并发控制
- Linux设备驱动中的并发控制
- linux驱动法度中的并发把握
- linux设备驱动中的并发控制
- C# 对象的序列化与反序列化
- 面试笔记11(操作系统基础)(需完善)
- WebView---Android中webview和js之间的交互
- 《C++primer》第五版 第四章 第五章 笔记
- 如何实现基于MFC对话框的PCL显示(1)
- 关于驱动中的并发
- iframe的contentWindow属性使用
- 日经春秋 20150604
- PHP根据两点间的经纬度计算距离
- 分享一个开源的流程图绘制软件--Diagram Designer
- Dom4j读取XML文件时遇到的一个问题(关于DTD)
- 赛马问题
- php中的传值赋值,引用赋值
- spring源码程序