1 # -*- coding: utf-8 -*-
2 import re
3 mem = [x for x in re.split('[\r|\n]', '''
4 store a 1
5 add a 1
6 jmp -1
7 store a 100
8 add a -1
9 jmp -1
10 '''.lower()) if x != '']
11 regs = {} # register file: 装register的柜子。register: 登记簿. pc: program counter
12 class ProcCxt: # Process Context
13 def __init__(this, pc): this.regs = {'pc' : pc} # this.priority ...
14 proc = [ProcCxt(0), ProcCxt(3)] # 2 processes
15 cpid = 0 # current process index
16 regs = proc[cpid].regs # start from process #0
17 while True:
18 inst = mem[regs['pc']].split() # fetch instruction 取指
19 print(inst, end='\t')
20 op_code = inst[0] # op: operation
21 if op_code == 'store':
22 (reg_name, immd) = inst[1:]
23 regs[reg_name] = int(immd)
24 regs['pc'] += 1
25 elif op_code == 'add':
26 (reg_name, immd) = inst[1:]
27 regs[reg_name] += int(immd)
28 if regs[reg_name] < 0: msb = 1
29 regs['pc'] += 1
30 elif op_code == 'jmp':
31 immd = int(inst[1])
32 if immd == 0: break
33 regs['pc'] += immd
34 print(regs)
35 if input('Interrupt [y/<Enter>]?').lower() == 'y':
36 proc[cpid].regs = regs
37 cpid = (cpid + 1) & 1
38 regs = proc[cpid].regs
39 print('switched to proc', cpid, regs)

以下内容过分追求简单,不准确。

CPU有几十个寄存器。linux kernel按task调度。历史上还有过batch, job等名词。ls && date是个job,ls和date是程序,运行起来后叫process,kernel里把process叫task。程序是死的、休眠的,在硬盘上存1万年还是那些个00101。进程是活的,有上下文。上面的程序A,B,C三个人运行,状况不一样——如果他们不是同时按y或Enter键的话。Sheldon有了Leonard Nimoy的DNA,种出两个来,分别在中国和美国生活,中国的会说“英语忒TM难学了”,美国的会说"OMG, there are thousands of characters?"

Windows 95前,Windows没有抢占式多任务。两个程序,一个调用get_data从网络收数据,另一个调用input从键盘读。这两个函数都是操作系统提供的:
void get_data() { if (data_not_ready) schedule(); ... }
void input() { if (data_not_ready) schedule(); ... }
void schedule() { 选个进程来运行。}

有了时钟中断,就可以每隔比如20ms,强行打断正在执行的进程,重新调度。没有时钟中断的话,网卡键盘等外设可能会有中断。while(1);的程序少,一般总要读写下文件吧。操作系统:heiheihei 有机可乘。

所谓进程在CPU上运行…… 其实程序是存在内存里的,多个CPU的多个核共享内存。每个核都是一大块电路,不同CPU的寄存器是不同的。所谓执行程序,就是寄存器,尤其是PC寄存器变来变去。

用python写进程调度器自然奇葩,不过linux也不是用汇编写的啊。当然它的调度器比round robin(圆桌骑士不是亚瑟吗?)花样多多了。

CPU如何同时运行多个进程?的更多相关文章

  1. Linux 和 Windows 查看当前运行的 python 进程及 GPU、CPU、磁盘利用率

    目录 查看当前 python 进程 Linux Windows 查看 GPU 利用率 Linux Windows Linux CPU 利用率 Linux 磁盘利用率 查看当前 python 进程 Li ...

  2. IOS高级开发~开机启动&无限后台运行&监听进程

    一般来说, IOS很少给App后台运行的权限. 仅有的方式就是 VoIP. IOS少有的为VoIP应用提供了后台socket连接,定期唤醒并且随开机启动的权限.而这些就是IOS上实现VoIP App的 ...

  3. Linux显示所有运行中的进程

    Linux显示所有运行中的进程 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ ps aux | less USER PID %CPU %MEM VSZ RSS ...

  4. linux暂停一个在运行中的进程【转】

    转自:https://blog.csdn.net/Tim_phper/article/details/53536621 转载于: http://www.cszhi.com/20120328/linux ...

  5. linux下获取占用CPU资源最多的10个进程

    linux下获取占用CPU资源最多的10个进程,可以使用如下命令组合: ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head linux下获取占用 ...

  6. IOS开发~开机启动&无限后台运行&监听进程

    非越狱情况下实现: 开机启动:App安装到IOS设备设备之后,无论App是否开启过,只要IOS设备重启,App就会随之启动: 无限后台运行:应用进入后台状态,可以无限后台运行,不被系统kill: 监听 ...

  7. linux下获取占用CPU资源最多的10个进程,可以使用如下命令组合:

    linux下获取占用CPU资源最多的10个进程,可以使用如下命令组合: ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head linux下获取占用 ...

  8. Qt之运行一个实例进程

    简述 发布程序的时候,我们往往会遇到这种情况: 只需要用户运行一个实例进程 用户可以同时运行多个实例进程 一个实例进程的软件有很多,例如:360.酷狗- 多个实例进程的软件也很多,例如:Visual ...

  9. C#获取运行程序的进程ID

    C#获取运行程序的进程ID [DllImport("User32.dll", CharSet = CharSet.Auto)] public static extern int G ...

随机推荐

  1. Linux修改bashrc

    .bashrc是一个隐藏的文件,要打开并修改该文件需要: (1) 查看:ll -a 找到文件 .bashrc: (2) 打开:vi .bashrc (或者 vim .bashrc) 打开文件: (3) ...

  2. (三)lamp环境搭建之编译安装php

    1,PRC (People's republic of China) timezone中设置的时间为中国时间. 2,php的官方镜像源,使用linux时可以直接下载的 http://cn2.php.n ...

  3. sed 修改替换包含关键字的整行

    查找关键字 user10 所在的行,替换整行内容为aaaaaaaaaa #sed -i "s/^.*user10.*$/aaaaaaaaaa/" useradd.txt

  4. 你们不要再吵了! Java只有值传递..

    写在前边 上次聊到Java8新特性 lambda时,有小伙伴在评论区提及到了lambda对于局部变量的引用,补充着博客的时候,知识点一发散就有了这篇对于值传递还是引用传递的思考.关于这个问题为何会有如 ...

  5. [mysql课程作业]我的大学|作业

    第八周周五 1.将xs表中王元的专业改为"智能建筑". # update xs set 专业名='智能建筑' where 姓名='王元'; # select * from xs w ...

  6. 【完美解决】IDEA 中 Maven 报错 Cannot resolve xxx 和 Maven 中 Dependencies 报红/报错。

    目录 前提 场景 解决办法 1.首先,清除缓存,点击之后重启IDEA. 2.关闭IDEA,打开项目文件夹 3.重新打开 IDEA,找到右边的 Maven 4.解决 Maven 中 Dependenci ...

  7. HTML 简单介绍

    1.什么是HTML > HTML是用来描述网页的一种语言 > HTML指的是超文本标记语言(Hyper Text Markup Language) > 标记语言是一套标记标签(mar ...

  8. 移动GPU分类/百科

    ARM mali gpu四大微架构概述 https://zhuanlan.zhihu.com/p/107141045 http://www.neardi.com/news_23/487.html

  9. Intellij IDEA 配置Junit

    导包: 1.Hamcrest Core 包:    https://mvnrepository.com/artifact/org.hamcrest/hamcrest-core/1.3 2.Junit包 ...

  10. 大爽Python入门教程 3-3 循环:`for`、`while`

    大爽Python入门公开课教案 点击查看教程总目录 for循环 可迭代对象iterable 不同于其他语言. python的for循环只能用于遍历 可迭代对象iterable 的项. 即只支持以下语法 ...