• Linux系统编程04


    进程的概念

    进程(动态)是一个正在运行的程序(静态)
    多道程序设计缺点:
    (1)缺乏隔离,各个程序之间可以直接访问,使用对方的数据
    (2)内存使用率低,如果一个新任务过来存放不下,我们需要将某个程序整个换出内存在进行存放
    (3)地址使用麻烦,耨个程序可能会被多次加载,每次加载所处的物理地址都不一致,只能使用相对地址,对硬件要求很高
    解决上面的问题,我们提出了虚拟:
    我们在用户和内存中间加了一个虚拟内存,将复杂的底层内存抽象成建简单的结构
    在这里插入图片描述
    虚拟如何实现对内存的抽象:
    (1)每个进程在逻辑上有自己独立的内存空间(进程地址空间),看不到其他进程,让用户感觉自己在独占整个电脑
    (2)使用虚拟内存

    虚拟内存的实现

    内存里面我们使用到的热点内存是很难少的,大概率不会全部内存都使用到
    局部性原理:我们在调用内存区域的某条指令,我们很有可能访问这条指令周围的其他指令
    操作系统一般会对内存进行分页和分块进行存储使用,分页是目前大部分在使用的
    分页:将内存分割成大小相同(4096B)的单元
    我们在将虚拟内存的热点页驻留到内存里面,如果现在我们有很多页需要驻留,那么我们会将长期不用的页换出到磁盘的交换分区(虚拟内存),以防止下次用户需要对指令进行调用
    对于用户只需要关注虚拟内存,并不需要关注物理地址,在代码中只需要用虚拟内存
    在这里插入图片描述
    分时系统缺陷
    用户需要主动放弃CPU,这样就导致程序员不仅要关注自己代码的实现,还要区关注进程对CPU的使用情况
    为了解决这个问题,我们在用户和CPU之间添加一个虚拟CPU,让用户觉得自己在独占CPU,这样程序员便不用关注其他用户进程对CPU的使用
    并行在某个时刻,多个进程同时运行 -------只有一个CPU核心,不能并行
    并发在某段时间,多个进程同时运行
    进程的切换
    进程可通过修改寄存器的pc指针实现切换,寄存器的状态称为上下文
    Linux一般使用完全公平调度算法
    行为和时间片轮转几乎一样,但可以动态的根据运行情况调整优先级
    Linux将进程信息存储在task_struct任务描述符里,然后将其放进任务队列,这个队列是一个双向链表
    pid时一个正整数,给用户唯一标识不同的进程
    在这里插入图片描述
    其中PPID是表示当前进程的父进程,在Linux中,进程之间存在亲缘关系ps的父进程是bash

    获取PID
    在这里插入图片描述
    这个操作永远都不会出错,因此执行此操作不用进行错误检查
    在这里插入图片描述
    进程的权限
    之前我们学过文件有9种权限分别为u,g,o三种用户组赋予r,w,x权限
    一个文件的权限实现是要确定执行这个文件的进程所拥有的权限
    在这里插入图片描述
    在这里插入图片描述
    默认情况下用户的uid有效用户身份和euid真实身份都是一样的,都是启动这个进程的用户,我们怎么判断这个用户是否能够启动这个进程,首先user要有可执行程序的X权限,通过该程序启动一个进程,进程的uid和euid都是user
    同样的可执行文件对不同的用户其所可以执行的操作权限是不同的
    其实文件的权限有12位权限处理不同用户组u,g,o下的r,w,x还有suid,sgiid,sticky权限
    suid
    suid权限生效的条件
    (1)用户ux执行权限和 其他人o的执行x必须存在
    (2)用户us(suid)存在
    其他用户o通过可执行程序启动的进程euid更改程序的拥有者,这是就会更改程序的uid,此时对应的uid其他用户o可以拥有此执行程序的权限
    在这里插入图片描述
    我们可以看到开始我们没有改变可执行文件的suid权限时,我们在用其他用户执行文件时,会报错无法打开文件,这是其他用户就是第三者,没有权限执行这个程序,当我们切换为程序所有者更改suid属性,当我们切换回其他用户时,就可以正常运行,并且回将其真实归属用户和当前执行用户的id打印出来

    sgid
    sgid权限生效的条件
    (1)同时拥有其他用户o的执行权限x和组内用户g的执行权限x
    (2)拥有组内用户的s(sgid)
    在这里插入图片描述
    在这里插入图片描述
    stick粘滞位
    针对目录文件的
    stick起作用的条件
    对于其他用户o,拥有wt权限,给文件加上stick之后,其他用户可以创建文件,可以删除自己的我呢见,不能删除别人的文件
    在这里插入图片描述

    进程相关命令

    在这里插入图片描述

    ps的两种用法
    (1)ps -elf可以展示所有的进程信息
    在这里插入图片描述
    F--flag属性一般不起任何作用,数值越低优先级越高
    S--进程的status状态 D不可中断的睡眠(不会响应信号),一般是读写磁盘的时候;I空闲状态;R运行态或就绪态(因此PS指令不能区分就绪态或运行态的,因为PS也是一个进程,所以不能获取到别的进程的状态);S可中断睡眠,可以响应信号,类似于scanf,read一个管道等;T被暂停(CTRL+Z);tgdb中调试暂停;Z僵尸进程(进程已终止,资源未回收,主要是task_struct未回收)
    在这里插入图片描述
    PEI NI表示优先级
    ADDR驻留内存的起始地址
    SZ驻留内存的大小
    WCHAN(重要)阻塞的系统调用
    (2) ps aux
    在这里插入图片描述
    可以显示内存使用率

    VSZ虚拟内存的大小

    RSS驻留集(虚拟内存分配在物理内存中有多大)大小

    START状态
    以下,辅助状态
    在这里插入图片描述
    专门看内存的命令free
    在这里插入图片描述
    Mem:物理内存
    Swap:交换分区
    shared共享内存
    buffcache的区别
    (1)buff是内核缓冲区,cashe是页缓存
    (2)buff本质是一个队列,采用先进先出的结构,防止读取数据或者写入数据某一操作过快,而不均衡,cashe为了提高速度,将我们经常访问的数据复制一份放在高速缓存里面,让使用数据能够迅速找到

    ps -elf只能获取某一时刻的进程状态
    top获取实时的进程状态
    在这里插入图片描述
    在这里插入图片描述

    优先级系统

    Linux中有140个优先级级别Ubuntu中的优先级标号是-40 ~ 99数值越低,优先级越高
    这些优先级又被分为两个部分
    -40 ~ 59 实时优先级,高优先级的策略先运行,如果处于这个区间优先级的程序就会使用FIFO(先来先处理)以及RR(时间片流转)两种调度算法
    60 ~ 99 普通优先级,使用完全公平调度算法
    用户无法修改调度策略,而且用户只能修改进程优先级在60 ~ 99之间进行修改

    NiCE值 间接修改优先级,可以使用nice值启动进程

    NICE-20019
    PRI608099

    在这里插入图片描述

    在这里插入图片描述
    增加NICE值
    在这里插入图片描述
    我们可以将进程的优先级调高,但是不随意将进程的优先级调低,如果要将进程优先级调低,就需要使用sudo,但是优先级也只能在普通优先级数值内进行调整
    在这里插入图片描述
    在这里插入图片描述
    renice -n -10 -p while1 sudo renice -n -10 -p while1两个指令也可以调整优先级,但也只能在普通优先级里面进行调整

    前台和后台

    前台:可以响应键盘中断的进程就叫前台进程(CRTL + C 中止,CTRL + \终止,CTRL + Z 暂停)
    后台:不可以响应键盘中断的进程就叫后台进程

    默认启动的进程是前台运行态进程
    ./while1 &以这样的命令启动时默认启动运行态的后台进程
    jobs可以罗列出本窗口中所有的前台和后台进程,不同的窗口运行jobs打印的数据都是不一样的,只针对bash
    在这里插入图片描述
    使用fg将后台进程拉到前台
    fg 1是将上面jobs里面显示的序号进程号
    在这里插入图片描述
    使用CTRL + Z将前台进程转为后台stopped状态进程
    使用bg命令将后台暂停(stopped)进程转为运行状态
    使用kill命令杀死后台进程(1.获取pid;2,kill -9 pid)任何程序执行这个指令都会被杀死
    在这里插入图片描述

    crontab定时任务

    单个用户的定时任务 crontab -e
    在这里插入图片描述
    上面表示在4月11号17点的每一分钟向/home/mask/111.txt文件中写如123字符串
    多用户的定时任务
    sudo vim /etc/crontab
    在这里插入图片描述

  • 相关阅读:
    OpenCore引导都支持哪些.efi文件
    Mac新建文件夹报错,mkdir():Operation not supported
    Spring ComponentScan注解的简介说明
    langchain中的Document类
    Llama2-Chinese项目:2.1-Atom-7B预训练
    小程序容器技术,加速车联网安全生态运转
    【快速上手ESP32(基于ESP-IDF&VSCode)】07-I2C(附BH1750实战代码)
    比Linus更厉害的程序员,这家伙一定是穿越回来的!
    Docker 部署 Bitwarden RS 服务
    7.git冲突的产生与解决
  • 原文地址:https://blog.csdn.net/qq_48627750/article/details/133918492