CPU如何同时运行多个进程?
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如何同时运行多个进程?的更多相关文章
- Linux 和 Windows 查看当前运行的 python 进程及 GPU、CPU、磁盘利用率
目录 查看当前 python 进程 Linux Windows 查看 GPU 利用率 Linux Windows Linux CPU 利用率 Linux 磁盘利用率 查看当前 python 进程 Li ...
- IOS高级开发~开机启动&无限后台运行&监听进程
一般来说, IOS很少给App后台运行的权限. 仅有的方式就是 VoIP. IOS少有的为VoIP应用提供了后台socket连接,定期唤醒并且随开机启动的权限.而这些就是IOS上实现VoIP App的 ...
- Linux显示所有运行中的进程
Linux显示所有运行中的进程 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ ps aux | less USER PID %CPU %MEM VSZ RSS ...
- linux暂停一个在运行中的进程【转】
转自:https://blog.csdn.net/Tim_phper/article/details/53536621 转载于: http://www.cszhi.com/20120328/linux ...
- linux下获取占用CPU资源最多的10个进程
linux下获取占用CPU资源最多的10个进程,可以使用如下命令组合: ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head linux下获取占用 ...
- IOS开发~开机启动&无限后台运行&监听进程
非越狱情况下实现: 开机启动:App安装到IOS设备设备之后,无论App是否开启过,只要IOS设备重启,App就会随之启动: 无限后台运行:应用进入后台状态,可以无限后台运行,不被系统kill: 监听 ...
- linux下获取占用CPU资源最多的10个进程,可以使用如下命令组合:
linux下获取占用CPU资源最多的10个进程,可以使用如下命令组合: ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head linux下获取占用 ...
- Qt之运行一个实例进程
简述 发布程序的时候,我们往往会遇到这种情况: 只需要用户运行一个实例进程 用户可以同时运行多个实例进程 一个实例进程的软件有很多,例如:360.酷狗- 多个实例进程的软件也很多,例如:Visual ...
- C#获取运行程序的进程ID
C#获取运行程序的进程ID [DllImport("User32.dll", CharSet = CharSet.Auto)] public static extern int G ...
随机推荐
- CentOS7 导入oracle数据
1.切换到 oracle用户 #su - oracle 2.导入(一般的不会导入到sys账号下) #imp sys/密码@orcl file=/home/oracle/20200428.dmp fro ...
- spark structured-streaming 最全的使用总结
一.spark structured-streaming 介绍 我们都知道spark streaming 在v2.4.5 之后 就进入了维护阶段,不再有新的大版本出现,而且 spark strea ...
- 详细剖析Spring Cloud 和Spring Cloud Alibaba的前世今生
我们知道spring cloud可以用来开发微服务,但是应该很少有人真正知道Spring Cloud是什么. 官方的解释是:spring cloud提供了一些可以让开发者快速构建分布式应用的工具,这些 ...
- MSSQL SQL注入 总结
0x00 MSSQL 基础 MSSQL系统自带库和表 系统自带库 MSSQL安装后默认带了6个数据库,其中4个系统级库:master,model,tempdb和msdb:2个示例库:Northwind ...
- uni-app app端设置全屏背景色
设置page:{样式},博主调试的时候在app端不起作用,设置配置文件的backgroundColor也没有用,所以博主就使用了一个稍微比较偏的办法解决了,没有用获取设备信息的api来实现 具体操作就 ...
- css 跑马灯加载特效
css 跑马灯加载特效 <!DOCTYPE html> <html lang="en"> <head> <meta charset=
- storm调用kafka重复消费的问题
1. 实现IBolt接口的bolt需要显式调用collector.ack(); 2. 继承自BaseBasicBlot的bolt, 会帮你自动调用ack的
- JDK 之 HttpClient(jdk11)
HttpClient 简介 java.net.http.HttpClient 是 jdk11 中正式启用的一个 http 工具类(其实早在 jdk9 的时候就已经存在了,只是处于孵化期),官方寓意为想 ...
- c++学习笔记4(函数重载)
一个或多个函数,名字相似,然而参数个数或类型不同,这个叫做函数重载 优点:可以使函数的命名变得简单
- FZU_DS_2019_SequenceList
单选题 2-1 数组A[1..5,1..6]每个元素占5个单元,将其按行优先次序存储在起始地址为1000的连续的内存单元中,则元素A[5,5]的地址为: A.1120 B.1125 ...