存档

文章标签 ‘系统内核’

用于线程同步的读写锁(Readers/writer locks)

2010年2月21日 行者 没有评论

  读写锁(readers/writer lock)的具体含义是文如其名:对一个资源有多个读者而无写入者,或者是只有一个写入者而没有其他的写入者或读出者。

  这种情况是经常会用到的,这就需要有一种专用于这个目的的特殊的同步元素。

  很多情况下,你需要有个数据结构在一堆线程之间共享。当然,你希望在一个时刻只能有一个线程可以对这个数据结构执行写入操作。如果同时有多个线程能对其写入,那么就有可能一个线程写入的数据会覆盖其他线程所写入的数据。为了防止这种情况发生,写线程可以用独占的方式获取“读写锁”,也就是说只有它才能够访问这个数据结构。不过需要注意这个访问的独占性严格受控于随意的方式。也就是说这是由系统设计者来处理的,是由系统设计者来确保所有访问那个数据区域的线程通过读写锁进行同步。

阅读全文…

在SMP系统使用多线程需要注意的事情

2010年1月28日 行者 没有评论

  尽管你一般可以忽略你的系统是运行在SMP架构上还是单处理器上,不过还是有些事情会影响到你。不幸的是,这些事情都是低概率事件,它们可能在你的开发阶段没有出现,但是可能在测试、演示或更糟的,在实际应用中出现。在编程的时候花些时间做些防御性的措施可以在后续的阶段减少问题的发生几率。

  下面就是你可能在SMP系统上遇到的事情:

  • 多个线程确实可以也能同时运行——不过依赖于像FIFO调度、优先级这些东西来同步是不允许的;
  • 多线程可与中断服务程序(ISR)同时运行——也就是说你不但要保护线程不受ISR的影响,也要保护中断服务程序不受线程的影响;
  • 有些操作你期望是最小单元的、单步的,可能会依赖于操作与处理器的不同而不是最小单元的、单步的。这类的操作包括了需要“读取-修改-写入”周期操作的(例如:++,–,|=,&=等等)。你可以查找<atomic.h>文件来查找对应的最小单元替换函数。(这也不是只有SMP系统的问题,大多数的RISC处理器对上面的胆码也不是按照最小单元处理的)

内核状态

2009年12月27日 行者 没有评论

RUNNING

  系统的运行状态简单的说就是表示有线程处于活动状态并在使用CPU。在多处理器系统中,可以有多个线程处于运行状态;在单处理器系统中,只能有一个线程处于运行状态。

READY

  就绪状态表示线程现在可以运行了,只不过还未运行,因为现在有另外一个线程(同优先级或更高优先级)正在运行。如果有两个线程都有能力使用处理器,其中一个线程的优先级为10而另外一个线程的优先级为7,那么优先级为10的线程将进入运行状态而优先级为7的线程将进入就绪状态。

 

阅读全文…

进程间通信的发/收/回复的健壮实现

2009年9月27日 行者 没有评论

  通过使用发/收/回复将共同合作的线程与进程作为一个团队来构建一个UNIX应用程序的架构就会得到一个同步通知的系统。进程间通信就为这个系统的特殊转型而产生的,而不是在其后。

  异步系统的一个重要问题就是事件通知需要依靠信号处理器才能运行。异步的进程间通信将难于进行彻底的系统运行测试,并不能够确保不论信号处理器怎样,处理工作能够如预想的那样运行。应用程序一般都是依赖一个确定的起始点的“窗口”,在这个窗口中信号的延迟是可以忍受的,来避免出现这种情况。

阅读全文…

进程间通信的通道与连接

2009年9月25日 行者 没有评论

  在UNIX系统中,消息传递是沿着通道与连接传送的,而不是直接的从线程到线程。一个线程要接收消息就先要创建一个通道,另外一个线程如果想要向这个线程传递消息就需要创建一个连接附加到该通道上。

  通道是消息内核调用所必须的,服务器线程在调用MsgReceive()函数就是使用这个通道来接收消息的。连接由客户线程创建并用于“连接”服务器线程创建的可用通道。一旦连接确定,客户线程就可以使用MsgSend()函数发送消息了。如果一个进程中有多个线程连接到同一个通道,为了效率所有的连接就被映射到同一个内核对象。在一个进程中的通道与连接是使用一个小整数进行命名的。客户连接直接映射为文件描述符。

  从架构上来说,这是一个关键点。通过将客户连接直接映射为文件描述符,就消除了使用另一层变换的必要。我们不必“指出”根据文件描述符向哪里发送消息。相反,我们可以很简单的将消息直接发送给“文件描述符”(也就是连接ID)。

  这里可以使用的函数如下:

阅读全文…