wwwwwww
驱动牛犊
驱动牛犊
  • 注册日期2003-01-09
  • 最后登录2003-06-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1607回复:14

问一个有关并行的问题?

楼主#
更多 发布于:2003-01-13 21:58
俺在学操作系统时老师好象说过: 两段代码要并行执行(在单处理机上),可以通过这两段代码在不同的进程或线程中去实现.那么除了进程或线程的方式,又可以用什么方式实现两段代码的并行?
                             谢谢!!!!!!!
wwwwwww
驱动牛犊
驱动牛犊
  • 注册日期2003-01-09
  • 最后登录2003-06-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-01-16 22:48
哦俺明白了啊.事实上Win2000所说的异步I/O可不是真正的说,例程和调用这个例程的应用进程在逻辑,是同步执行的.而是先由调用进程先陷入内核,通知需要执行这个例程,再返回应用进程调用处的下一条语句继续执行.而在同时,由例程作用的外部硬件设备,象DMA,开始和处理器上执行的进程同时运行.这就是设备执行和调用进程是平行的关系.其实也就是处理器和外部设备的并行执行,可不是两段代码在处理器上的并行执行要是这样的话,那么对异步I/O功能所能使用的设备就有限制仅仅那些能有处理能力的设备才能使用?
liu.lin2
驱动牛犊
驱动牛犊
  • 注册日期2002-11-15
  • 最后登录2003-10-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-01-16 08:35
我想你是不是想知道,操作系统如何实现分时处理的,在逻辑上并行处理任务的,一般都是通过硬件定时中断,然后再中断服务例程中进行进程调度。大致原理是这样的,看看操作系统原理就清楚了,也可以学习一下linux的源代码和相关的分析文档。仅供参考
siteddy
驱动牛犊
驱动牛犊
  • 注册日期2001-08-07
  • 最后登录2005-02-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-01-16 08:31
呵呵,其实当你启动了设备读写(特指dma)之后你的例程是可以继续运行的,这时候设备和你的例程中的代码切实是真正意义上的并行,当然你也可以在启动设备读写(dma方式)之后立即完成当前的irp,这样当例程返回到应用程序之后,你的应用程序就可以和dma完全并行了,当然,这样用的机会不是很多,因为大部分时候你是要关心设备的完成情况的,这种情况你是要等硬件来中断或者轮询某设备寄存器位来得知设备的运行情况的。
teddy
wwwwwww
驱动牛犊
驱动牛犊
  • 注册日期2003-01-09
  • 最后登录2003-06-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-01-15 20:19
谢谢Siteddy老兄的指教.你说的对啊.不过,俺有点明白了.这里操作系统还是只能作为被动方,当进行系统调用和定时器中断,线程或进程切换时才起作用平时并不干涉应用程序的运行.就是在系统调用时,也只是提供系统例程给调用者,执行系统例程后,返回应用程序.并不是说,应用程序和系统例程在逻缉上是并行运行的.而总是在例程返回了应用程序才接着执行.
就拿俺说的异步问题,不能说返回应用程序后例程还能自己执行.应是在应用程序返回后通过中断方式例程再执行.
          俺说的不知道对不对请各位大虾指教!!!!!!!
lstart
驱动牛犊
驱动牛犊
  • 注册日期2001-08-14
  • 最后登录2004-01-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-01-15 19:30
 俺知道你的意思。可俺的真正的意思是说在宏观情况时,在逻辑上是并行运行的两段代码(在一个微处理器上),用什么样的方式实现?就俺所知道,可以用线程或进程实现,那么,还可通过什么方式呢?


中断..硬件的..
siteddy
驱动牛犊
驱动牛犊
  • 注册日期2001-08-07
  • 最后登录2005-02-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-01-15 15:54
异步i/o访问并非两个线程的并行问题,它是指系统与设备的并行。
你的driver在启动了设备操作之后不管设备有无返回,直接先行返回应用层,应用层可以继续干别的事了,因为你不关心结果,这就是异步i/o方式了。
teddy
siteddy
驱动牛犊
驱动牛犊
  • 注册日期2001-08-07
  • 最后登录2005-02-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-01-15 15:47
操作系统原理重修!
请注意线程一节!
teddy
qazasdpp
驱动牛犊
驱动牛犊
  • 注册日期2003-01-06
  • 最后登录2003-02-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-01-15 13:54
我想这是由I/O Manager来控制的. I/O Manager本身应该是一个进程.
yeammy
驱动牛犊
驱动牛犊
  • 注册日期2002-12-27
  • 最后登录2012-02-22
  • 粉丝0
  • 关注0
  • 积分63分
  • 威望12点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-01-15 13:25
谢谢老兄的解答!其实,俺问的是并不是引用层的代码的并行问题。是这样的,俺在学WDM时,有个异步I/O读写模式。这个I/O模式,指的是,当你应用程序调用驱动程序时,进入核心层(因为驱动是核心代码嘛),调用驱动程序的例程,就返回,接着执行应用程序的下一条语句;而同时,驱动的例程也在逻辑上同时运行。。。。。。。
  俺就想:此时,在单处理器上,肯定这个进程和例程不是同时运行的,那么,假如说这个进程运行时间片到了,是什么机制接着调用驱动程序的那个例程呢?不应该是进程调度模块,因为进程调度只能调度进程或线程,不能调度例程,而驱动程序此时不是作为一个进程去运行的。
要是例程被运行,它的时间片是多少?
                               谢谢
siteddy
驱动牛犊
驱动牛犊
  • 注册日期2001-08-07
  • 最后登录2005-02-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-01-15 08:50
不知道你是不是想问“应用层的线程间异步的实现?”
并行线程间如果彼此需要知道对方的部分行为(如改变了某共用变量)才能继续自己的行为,那么这些线程就需要同步,同步的实现可以依靠“信号量”,“事件通知”,“公共量”等实现。
相反则为异步,异步不需要特别的机制去实现。
不知道你是否还留着你的‘操作系统原理\'一书,留着,留着,千万别扔。
teddy
wwwwwww
驱动牛犊
驱动牛犊
  • 注册日期2003-01-09
  • 最后登录2003-06-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2003-01-14 22:30
  谢谢!你的意思是单处理器上的并行两段代码在逻缉上只能由线程或进程的方式来实现.那么,请问应用线程和异步是怎么样实现的?
siteddy
驱动牛犊
驱动牛犊
  • 注册日期2001-08-07
  • 最后登录2005-02-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2003-01-14 14:08
在windows中,线程是交付执行的最小单位,在不同进程中,你可能运行同一段代码,它们分别被封装入各自进程的某个线程(就是你调用该段代码的那个线程)。在同一个进程中,你必须开出不同的线程去调用那段代码以实现逻辑上的并行。所以无论怎样,逻辑上的并行都是用多线程的方法去实现的。
teddy
wwwwwww
驱动牛犊
驱动牛犊
  • 注册日期2003-01-09
  • 最后登录2003-06-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2003-01-14 13:15
  俺知道你的意思。可俺的真正的意思是说在宏观情况时,在逻辑上是并行运行的两段代码(在一个微处理器上),用什么样的方式实现?就俺所知道,可以用线程或进程实现,那么,还可通过什么方式呢?
liu.lin2
驱动牛犊
驱动牛犊
  • 注册日期2002-11-15
  • 最后登录2003-10-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2003-01-14 08:35
在单机上不管用什么方式不是真正的并行处理,而是分时处理的,除非是多CPU的系统。不知道你需要什么样的并行处理?
游客

返回顶部