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
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值