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. Vue脚手架最新版本安装使用

    现在很多的插件如Vant 这类的样式框架,都去兼容了Vue的3.0版本,所以我总结一下如何去简单的搭建一个Vue3.0的框架 开始 一,如何安装 在这里说明一下,Vue脚手架版本,和Vue版本是两个东 ...

  2. Oracle 相关命令

    http://www.mamicode.com/info-detail-2481866.html sql语句 system用户登陆 查看表空间和存放位置 select t1.name,t2.name ...

  3. ELK集群之kibana(4)

    kibane安装及基础使用 Kibana的安装 Kibana包含前端展示.es操作简化 yum localinstall kibana-7.6.2-x86_64.rpm -y Kibana配置修改ki ...

  4. Jmeter 运行结果的csv文件生成报告

    把运行结果保存到本地,下次可以直接用结果生成测试报告. 一.首先保证脚本能正常运行 二.本地创建csv文件,用来保存运行结果 三.察看结果树,选择本地文件(上一步创建好的csv文件),保存运行结果,如 ...

  5. List of devices attached 没有手机设备号 解决办法

    问题: cmd下使用adb devices 没有找到手机设备,如下图 解决办法: 采用360手机助手给我们自动安装对应的手机驱动,或者去对应的手机官网下载对应的驱动,这里手机要开启调试模式 我是opp ...

  6. vue事件绑定

    事件绑定 vue官方文档:<https://cn.vuejs.org/v2/guide/events.html#%E4%BA%8B%E4%BB%B6%E4%BF%AE%E9%A5%B0%E7%A ...

  7. Python 函数常用类型

    函数常用类型    无参数,无返回值    无参数,有返回值    有参数,无返回值    有参数,有返回值2.无参数,无返回值    无参数无返回值          def hello():    ...

  8. 【Sass/SCSS】预加载器中的“轩辕剑”

    [Sass/SCSS]预加载器中的"轩辕剑" 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 说明 随着前端 ...

  9. Roslyn 编译器Api妙用:动态生成类并实现接口

    在上一篇文章中有讲到使用反射手写IL代码动态生成类并实现接口. 反射的妙用:C#通过反射动态生成类型继承接口并实现 有位网友推荐使用 Roslyn 去脚本化动态生成,今天这篇文章就主要讲怎么使用 Ro ...

  10. [bzoj2743]采花

    预处理出每一个点下一个相同颜色的位置,记为next,然后将询问按左端点排序后不断右移左指针,设要删除i位置,就令f[next[next[i]]+1,同时还要删除原来的标记,即令f[next[i]]-1 ...