- 公平:每个程度都有机会用到cpu
- 非阻塞:任何程序不能无休止的阻挠别的程序运行,比如一个程序运行过程中需要输入数据而发生阻塞,那么这个进程不能阻碍别的程序运行
- 优先级:具有高优先级的程序,优先运行
zhaohaifan 2016-07-08
1.cpu管理就是进程管理
有3个原则:
2.内存管理主要是管理内存,主存,磁盘,磁带等存储介质所形成的内存架构。为此目的,发明了虚拟内存的概念,将物理内存扩充到外部存储介质上,内存管理的另外一个目的是让许多程序共用同一个物理内存而不产生干扰,这就需要对物理内存进行分割和保护。
3.存储管理
文件系统的主要目的是将磁盘变成一个很容易使用的存储媒介提供给用户。
4.设备管理就是管理输入输出设备
设备管理的几个原则:
5.操作系统简单来说就是实现抽象:进程抽象,文件抽象,虚拟内存抽象。
6.中断是操作系统获得计算机控制权的根本保证
7.内核态可以访问计算机的所有资源,用户态访问权限有部分限制。凡是牵涉到计算机本体根本运行的事情都应在内核态实现。
8.计算机如何识别内核态还是用户态程序?
做出判断需要一种标志,这个标志就是处理器的一个状态位。所谓的用户态,内核态实际上是处理器的一种状态,而不是程序的状态。通过这个状态字,我们可以将cpu设置为内核态,用户态,或者其他子态。一个程序运行时,cpu是什么态,这个程序就运行在上面态
9.内核态与用户态的实现
如何对用户态进行限制呢?显然,要对程序的每一条指令进行检查,这种检查就是地址翻译。内核态直接绕过地址翻译的过程。
10.随着技术的发展,操作系统慢慢有结构了,开始是单一的操作系统结构,但是这样的结构有许多缺点,比如功能块之间循环调用造成死锁。于是,人们设计了操作系统层次结构,下层对上层功能提供服务。
随着操作系统越来越大,如何提高执行效率和保障安全性成了关键问题,于是提出了微内核结构,将一些非核心的功能放到用户态。
11.操作系统对进程的管理通过进程表实现,进程表里存放了关于进程的所有信息,
12.操作系统如何为应用程序提供服务?
系统调用API
13.shell(壳)与系统调用
使用API需要编程,如何方便不编程的用户使用呢?许多操作系统提供了shell(壳,分为文本和图形界面),在shell上,用户输入代码,间接调用API。
14.进程空间也叫地址空间,地址空间就是进程要用到的所有资源。所有资源构成了状态的划分。地址空间的特点就是"被动",它自己不能做什么,需要线程来让这些资源发生作用。
进程的缺陷:进程如果在执行过程中发生阻塞,例如等待输入,整个进程就将挂起,而无法继续执行,这样,即使进程里面有部分工作不依赖于输入数据,也无法推进。因此发明了线程。
15. 既然线程是进程的分身,那么谁来管理呢? 有2种选择,进程管理自己的线程,或者让操作系统管理线程
内核态线程的优点: 编程简单
缺点: 效率低
用户态线程的优点: 编程复杂
缺点: 效率高,灵活方便
16.当一个进程中的线程阻塞时,整个进程都阻塞了,此时怎么办?如果直接切换进程,那么造成很大的浪费,因为这个进程中可能还有其他的线程需要执行。因此,当线程阻塞时,操作系统会给予"第二机会",询问进程是否还有其他需要执行的线程。但是这种方式也有问题,违反了操作系统设计原则中上层调用下层服务的原则。
内核态和用户态线程都有严重的缺陷,因此现代操作系统的线程模型将2者结合了起来,
17.推出线程模型的目的就是实现进程级的并发,因为在一个进程中经常出现多个线程,
线程共享地址空间也会出现问题,这些矛盾归结为以下2个方面
18.线程是软件层不确定性的根源,指令多级流水线是硬件层不确定性的根源
19.线程通信借助于管道,管道是一个线性字节数组,linux系统下载shell中,| 符号创建管道,例如:
$ sort < file | grep zou
将sort的结果作为grep的输入
如果要在不同进程之间的线程之间通信,要使用记名管道,一般只有linux操作系统支持
20.线程通信还可以使用socket,socket功能强大,可以支持不同层面,不同应用,跨网络的通信
21. 线程通信中的套接字和管道需要双方主动建立连接,现在需要一种机制处理如下的通信需求。
应对以上需求,我们使用的是信号
22.计算机中,信号就是一个内核对象,或者说是一个内核数据结构,发送方将该数据结构填好,并指明该信号的目标进程后,发出特定的软件中断。操作系统于是到内核对象中找信号接收方,并进行通知。
信号量的发明源于铁路的运行,任何时刻只有一列列车运行在轨道上,而管理这条铁路的系统就是信号量。
23.线程,socket,信号还是不能满足一种通信需求:大量数据需要共享
这时,通过共享内存的方式进行通信。使用方法是一个进程首先创建一片内存空间专门通信用,而其他进程将该片空间映射到自己的(虚拟)地址空间,这样,读写自己地址中的共享内存区域时,就是在通信。
24.多线程的执行结果是不确定的,如何解决这个问题?
线程的同步,同步就是让线程按照一定的规则执行,共同资源有锁,一段程序代码要么一次性执行完,要么不执行,不会出现执行到一半的时候,别的线程抢占了cpu。
25.线程同步中,没有锁的线程要一直等待,等待的过程消耗资源,怎么解决这个问题?
线程休眠,等到别的线程使用完了资源后,释放锁的时候唤醒线程。
26.管程
信号量存在程序编写困难和效率低下的问题,因此发明了管程,管程