操作系统-简单概念

本文最后更新于:1 年前

[TOC]

软中断硬中断

Linux 系统为了解决中断处理程序执⾏过⻓和中断丢失的问题,将中断过程分成了两个阶段,分别是

  • 上半部⽤来快速处理中断,⼀般会暂时关闭中断请求,主要负责处理跟硬件紧密相关或者时间敏感的事情。
  • 下半部⽤来延迟处理上半部未完成的⼯作,⼀般以「内核线程」的⽅式运⾏。

⽹卡收到⽹络包后,会通过硬件中断通知内核有新的数据到了,于是内核就会调⽤对应的中断处理程序来响应该事件,这个事件的处理也是会分成上半部和下半部。

  • 上部分要做到快速处理,所以只要把⽹卡的数据读到内存中,然后更新⼀下硬件寄存器的状态,⽐如把状态更新为表示数据已经读到内存中的状态值。
  • 接着,内核会触发⼀个软中断,把⼀些处理⽐较耗时且复杂的事情,交给「软中断处理程序」去做,也就是中断的下半部,其主要是需要从内存中找到⽹络数据,再按照⽹络协议栈,对⽹络数据进⾏逐层解析和处理,最后把数据送给应⽤程序

所以,中断处理程序的上部分和下半部可以理解为:

上半部直接处理硬件请求,也就是硬中断,主要是负责耗时短的⼯作,特点是快速执⾏

下半部是由内核触发,也就说软中断,主要是负责上半部未完成的⼯作,通常都是耗时⽐较⻓的事情,特点是延迟执⾏

操作系统

计算机是由各种外部硬件设备组成的,⽐如内存、cpu、硬盘等,如果每个应⽤都要和这些硬件设备对接通信协议,那这样太累了,所以由内核来负责,让内核作为应⽤连接硬件设备的桥梁,应⽤程序只需关⼼与内核交互,不⽤关⼼硬件的细节。
现代操作系统,内核⼀般会提供 4 个基本能⼒:

  • 管理进程、线程,决定哪个进程、线程使⽤ CPU,也就是进程调度的能⼒;
  • 管理内存,决定内存的分配和回收,也就是内存管理的能⼒;
  • 管理硬件设备,为进程与硬件设备之间提供通信能⼒,也就是硬件通信能⼒;
  • 提供系统调⽤,如果应⽤程序要运⾏更⾼权限运⾏的服务,那么就需要有系统调⽤,它是⽤户程序与操作系统之间的接⼝。

image-20210804214134653

堆栈

由编译器自动释放,存放函数的参数值,局部变量等。每当一个函数被调用时,该函数的返回类型和一些调用的信息被存储到栈中。然后这个被调用的函数再为它的自动变量和临时变量在栈上分配空间。每调用一个函数一个新的栈就会被使用。栈区是从高地址位向低地址位增长的,是一块连续的内在区域,最大容量是由系统预先定义好的,申请的栈空间超过这个界限时会提示溢出,用户能从栈中获取的空间较小。

堆是是不连续的内存区域,这是由于系统使用链表存储空闲内存地址的,自然是不连续的。而链表的遍历方式是由低地址向高地址,堆的大小受限于计算机系统中有效的内存,由此可见,堆获得的空间比较灵活,也比较大。
操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序,

32 位 64 位

从程序上说:32 位与 64 位程序,是指经过语言编译后的可执行文件,比如 C 语言编写的程序就需要区分是 32 位的还是 64 位

从系统和硬件上讲:CPU 一次处理数据的能力是 32 位还是 64 位,关系着系统需要安装 32 位还是 64 位的系统

32 位和 64 位中的“位”,也叫字长,是 CPU 通用寄存器的数据宽度,是数据传递和处理的基本单位。字长是 CPU 的主要技术指标之一,指的是 CPU 一次能并行处理的二进制位数,字长总是 8 的整数倍

image-20210805161650063

用户态内核态

image-20210806101858699

内核态:控制计算机的硬件资源,并提供上层应用程序运行的环境。

用户态:上层应用程序的活动空间,应用程序的执行必须依托于内核提供的资源。

系统调用:为了使上层应用能够访问到这些资源,内核为上层应用提供访问的接口。

在 CPU 的所有指令中,有一些指令是非常危险的,如果错用,将导致整个系统崩溃。比如:清内存、设置时钟等。如果所有的程序都能使用这些指令,那么十分危险。所以,CPU 将指令分为特权指令和非特权指令,对于那些危险的指令,只允许操作系统及其相关模块使用,普通的应用程序只能使用那些不会造成灾难的指令。