多数时候,我们在学一门语言的时候,写的第一个程序都是hello world;
无论是python、c还是c++等其他高级语言写的实际上都属于我们的应用程序,所以应用程序的执行都需要操作系统支持,你知道操作系统都为我们提供了哪些服务吗?
一、从helloworld学习OS:
#include<stdio.h>
int main(int argc , char * argv[])
{
printf("hello world");
return 0;
}
1.首先客户双击图标 或者. /可执行文件名启动程序,告诉操作系统的我要执行这个程序;
2.操作系统检查我们的程序,检查程序是不是一个可执行文件(PE/ELF),如果是,去磁盘找到可执行文件的指令和数据;
3.操作系统创建一个新的进程,如创建PCB,将可执行文件映射到进程结构,此时进程就算是创建好了;
4.操作系统为进程设置CPU的上下文环境,然后把我们的程序交给调度程序,如果我们的程序刚好被调度程序选中,那么就要跳到程序的入口开始执行;
5.执行我们程序的第一条语句一定会发生缺页异常,do_page_fault异常,因为此时我们还没有将我们的指令和数据加载到内存中,所以CPU找不到,发生异常;
6.然后操作系统内存管理给我们的程序分配物理页面(内存),并将程序的指令和代码读入内存,继续执行;如果我们的程序特别大的话。一张页面可能不够用,之后还可能发生缺页异常;
7.程序执行到print()函数,实际上是一个系统调用,内核是sys_write(),在我们的标准输出(屏幕)打印出去;
8.一般我们的显示设备(这里指的是屏幕)由一个进程控制,此时操作系统要做的是将我们的字符串"hello world"送给显示设备进程;
9.设备对应的进程接收到操作系统的指令以及要显示的字符串,判断该操作是否合法,如果合法就将该字符串转换成像素,将像素存入映像区;
10.视频硬件将像素转换成数字信号,显示器再去解释信号,激发液晶屏,这样我们就看到了字符串"helloworld"。
实际上,整个过程不仅仅执行我们的helloworld程序
还有进程创建程序、进程调度程序、内存分配程序......
这些程序相互交织
而helloworld是我们应用程序,其他的是操作系统的为我们应用程序提供支持的程序
我们可以看到操作系统给我们做了 启动程序、执行程序、执行结束的善后工作
二、操作系统是什么:
从上面的helloworld程序你大概能隐约的知道操作系统是什么,我这里给出你较专业的定义:
1.OS本质也是一个软件;
2.有效、合理的方式组织管理计算机的软硬件资源;
3.合理组织计算工作流程,控制程序的执行提供给用户服务;
4.在一个就是使得用户更加高效灵活的使用计算机。
有效:系统效率,资源利用率(比如我们总是希望cpu能不空闲,IO忙碌起来)
合理:资源的分配策略是否公平合理
方便:用户界面和编程接口(能方便的与OS打交道)
所以操作系统的作用显而易见:
1.资源的管理者(软件资源(磁盘的文件、各类管理信息)和硬件资源(cpu、内存、IO设备等))
细致的划分可以分为以下:
1.进程/线程的管理:状态、控制、同步互斥、通信、调度…
2.存储管理:分配/回收、地址转换(虚拟->物理)、存储保护、内存扩充…
3.文件管理:文件目录、文件操作、磁盘空间、缓冲技术…
4.设备管理:设备驱动、分配回收、缓存技术…
5.用户接口:系统命令、编程接口…
OS如何管理资源:
1.跟踪记录资源的使用情况,实际上就是 数据结构 来记录
(哪些资源空闲、分配给谁、使用多久时间)
2.确定资源分配策略,实际上就是 分配算法,算法去实际的操作数据结构
(一般为动态分配策略)
3.进行资源的分配和回收
(比如分配出去了,将某个数据结构的标志位 修改为1,使用结束了回收了再改为0)
4.协调多个进程对资源的请求冲突
2.各种系统服务的提供者:(如进程创建、文件操作等)
3.是用户程序与硬件桥梁:(屏蔽硬件帮助用户操作硬件,因为硬件操作比较繁琐)
举个例子读文件:你是愿意去自己操作磁头读磁盘 还是 去执行write()
通过操作系统,我们程序员更好的对硬件进行编程。
三、操作系统的特点:
1.并发:有能够处理多个同时性的活动的能力;
单cpu
宏观:所以程序都在执行
微观:每个时刻只有一个程序在cpu上运行
与并发类似的一个概念-----并行:指不同程序在多个硬件部件上执行
没必要刻意的区分。
2.共享:操作系统本身与用户的程序共享计算机的资源。
对操作系统而言:对资源进行合理分配和使用,在一定时间内,要被多个进程交替使用
互斥共享:打印机
同时共享:打开磁盘上的不同的文件,此时磁盘是同时共享的
3.虚拟:一个个的物理试题映射位若个对应的逻辑实体
如何体现虚拟,据举例:
1.假设主机只有一个物理CPU,但是我们看到宏观看到是多个进程看到是每个进程都有自己的物理CPU。
实际上是虚拟的
2.存储器:每个进程运行起来都会有虚拟地址空间,这样看起来每个进行都有自己的物理内存,
可是实际上,所以的进程共享的是一块物理内存
3.显示设备:多窗口或虚拟终端
4.随机:随时对不可预测的事件进行处理
进程走走停停,无法预知进程运行的推进
难以重现系统在某个时刻的状态
四、操作系统的典型架构: 这里说一下linux架构
整体分为用户态和内核态:
1.用户态:应用程序
2.内核态:进程调用模块、虚拟内存管理、物理内存管理、文件系统、设备驱动程序、网络模块、异常处理、中断处理、系统调用接口
五、操作系统的分类:
操作系统的不同是根据 硬件技术的发展、需求的发展以及软件基础的发展而发展。
可以按照出现的先后顺序进行分类:
批处理操作系统:
用户将一批作业给操作系统,形成作业流,操作系统依次的进行处理,吞吐量不错;
SPOOLING系统(技术):同时的外围设备联机操作,又称假脱机技术
思想:利用磁盘做缓冲,将输入、计算、输出分别组织成独立的任务流,使I/O和计算真正并行
分时操作系统:
将CPU的时间划分为若干个片段,系统轮流为终端用户服务,每次消耗一个时间片;
给人一个错觉,每个终端用户都有一个CPU,实际上是大家共享一个物理CPU
体现OS的 虚拟 特性
通用操作系统:
分时和批处理的结合。原则是分时优先,批处理在后
“前台”:需要频繁交互的作业
”后台“:时间性要求不强的作业
实时操作系统:
计算机能及时的进行响应外部事件,规定时间内完成对事件的处理
个人计算机操作系统:计算机为单用户服务,界面友好,操作简单
网络操作系统:在各种计算机的操作系统的上按照网络协议标准开发的软件
分布式操作系统:
计算机的处理或者计算分布在不同的计算机上,允许若干个计算机协同的共同去完成一个任务
嵌入式操作系统:在各种设备、装置或系统中,完成特定功能的软硬件系统,如汽车、手机、电视机、MP3等,对以上系统的开发进行统一调度、资源分配等等