现代操作系统(一)

一.引论

多数计算机有两种运行模式:内核态和用户态。软件中最基础的部分是操作系统,它运行在内核态(管态、核心态),在这个模式下,操作系统具有对所有硬件的完全访问权,可以执行机器能够运行的任何指令。软件的其余部分运行在用户态,在用户态下,只使用了机器指令中的一个子集
操作系统的任务是在相互竞争的程序之间有序的控制对处理器、存储器以及其他I/O接口设备的分配
计算机硬件简介
1.处理器
由于用来访问内存以得到指令或数据的时间要比执行指令花费的时间长得多,所有的CPU内都有一些用来保存关键变量和临时数据的寄存器
程序计数器,它保存了将要取出的下一条指令的内存地址
堆栈指针,指向内存中当前栈的顶端,该栈包含了每个执行过程的栈帧。一个过程的栈帧中保存了有关的输入参数、局部变量以及那些没有保存在寄存器中的临时变量
程序状态字(PSW)寄存器,这个寄存器包含了条件码位、CPU优先级、模式(用户态或内核态)以及各种其他控制位。用户程序通常读入整个PSW,但是只对其中的少量字段写入
为了从操作系统中获得服务,用户程序必须使用系统调用以陷入内核并调用操作系统,TRAP指令把用户态切换到内核态

2.存储器
存储器系统采用一种分层次的结构

1) 存储器系统的顶层是CPU中的寄存器,程序必须在软件中自行管理这些寄存器
2) 下一层是高速缓存,它多数由硬件控制。主存被分割成高速缓存行,有多行存在;第一级或称为L1缓存,总是在CPU中,通常用来将已解码的指令调入CPU的执行引擎,对于频繁使用的数据字,多数芯片安排有第二个L1缓存;另外往往还设计有二级缓存(L2缓存),用来存放近来使用过的若干兆字节的内存字。L1和L2缓存之间的差别在于时序,对L1缓存的访问,不存在任何延时;而对L2缓存的访问,则会延时1-2个时钟周期
3) 再往下一层是主存,这是存储器系统的主力。也成为随机访问存储器(RAM)。所有不能在高速缓存中得到满足的访问请求都会转往主存。只读存储器(ROM)速度快且便宜,但是不可修改。电可擦除可编程ROM(EEPROM)和闪存(flash memory)也是非易失的,但是可以擦除和重写。还有一类存储器是CMOS,易失性的。

3.磁盘
一种机械装置
信息写在磁盘的一系列同心圆上。在任意一个给定臂的位置,每个磁头可以读取一段环形区域,称为磁道;把一个给定臂的位置上的所有磁道合并起来,组成了一个柱面。每个磁道划分为若干扇区。固态硬盘是数据存储在闪存中。

4.I/O设备
I/O设备一般包括两个部分:设备控制器和设备本身
控制器的任务是为操作系统提供一个简单的接口
专门与控制器对话,发出命令并接收响应的软件,称为设备驱动程序
实现输入输出有三种方式:

  • 忙等待:用户程序发出一个系统调用,内核将其翻译成一个对应设备驱动程序的调用过程;然后设备驱动程序启动I/O并在一个连续不断的循环中检查该设备。看该设备是否完成了工作。当I/O结束后,设备驱动程序把数据送到指定的地方并返回。缺点是一直占据CPU
  • 设备驱动程序启动设备并且让该设备在操作完成时发出一个中断
  • 直接存储器访问DMA,无须CPU干预

5.总线
PCI使用并行总线架构,PCIe使用串行总线架构
USB是用来将所有慢速I/O设备与计算机连接的
SCSI总线是一种高速总线,用在高速硬盘、扫描仪和其他需要较大带宽的设备上

6.启动计算机
母板上有BIOS程序,存放在一块闪存RAM中,非易失性。
(1)在计算机启动时,BIOS开始运行。首先检查所安装的RAM数量,键盘和其他基本设备是否已经安装并正常响应。接着扫描PCIe和PCI总线并找到连在上面的所有设备。
(2)然后BIOS通过尝试存储在CMOS中的设备清单决定启动设备。启动设备上的第一个扇区被读入内存并执行。这个扇区中包含一个对保存在启动扇区末尾的分区表检查的程序,以确定哪个分区是活动的。然后从该分区读入第二个启动装载模块。来自活动分区的这个装载模块被读入操作系统,并启动之。
(3)然后,操作系统询问BIOS,以获得配置信息。一旦有了全部的设备驱动程序,操作系统就将它们调入内核。然后初始化有关表格,创建需要的任何背景进程,并在每个终端上启动登录程序和GUI

操作系统概念
1.进程:本质上是正在执行的一个程序,基本上是容纳运行一个程序所需要所有信息的容器
2.地址空间:与每个进程相关,一般存放有可执行程序、程序的数据以及程序的堆栈
3.文件:普通文件的相关操作都是需要系统调用;特殊文件有块特殊文件(可随机存取的块组成的设备,诸如磁盘)以及字符特殊文件(用于打印机、调制解调器和其他接收或输出字符流的设备);管道是一种虚文件,它可连接两个进程
4.输入/输出
5.保护

系统调用
1.用于进程管理的系统调用

调用 说明
pid = fork() 创建与父进程相同的子进程
pid = waitpid(pid,&statloc,options) 等待一个子进程终止
s = execve(name,argv,environp) 替换一个进程的核心映像
exit(status) 终止进程执行并返回状态

UNIX将其存储空间划分为三段:正文段、数据段以及堆栈段。数据向上增长而堆栈向下增长
2.用于文件管理的系统调用

调用 说明
fd = open(file,how,…) 打开一个文件供读、写或两者
s = close(fd) 关闭一个打开的文件
n = read(fd,buffer,nbytes) 把数据从一个文件读到缓冲区中
n = write(fd,buffer,nbytes) 把数据从缓冲区写到一个文件中
position = lseek(fd,offset,whence) 移动文件指针
s = stat(name,&buf) 取得文件的状态信息

3.用于目录管理的系统调用

调用 说明
s = mkdir(name,mode) 创建一个新目录
s = rmdir(name) 删去一个空目录
s = link(name1,name2) 创建一个新目录name2并指向name1
s = unlink(name) 删去一个目录项
s = mount(special,name,flag) 安装一个文件系统
s = umount(special) 卸载一个文件系统

4.各种系统调用

调用 说明
s = chdir(dirname) 改变工作目录
s = chmod(name,mode) 修改一个文件的保护位
s = kill(pid,signal) 发送信号给一个进程
seconds = times(&seconds) 自1970-1-1流逝的时间

操作系统结构
单体系统:整个操作系统在内核态以单一程序的方式运行
层次式系统:上层软件都是在下一层软件的基础上构建的
微内核:为了实现高可靠性,将操作系统划分为小的、良好定义的模块、只有其中一个模块(微内核)运行在内核态,其余的功能较弱的模块则作为普通用户进程运行
客户端-服务器模式
虚拟机
外核

猜你喜欢

转载自blog.csdn.net/u011955067/article/details/80216049