进程的概念
进程
(动态)是一个正在运行的程序
(静态)
多道程序设计缺点:
(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)用户u
的x
执行权限和 其他人o
的执行x
必须存在
(2)用户u
的s(suid)
存在
其他用户o
通过可执行程序启动的进程euid
更改程序的拥有者,这是就会更改程序的uid
,此时对应的uid
其他用户o
可以拥有此执行程序的权限
我们可以看到开始我们没有改变可执行文件的suid
权限时,我们在用其他用户执行文件时,会报错无法打开文件,这是其他用户就是第三者,没有权限执行这个程序,当我们切换为程序所有者更改suid
属性,当我们切换回其他用户时,就可以正常运行,并且回将其真实归属用户和当前执行用户的id打印出来
sgid
sgid权限生效的条件
(1)同时拥有其他用户o
的执行权限x
和组内用户g
的执行权限x
(2)拥有组内用户的s(sgid)
stick粘滞位
针对目录文件的
stick起作用的条件
对于其他用户o
,拥有w
和t
权限,给文件加上stick
之后,其他用户可以创建文件,可以删除自己的我呢见,不能删除别人的文件
进程相关命令
ps的两种用法
(1)ps -elf
可以展示所有的进程信息
F--flag属性
一般不起任何作用,数值越低优先级越高
S--进程的status状态
D
不可中断的睡眠(不会响应信号),一般是读写磁盘的时候;I
空闲状态;R
运行态或就绪态(因此PS指令不能区分就绪态或运行态的,因为PS也是一个进程,所以不能获取到别的进程的状态);S
可中断睡眠,可以响应信号,类似于scanf,read一个管道等;T
被暂停(CTRL+Z);t
gdb中调试暂停;Z
僵尸进程(进程已终止,资源未回收,主要是task_struct
未回收)
PEI NI
表示优先级
ADDR
驻留内存的起始地址
SZ
驻留内存的大小
WCHAN(重要)
阻塞的系统调用
(2)ps aux
可以显示内存使用率
VSZ
虚拟内存的大小
RSS
驻留集(虚拟内存分配在物理内存中有多大)大小
START
状态
以下,辅助状态
专门看内存的命令free
Mem
:物理内存
Swap
:交换分区
shared
共享内存
buff
和cache
的区别
(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 | -20 | 0 | 19 |
---|---|---|---|
PRI | 60 | 80 | 99 |
增加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