一、内核os内核其他程序内核Linux操作系统的核心是计算机硬件与上层应用程序之间的核心接口与资源管理者。主要负责进程管理、内存管理、文件系统、设备管理、网络管理。直接运行在硬件之上掌握所有系统资源为用户程序提供安全、高效的运行环境五大核心子系统1. 进程管理1负责进程/线程的创建、调度、销毁2采用CFS分配CPU时间片CFS通过维护每个进程的虚拟运行时间让所有可运行进程尽可能公平地获得CPU时间3提供进程间通信(IPC):信号、管道、消息队列、共享内存2. 内存管理1管理物理内存与虚拟内存2通过分页机制实现虚拟地址到物理地址的映射负责页表管理、缺页异常、页面置换、malloc内存分配3支持交换分区(Swap)缓解内存不足3. 虚拟文件系统1遵循“一切皆是文件”的设计哲学2为ext4/XFS等各类文件系统提供统一接口3管理文件、目录、权限及磁盘I/O缓存4. 设备驱动1内核代码量占比最大(约50%)2管理字符设备(eg:键盘、鼠标)、块设备(eg:硬盘、U盘)、网络设备3提供硬件抽象、使应用程序无需关心硬件细节5. 网络协议栈1完整实现TCP/IP协议簇2处理数据包的发送、接受、路由与转发3为应用提供Socket接口二、进程1. 定义进程是程序的一次运行过程是操作系统进行资源分配和调度的基本单位 内核pcb数据结构对象 -- 描述进行的所有属性 codedata2. PCB1Linux用task_struct结构体实现PCB内容分类a.标识符 -- 描述本进程的唯一标识符来区别其他进程b.状态 -- 任务状态、退出代码、退出信号等c.优先级 -- 先对于其他进程的优先级d.程序计数器 -- 程序中即将被执行的下一条指令的地址(程序计数器保存在CPU寄存器中)e.内存指针 -- 包括程序代码和进程相关数据指针还有堆指针、栈指针、共享库指针、环境变量指针f.上下文数据 -- 进程执行时处理器的寄存器中的数据g.I/O状态信息 -- 包括显示的I/O请求、分配给进和被进程使用的文件列表h.记账信息 -- 可能包括处理器时间总和、时间限制、记帐号等i.其他信息3. Linux如何组织进程在内核源代码中找到Linux采用双向链表红黑树哈希表组织进程底层遍历task_struct4. 查看进程1/proc2PID -- 当前进程IDkill -9 PID -- 结束进程 kill发送信号-9SIGKILL不能被捕获kill -l 可以查看所有的结束指令getpid() -- 库函数获得PID3PPID -- 父进程IDgetppid() -- 库函数获得PPIDbash -- 命令行进程 PID∈PPID PIDPPID是标识符5. 创建进程1fork() -- 库函数 -- 代码层面a. 为什么fork给子程序返回0返回不同返回值为了区分不同的执行流去执行不同的执行代码块。一般而言fork之后代码父子共享代码不可被修改父进程返回子进程PID 子进程返回0 失败返回-1b. 为什么fork给父进程返回ppid父进程通过子进程pid控制不同的子进程子进程返回0因为子进程没有必要知道自己的PID而父进程需要通过返回值获得子进程PIDc. fork是如何返回两次如何理解父子共享代码fork之后父进程执行一次fork产生子进程父进程继续执行子进程继续执行d. 一个变量为什么会有不同的内容如何理解任何平台进程运行具有独立性。子进程进行数据层面的写时拷贝子进程想访问父进程的某些数据os在内存中开辟一块空间将父进程的某些数据拷贝过来让子进程进行访问2./ 运行程序 -- 指令级别3父子进程被创建好fork() 谁先运行由调度器决定不确定6.进程状态1运行态 --- running --- R如何查看进程是否处于运行态( 查看pid的方法 )R --- 前台运行处于运行队列的进程正在运行或者等待CPU调度2阻塞状态 ( eg: scanf 函数被调用却不输入处于阻塞状态)定义等待资源的进程且处于等待队列中的进程A. 浅度睡眠 --- sleeping --- S 可中断睡眠 --- 可被信号唤醒B. 深度睡眠 --- disk sleep --- D 不可中断睡眠无法被删除不可中断睡眠通常等待磁盘IO(原因防止IO过程中被打断导致数据异常)3暂停状态 --- TA. stoppedB. 高IO状态 tracing4终止态 --- dead --- X运行结束已经死亡状态短暂存在马上释放5僵尸状态 --- Z进行运行结束先进入 Z 状态子进程退出若父进程没有主动回收子进程信息子进程会处于 Z 状态进程相关资源尤其 task_struct 结构体无法被释放 ( 会被一直占用导致内存泄漏 )父进程先退出子进程的父进程会被改写为1号进行 由操作系统完成 父进程是1号进程会导致孤儿进程该进程被系统领养领养进程孤儿进程也会退出也要被释放6挂起状态定义为了节省内存等待的进程中代码和数据被换出到外设磁盘中等到被运行时被换入内存中7. 进程优先级 prioritynice --- 优先级的修正数值优先级可以通过 nice 的取值被调整nice越小优先级越高priority(new) priority(old) nicepriority(old)取值范围[100, 139] nice的取值范围[-20, 19] renice可以更改nice值8. 其他概念1竞争性系统进程数目多CPU资源少量进程间存在竞争性为了高效完成任务更合理竞争相关资源 -- 优先级2独立性多进程运行且互不干扰3并行多个进程在多个CPU下分别同时进行运行4并发多个进程在一个CPU采用进程切换的方法在一段时间内使多个进程都得以推进9. 其他问题1系统通过程序计数器pceip 记录当前进程正在执行指令的下一行指令的地址 来得知进程执行到哪行代码2进程在被切换的时候 --- 防止数据丢失保存上下文切换上下文保存当前进程CPU上下文到PCB中加载新进程PCB - 恢复寄存器 - 继续运行3命令行参数为指令、工具、软件等提供命令行选项的支持让不同选项表示不同功能两张核心向量表命令行参数表 环境变量表执行命令bash本身在启动的时候会从os的配置文件中读取环境信息子进程会继承父进程的环境变量本地变量 - 在命令行定义的变量 变量值本地变量不会被子进程继承只有在本bash内部有效export 变量名 变量值 -- 成为环境变量set --- 查看系统中定义的所有变量命令行上所有指令不一定会创建子进程命令常规命令 --- 通过创建子进程完成 内建命令 --- bash 不创建子进程自己亲自执行 ( 类似于bash调用自己写的/系统提供的函数)10. 环境变量 --- 系统提供的一组 name value 形式的变量不同环境变量有不同用户通常有全局属性环境变量是操作系统提供的一种机制用于向进程传递运行环境信息本质是一组由Shell创建并维护的字符串键值对形式 变量名 变量值1echo $PATH2PATHLinux系统PATH 路径会覆盖 PATH $PATH新增且不覆盖3HOME$HOME : 当前用户家目录4env查询环境变量unset --- 清除环境变量5HISTSIZE --- 记录的历史命令6OLDPWD --- 当前路径的上一层7PWD --- 当前所处路径8SHELL $SHELL 当前默认登录SHELL程序路径9USER $USER --- 查看当前登录用户名10通过第三方命令行和C语言中 extern char **environ获取 unisted.h11bash - fork() - 子进程 - 继承环境变量 - exec() - 新程序运行 - main(argc, argv, env)11. 进程地址空间 --- 进程地址空间是操作系统为每个进程抽象出来的一段虚拟地址范围1地址空间地址总线排列形成的地址范围 [0, 2^32]2本质内核的一个数据结构对象类似PCB一样地址也要被操作系统管理 先描述再组织为什么要有A. 让进程以统一的视角看待内存B. 增加进程虚拟空间可以让用户访问内存的时候增加一个转换过程对寻址进行审查异常拦截保护内存进程 内核数据结构 可执行代码和数据页表 虚拟地址 物理地址 标志位( rlw )标志位对应的代码、数据是否被已经被加载到内存 代码只能读不能改的原因C. 地址空间和页表的存在将进程管理模块和内存管理模块进行耦合D. 进程隔离
Linux操作系统 --- 进程
一、内核os内核其他程序内核Linux操作系统的核心是计算机硬件与上层应用程序之间的核心接口与资源管理者。主要负责进程管理、内存管理、文件系统、设备管理、网络管理。直接运行在硬件之上掌握所有系统资源为用户程序提供安全、高效的运行环境五大核心子系统1. 进程管理1负责进程/线程的创建、调度、销毁2采用CFS分配CPU时间片CFS通过维护每个进程的虚拟运行时间让所有可运行进程尽可能公平地获得CPU时间3提供进程间通信(IPC):信号、管道、消息队列、共享内存2. 内存管理1管理物理内存与虚拟内存2通过分页机制实现虚拟地址到物理地址的映射负责页表管理、缺页异常、页面置换、malloc内存分配3支持交换分区(Swap)缓解内存不足3. 虚拟文件系统1遵循“一切皆是文件”的设计哲学2为ext4/XFS等各类文件系统提供统一接口3管理文件、目录、权限及磁盘I/O缓存4. 设备驱动1内核代码量占比最大(约50%)2管理字符设备(eg:键盘、鼠标)、块设备(eg:硬盘、U盘)、网络设备3提供硬件抽象、使应用程序无需关心硬件细节5. 网络协议栈1完整实现TCP/IP协议簇2处理数据包的发送、接受、路由与转发3为应用提供Socket接口二、进程1. 定义进程是程序的一次运行过程是操作系统进行资源分配和调度的基本单位 内核pcb数据结构对象 -- 描述进行的所有属性 codedata2. PCB1Linux用task_struct结构体实现PCB内容分类a.标识符 -- 描述本进程的唯一标识符来区别其他进程b.状态 -- 任务状态、退出代码、退出信号等c.优先级 -- 先对于其他进程的优先级d.程序计数器 -- 程序中即将被执行的下一条指令的地址(程序计数器保存在CPU寄存器中)e.内存指针 -- 包括程序代码和进程相关数据指针还有堆指针、栈指针、共享库指针、环境变量指针f.上下文数据 -- 进程执行时处理器的寄存器中的数据g.I/O状态信息 -- 包括显示的I/O请求、分配给进和被进程使用的文件列表h.记账信息 -- 可能包括处理器时间总和、时间限制、记帐号等i.其他信息3. Linux如何组织进程在内核源代码中找到Linux采用双向链表红黑树哈希表组织进程底层遍历task_struct4. 查看进程1/proc2PID -- 当前进程IDkill -9 PID -- 结束进程 kill发送信号-9SIGKILL不能被捕获kill -l 可以查看所有的结束指令getpid() -- 库函数获得PID3PPID -- 父进程IDgetppid() -- 库函数获得PPIDbash -- 命令行进程 PID∈PPID PIDPPID是标识符5. 创建进程1fork() -- 库函数 -- 代码层面a. 为什么fork给子程序返回0返回不同返回值为了区分不同的执行流去执行不同的执行代码块。一般而言fork之后代码父子共享代码不可被修改父进程返回子进程PID 子进程返回0 失败返回-1b. 为什么fork给父进程返回ppid父进程通过子进程pid控制不同的子进程子进程返回0因为子进程没有必要知道自己的PID而父进程需要通过返回值获得子进程PIDc. fork是如何返回两次如何理解父子共享代码fork之后父进程执行一次fork产生子进程父进程继续执行子进程继续执行d. 一个变量为什么会有不同的内容如何理解任何平台进程运行具有独立性。子进程进行数据层面的写时拷贝子进程想访问父进程的某些数据os在内存中开辟一块空间将父进程的某些数据拷贝过来让子进程进行访问2./ 运行程序 -- 指令级别3父子进程被创建好fork() 谁先运行由调度器决定不确定6.进程状态1运行态 --- running --- R如何查看进程是否处于运行态( 查看pid的方法 )R --- 前台运行处于运行队列的进程正在运行或者等待CPU调度2阻塞状态 ( eg: scanf 函数被调用却不输入处于阻塞状态)定义等待资源的进程且处于等待队列中的进程A. 浅度睡眠 --- sleeping --- S 可中断睡眠 --- 可被信号唤醒B. 深度睡眠 --- disk sleep --- D 不可中断睡眠无法被删除不可中断睡眠通常等待磁盘IO(原因防止IO过程中被打断导致数据异常)3暂停状态 --- TA. stoppedB. 高IO状态 tracing4终止态 --- dead --- X运行结束已经死亡状态短暂存在马上释放5僵尸状态 --- Z进行运行结束先进入 Z 状态子进程退出若父进程没有主动回收子进程信息子进程会处于 Z 状态进程相关资源尤其 task_struct 结构体无法被释放 ( 会被一直占用导致内存泄漏 )父进程先退出子进程的父进程会被改写为1号进行 由操作系统完成 父进程是1号进程会导致孤儿进程该进程被系统领养领养进程孤儿进程也会退出也要被释放6挂起状态定义为了节省内存等待的进程中代码和数据被换出到外设磁盘中等到被运行时被换入内存中7. 进程优先级 prioritynice --- 优先级的修正数值优先级可以通过 nice 的取值被调整nice越小优先级越高priority(new) priority(old) nicepriority(old)取值范围[100, 139] nice的取值范围[-20, 19] renice可以更改nice值8. 其他概念1竞争性系统进程数目多CPU资源少量进程间存在竞争性为了高效完成任务更合理竞争相关资源 -- 优先级2独立性多进程运行且互不干扰3并行多个进程在多个CPU下分别同时进行运行4并发多个进程在一个CPU采用进程切换的方法在一段时间内使多个进程都得以推进9. 其他问题1系统通过程序计数器pceip 记录当前进程正在执行指令的下一行指令的地址 来得知进程执行到哪行代码2进程在被切换的时候 --- 防止数据丢失保存上下文切换上下文保存当前进程CPU上下文到PCB中加载新进程PCB - 恢复寄存器 - 继续运行3命令行参数为指令、工具、软件等提供命令行选项的支持让不同选项表示不同功能两张核心向量表命令行参数表 环境变量表执行命令bash本身在启动的时候会从os的配置文件中读取环境信息子进程会继承父进程的环境变量本地变量 - 在命令行定义的变量 变量值本地变量不会被子进程继承只有在本bash内部有效export 变量名 变量值 -- 成为环境变量set --- 查看系统中定义的所有变量命令行上所有指令不一定会创建子进程命令常规命令 --- 通过创建子进程完成 内建命令 --- bash 不创建子进程自己亲自执行 ( 类似于bash调用自己写的/系统提供的函数)10. 环境变量 --- 系统提供的一组 name value 形式的变量不同环境变量有不同用户通常有全局属性环境变量是操作系统提供的一种机制用于向进程传递运行环境信息本质是一组由Shell创建并维护的字符串键值对形式 变量名 变量值1echo $PATH2PATHLinux系统PATH 路径会覆盖 PATH $PATH新增且不覆盖3HOME$HOME : 当前用户家目录4env查询环境变量unset --- 清除环境变量5HISTSIZE --- 记录的历史命令6OLDPWD --- 当前路径的上一层7PWD --- 当前所处路径8SHELL $SHELL 当前默认登录SHELL程序路径9USER $USER --- 查看当前登录用户名10通过第三方命令行和C语言中 extern char **environ获取 unisted.h11bash - fork() - 子进程 - 继承环境变量 - exec() - 新程序运行 - main(argc, argv, env)11. 进程地址空间 --- 进程地址空间是操作系统为每个进程抽象出来的一段虚拟地址范围1地址空间地址总线排列形成的地址范围 [0, 2^32]2本质内核的一个数据结构对象类似PCB一样地址也要被操作系统管理 先描述再组织为什么要有A. 让进程以统一的视角看待内存B. 增加进程虚拟空间可以让用户访问内存的时候增加一个转换过程对寻址进行审查异常拦截保护内存进程 内核数据结构 可执行代码和数据页表 虚拟地址 物理地址 标志位( rlw )标志位对应的代码、数据是否被已经被加载到内存 代码只能读不能改的原因C. 地址空间和页表的存在将进程管理模块和内存管理模块进行耦合D. 进程隔离