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 ...
随机推荐
- VCS常用仿真选项开关及步骤总结
转自:https://blog.csdn.net/bcs_01/article/details/79803304 转自:https://blog.csdn.net/wonder_coole/artic ...
- linux中dd命令
转载:https://www.runoob.com/linux/linux-comm-dd.html Linux dd 命令用于读取.转换并输出数据. dd 可从标准输入或文件中读取数据,根据指定的格 ...
- 猫狗收容所 牛客网 程序员面试金典 C++
猫狗收容所 牛客网 程序员面试金典 C++ 题目描述 有家动物收容所只收留猫和狗,但有特殊的收养规则,收养人有两种收养方式,第一种为直接收养所有动物中最早进入收容所的,第二种为选择收养的动物类型(猫或 ...
- hdu 1394 Minimum Inversion Number(线段树or树状数组)
题意: 给你N个数,N个数是0~N-1的一个全排列. 要求统计它的所有形式的逆序对的最小值.它的所有形式的意思是,不断将数组开头的第一个数放到数组的最后面. 逆序对:i<j且ai>aj 思 ...
- 在Delphi中高效执行JS代码
因为一些原因,需要进行encodeURIComponent和decodeURIComponent编码,在Delphi中找了一个,首先是发现不能正确编码+号,后面强制处理替换了,勉强可用. 后面发现多次 ...
- SQL*Loader-704: Internal error: ulconnect: OCIServerAttach [0] ORA-12541: TNS:no listener
使用/app/oracle/product/11.2.0/bin/sqlldr导入数据报错: 监听没有开启?检查发现监正常 猜测是监听端口不是默认的1521有关系,直接在sid里面加上数据库服务器的i ...
- SQL注入之猫舍
第一步:先查看是否存在注入点:构造?id=1 and 1=1 回车后发现页面正常 构造?id=1 and 1=2 发现页面异常,得出结论:存在注入点 第二步:判断字段数 当输入order by 1和o ...
- c++学习笔记6(结构化程序设计的不足)
结构化程序设计 c语言使用结构化程序设计: 程序=数据结构+算法 程序有全局变量以及众多相互调用的函数组成 算法以函数的形式实现,用于对数据结构进行操作 结构化程序设计不足 软件业的目标是更快,更正确 ...
- java更开源-安全可靠国产系统背景下的应有.NET Core的一席之地
"安可"背景下的中国软件开发 在中美当前背景下的安全可靠国产系统(简称安可),安可产业要实现技术自主可控,需要在四个层面逐步实现:基础硬件设施,如芯片.服务器.存储.交换机.路由器 ...
- linux安装python3.6.1
Linux下安装Python3.6和第三方库 如果本机安装了python2,尽量不要管他,使用python3运行python脚本就好,因为可能有程序依赖目前的python2环境, 比如yum!!! ...