第一章

1.1操作系统是系统资源的管理者

操作系统 本质上是对硬件机器的扩展 将裸机改造成功能更强、使用更方便的机器。

1.2操作系统的四个特征

并发、共享、虚拟、异步

并发:两个或多个事件在同一时间间隔内发生。宏观上同时发生,微观上交替发生。

并行:两个或多个事件在同一时刻同时发生。

共享:系统中的资源可供内存中多个并发执行的进程共同使用。

虚拟:把一个物理上的实体变为若干个逻辑上的对应物。

异步:在多道程序环境中,允许多个程序并发执行,但由于资源有限,进程的执行不是一贯到底的,而是走走停停,已不可预知的速度向前推进。

1.3操作系统的发展与分类

手工操作阶段;批处理阶段(单批处理;多批处理);分时操作系统;实时操作系统

1.4操作系统的运行机制

CPU状态:内核态和用户态

处于内核态,说明此时正在运行的是内核程序,此时可以执行特权指令

处于用户态,说明此时正在运行的是应用程序,此时只能执行非特权指令

内核态切换到用户态:执行一条特权指令--修改PSW的标志位为“用户态”、

用户态切换到内核态:由中断引发,硬件自动完成变态过程,触发中断信号意味着操作系统将强行夺回CPU使用权。

1.5中断和异常

中断的类型

内中断(异常、例外):与当前执行的指令有关,中断信号来源于CPU内部

内中断触发场景:

(1)若当前执行的指令是非法的,则会引发一个中断信号

(2)应用程序想请求操作系统内核服务,执行陷入指令,引发中断信号

外中断(中断):与当前执行的指令无关,中断信号来源于CPU外部

外中断触发场景:

  1. 时钟中断,由外部时钟部件发来的中断信号
  2. I/O终端,由输入/输出设备发来的中断信号

内中断分类:陷入(请求内核服务)、故障(缺页处理)、终止(程序bug)

外中断分类:时钟中断、I/O中断请求

中断机制的基本原理

不同的中断信号,需要用不同的中断处理程序来处理。(中断向量表实现)

1.6系统调用

系统调用:操作系统提供给用户程序调用内核功能的接口。

系统调用过程

传递系统调用参数->执行陷入指令(用户态)->由操作系统内核程序处理系统调用请求 ->返回应用程序

陷入指令(trap)

陷入指令允许用户程序‌主动请求操作系统内核服务‌(如文件读写、进程创建等),或在发生‌不可恢复错误‌(如除零、非法指令)时将控制权交还给操作系统。

1.7操作系统体系结构

分为大内核和微内核。微内核只包括时钟管理、中断处理、原语。

附:Windows/Linux进程与线程本质区别

进程:资源分配单位(内存、地址空间、文件句柄、权限)。

线程:CPU调度执行单位(时间片、寄存器、栈)一个进程至少一个主线程,线程共享所属进程全部资源。

底层本质差异

1、地址空间

进程:独立虚拟地址空间,A进程看不到B进程,互相隔离。

线程:共享同一个进程地址空间,同进程线程读写同一块内存。

2、资源拥有

进程独有:虚拟内存页表、PID、进程 PCB、打开文件描述符、信号处理、用户权限

线程独有:线程栈、寄存器集合、线程 TCB、线程 ID

线程不拥有内存资源,只借用进程资源运行

3、切换开销

进程切换:切换页表、刷新TLB、切换地址空间 开销极大

线程切换:只切换寄存器、栈指针、不换页表 开销极小

4、健壮性

一个进程崩溃:只自己死,不影响其他进程

一个线程崩溃:整个进程一起崩溃(共用地址空间)

5、通信方式

进程间IPC:管道、消息队列、共享内存、socket ,复杂低效

线程间通信:直接读写全局变量,简单高效,但要加锁同步

Windows 与 Linux 线程模型差异

Linux

1、内核线程+用户线程两层模型

2、线程本质就是特殊进程,内核不区分进程/线程

3、同进程多线程:共享PID

4、调度粒度统一,内核直接调度线程

Windows

1、严格区分进程对象和线程对象,内核天生线程调度

2、进程负责资源、线程负责执行

3、线程优先级严格分级,调度比Linux更偏向抢占实时

面试总结

1、进程是资源分配最小单位,线程是CPU调度最小单位

2、进程地址空间独立,线程共享进程地址空间

3、进程切换开销远大于线程切换

4、Linux线程用轻量级进程实现,Windows内核原生支持线程

进程虚拟地址空间 + 栈溢出 + 堆内存管理

进程虚拟地址空间(32位/64位 标准布局)

要点:每个进程有独立虚拟地址空间,隔离互不干扰;物理内存由MMU+页表映射

经典32位进程地址空间排布(从上到下)

各区关键特性

  1. 代码段.text 只读、共享、不可写 存放程序机器指令
  2. 数据段/bss 全局变量、static静态变量 bss不占用磁盘文件,运行时清零分配
  3. 堆Heap 手动管理:malloc/free new/delete 向上扩张,自由申请释放,碎片多
  4. 栈Stack 系统自动管理,函数调用自动分配回收 容量极小、速度极快
  5. 内核空间 权限最高,用户态无法直接访问

栈详解&栈溢出

栈特点:内存连续,自动分配自动释放;生长方向:从高地址到低地址;

栈溢出原因:数组越界;缓冲区拷贝不限制长度;超大局部数组

堆内存管理

堆核心特点:空间大、生命周期手动控制;生长方向:低地址到高地址;不连续碎片化,分配速度慢于栈

全局变量在数据段 /bss,局部变量在栈,动态对象在堆。

学习参考:王道操作系统

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐