CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
花落谁家,你作主! 盛大widget设计大赛英雄榜
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

80分送给解铃人,非科班出生的我疑惑了3年的问题,悬而未解.

楼主mmalis(渴望浪漫的女孩)2002-03-29 22:43:47 在 C/C++ / C语言 提问

 
   
   
   
  本人对底层的东东不了解,四处打听,无人问津,请高手赐教:  
   
  1、CPU的中断到底有什么用?高级语言的线程与进程是否在调用中断?  
   
  2、CPU同一时刻只能执行一条指令,为什么?  
   
  3、为什么WINDOWS能运行于不同的CPU?  
   
  4、高级语言编译后如C中的X=A+B(X、A、B分别为变量),为什么适合于各种不同的CPU?假设我在WIN98下用VC++6.0编译器将“+”编译为0011,是否其他的CPU中0011指令都是“+”的意思?  
   
   
      困惑多年!!!!!!!!!!!!!!!  
  问题点数:80、回复次数:49Top

1 楼holeon(procedure)回复于 2002-03-29 23:50:27 得分 5

参考解答:(如有不正确之处,请高手指正)  
  1、CPU的中断用于并发执行多个作业,避免CPU资源的浪费,或者用于分时系统中多个用户共享同一个CPU。有时为了提供一些系统级的功能,为避免和用户作业互相干扰引起混乱,也会调用CPU中断来进行。  
  进程只是一段程序的运态执行过程,线程又是进程的组成部分。当多个进程并发执行时,会调用中断指令。  
   
  2、任何一个CPU在同一时刻都只能执行一条指令。因为执行指令要占用总线、运算部件和寄存器。如果同时执行多条指令会导致数据混乱冲突而使结果出错。而且一个运算器同一时刻也只能执行一个运算操作。这是由电路设计决定的。  
   
  3、现在PC机系统结构方面都是IBM系列兼容机,所以现在PC机使用的CPU不论产商和型号,其中的基本指令集都是相同的。而且Windows中也提供了一部分特殊指令集的支持。所以Windows可以运行在PC机中任何一款CPU上。  
   
  4、高级语言编译后的机器代码是在操作系统的支持下执行的。由操作系统识别后翻译为微指令再由CPU来执行。所以只要操作系统一致,翻译结果就是一样的。例如:你在VC6.0下编译出的机器代码只能在Windows下运行,在Linux下就不能执行。  
  而且各种PC机的CPU基本指令集相同,对于"+"操作的机器指令也是一样的。Top

2 楼rhesus(越堕落越快乐)回复于 2002-03-30 00:00:06 得分 1

你厉害Top

3 楼MarsXia(秋)回复于 2002-03-30 00:16:11 得分 2

1)假设cpu是110值班室里的警察,com,lpt,keyboard,realtime   etc.如果有事需要cpu处理,他们需要打110电话(发出信号)引起cpu注意,cpu会根据事情的轻重缓急以及受到信号的先后次序等条件综合考虑排定事情的优先级,然后处理。中断就是110电话:)至于线程和进程与中断的关系不是一回事,假设一个线程仅仅只是计算a=3,b=5,求c=a+b,他不会和中断有太多的关系。  
  2)cpu不一定同一时刻只是计算一条指令,你指的是8086吧  
  3)windows是一种操作系统,当然也是软件,最终是由0,1序列构成指令+数据,其实理论上说来cpu的处理就是接受指令+数据,然后计算,输出结果,自然只要组成windows的代码所用的指令集能被intel,amd(x86指令集)以及alpha(risc指令集)认识,自然就能被相应的cpu处理了。  
  4)参见3。另假设intel   p4将+号认为0011,也许IBM   AS400的cpu认为+号是01,没关系,我们转换一下,凡是看到老外我说“good   night”,同时看到中国老太我就说“晚上好”,明白?  
  所以我完全可以在我的intel   p4   cpu上用软件模拟出你的掌上电脑或你的手机的cpu,微软当年就是艾伦在dec的牵牛星机器上模拟出微型机cpu,然后让比尔*盖茨在这台软件cpu的机器上写了basic编译器然后才发家的。Top

4 楼MarsXia(秋)回复于 2002-03-30 00:21:40 得分 2

holeon(procedure,你的第2点有些问题,因为有时候cpu可能并没有完整执行完毕一条指令,他会将状态保存然后执行其他指令;此外在小型机和大型机指令可以并行执行。Top

5 楼rabbitlin(LL)回复于 2002-03-30 00:35:05 得分 2

恩~~~就是“分时”作用~~~cpu做事情不是一件做完再一件,其实是这个做点,那个做点的,微机中,速度应看cpu和内存吧Top

6 楼celeil(蜡笔小新)回复于 2002-03-30 01:17:18 得分 2

楼顶的,买本《计算机组成与结构》回家自己看吧。如果最后一题不行,你在买本《操作系统原理》回家看。Top

7 楼ly_blue(blueskylove)回复于 2002-03-30 01:21:37 得分 2

关于第二点:  
  cpu只能执行一条指令是在以往8086的处理器中,自从采用了流水线技术后,处理器开始能够并行的重叠执行若干条指令,它将一条指令分为几段,分段处理,具体的你可以去查一下有关流水线的资料。Top

8 楼vcshcn(黑天的猩猩)回复于 2002-03-30 01:40:05 得分 1

三年了???Top

9 楼h_falls(falls)回复于 2002-03-30 01:46:19 得分 2

对   holeon(procedure)   的做些补充  
   
  在   intel的   x86体系结构的cpu中有三种类似的机制:  
  中断(interrupt),陷阱(trap),异常(exception)  
   
  中断(interrupt)就是外部中断,这种中断的发生是完全“异步”的,根本  
  无法预测什么时候会发生。你可以用关中断指令关闭对外部中断的响应。  
  (有种中断是无法关掉的,比如断电产生的中断)  
   
  陷阱(trap)是由专设的指令,如"int   n",在程序中有意地产生的,是主动的,  
  “同步”的。只要cpu一执行"int   n",就知道在开始执行下一条指令之前一  
  定要先进入中断服务子程序。  
   
  异常(exception)一般也是“异步”的,多半由于“不小心”犯了规才发生。  
  比如,当你的除数为0的时候,就会产生一次异常。当然,也不排除故意产生  
  异常的可能,比如linux的内存管理就是通过页面异常扩展堆栈区的大小。  
   
  众所周知,intel的x86   cpu分为4个状态。cpu平时处于用户状态,无论是外  
  部中断还是陷阱还是异常,都会通过中断向量表的表项,穿越中断门或者陷阱  
  门或者调用门进入系统状态,执行中断服务程序后又回到用户状态。  
  Top

10 楼h_falls(falls)回复于 2002-03-30 01:52:54 得分 2

>比尔*盖茨在这台软件cpu的机器上写了basic编译器然后才发家的。  
  注意:是解释器,不是编译器  
  呵呵,微软最喜欢吹这个了,写个basic编译器从技术上来说有什么  
  了不起的?想想Richard   Stallman单枪匹马写出gcc的编译器才让人  
  佩服。  
   
  可惜中国的记者都是白痴+拜金主义者,以为写个basic解释器在技术  
  上就多了不起,到处宣传,井蛙观天。  
  Top

11 楼vcshcn(黑天的猩猩)回复于 2002-03-30 02:13:20 得分 2

在一个时刻执行的是一个指令步,指令是并行执行的Top

12 楼chjing_111(chjing)回复于 2002-03-30 03:13:57 得分 1

这与不同的操作系统有关  
  holeon(procedure)说得很好。  
  marsxia(秋)   说得很形象  
   
  Top

13 楼chen_saint(我不是代码狂)回复于 2002-03-30 10:47:25 得分 1

这个问题不同水平的人   理解深度也不一样。  
  Top

14 楼jianghai16()回复于 2002-03-30 12:05:01 得分 2

三年未解的问题,够钻的。建议你再花三年去弄清这样几个问题:计算机的系统结构,软件的可移植性。Top

15 楼dancerindark(麦田里守望者)回复于 2002-03-30 13:27:03 得分 2

如果你搞mis系统,这些东西对你没啥用,最多记个结论就得了。如果你是搞软硬结合,例如设备驱动程序,操作系统什么的,这些基本东西还没搞懂,早就下课了。Top

16 楼xiaoxiang2xxx(BSPFirst)回复于 2002-03-30 13:39:41 得分 2

我来更正一下holeon(procedure)的内容(如有不对,欢迎指点):  
   
  1、中断的主要作用是为了响应外部事件(中断对CPU就像触觉对人脑一样,起一个通知作用),最关键部分是由硬件实现的。不是你调用中断,而是外部事件发生后CPU调用你的中断服务程序(当然在DOS下也用中断作为系统调用的接口,但这不是正统用法)。  
   
  2、现代的CPU利用流水线和超流水线架构可以实现同时执行多条指令。以Pentium为例在许多情况下可以同时完成2条指令,可以看Pentium手册。  
   
  3、不见得都和IBM兼容,特别是服务器、工作站很多都有自己的架构,也不用Intel、AMD的CPU。Window95、98就只支持IBM兼容机,而WindowNT、2000能支持很多其它的机型(像PowerPC)。那为什么Windows能运行于不同的CPU,很简单在不同的CPU上使用不同的机器指令。  
   
  4、VC6.0下编译出的机器代码并不一定能在所有的Windows上运行!VC6.0可以生成很多不同CPU的机器指令。为IMB兼容机生成的程序不能在PowerPC上的Windows平台运行。  
   
  像Java那样一次编译到处运行,C++作不到。C++只能一次编码到处编译。那Java为什么能行?JVM是关键。所有的Java程序经编译后生成的不是机器指令(如果这样换到另一种CPU上肯定跑不了),而是堆栈式的伪指令,再有JVM将其翻译成机器指令,由CPU执行。当然不同的CPU,JVM是不同的。Top

17 楼ywls(yw)回复于 2002-03-30 14:07:39 得分 2

还是看看计算机组成原理吧,里面都有解释,再看看操作系统也不错。Top

18 楼wkoji(杨威利)回复于 2002-03-30 14:39:58 得分 1

我是看到有MM,所以来凑个热闹的Top

19 楼wolfboy(峰鸟)回复于 2002-03-30 16:51:43 得分 1

楼上真搞笑Top

20 楼vxhelp(飞来飞去的鱼)回复于 2002-03-30 17:54:13 得分 2

 
  计算机系统结构  
  计算机组成  
  操作系统  
  编译原理  
   
  这几本书看看,你会找到答案的。  
  Top

21 楼zyzl()回复于 2002-03-30 19:07:42 得分 2

关于第2点,我想应该是这样的:从微观上来讲,某一“时刻”一个CPU只能运  
   
  行一条指令,但大家说的流水线工作原理应该在某一“时间”上来讲的,一个  
   
  CPU可现时运行多条指令!大家不这样认为吗?!Top

22 楼youngcave(金牌)回复于 2002-03-30 19:17:53 得分 1

MM真幸福有这么多的高手和菜鸟看你的贴子还说了这么多的……Top

23 楼qiqi97(迷茫)回复于 2002-03-30 19:34:58 得分 1

看计算机原理,操作系统原理,能自己体会到Top

24 楼missdeer(思鹿)回复于 2002-03-30 19:44:24 得分 1

MM?怀疑!Top

25 楼holeon(procedure)回复于 2002-03-31 01:39:31 得分 2

关于第二点,我的意思是在微指令级上,CPU同一时刻只能执行一条微指令。现在的CPU能同时执行2条以上的微指令吗(不调用中断,是真正意义上的同时执行)?Top

26 楼zyzl()回复于 2002-03-31 13:13:17 得分 1

同意楼上,我在四楼持同样观点!Top

27 楼hcpp(简单的才是美的)回复于 2002-04-02 14:59:38 得分 1

问题不嫌其多,答案不嫌其多!Top

28 楼guoyichao(guoyichao)回复于 2002-04-02 15:09:04 得分 2

to:h_falls(falls)    
  写解释器或编译器都是需要很高的技术,rms是用c和lisp的黑客,bill   gates是用basic的黑客,另,现在的gcc这么庞大的编译系统是不可能由一个人自行开发完成。Top

29 楼ericzhangali(另一个空间)回复于 2002-04-02 15:21:22 得分 2

关于第二点,在微指令级上,毫微指令级上,同一时刻只可能执行一条指令,顶楼说得没错,底下的说什么并行啦流水线啦象是狡辩。Top

30 楼WingAngel(追月)回复于 2002-04-02 15:40:08 得分 2

第一题:相应外设,保护现场。  
  第二题:现在cpu的指令寄存器只有32位,一条微位指令也是32位的,你说怎么可以同时运行两条指令呢?  
  第三题:软件是为了管理硬件设计的,现在cup的区别只是在高速缓存大小和指令执行效率上,具体原理是一样的,再说了,现在的cup不就是那么几种吗?写系统当然要考虑周全了!  
  第四题:见顶楼。Top

31 楼superzjx2000(承桴浮于海)回复于 2002-04-02 15:44:14 得分 1

大姐:  
          世界上有N种CPU   N种体系结构  
            您指哪种?Top

32 楼awinder(风)回复于 2002-04-02 15:51:01 得分 2

2。pentium以上cpu可以同时使用u,v,和协处理器同时执行3条互不干扰的指令,这一点在优化程序是至关重要,你可以去intel的主页下在一份Intel   Architecture   Software   Developer’s   Manual   Volume   看看。  
  3。只要指令级一样就可以。windows只能执行于x86体系的cpu,在其他cpu上就不行了。  
   
  WingAngel,你记组学好了吗,就瞎说!Top

33 楼awinder(风)回复于 2002-04-02 15:54:45 得分 2

还有你不要以为cpu就intel和amd,via出,其他的公司也出,例如sun的基于sparc的cpu,windows就不能用了,Top

34 楼mmalis(渴望浪漫的女孩)回复于 2002-04-02 16:55:10 得分 0

谢谢诸位,我不是大姐。superzjx2000(锥子),跟你年龄差不多!!!Top

35 楼jiji007(jiji007)回复于 2002-04-02 17:05:04 得分 1

MM真幸福,这种问题都有这么多人聊。Top

36 楼mmalis(渴望浪漫的女孩)回复于 2002-04-02 17:06:03 得分 0

真正受益菲浅,请哪位GG建议一下怎样犒劳?  
  Top

37 楼duanfeng(段玉)回复于 2002-04-02 17:27:35 得分 2

关于第二点:  
  有指令级并行的概括,只不过目前的大部分计算机体系构架和语言都是串行Top

38 楼duanfeng(段玉)回复于 2002-04-02 17:36:08 得分 1

mmalis   (渴望浪漫的女孩)   小妹妹,今年多大了?  
  呵呵Top

39 楼duanfeng(段玉)回复于 2002-04-02 17:37:19 得分 1

mmalis   (渴望浪漫的女孩)   小妹妹,今年多大了?  
  呵呵Top

40 楼a_kun(狂人日记)回复于 2002-04-02 18:06:10 得分 2

同holeon(procedure)讨论:  
  关于第4点,我认为:  
  高级语言编译出来的可执行文件能在不同的cpu上面运行是因为编译器针对不同的cpu生成了不同的机器码,针对一种cpu编译出来的程序(机器码)不能在另外一种不兼容的cpu上运行。例如intel和amd兼容,所以程序能够在两种cpu下相同的操作系统上运行。  
  同一个程序不能在同一个cpu上的不同操作系统下运行是因为文件格式不相同,而不是因为机器码不同,比如windows的pe格式linux不认识,所以.exe文件不能在linux上面执行,但是它的相同操作的机器码是相同的。  
  windows能运行在不同的cpu上是因为针对不同的cpu有不同的编译版本,各版本指令不相同。  
  微指令是由cpu划分的,不是操作系统划分的。Top

41 楼xsexx(xsexx)回复于 2002-04-02 19:24:20 得分 2

建议买以下书籍  
  1)操作系统原理  
  2)计算机组成与结构  
  3)数据结构  
  4)编译原理  
  5)汇编语言  
  6)VC60Windows设计  
  7)windows汇编语言设计  
  开完了就明白了,不用3年,只用一年!!     :)  
  Top

42 楼terrorist(无肺)回复于 2002-04-02 20:12:46 得分 2

大家说得很好!啊!我就不补充了。。。。给分就行了!Top

43 楼dbar(流水年轮)回复于 2002-04-02 21:27:58 得分 2

大家讲得如此详细  
  不用我说了,看来我是白来了.呵呵呵呵Top

44 楼caoxin()回复于 2002-04-02 21:46:01 得分 1

看见MM  
  没事献殷勤  
  我呸Top

45 楼wangleen(毛毛虫)回复于 2002-04-03 21:58:23 得分 1

没事献殷勤,非奸即盗!Top

46 楼xday(飙行者)回复于 2002-04-25 23:46:58 得分 1

女人是够傻的Top

47 楼vtable9999(肝肝肝肝)回复于 2002-04-26 02:37:56 得分 1

估计也和我年龄差不多,呵~Top

48 楼yejin13(:::13:::)回复于 2002-04-26 13:01:49 得分 1

我坚持cpu同一时刻只能执行一条指令的观点,请赐教Top

49 楼steedhorse(晨星)回复于 2002-04-26 13:12:22 得分 2

vcshcn(黑色的星星)的说法要准确一些。当然,这个问题也依赖于用什么观点去看,如果把“时刻”看的过于狭义,那么一个“时刻”大概连一个指令步也执行不了,因为,一个“指令步”的执行也是需要时间的。所以,如果不是非常“狭义”,那么认为一个时刻能执行一条指令也可以。  
  但无论多么“广义”,认为“一个时刻”能够执行多条指令都是不恰当的。因为“多条”有并行、同时的意思。Top

50 楼langxing(东方不败)回复于 2002-04-26 14:14:17 得分 2

说得好!厉害!,我都感觉自愧不如!Top

相关问题

  • 科班出身
  • 未解之Macro??
  • 疑惑!
  • 疑惑!
  • 疑惑??????
  • 疑惑
  • 疑惑!!!
  • 疑惑!?
  • 疑惑
  • 疑惑

关键词

  • c++
  • 指令
  • cpu
  • 执行
  • 中断
  • 编译
  • 编译器
  • 操作系统
  • windows
  • 计算机

得分解答快速导航

  • 帖主:mmalis
  • holeon
  • rhesus
  • MarsXia
  • MarsXia
  • rabbitlin
  • celeil
  • ly_blue
  • vcshcn
  • h_falls
  • h_falls
  • vcshcn
  • chjing_111
  • chen_saint
  • jianghai16
  • dancerindark
  • xiaoxiang2xxx
  • ywls
  • wkoji
  • wolfboy
  • vxhelp
  • zyzl
  • youngcave
  • qiqi97
  • missdeer
  • holeon
  • zyzl
  • hcpp
  • guoyichao
  • ericzhangali
  • WingAngel
  • superzjx2000
  • awinder
  • awinder
  • jiji007
  • duanfeng
  • duanfeng
  • duanfeng
  • a_kun
  • xsexx
  • terrorist
  • dbar
  • caoxin
  • wangleen
  • xday
  • vtable9999
  • yejin13
  • steedhorse
  • langxing

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo