易截截图软件、单文件、免安装、纯绿色、仅160KB

Linux内核中用于同步的几种机制集中起来分析

Linux内核中用于同步的几种机制集中起来分析,强调了它们之间在实现和使用上的不同。
  同步通常是为了达到多线程协同的目的而设计的一种机制,通常包含异步信号机制和互斥机制作为其实现的底层。在Linux 2.4内核中也有相应的技术实现,包括信号量、自旋锁、原子操作和等待队列,其中原子操作和等待队列又是实现信号量的底层。
  
  一. 等待队列和异步信号
  
  wait queue很早就作为一个基本的功能单位出现在Linux内核里了,它以队列为基础数据结构,与进程调度机制紧密结合,能够用于实现核心的异步事件通知机制。我们从它的使用范例着手,看看等待队列是如何实现异步信号功能的。
  
  在核心运行过程中,经常会因为某些条件不满足而需要挂起当前线程,直至条件满足了才继续执行。在2.4内核中提供了一组新接口来实现这样的功能,下面的代码节选自kernel/printk.c:
  
   unsigned long log_size;
  1: DECLARE_WAIT_QUEUE_HEAD(log_wait);...
  4: spinlock_t console_lock = SPIN_LOCK_UNLOCKED;...
   int do_syslog(int type,char *buf,int len){
   ...
  2: error=wait_event_interruptible(log_wait,log_size);
   if(error)
   goto out;
   ...
  5: spin_lock_irq(
   ...
   log_size--;
   ...
  6: spin_unlock_irq(
   ...
   }
   asmlinkage int printk(const char *fmt,...){
   ...
  7: spin_lock_irqsave(console_lock,flags);
   ...
   log_size++;...
  8: spin_unlock_irqrestore(
  3: wake_up_interruptible(log_wait);
   ...
   }
  
  这段代码实现了printk调用和syslog之间的同步,syslog需要等待printk送数据到缓冲区,因此,在2:处等待log_size非0;而printk一边传送数据,一边增加log_size的值,完成后唤醒在log_wait上等待的所有线程(这个线程不是用户空间的线程概念,而是核内的一个执行序列)。执行了3:的wake_up_interruptible()后,2:处的wait_event_interruptible()返回0,从而进入syslog的实际动作。
  
  1:是定义log_wait全局变量的宏调用。
  
  在实际操作log_size全局变量的时候,还使用了spin_lock自旋锁来实现互斥,关于自旋锁,这里暂不作解释,但从这段代码中已经可以清楚的知道它的使用方法了。
  
  所有wait queue使用上的技巧体现在wait_event_interrupt


相关文档:

Linux信号

from: http://cc.byexamples.com/20070520/tap-the-interrupt-signal/
When you hit control+c, you are actually send a SIGINT ( Interrupt signal ) to your program. By default, your program will be terminated after receiving SIGINT. But you can change the way of handling Interrupt signal.
Some of the a ......

Linux 内核编译步骤 (转)

下载新内核以后,先把Linux-2.6.18.2.tar.bz2 复制到/usr/src/ 的下面
tar –jxvf  Linux-2.6.18.2.tar.bz2 cd Linux-2.6.18.2 make mrproper 把原来编译产生的垃圾删除
配置内核可以根据需要与爱好使用下面命令中的一个:
#make config (基于文本的最为传统的配置界面)
#make menuconfig (基于文本 ......

一步一学Linux与Windows 共享文件Samba (v0.2b)

一步一学Linux与Windows 共享文件Samba (v0.2b)
作者:北南南北,正在增加中... ... 需要您的参与;
来自:LinuxSir.Org
简介:本文只是讲一讲我们最常用的Linux与Windows共享文件,主要是为新手指一指路。如何建立最简单的Samba服务器,并讲述遇到问题应该从何处寻找解决方案;正在更新之中,希望您的参加 ... ... 谢 ......

linux进程后台运行的几种方法


我们经常会碰到这样的问题,用 telnet/ssh 登录了远程的 Linux 服务器,运行了一些耗时较长的任务, 结果却由于网络的不稳定导致任务中途失败。如何让命令提交后不受本地关闭终端窗口/网络断开连接的干扰呢?下面举了一些例子, 您可以针对不同的场景选择不同的方式来处理这个问题。
nohup/setsid/&
场景:
如果只 ......

linux下,设置IP地址,重启机器有效

1. vi /etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=example.com
GATEWAY=192.168.0.1
NDS1=219.150.32.132  // dns 服务器地址
2.  vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
HWADDR=00:15:E9:B1:32:AF
BOOTPROTO=static
IPADDR=192.168.0.188
NETMASK=255. ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号