-
内核是什么
- 纯技术层面,内核是硬件和软件的中间层,将应用程序的请求传递给硬件,并且充当底层驱动程序,对系统中各种设备和组件寻址;
- 一句话总结,内核是程序,被应用程序调用,可以找到硬件,操作硬件;
- 内核充当了什么角色
- 在应用程序的视角,内核是增强了的计算机;应用程序所能访问的最底层就是内核;
- 若干进程并发运行时,内核充当资源管理器;
- 内核分配共享资源 ( CPU 时间,磁盘空间,网络连接 ) 给各个系统进程,还要保证系统的完整性
- 内核充当库,提供面向系统的命令; 系统调用用于向计算机发送请求;
- 用户空间借用C库,向内核发起系统调用,从而系统调用操作内核
- 内核有哪几种
- 微内核; 实用性进展甚微;
- 宏内核; 是构建系统内核的传统方法,内核的所有代码,包括子系统 ( 内存管理,文件系统,设备驱动程序 )都打包到一个文件中,内核中的每个函数都可以访问到内核中所有其他部分; 因而编程时一个不小心就会使得源代码中出现复杂的嵌套
- Linux系统是宏内核
- 纯技术层面,内核是硬件和软件的中间层,将应用程序的请求传递给硬件,并且充当底层驱动程序,对系统中各种设备和组件寻址;
内核的组成部分
内核部分交互
为什么需要内核
- 进程间通信,需要内核机制
- 各进程在 CPU 的虚拟内存中分配地址空间,各个进程的地址空间是完全独立的. 故而进程并不会意识到彼此的存在,认为自己是系统中的移位存在
- CPU 会并发,并发行为伴随着进程切换,内核处理进程切换技术细节
- 技术细节包括:
- 撤销进程的 CPU 资源之前保存进程的所有状态相关的要素
- 进程状态置于空闲
- 重新激活进程时,恢复进程保存的状态
- 技术细节包括:
- 进程之间共享 CPU 时间,确定进程运行多长时间,需要内核调度
一句话来说,操作系统需要内核,内核可以实现进程调度(依据进程的权重分配时间); 内核可以切换进程处理细节实现并发; 进程间的通信也需要内核;
Linux内核的进程初窥
Linux 对进程采用了一种层次系统,每个进程都依赖于一个父进程(树结构),内核启动 init 程序作为第一个进程(root根),该进程负责系统初始化,显示登陆提示符,图形登录界面等.
Linux 内核是树形层级结构,系统初始化从根 init 进程开始,可以通过命令 pstree 显示进程明细
进程的扩展方式是通过新进程的创建方式密切相关
- fork 创建当前进程的副本,即子进程,二者只有进程 ID 不同即 PID 不同. 子进程复制了父进程的内存.
- Linux 使用 写时复制 即 copy on write 技术,将内存复制操作延迟到父进程或子进程向某个内存页面写入数据之前,在只访问的情况下父进程和子进程可以共用同一内存页.
- exec将一个新程序加载到当前进程的内存中并执行. 旧程序的内存页将刷出,其内容将替换为新的数据,然后开始执行新程序
Linux的线程初窥
Linux 的程序执行形式: 重量级进程( unix 进程) 与 线程(轻量级进程)
简而言之,进程是一个正在执行的程序; 线程是与主程序并行运行的程序函数或例程
- 主进程 fork 出不同的子进程实例
- 子进程需要通过某种通信机制,才能将接收到的数据提供给主程序
- 线程和主程序共享同样的地址空间,主程序自动就可以访问接收到的数据
- 线程和进程间不需要额外的通信
Linux 使用 clone 方法创建线程,工作方式类似于 fork,但是启动了精确的检查,细粒度的资源分配
- 确认哪些资源与父进程共享, 哪些资源为线程独立创建
- 一定程度上允许线程与进程之间连续转换
Linux的命名空间
进程 id 即 pid 是全局变量,
- 每个命名空间包含一个 pid 进程集合,
- 每个命名空间提供文件系统的不同视图,某个命名空间中挂在的卷不会传播到其他命名空间
Linux 的地址空间与特权级别
- Linux将每个进程的空间称为虚拟空间,进程空间分为地址空间和内核空间
- 进程认为地址空间只有自身一个进程,无法感知到其他进程,故而地址空间的最大长度与实际物理内存数量无关,因而地址空间也称为虚拟地址空间
- Linux 中分为核心态与用户态
- 区别仅在于进程的虚拟空间中的内核空间是否能被访问
- 可访问 -> 核心态
- 不可访问内核空间 -> 用户态
- 核心态与用户态的切换需要系统调用的特殊转换手段完成
- 区别仅在于进程的虚拟空间中的内核空间是否能被访问
内核执行代码
- 代表用户程序执行代码
-
用户进程 -> 系统调用 -> 向内核请求 -> 内核检查进程是否可执行操作 -> 内核代为执行所需操作 -> 返回用户状态
-
-
内核可以由异步硬件中断激活,在中断上下文中运行
-
与进程上下文运行的区别是, 中断上下文运行不能访问虚拟地址空间中的用户空间.因为中断随时可能发生
-
中断发生时任一用户进程可能处于活动状态,中断上下文的进程与中断原因无关,内核无权访问用户空间
-
内核在中断上下文中更加谨慎
-
如不能进入睡眠状态
-
-
-
内核中的内核线程
-
不访问用户空间且无权处理用户空间.
-
类似于普通的用户层应用程序
-
内核线程可以睡眠
-
内核线程可以被调度器跟踪
-
用于各种用途
-
内存和块设备数据同步
-
帮助调度器在 CPU 分配进程
-
-
内核线程的名称都置于方括号内
-
多处理器系统上,许多线程启动时,指定了 CPU 运行, 从线程名称的 / 与 CPU编号可以看到
-
使用 ps fax 查看该明细
-
-
-