宏内核和微内核架构
系统属于软件的范畴,负责管理系统硬件资源,同时为应用程序开发和执行提供配套环境,OS必须具备两个功能
- 为应用程序提供执行环境
- 为多用户和应用程序管理计算机的硬件资源
- 虚拟性
- 并发性
宏内核
所有内核代码都编译一个二进制,所有的内核代码都运行在一个大内核地址空间里,内核代码可以直接访问和调用,效率高并且性能好
微内核
把操作系统分为多个独立的功能模块,每个功能模块之间的访问需要通过消息来完成,因此效率没有那么高
- 宏内核架构优点:设计简洁和性能比较好,而微内核架构优势也很显示,比如稳定性和实时性等。
- Linux 只使用ring0和ring3 两种模式为了实现内核态和用户态,linux内核为内核态和用户态之间切换设置软件抽象层(系统调用层)
进程/进程的生命周期
进程
- 进程作为操作系统使用层,提供使用操作系统抽象出资源层的能力
- 进程是指计算机中已运行的程序,进程本身不是基本的运行单位,而是线程的容器。
-
程序本身只是指令,数据以及其组织形式的描述,进程才是程序的真正运行实例
在Linux内核中把进程叫做任务(task) 进程的虚拟地址空间可分为用户虚拟地址空间和内核虚拟地址空间,所有 进程共享内核虚拟地址空间,每个进程都有独立的用户虚拟地址空间
需要注意 进程有两种特殊的形式: 没有用户虚拟地址空间的进程叫内核线程,共享用户虚拟地址空间的进程叫用户线程。 共享同一个用户虚拟地址空间的所有用户线程叫线程组
c语言标准库进程和linux内核进程有些区别 包括多个线程的进程在Linux中叫线程组,只有一个线程的进程叫任务或进程,线程叫共享用户虚拟地址空间的进程
ps 显示瞬间进程的状态,并不是动态连续,如果进行实时监控需要用top 命令
进程的优先级
优先级: prior 调度优先级 数值越小,优先级越高 static_prior 静态优先级 normal_prior 正常优先级(数值越小优先级越高) rt_priority 实时优先级 限期进程: 大多数情况下prior 等于normal_prior ,特殊情况下,如果进程X 占有实时互斥锁,进程Y正在等待锁,进程Y的优先级比进程X 优先级高,那么进程X的优先级临时提高到进程Y的优先级,即进程X的prio的值等于进程Y的prior的值。 static_prior 在限期进程为0,实时进程为0,在普通进程中为120+nice值,数值越小,表示优先级越高 normal_prior 在限期进程为-1,实时进程为99-rt_priority ,普通进程为static_prior rt_priority 在限期进程没有意义,为0,实时进程的优先级,范围1-99 数值越大,优先级越高,普通进程没有意义,总是0
系统调用
当运行应用程序的时候,调用fork()/vfork()/clone()函数就是系统调用,系统调用就是,系统调用就是应用程序如何进入内核执行任务,程序使用系统调用执行一系列的操作:比如创建进程,文件IO等等。 fork(sys_fork()) ,vfork,(sys_vfork())clone (sys_clone) kthread_create()返回的是 _do_fork() 函数,核心点是copy_process函数 long do_fork(unsigned long clone_flags,//创建进程的标志位集合 unsigned long stack_start,//用户态栈的起始地址 unsigned long stack_size,//用户态栈的大小,一般情况下设置为 0 int __user parent_tidptr, //指向用户空间中地址的指针,分配指向父子进程的PID int __user child_tidptr)
内核线程
内核线程是直接由内核本身启动的进程,内核线程实际上是将内核函数委托给独立的进程,与系统中其他进程并行执行,(实际上,也并行于内核自身的执行),内核线程经常称之为内核守护进程,他们用于执行下面的任务: 没有独立的进程地址空间,task_struct 数据结构里面有一个成员指针mm设置为NULL,所以只能运行在内核空间。
- 周期性地修改的内存页与页来源块设备同步(例如,使用mmap的文件映射);
- 如果内存页很少使用,则写入交换区
- 管理延迟动作(deferred action);
- 实现文件系统的事务日志
退出进程
退出进程有两种方式:一种是调用exit()系统调用或从某个程序主函数返回,主动调用exit() ,另外一个方式为被接受到杀死信号sigkill或者异常时终止。