1.虚拟化
cpu的虚拟化:让每个运行着的程序都觉得自己拥有一个对立的cpu。
分时技术:把cpu的时间分为一个个时间片,由OS来决定每个时间片运行那个程序的指令。
内存的虚拟化:让每个运行着的程序都觉得自己拥有一片独立的内存。
2.并发
然后线程1和线程2各加1000次,结果应该是2000次是吧,也就是线程1/2输入N时,我们预计程序的最终输出位2N,但如果线程值更高时,可能会出现少了的情况。
为什么会出现加少了的情况,如下图,按理来说顺序应该是当x走完①②③步时,x就会变成x+1,+1操作后变为x+2再执行①②③。但这中间会被打断,请看下图中间红黑笔的部分,线程1用黑色写,线程2用红色写,正在线程1在执行第三步的时候,他的时间片到了,操作系统觉得线程1运行时间太多,会选择线程2来执行,线程2再把寄存器值写为x+1,这个时候操作系统觉得线程2使用的时间片够了,再反过来让线程1执行第③步,这样线程1/2都把+1操作执行完了,但X仍然是x+1的值,少加了一次,就是未能变成x+2,少加了一次,再看看红黑笔图下面竖状图可以清晰的解释这个过程。
3.持久性
想持久的保存数据。文件系统:在逻辑硬盘上建立起文件系统,然后把把数据持久性的保存在文件系统的一个个文件中。
4. OS如何管理运行着的程序
OS要管理运行着的程序,就必须把运行着的程序在OS内严格表达出来。
进程:运行着的程序。进程向OS提出资源请求,OS把资源分配给进程。进程就是OS分配资源的单位。OS是计算机资源的大管家,OS把资源分配给一个个进程后,OS就必须有办法跟踪到每个进程从出生到死亡的过程中使用的一切资源。
PCB:进程控制块Process Control Block
每一个进程都有一个PCB,在OS看来一个PCB就代表一个进程。OS把分配给进程的一切资源或者能够跟踪到这些资源的信息都保存在进程的PCB中。
OS为了更好的管理进程,引入了进程状态:运行状态:进程的指令正在被cpu执行就绪状态:除cpu外,OS已经把所有资源分配给了这个进程。阻塞状态:除cpu外,还有其他资源OS还没有分配给这个进程。
5.OS要管理进程必须要解决二个问题
Q1.OS调度一个进程到cpu上运行后,cpu执行的是这个进程的指令,cpu没有执行OS的指令。这就意味着OS失去了cpu的使用权,那如何防止正在cpu上执行的进程干坏事?
Q2.OS调度一个进程到cpu上运行后,cpu执行的是这个进程的指令,没有执行OS的指令。如何防止当前执行的进程不霸占cpu?如何给cpu执行OS的指令的机会?
Q1的解决方法:分权限。cpu在硬件上就支持不同的权限,执行OS的指令时,cpu处于内核模式,意味着OS的指令不受任何限制;执行应用程序的指令时,cpu处于用户模式,意味着应用程序的指令受限制。
当应用程序的某些功能需要内核模式的指令才能完成时,应用程序必须向OS提出申请,由OS帮运行程序执行相关的指令,完成相关的功能。应用程序向OS提出申请的方式是:调用OS提供的系统调用(system call)。在每一个系统调用的代码中,都有特殊的指令,执行完这条指令后,cpu就从用户模式切换到内核模式,然后去执行OS的代码由OS的代码帮应用程序完成相关的功能。当OS的代码执行完后,系统调用中还有特殊的指令,执行完特殊的指令,cpu就从内核模式切换会用户模式,继续去执行应用程序的代码。
Q2的解决方法