操作系统
操作系统(OS)是当今最复杂的系统软件之一,它几乎是所有复杂应用软件的基础。操作系统本质上是一组程序,他管理和控制其他程序的执行,并充当应用程序和计算机硬件之间的接口。操作系统相当于一个管理者。它的出现是为了使计算机更好的使用。
冯诺依曼体系结构
我们常见的计算机、服务器都遵循着冯诺依曼体系结构。
-
运算器和控制器称为CPU
-
所有设备都只能直接和内存打交道
前边说过操作系统是一个管理者,那么如何理解管理,到底管理什么?
管理:
1.描述被管理的对象
2.组织被管理的对象
就像我们学生在教务处被管理起来一样,我们每个同学都会被描述为具有学号,姓名,出生,性别等信息的一个对象,然后全校的学生再被组织起来,例如用数据结构中的链表一样,这样教务处便可以很容易的管理我们任何一个同学。
进程
我们知道一个应用程序没运行起来是存放在磁盘或其他远程的地方,一个程序要运行起来首先得将它加载到内存中去,前边我们在讲冯诺依曼体系结构中说道所有设备都只能直接和内存打交道。当一个程序运行起来,我们将程序运行的活动称为进程。
-
操作系统是一个管理者,那么进程也是需要被管理的对象,同样,我们先将进程描述起来,再组织起来。
-
进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。
-
课本上称之为PCB(process control block),Linux操作系统下的PCB是: task_struct
task_ struct内容分类
-
标示符: 描述本进程的唯一标示符,用来区别其他进程。
-
状态: 任务状态(就绪,运行,阻塞等),退出代码,退出信号等。
-
优先级: 相对于其他进程的优先级。(80,-20~19)
-
程序计数器: 程序中即将被执行的下一条指令的地址。
-
内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
-
上下文数据: 进程执行时处理器的寄存器中的数据。
-
I/O状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
-
记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
-
其他信息
所有运行在系统里的进程都以task_struct链表的形式存在内核里。
进程的地址空间:在Linux下,每一个进程的用户程序都是从虚拟地址 0x08048000 开始分布的,那么多个进程占据的内存是否会发生冲突?不会,因为这里的地址空间指的是虚拟地址空间,不是真正的物理内存地址空间。虚拟地址空间和物理地址空间通过页表的方式映射,所以每个进程都有属于自己的虚拟地址空间。
另外,通常⽗子代码共享,⽗⼦再不写入时,数据也是共享的,当任意⼀方试图写入,便以写时拷贝的方式各⾃自一份副本。具体见下图:
进程调度
-
长程调度
-
中程调度
-
短程调度
决策模式:
非抢占式:进程一旦处于运行状态,就一直执行到终止,或因为等待I/O或请求某些操作系统服务而阻塞。
抢占式:当前运行的进程可能被其他进程抢占,并转移到就绪状态。发生时机:一个新进程到达;中断后一个阻塞进程置位就绪状态;或者基于周期的时钟中断,如时间片到期时。
短程调度策略
-
FCFS(FIFO)
-
轮转
-
SPN(最短进程优先)
-
SRT(最短剩余时间)
-
HRRN(最高相应比优先)
-
反馈
线程
通过上文,我们知道,一个进程(应用程序)做了很多事,提供环境,资源(如内存,打开I/O设备等),还要通过处理器执行程序的流程,我们把有关程序执行流方面的抽象分离出来,就是线程的概念。线程就是对程序执行流的一个抽象,而进程是这个执行流所依赖的一个上下文。一个进程中可以有多个线程,每个线程也想进程一样被描述组织管理起来。
线程的优点:
-
在一个进程中创建线程所需的开销要比进程少很多,创建线程比创建进程快10倍。
-
终止一个线程比终止一个进程花费时间少。
-
同一个进程内线程间的切换比进程间的切换花费时间少。
-
线程提高了程序间通信的效率。独立的进程间的通信需要内核介入,而同一进程内的线程之间通信不需要。
总之就一句话:同一进程内的线程所需的时间开销要比进程间的时间开销少。