Reactor模型Preactor模型

      通常的,对一个文件描述符指定的文件或设备, 有两种工作方式: 阻塞与非阻塞。所谓阻塞方式的意思是指, 当试图对该文件描述符进行读写时, 如果当时没有东西可读,或者暂时不可写, 程序就进入等待状态, 直到有东西可读或者可写为止。而对于非阻塞状态, 如果没有东西可读, 或者不可写, 读写函数马上返回, 而不会等待。系统I/O方式可分为阻塞,非阻塞同步和非阻塞异步三类,三种方式中,非阻塞异步模式的扩展性和性能最好。主要是讲了两种IO多路复用模式:Reactor和Proactor,并对它们进行了比较。

     一般地,I/O多路复用机制都依赖于一个事件多路分离器(Event Demultiplexer)。分离器对象可将来自事件源的I/O事件分离出来,并分发到对应的read/write事件处理器(Event Handler)。开发人员预先注册需要处理的事件及其事件处理器(或回调函数);事件分离器负责将请求事件传递给事件处理器。两个与事件分离器有关的模式是Reactor和Proactor。Reactor模式采用同步IO,而Proactor采用异步IO。   什么是同步和异步,同步和异步是针对应用程序和内核的交互而言的,同步指的是用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪,而异步是指用户进程触发IO操作以后便开始做自己的事情,而当IO操作已经完成的时候会得到IO完成的通知(异步的特点就是通知)。而阻塞和非阻塞是针对于进程在访问数据的时候,根据IO操作的就绪状态来采取的不同方式,说白了是一种读取或者写入操作函数的实现方式,阻塞方式下读取或者写入函数将一直等待,而非阻塞方式下,读取或者写入函数会立即返回一个状态值。

   一般来说I/O模型可以分为:同步阻塞,同步非阻塞,异步阻塞,异步非阻塞IO

同步阻塞IO: 在此种方式下,用户进程在发起一个IO操作以后,必须等待IO操作的完成,只有当真正完成了IO操作以后,用户进程才能运行。JAVA传统的IO模型属于此种方式!

同步非阻塞IO: 在此种方式下,用户进程发起一个IO操作以后边可返回做其它事情,但是用户进程需要时不时的询问IO操作是否就绪,这就要求用户进程不停的去询问,从而引入不必要的CPU资源浪费。其中目前JAVA的NIO就属于同步非阻塞IO。

异步阻塞IO:此种方式下是指应用发起一个IO操作以后,不等待内核IO操作的完成,等内核完成IO操作以后会通知应用程序,这其实就是同步和异步最关键的区别,同步必须等待或者主动的去询问IO是否完成,那么为什么说是阻塞的呢?因为此时(通知)是通过select系统调用来完成的,而得到通知以后实际的read\write还是得需要我们自己去做。我们自己去拿到数据然后处理,非阻塞模型则是在得到通知的时候数据也直径给我们了,不必自己做read\write了。

异步非阻塞IO:在此种模式下,用户进程只需要发起一个IO操作然后立即返回,等IO操作真正的完成以后,应用程序会得到IO操作完成的通知,此时用户进程只需要对数据进行处理就好了,不需要进行实际的IO读写操作,因为真正的IO读取或者写入操作已经由内核完成了。目前Java中还没有支持此种IO模型。

搞清楚了以上概念以后,我们再回过头来看看,Reactor模式和Proactor模式。

首先来看看Reactor模式,Reactor模式应用于同步I/O的场景。我们分别以读操作和写操作为例来看看Reactor中的具体步骤:

读取操作:

1. 应用程序注册读就绪事件和相关联的事件处理器

2. 事件分离器等待事件的发生

3. 当发生读就绪事件的时候,事件分离器调用第一步注册的事件处理器

4. 事件处理器首先执行实际的读取操作,然后根据读取到的内容进行进一步的处理

写入操作类似于读取操作,只不过第一步注册的是写就绪事件。

下面我们来看看Proactor模式中读取操作和写入操作的过程:

读取操作:

1. 应用程序初始化一个异步读取操作,然后注册相应的事件处理器,此时事件处理器不关注读取就绪事件,而是关注读取完成事件,这是区别于Reactor的关键。

2. 事件分离器等待读取操作完成事件

3. 在事件分离器等待读取操作完成的时候,操作系统调用内核线程完成读取操作(异步IO都是操作系统负责将数据读写到应用传递进来的缓冲区供应用程序操作,操作系统扮演了重要角色),并将读取的内容放入用户传递过来的缓存区中。这也是区别于Reactor的一点,Proactor中,应用程序需要传递缓存区。

4. 事件分离器捕获到读取完成事件后,激活应用程序注册的事件处理器,事件处理器直接从缓存区读取数据,而不需要进行实际的读取操作。

Proactor中写入操作和读取操作,只不过感兴趣的事件是写入完成事件。

从上面可以看出,Reactor和Proactor模式的主要区别就是真正的读取和写入操作是有谁来完成的,Reactor中需要应用程序自己读取或者写入数据,而Proactor模式中,应用程序不需要进行实际的读写过程,它只需要从缓存区读取或者写入即可,操作系统会读取缓存区或者写入缓存区到真正的IO设备。 综上所述,同步和异步是相对于应用和内核的交互方式而言的,同步 需要主动去询问,而异步的时候内核在IO事件发生的时候通知应用程序,而阻塞和非阻塞仅仅是系统在调用系统调用的时候函数的实现方式而已

Linux信号相关学习

        Linux假如现在在一个信号处理程序中,当有一个新的信号来临时会先中断目前的信号处理程序,进入新信号的信号处理程序,处理完毕后返回继续执行,如果在新信号处理程序中调用longjmp函数,则就会破坏刚才中断的信号处理程序,造成刚才中断的信号处理程序不能执行完毕后面无法执行了。sigsuspend和pause函数都会受当前进程的信号屏蔽字的影响,对在当前屏蔽字中的信号不能唤醒由这两个函数造成休眠的进程,sigsuspend函数的作用是将当前进程屏蔽字设置成函数参数指定的,然后休眠,唤醒后设置会函数调用前的信号屏蔽字。如果一个进程同时注册SIGCHLD信号处理和wait子进程,先处理SIGCHLD处理程序,再从wait返回,如果在调用wait时屏蔽SIGCHLD则wait执行后恢复屏蔽会将阻塞的信号发送给进程。在sigprocmask函数返回前递交给信号处理程序处理。或者是在sigsuspend休眠时递送(此时未在屏蔽字之中)。如果调用pause函数希望在收到这个信号时程序能够唤醒则会造成在递送给pause时会产生竞争条件,在sigprocmask函数返回前已经递交过了,所以会造成pause永远休眠。

迁移WordPress到新服务器

 

  1. 备份:通过FTP备份全部的文件。导出数据库sql文件。
  2. 迁移:把备份的文件解压到新的web服务器根目录下;导入sql文件到新的mysql数据库中。修改数据库配置文件wp-config.php,将用户名、密码等更改为新MySQL服务器的信息。

    更改博客的安装地址和博客地址,在数据库中找到wp-options表,找到第一条记录siteurl以及home,这两条记录的值改成你的新域名。只有完成这一步后,才可以顺利进入后台,否则输入密码,会自动跳转到原来的老域名。

    UPDATE wp_options SET option_value = replace( option_value, ‘http://老域名’, ‘https://taobig.org’) WHERE option_name = ‘home’ OR option_name =’siteurl’ ;

    修改文章内部所有的用到老链接的域名字符串。此时得要将文章内链的旧域名修改为新域名。

    UPDATE wp_posts SET post_content = replace(post_content, ‘http://老域名’, ‘https://taobig.org’);

    UPDATE wp_posts SET guid = replace( guid, ‘http://老域名’, ‘https://taobig.org’ );

限时获取windows 8 优惠码

今天是有一件大事件。发行了13的windows xp正式退役。微软与中国的部分互联网企业合作以极低的价格提供windows 8的序列号,鼓励用户使用windows 8操作系统。

从2014年4月8日零时持续4月10日晚11时59分,所有用户可以在360官网会员专区(http://vip.360.cn/huodong/win8.html)、腾讯电脑管家论坛(http://guanjia.qq.com/act/brand/xp/)获取Win8在线发行软件版本的优惠代码,使用代码后,在微软商场(http://www.microsoftstore.com)购买只需花费299元就可以升级到Win8。而之前单独在微软商场购买则需要888RMB。
获取优惠码后,请在4月8日-4月10日(00:00至24:00)内完成支付,逾期失效
支付完成后,您可以在1年内下载Win8系统安装包,并激活。

Nokia Tune的来历

诺基亚那首经典的手机铃音,你知道它的来源吗?
按照诺基亚中文博客的解释

西班牙著名作曲家,被很多人称为近代吉他乐之父的弗朗西斯科•塔雷加-伊克西亚(Francisco Tarrega-Eixea,1852-1909)谱写了《Gran Vals》(大圆舞曲)。1993年(来源维基百科,诺基亚中文博客没有直接给出具体时间)时任诺基亚销售副总裁 Anssi Vanjoki 带着这首曲子找到通信副总裁 Lauri Kivinen,两人从 14 分钟长的原曲中选出小段旋律,将其命名为《Grande Valse》。

这就是后来大家耳熟能详的Nokia Tune。
来源: http://blog.nokia.com.cn/2010/06/07/nuojiyalingshengdeyoulai/

[优酷视频]《cargo》–澳洲短片电影节佳作!

一个主题就是父爱的短片,很是催人泪下。

优酷地址:http://v.youku.com/v_show/id_XNTQwNzY2NTg4.html

通过评论可以发现一些你不曾注意的一些细节。

一个网友评论:

为了不伤害自己的孩子,他父亲在转变之前绑住了自己的双手,尽管不知道孩子能不能得救,但为了那一点希望,这位坚强的父亲将孩子绑在背上,捡起地上的腐肉用树干挂在前方,好让变为行尸后的自己能够带着孩子继续前进。直到最后看到有人在屋顶上正用枪瞄准的时候他立刻反应起来把气球挡在自己头上好让他瞄准自己脑袋而不伤到自己小孩……