定义
一种软件,对上是用户,对下是计算机硬件。对上管程序(QQ),对下管硬件。
主要做什么
管理硬件,管理软件(各种各样的进程)
Linux Kernel
这里讲的所有操作系统都是Linux,包括鸿蒙、安卓都是Linux操作系统,那些闭源的操作系统不研究。
kernel几个作用
- cpu调度
- 内存管理
- 文件系统
- 应用管理进程调度
- 中断处理设备驱动
宏内核:kenel+cpu调度+内存管理+文件系统+进程调度+中断处理,合起来叫宏内核。平时接触的windws、linux都属于这种。
微内核:kenel只负责进程调度,其他四大块是分布式的(处于不同的芯片上)。鸿蒙属于这种。弹性部署,四大块可以作为插件嵌入内核kernel。用户要访问文件系统,过程是:用户-kernel-文件系统-kernel-用户。
缺点:运行速度低,所有东西都要经过kernel转手。
优点:kernel非常小,可以灵活部署,灵活拆装。不同等级都可以部署到kernel上。
操作系统启动过程
启动:按下开机键以后,通电后,主板通电,主板上有一块儿芯片,叫bios[basic input output system],这块儿芯片里面有一段写死的程序,UEFI就是升级版本的Bios。先检查硬件,内存条等等。。硬件检查没问题后,加载bootLoader程序到内存,bootLoader(就是可以选择加载哪个系统的程序),放在MBR里,bootLoader执行以后,操作系统就执行了。
Cmos:场景:设置硬盘启动还是U盘启动,设置以后,下次默认启动。纪录这些信息的是一个芯片叫cmos,它的供电是靠一个专门的3伏电池。
操作系统是安装在硬盘上的,运行到内存掌管整个电脑,Bios功不可没。
中断
硬中断:硬件和操作系统打交道是通过中断进行的。当操作系统收到中断信号后会查中断处理表,看看每种硬件(键盘)对应的程序,然后去执行。
软中断:只有一个号0x80
内核态、用户态
dos最简单的操作系统,允许应用程序直接访问硬件,比较危险。现在屏蔽掉了。无内核态用户态。
内核态可以直接访问内存、进程。而用户态无法直接访问内存,必须经过内核态。
权限等级:0[内核态]123[用户态],Linux只有0、3这两个级别。
程序、进程、线程、纤程
qq双击三次,启动了三个进程(放到内存里开始执行,cpu开始执行它的指令了),这个进程里好多工作并行进行的(显示ui,接收网络传输,存盘)通过线程来执行,线程里并行进行的叫纤程或者协程。
进程线程区别:进程分配资源的单位,线程执行单位。
启动进程会分配内存空间(虚拟内存映射物理内存),线程共享进程的内存空间,是不会分配内存空间的。所以,分配资源按照进程来,真正执行按照线程来。
纤程
cpu执行一段程序的时候,就是执行线程,线程是执行的基本单位。
寄存器:PC/CSIP,可以纪录执行到哪条指令了。
程序的本质:指令+数据
所以程序的本质,就是CPU找到第一条指令,不断的从内存中读取指令,拿到CPU做计算,计算完了以后,把它放回去。再进行下一条指令,一直到最后。
- 每次起一个线程,都要经过操作系统,很重量级的。
- JVM启动线程是用户态,得通过内核态操作系统(老大)开启线程。
- 系统可以启动总线程数是有限的。
- JVM启动一个线程,线程相关的数据结构(执行到哪条指令了。。。)都要保存起来,前前后后大概需要内存1M左右。
- 在JVM内存创建线程,不惊动操作系统,模拟线程出来。(线程执行的时候就是一些寄存器的信息PC+堆栈的信息就能保留线程的执行信息执行过程)所以PC+Stack就能模拟线程出来。用户级别的线程。
- 纤程:线程中的线程。/协程/绿色线程
- 所以:JVM启动线程是要经过os的,但是通过JVM自己的堆栈去模拟线程,是轻量级的,只要你有内存就可以创建很多。一万个线程无法想象,一万个纤程没问题。
- JDK14将来会支持纤程。golang、kotlin支持纤程(牛就牛在这儿)
- 特定情况下,纤程比线程效率高。例如做一万次计算
- 为何内核态效率比较低呢?线程比纤程效率低呢?
related:
内存管理:
内存映射:(进程先分配的是虚拟内存如何映射成为了物理内存?)