理解Linux中的OS管理和进程属性

张开发
2026/4/13 2:46:10 15 分钟阅读

分享文章

理解Linux中的OS管理和进程属性
冯诺依曼体系结构冯诺依曼体系结构输入设备输出设备存储器中央处理器CPU存储器指的是内存CPU包括运算器和控制器CPU在数据层面不会和外设直接打交道只会和内存进行交互任何程序在运行时都必须先从磁盘中加载到内存因为代码和数据必须被CPU访问但是CPU指挥和内存进行交互这是体系结构决定的数据流动eg.为什么要有内存内存时外设和CPU之间的一个巨大的缓存操作系统OS任何计算机系统都包含一个基本的程序集合称为操作系统操作系统包括内核其他程序OS的本质时一种进行软硬件资源管理的软件设计OS的目的每一种硬件都要有自己对应的驱动程序与硬件交互管理所有的软硬件资源为用户程序提供一个良好的运行环境管理是先描述再组织进程什么是进程进程是程序的执行实例是正在执行的程序进程是担当分配系统资源的实体进程 内核数据结构task_struct 程序的代码和数据在调度进程时会让task_struct进去排队进程会被根据task_struct属性被os调度器调度运行task_struct内部有哪些属性标示符ps ajx | head -1 ps ajx | grep 执行文件名可以查看运行中程序的属性将程序运行起来./或双击的本质就是启动一个进程执行完就退出ls pwd指令一直不退直到用户退出常驻进程pid怎么显示进程的标示符PID同一个进程再不同时间启动其PID是不一样的因为PID是累加的PID是为了区别进程在进程中使用 getpid 就可以获取pid在系统中可以使用ctrl c来终止运行中的进程也可以使用killkill可以向指定的进程发送信号kill -9 pid编号可以杀掉一个进程在linux系统中可以使用ps来查看文件的属性根目录下的/proc中的每一个目录即代表一个进程目录的名称就是pid目录中存储的是该进程的属性当启动进程时系统会紧接着在/proc中新建一个相应的文件夹ps的本质就是打开/proccwdcurrent work dir当前工作目录当前路径就是进程的cwd当一个进程实际启动的时候该进程会记住当前的路径cwd启动进程时会在当前路径生成文件这个路径就是文件的cwdchdir可以改变进程启动时的路径这样就可以让其他的文件在别的路径生成ppidppid是父进程id在Linux系统中启动后新建任何进程时都是自己的父进程创建的使用getppid可以获取父进程id命令行中执行命令/程序本质是bash进程创建的子进程由子进程执行我们的代码子进程fork函数可以创建子进程创建成功会给父进程返回子进程的pid可以看到这里打印了两个分支printf因为经过fork分支后会执行两个分支fork函数由两个返回值因为fork后变成了两个进程这两个进程是父子关系一般而言这两个进程的代码是共享的(子进程的代码是从父进程继承来的)但是数据是各自私有一份fork返回的id对于父进程是subpid对于子进程是0为什么父子进程的数据各自私有进程具有很强的独立性多个进程之间运行时互不影响即便是父子一个进程在运行时代码是只读的但是数据不允许两个进程互相干扰因此要保证数据各自私有一份返回的本质就是对指定的变量写入数据而打印的数据就是读取数据创建多进程创建子进程时子进程的task_struct是拷贝自父进程的然后再调整新的task_struct部分属性task_struct连入到进程列表中此时子进程已经创建了父进程执行一次return子进程执行一次ruturn所以fork会存在两个返回值fork后谁先运行是由OS的调度器来自主决定的状态进程的状态CPU执行代码不是把进程执行完毕才开始执行下一个而是给每一个进程预分配一个时间片基于时间片进行调度轮转单CPU下这种行为是并发多个进程再多个CPU下同时运行这种行为是并行Linux/windows民用级别的操作系统分时操作系统调度任务追求公平实时操作系统从开始到结束必须尽快处理且一但运行就尽量跑完一个进程位于运行队列当中该进程就叫做运行状态本质是准备好了随时可以运行数据没有准备好导致进程无法运行则是阻塞状态运行和阻塞的本质是让不同的进程处在不同的对列中当内存严重不足时系统会将进程挂起到外设在磁盘中单独设有一个swap分区用于挂起挂起的本质是用时间换空间Linux进程的状态Rrunning运行状态Ssleeping休眠状态阻塞等待的状态可中断睡眠浅睡眠Ddisk sleep磁盘休眠状态阻塞等待状态不可中断睡眠深度睡眠该进程在睡眠期间不可被杀掉Tstopped停止状态ttracing stop追踪停止进入停止状态的原因1.进程做了非法但是不致命的操作被OS停止了2.当进程被追踪断点停下进程状态是t使用 kill -19 可以让进程停止使用 kill -18 可以结束停止状态Xdead终止状态进程创建出来是为了完成用户的任务通过进程执行的结果来告知父进程/操作系统任务是否完成Zzombie僵尸状态维持退出信息方便父进程和操作系统来进行查询进程退出时1.代码不会执行了首先可以立即释放的就是对应的程序信息结构2.进程退出要有退出信息进程的退出码保存在自己的task_struct内部3.管理结构task_struct必须被OS维护起来方便用户未来获取进程的退出信息进程创建时先创建task_struct再有代码和数据进程退出时先释放代码和数据再删除task_struct还没有删除task_struct时进程时僵尸状态僵尸进程如果没有人管则会一直僵尸僵尸进程默认没人管如果一个进程僵尸父进程不进行回收就是内存泄漏语言层面的内存泄漏问问题如果在常驻内存的进程中出现影响比较大父进程还在子进程退出则正常父进程退出子进程还在子进程会被系统领养这种子进程是孤儿进程进程优先级优先级是获得某种资源的先后顺序排队的本质就是确认优先级为什么要有优先级因为目标资源较少优先级就是task_struct中维护的int类型优先级数字越小代表优先级越高优先级受PRI和NI影响PRIpriorityLinux中的进程的优先级NInice优先级的nice数据-20 nice 19最终优先级 pri默认/老的 niceuid是用户id决定了进程是谁启动的为什么nice存在范围为了保证进程调度的尽量公平为什么是[-20,19]真实进程的优先级范围是[60,99]相同优先级的进程会被挂接在一起修改优先级不是高频操作而且不建议修改可以使用指令或代码进行修改进程队列CPU里面维护了有两张相同数据的哈希表active活跃和expired过期CPU调度只会从active队列中选择进程进行调度通常哈希表中纵向根据优先级排队横向根据到来的先后顺序排队为了防止进程饥饿问题创建的新进程和时间片结束的进程会被放到expired对列中只有当active对列为空才会将expired中的进程放入active对列中直接将两个对列的指针交换同时又维护了两个bit_map[5]位图来决定对应为止是否存在进程这是LInux内核O1调度算法所有进程都要链表链接但是linux中的链表结构与一般结构不同只有连接字段没有属性字段为什么要设计成这样一个进程既可以在全局链表中又可以在不脱离全局链表的同时加入别的链表原理同一个结构体中定义的对象其地址时相邻的并逐渐递增这样只要知道其中一个对象的地址并知道该对象的偏移量就可以知道整个元素的地址了进程切换每个进程都有一个时间片时间片到了就要切换进程Linux是基于时间片进行调度轮转的一个进程在时间片结束时不一定跑完可以在任何地方被重新调度切换CPUeippc当前正在执行指令的下一条指令的地址ir指令寄存器就是正在执行的指令CPU内部的寄存器的数据是进程执行时的瞬时状态信息数据CPU内有很多个寄存器整体称为一套寄存器寄存器不等于寄存器中的数据进程切换的核心是进程上下文数据的保存和恢复其本质就是切走将相关寄存器的内容保存起来切回将历史保存的寄存器的数据恢复到寄存器中每次切换时每次保存完上下文的时候CPU都是全新的一套寄存器是被多个进程共享使用的进程的上下文寄存器数据被保存到当前进程的PCB中就可以了进程运行就是重复”取指令更新pc分析执行指令“的过程

更多文章