## **操作系统**
**死锁以及为什么发生死锁,解除死锁**
死锁是指一组相互竞争系统资源或进行通信的进程间的"永久"阻塞。
产生死锁的原因:
(1)竞争系统资源
(2)进程的推进顺序不当
产生死锁的四个必要条件:
(1) 互斥条件:一个资源每次只能被一个进程使用。
(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
**解除死锁**:
当发现有进程死锁后,应立即把它从死锁状态中解脱出来,常采用的方法有:
剥夺资源:从其它进程剥夺足够数量的资源给死锁进程,以解除死锁状态;
撤消进程可以直接撤消死锁进程或撤消代价最小的进程,直至有足够的资源可用,
死锁状态消除为止
所谓代价是指优先级、运行代价、进程的重要性和价值等。
**进程之间通信方式**:
> 信号,管道,消息队列,共享内存。
## **启动流程 ( Windows )**:
基本上操作系统是从计算机通电自检完成后开始进行的,这一过程可以分为
( 预引导、引导、载入内核、初始化内核、登录等 5 个阶段 )
1) 预引导
通电自检后,从引导设备中读取并运行主引导记录MBR
2) 引导
引导阶段又可以分为 初始化引导载入程序、操作系统选择、硬件检测、硬件配置文件选择
在这一过程中需要使用的文件包括 ntldr、boot.ini、ntdetect.com、ntoskrnl.exe、ntbootdd.sys、bootsect.dos ( 非必须 )
A 初始化引导载入程序:
程序 ntldr 会自动寻找系统自带的一个微型的文件驱动,读取文件系统驱动并成功找到硬盘上的分区后,引导载入程序的初始化过程就已经完成。
B 操作系统选择:
ntldr 程序完成了初始化工作后就会从硬盘上读取 boot.ini 文件,进行操作系统选择(多系统)
C 硬件检测:
操作系统选择了想要载入的 Windows 系统后,ntdetect.com 首先要将当前计算机中安装的所有硬件信息收集起来并列成一个表,接着将该表发送给 ntldr,这个表的信息稍后会被用来创建注册表中有关硬件的键。这里需要被收集信息的硬件包括总线 / 适配器类型显卡、通讯端口、串口、浮点运算器 ( CPU )、可移动存储器、键盘、指示装置 ( 鼠标 )。
D 配置文件选择:
这个步骤不是必须的。
只有在计算机(常用于笔记本电脑)创建了多个硬件配置文件的时候才需要处理这一步
3) 载入内核阶段
在这一阶段,ntldr 会载入 Windows 的内核文件 ntoskrnl.exe,但这里仅仅是载入,内核此刻还不会被初始化。随后被载入的是硬件抽象层。接下来要被内核载入的是:HKEY_LOCAL_MACHINE\System 注册表键。
ntldr 会根据载入的 Select 键的内容判断接下来需要载入哪个 ControlSet 注册表键,这些键决定随后系统会载入哪些设备驱动或者启动哪些服务。
这些注册表键的内容被载入后,系统将进入初始化内核阶段。
这时候ntldr会将系统的控制权交给操作系统内核。
4) 初始化内核阶段
在这一阶段中主要会完成 4 项任务:
创建 Hardware 注册表键、对 Control Set 注册表键进行复制载入和初始化设备驱动、启动服务
A.创建Hardware注册表键:
Windows 内核会使用前面硬件检测阶段收集倒的硬件信息来创建 HKEY_LOCAL_MACHINE/Hardware 键。也就是说注册表中该键的内容不是固定的,会根据系统中的硬件配置情况动态更新。
B.对Control Set注册表键进行复制:
如果上一步成功,系统内核会对 Control Set 键的内容创建一个备份。这个备份会被用在系统的高级启动菜单中 "最后一次正确的配置" 选项。
例如,系统新装了一个显卡驱动,Hardware 还没有创建成功系统就崩溃了,这时就可以使用"最后一次正确的配置"选项,用上一次 Control Set 注册表键的备份内容重新生成 Hardware 键,从而撤销因安装了显卡驱动对系统设置的更改。
C.载入和初始化设备驱动:
操作系统内核首先会初始化之前在载入内核阶段载入的底层设备驱动,然后会在注册表的,HKEY_LOCAL_MACHINE/System/CurrentControlSet/Services 键下查找所有 Strat 键值为 1 的设备驱动,这些设备驱动将会在载入之后立刻进行初始化。
D.启动服务:
系统内核成功载入并且成功初始化所有底层设备驱动后,ntoskrnl.exe 创建会话管理器进程 smss.exe,这是第一个用户态进程 会话管理器会启动其他高层子系统和服务,加载并初始化内核模式中的 Win32 子系统 ( win32k.sys ),启动 csrss.exe ( win32 子系统在用户模式的部分 ),进而启动 Win32 子系统。Win32 子系统的作用是控制所有输入 / 输出设备以及访问显示设备。当这些操作都完成后,Windows 的图形界面就可以显示出来了,同时用户也将可以使用键盘以及其他 I/O 设备。
接下来会话管理器会启动 winlogon 进程。至此,初始化内核阶段已经成功完成,这时候用户就可以开始登陆了。
5)登录阶段
这一阶段,由会话管理器启动的 winlogon.exe 进程将会启动本地安全性授权 lsass.exe 子系统,加载图形化标识和验证 ( Graphical Identfication and Authentication,GINA ) 并等待用户登录。
默认 GINA 是 Msgina.dll,可以自行开发 GINA 实现基于生物信息的用户登录 ( 指纹识别,人脸识别 ),然后启动后台服务管理器 services.exe ,通过它启动所有标识为自动启动的 Win32 服务程序。
在登录过程中,后台可能仍在加载一些非关键的设备驱动。系统会再次扫描 HKEY_LOCAL_MACHINE/System/CurrentControlSet/Services 注册表键,寻找 Start 键的数值是 2 或者更大数字的服务。这些服务就是非关键服务,系统直到成功登录后才开始加载这些服务,至此,Windows 启动过程完成。
### **线程**:
线程有时候又被称为轻量级进程,是程序执行的最小单元。
一个进程可对应多个线程,而一个线程只属于一个进程。进程的执行是以线程为单位进行的,比如说一个简单 “hello world” 程序只有一个线程,就是 main() 函数对应的线程。
## **保护模式,实模式**
保护模式与实模式相对应,在保护模式下, CPU 的寻址模式与实模式不同。
实模式下的寻址方式是 "段基址+段偏移",段的默认大小为 64kb ,所有段都是可读写的,唯有代码段是可执行的,段的特权级为 0。
特权级有 0、1、2、3 四个级别,0 特权级别最高,3 特权级别最低想要控制系统,就必须取得0特权级,比如调试工具 SoftICE 就工作在0特权级上。