鱼C论坛

 找回密码
 立即注册
查看: 3230|回复: 6

CPU执行程序的最小单位是什么?

[复制链接]
发表于 2013-11-27 21:04:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
想请教各位一个问题,当CPU已经开始执行一条指令但是还没有执行完,这是有可能被打断去执行其它指令吗?
比如说一个程序(假设运行在单核单线程的单个处理器上)有线程A和线程B,假如线程A已经开始执行了mov eax,ebx,但是还没有执行完,此时线程A有可能被打断去执行线程B的指令吗?

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-11-27 21:36:33 | 显示全部楼层
我表示我也不知,同求答案
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-11-27 23:17:25 | 显示全部楼层
我是个门外汉  我个人感觉不行 一条指令应该是最小的吧  你让他执行一般去干别的他估计不愿意:lol:
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-11-28 00:42:51 | 显示全部楼层
不知道呀不知道
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-11-28 08:26:13 | 显示全部楼层
我也想知道
:shutup:
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-11-28 13:10:40 | 显示全部楼层
打断的话有内中断和外中断

CPU是轮流执行每个程序一小块时间片,由于CPU速度很快,你感觉不到,以为程序在并行执行,其实也只是快速的轮流执行。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-11-28 16:39:48 | 显示全部楼层
线程a可能被阻塞(也就是你说的打断),然后执行线程b,给你个简单的例子

  1. public class Ex_3 implements Runnable {
  2.         String threadName;
  3.         public Ex_3(String threadName)
  4.         {
  5.                 System.out.println(threadName);
  6.                 this.threadName = threadName;
  7.         }
  8.        
  9.         public void run()
  10.         {
  11.                 for(int i = 0 ; i < 3 ; ++i)
  12.                 {
  13.                         System.out.println("正在运行的线程:"+threadName);
  14.                        
  15.                         try
  16.                         {
  17.                                 Thread.sleep((int)Math.random()*1000);
  18.                         }
  19.                         catch(Exception ex)
  20.                         {
  21.                                 System.out.println(ex);
  22.                         }
  23.                 }
  24.         }
  25.         public static void main(String[] args)
  26.         {
  27.                 System.out.println("开始运行主函数");
  28.                 Ex_3 t1 = new Ex_3("first");
  29.                 Ex_3 t2 = new Ex_3("second");
  30.                
  31.                 Thread tt1 = new Thread(t1);//线程1
  32.                 Thread tt2 = new Thread(t2);//线程2
  33.                
  34.                 tt1.start();//线程1启动
  35.                 tt2.start();//线程2启动
  36.                
  37.                 System.out.println("主函数结束");
  38.         }
  39. }
复制代码
这段程序的两次运行结果:
(1)。
  1. 开始运行主函数
  2. first
  3. second
  4. 主函数结束
  5. 正在运行的线程:first
  6. 正在运行的线程:first
  7. 正在运行的线程:first
  8. 正在运行的线程:second
  9. 正在运行的线程:second
  10. 正在运行的线程:second
复制代码
(2)。
  1. 开始运行主函数
  2. first
  3. second
  4. 主函数结束
  5. 正在运行的线程:second
  6. 正在运行的线程:first
  7. 正在运行的线程:second
  8. 正在运行的线程:first
  9. 正在运行的线程:second
  10. 正在运行的线程:first
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-5 14:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表