从OOo打印模式说开去

        前几天日本的客户对项目中的打印功能作了反馈。该项目使用OpenOffice的来进行打印的,本来之前是要用Micorosoft Office来做这一块的,不过被客户否决了,客户的技术能力很不错,知道Microsoft很多Bug。

 
        问题是这样的,在windows平台OOo是一个多进程系统,“soffice.bin”、“soffice.exe”。但是它对所有实例都是用同样的进程,简单地说也就是不管开多少窗口这样个进程都只有一个(有点绕好像)。想法是好的,不过很可惜有Bug,客户在对打印功能进行测试的过程中发现有时候这两个进程会多一些出来,这个时候打印功能就会罢工。关于这个问题,OOo官方说把它们都Kill掉就好了。
 
        不过好像问题没有这么简单。执行打印方法,释放资源。然后获取所有名为“soffice.bin”、“soffice.exe”的进程(服务器环境),全部Kill掉。然后,打印机一动不动。
 
        看来我担心的事情发生了。对于打印机的工作原理我了解的比较少,所以做这个解决方案的时候就有点担心如果OOo打印和打印机之间同异步的关系。Debug了一下,发现如果在打印方法返回后线程Sleep大约500毫秒就没问题了。看来果然是异步的。这回可郁闷了,Sleep绝不是一个可行的解决方案,因为时间没法确定。不过在OOo官方看了一下,居然有一个叫“Wait”的参数,可以指定打印的同异步模式,而默认的就是异步方式。
 
        OK,马上设置这个参数为True,然后行TestCode。打印机响了起来,问题解决了。
 
        问题是解决了,不过疑问却留在心中。以前做企业级产品比较少,没有研究过打印机的功能。没想到打印居然还分同步和异步方式,有意思(其实我应该早想到,白费了那么多功夫去研究操作系统内核原理了)。
 
         关于IO体系结构和设备驱动的这种老生常谈的换提就不讨论了,这里着重研究打印机的工作式(以前基本上没关注过这个设备)
 
        仔细研究了一下,事情和一种叫Spooling的技术有关。Windows上面有个叫Print Spooler的服务,结束了就不能打印了印了。
 
        Spooling技术是这样的,全名叫做Simultaneous Peripheral Operation On-Line (即外部设备联机并行操作),它是关于慢速字符设备如何与计算机主机交换信息的一种技术,通常称为“假脱机技术”。很显然,打印机是一种字符设备。
 
        所谓假脱机就是说并不是真正的脱机,当然也不是直接耦合了。SPOOLing是一种外围设备同时联机操作的技术,又叫排队转存。在输入和输出之间有个输入和输出的缓冲区(对于打印机来说就是打印机列了)。这个缓冲区可以消除用户联机等待的时间。
       
        SPOOLing的工作方式是这样的:在系统输入模块收到作业输入请求信号后,输入管理模块中的读过程负责将信息从输入装置中读入输入缓冲区。当缓冲区满时,由写过程将信息从缓冲区写到外存的输入缓冲区中,读过程和写过程反复循环,直到一个作业输入完毕。当读过程读到一个硬件结束标志之后,系统再次驱动写过程把最后一批信息写入外存输入缓冲区并调用中断处理程序结束该次输入。然后,系统为该作业建立作业控制块,从而使输入缓冲区中的作业进入作业等待队列,等待作业调度程序选中后进入内存运行。系统在管理输入缓冲区过程中可以“不断”读入输入的作业,直到输入结束或输入缓冲区满而暂停。
 
        这就是说若系统的某台台行式打印机采用了虚拟设备技术,那么若有进程要求对它打印输出时,SPOOLing系统并不是将这台打印机直接分配给进程,而是在共享设备(磁盘或磁鼓)上的输出SPOOLing存储区中为其分配一块存储空间,进程的输出数据以文件形式此。各进程的数据输出文件形成了一个输出队列,由输出POOLing系统控制这台打印机进程,依次将队列中的输出文件实际打印输出。在SPOOLing 系统中,实际上并没有为任何进程分配,而只是在输入缓冲区和输出缓冲区中,为进程分配一存储区和建立一个IO请求表。这样,便把独占设备改造为共享设备。
 
        SPOOLing是在通道技术喝多道程序设计的基础上产生的,使用主机和通道共同作业,并使用外存作为设备缓冲区的的后援,实现外围设备同时联机的操作。通常会有一个负责IO的常驻内存的进程来处理(Windows下就是spoolsv.exe了)。
 
        打印机正式SPOOLing的典型实例。
 
        使用SPOOLing技术的好处如下:
               1、提高了IO速度
               2、将独占设备改造为共享设备
 
         打印机的工作方式终于弄清楚了,不过似乎和我的问题关系不大。从SPOOLing的角度来看,打印永远是异步的。那么同步是什么呢?那就是对于缓冲区读写的同步异步了,具体的话涉及到IO体系结构,不多说了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值