一,操作系统的关键抽象
解析:
1,把IO设备抽象成文件,这样用户不用直接面对硬盘做操作了,因为硬盘是复杂的机械式设备(磁盘块,旋转,扇区等)。操作系统不仅把IO设备抽象成文件。还包括控制台,输入输出设备都可以抽象成文件。
2,物理主存+IO设备 抽象成 虚拟存储器。虚拟存储器是对内存和硬盘的抽象,他让每个进程都有一个超级大的内存空间。(因为内存的大小是 有限的,不可能把所有的进程都放到内存中,所以操作系统给每个进程一个独立的虚拟地址空间,这个独立的虚拟地址空间会被映射到真 实的内存空间,程序看起来是在运行,但是可能只有一小段的代码被调到的真实的内存中,并不是所有的程序代码都调入内存中去了)
3,cpu抽象成指令集,
4,操作系统 + 存储器 抽象成 进程
5,操作系统 + 进程 抽象成 虚拟机。比如云计算就用到虚拟机。
二,进程的比喻
三,内存中的进程
进程在虚拟存储器中的逻辑布局
操作系统切换进程
内存中有一个数据结构叫:PCB,专门用来保存上下文的。
当cpu时间片用完后,从运行态到就绪态
当发生阻塞时,从运行态到等待
进程的调度:
dos系统,win3.1系统都是非抢占式,不适合交互式操作。
批处理系统的调度
交互式系统的调度
进程间同步:
经典的生产者消费者问题
问题:
代码中的count++,其实机器语言执行时需要三步。
register = counter; 把内存中的值放入寄存器中
register = register + 1; 寄存器进行自增操作
counter = register; 再把寄存器中的值写会内存中
一个指令周期内不能一下子完成上面三条指令。那么在并发情况下就会出错。所以要加锁,等这三条指令执行完毕。才让别的线程执行。
解决问题:
三,线程
线程的切换
实现方式一:
缺点:一个进程的其中一个线程阻塞后,该进程的其他线程都无法执行。
实现方式二:
缺点:内核中的线程太多了
实现三:
多个用户线程对应一个内核线程。