4.2)单线程与多线程的对比:随着硬件技术的发展,CPU的速度越来越快,相对来说,串口是低速设备,向数据库服务器进行一次查询也要花去不少的时间。根据木桶理论,一个木桶能放多少水,取决于最短的那一块木板。打个比方,就像我们的上网速度与我们计算机的CPU的速度没有什么关系。因为瓶颈在连接速度。
类似的,对串口通信的上位机而言,多数时间是CPU在等待串口读写操作的完毕和数据库查询结果的返回,而不是相反。如果使用单线程,其流程基本是,查询接收缓冲区里是否有等待接收的数据,如果有,则接收数据,处理数据,向数据库服务器发出查询请求,然后等待数据库服务器返回的查询结果(注意:此间,整个进程可能被阻塞于此),接到查询结果之后,再做相应的处理。处理完毕后,再对串口接收缓冲区进行查询。
使用单线程的流程图略。这种方法在一些对实时性能要求不高的场合是可行的,但它的缺点也是显而易见的。现在,我们设想这么一种情况,当进程正在等待数据库服务器返回结果的时候,又有一个门控控制机发来了串口信号,可是它必须在串口的接收缓冲区里等待。因为整个进程由于等待数据库服务器的返回结果而阻塞于此了。在处理完手头的事情之前,CPU没有时间去接收串口传来的数据。这样,系统分配给该进程的CPU时间片,就这样白白的浪费掉了。设想一下:如果发生数据大量高速涌入的情况,比如说,在3秒钟内,有20个门控控制机发出请求。那么,会出现什么情况?同一时间,进程只能去处理一个请求,其它的信号必须等待。数据库查询所花的时间越长,问题就越严重。在门控系统里,这样的问题或许不重要。因为出现这种情况的概率并不高,即便出现了,让用户在门外多等几秒钟也算不上什么大事。但在其它的一些场合,比如工控系统,这样的就会因为不能在规定的时间内做出响应而误事。

解决方案 »

  1.   

    (接前文)为了提高CPU的利用率,为了保证程序的实时响应能力。我在这里使用了多线程技术,串口监视线程,数据分析线程,动态建立的数据处理线程可以‘同时’工作。注意,在单CPU的系统里,这样的‘同时’是一种错觉,实际上,还是多个线程轮流使用CPU。如前问所述,CPU的速度已经很快,系统效率的瓶颈不在CPU,而在串口和数据库服务器。所以,整个进程的效率会提高不少。使用多线程的流程图:略。需要注意的是,使用多线程技术并不能节省CPU的操作,相反,它还要在切换上下文中花一些时间。多线程只是提高了CPU的利用率而已。当线程开得过多的时候,CPU要在各个线程中不停的切换,可能会出现整体运行效率降低的情况。
    这是题外话,本文在这里不做进一步的讨论。(待续)
      

  2.   

    呵呵.
    这位仁兄讨论问题的态度蛮真诚的.
    从我这个角度来看,实在是很难看出问题.
    但是有一点比较难理解.
    就是你如果使用一个ADO连接的话,它的颈瓶效应会在连接处.如果建立多个连接的话~~
    在产生新的连接时,可能查询的结果已经回来啦.只有在系统启动的时候,内部预建十或二十个连接.在有ADO请求时,使用空闲的一个.如果全部占用,就等吧.
    愚见,不要见笑.
      

  3.   

    据我所知,MSCOMM也是事件驱动的啊?查查MSDN就看的出来呀。
      

  4.   

    -------------------------
    就是你如果使用一个ADO连接的话,它的颈瓶效应会在连接处.如果建立多个连接的话~~
    在产生新的连接时,可能查询的结果已经回来啦.只有在系统启动的时候,内部预建十或二十个连接.在有ADO请求时,使用空闲的一个.如果全部占用,回复贴子: 
     temp(全局变量) 回复于2001-5-16 14:03:00   
    事关学位,欢迎多提批评意见!  
     seesi(不是我想骗你,是我不知道怎么才能不骗!) 回复于2001-5-16 14:06:00   
    还可以  
     temp(全局变量) 回复于2001-5-16 16:10:00   4.2)单线程与多线程的对比:随着硬件技术的发展,CPU的速度越来越快,相对来说,串口是低速设备,向数据库服务器进行一次查询也要花去不少的时间。根据木桶理论,一个木桶能放多少水,取决于最短的那一块木板。打个比方,就像我们的上网速度与我们计算机的CPU的速度没有什么关系。因为瓶颈在连接速度。
    类似的,对串口通信的上位机而言,多数时间是CPU在等待串口读写操作的完毕和数据库查询结果的返回,而不是相反。如果使用单线程,其流程基本是,查询接收缓冲区里是否有等待接收的数据,如果有,则接收数据,处理数据,向数据库服务器发出查询请求,然后等待数据库服务器返回的查询结果(注意:此间,整个进程可能被阻塞于此),接到查询结果之后,再做相应的处理。处理完毕后,再对串口接收缓冲区进行查询。
    使用单线程的流程图略。这种方法在一些对实时性能要求不高的场合是可行的,但它的缺点也是显而易见的。现在,我们设想这么一种情况,当进程正在等待数据库服务器返回结果的时候,又有一个门控控制机发来了串口信号,可是它必须在串口的接收缓冲区里等待。因为整个进程由于等待数据库服务器的返回结果而阻塞于此了。在处理完手头的事情之前,CPU没有时间去接收串口传来的数据。这样,系统分配给该进程的CPU时间片,就这样白白的浪费掉了。设想一下:如果发生数据大量高速涌入的情况,比如说,在3秒钟内,有20个门控控制机发出请求。那么,会出现什么情况?同一时间,进程只能去处理一个请求,其它的信号必须等待。数据库查询所花的时间越长,问题就越严重。在门控系统里,这样的问题或许不重要。因为出现这种情况的概率并不高,即便出现了,让用户在门外多等几秒钟也算不上什么大事。但在其它的一些场合,比如工控系统,这样的就会因为不能在规定的时间内做出响应而误事。
     
     ginkgoboy(彝族舞曲) 回复于2001-5-16 16:14:00   蛮好蛮好...我不是计算机专业的...没写过...好遗憾.... 
     temp(全局变量) 回复于2001-5-16 16:15:00   
    这个毕设论文关系到我的学位,请大家指正。  
     temp(全局变量) 回复于2001-5-16 17:04:00   
    (接前文)为了提高CPU的利用率,为了保证程序的实时响应能力。我在这里使用了多线程技术,串口监视线程,数据分析线程,动态建立的数据处理线程可以‘同时’工作。注意,在单CPU的系统里,这样的‘同时’是一种错觉,实际上,还是多个线程轮流使用CPU。如前问所述,CPU的速度已经很快,系统效率的瓶颈不在CPU,而在串口和数据库服务器。所以,整个进程的效率会提高不少。使用多线程的流程图:略。需要注意的是,使用多线程技术并不能节省CPU的操作,相反,它还要在切换上下文中花一些时间。多线程只是提高了CPU的利用率而已。当线程开得过多的时候,CPU要在各个线程中不停的切换,可能会出现整体运行效率降低的情况。
    这是题外话,本文在这里不做进一步的讨论。(待续)  
     temp(全局变量) 回复于2001-5-16 18:43:00   
    谁能指出写毛病?只要说了就有分。
    谢过了。  
     111222([email protected]) 回复于2001-5-16 18:47:00   
    不幽默啊...能不能写得搞笑一些啊??  
     BaoYu(雨路) 回复于2001-5-16 19:04:00   
    呵呵.
    这位仁兄讨论问题的态度蛮真诚的.
    从我这个角度来看,实在是很难看出问题.
    但是有一点比较难理解.
    就是你如果使用一个ADO连接的话,它的颈瓶效应会在连接处.如果建立多个连接的话~~
    在产生新的连接时,可能查询的结果已经回来啦.只有在系统启动的时候,内部预建十或二十个连接.在有ADO请求时,使用空闲的一个.如果全部占用,就等吧.
    -------------------------我测试过呀,两组查询结果是交错打印出来的。可见,是可以并行的。
      

  5.   


    -------------------------就是你如果使用一个ADO连接的话,它的颈瓶效应会在连接处.如果建立多个连接的话~~
    在产生新的连接时,可能查询的结果已经回来啦.只有在系统启动的时候,内部预建十或二十个连接.在有ADO请求时,使用空闲的一个.如果全部占用,等吧.
    -------------------------
    我测试过呀,两组查询结果是交错打印出来的。可见,是可以并行的。
      

  6.   

    <<mscomm是多线程的。 能不能解释一下MSCOMM的机理,到底怎么是个多线程?
      

  7.   

    我有两点建议,你可以参考:
    1、如果只是把数据的接收和处理拆分成两个线程,效果还不如直接在一个线程中接收再处理。
      你要做成一对多或多对多的处理方式,这是常用的技术。
    2、不要考虑mscomm控件,它不可靠。
      

  8.   

    1. ADO是否支持多线程同时查询
    2. 如果串口数据来的太快,串口线程发出N个消息,接收线程来不及处理,消息会不会丢失?
       消息队列中的最大消息数依赖于window机制, 且消息的实时性值得怀疑,
       不如自已定义缓冲区,然后用事件(event)通讯来得稳妥。
    3. 多线程间的同步多讲一点。
      

  9.   

    <<消息队列中的最大消息数依赖于window机制,且消息的实时性值得怀疑,
      
    这该怎么应对呢?
      

  10.   

    <<如果串口数据来的太快,串口线程发出N个消息,接收线程来不及处理,消息会不会丢失?不会丢失,因为在消息队列里
      
      

  11.   

    << ADO是否支持多线程同时查询支持,我试过的
      

  12.   

    temp能不能把你的email留下
    俺的毕设也做的串口通信,可是做得巨烂,有几个问题请教!
      

  13.   

    <<但在其它的一些场合,比如工控系统,这样的就会因为不能在规定的时间内做出响应而误事。Windows 的设计目的是构建一个GPOS(General Purpose Operating System),而不是去实现一个实时操作系统(RTOS,Real-Time Operating System),故而不會在這种情況下使用windows來做平台
      

  14.   

    呵呵,我的毕业论文也有关多线程的,不过是网络方面的,用VC做的。也写了一大通多线程的优点。补充一个:因为现代计算机系统硬件之间也有很大的可并行性,比如硬盘与串口。并行不是只存在于硬件和CPU之间,硬件和硬件之间也有。另外,可以考虑把操作系统课程的进程之间同步的内容写一些,比如生产者-消费者模型,哲学家吃面条这些东西。这些东西和你的线程的模型的联系等等........最后,我也从你的文字里面发现不少有用东西哦,不过可惜我已经定稿了。
      

  15.   

    <<temp能不能把你的email留下[email protected]
      

  16.   

    <<1.你的数据库中存放是什么?用户的ID、权限?容量有多大啊?权限表:卡号,门号,日期,起始时间,终止时间地址码表:地址码,门号,容量?难道有上限吗?<<2 你的效率测试是基于什么的?模拟了多少接入串口信号?单线和多线的差别明显吗?条件不够,没发测试,没有那么多的终端。
      

  17.   

    Windows消息传递的时效性到底怎么样?
      

  18.   

    <<ADO是否支持多线程同时查询支持多线程,同时吗?不知道。怎么算同时?