进程优先级、环境变量、进程地址空间
优先级
概念:cpu资源分配的先后顺序,就是指进程的优先权,就跟排队一样,排队的本质就是在确认优先级,那为什么需优先级要?因为资源的不足导致
查看系统进程
Linux系统中输入ps -l 就能查看信息
系统进程基本信息:
- UID : 代表执行者的身份
- PID : 代表这个进程的代号(常说的子进程)
- PPID :代表这个进程是由哪个进程发展衍生而来的,亦即父进程的代号
- PRI :代表这个进程可被执行的优先级,其值越小越早被执行
- NI :代表这个进程的nice值
PRI和NI
PRI也就是进程的优先级,PRI越小,进程优先级就越高
- Linux进程的优先级数值范围:60~99
- Linux默认进程优先级都是80
那为什么优先级要限定在一定的范围内?
如果不限定,容易导致优先级较低的进程,长时间得不到CPU,导致进程饥饿
os调度的时候,较为均衡的让每一个进程都要得到调度。这样就会较为公平
Linux进程PCB中存在一个nice值也就是NI,表示优先级的修正数据,nice为负值时,优先级值变小,优先级就会越高,越快被执行,调整优先级,实质是调整进程nice值
- nice调整最小是:-20,超过部分统一为-20(-100也是-20)
- nice调整最大是:19,超过部分统一为19(100也是19)
PRI(new)=PRI(old)+nice
查看进程优先级命令
用top命令更改已存在进程的nice:
- 输入指令top
- 进入top后输入r->输入进程PID->输入nice值
当我们输入nice值为-20时
其他知识
- 竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级
- 独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰
- 并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行
- 并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发
环境变量
基本概念
- 环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数
- 环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性
常见环境变量
- PATH : 指定命令的搜索路径
- HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)
- SHELL : 当前Shell,它的值通常是/bin/bash
PATH基本用法
创建一个myprocess.c的文件你发现./myprocess能执行,直接输入myprocess不能执行
那怎么样才能执行myprocess呢?
先输入指令echo $PATH查看环境变量路径
再将数据拷贝到此路径下cp myprocess /usr/sbin/
你会发现myprocess就能使用了
那我要怎样取消myprocess这个指令呢?
删除它的路径rm /usr/sbin/myprocess,就不能再执行了
HOME
root和普通用户下HOME值是不一样的
root用户
普通用户
环境变量相关的命令
- echo: 显示某个环境变量值
- export: 设置一个新的环境变量
- env: 显示所有环境变量
- unset: 清除环境变量
- set: 显示本地定义的shell变量和环境变量
本地变量 MY_ENV=hahahahaha env查找不到,但是发现能打印
export导入环境变量进去,但是退出Xshell,再查找的话就查找不到
unset清除之后,无法显示
永久设置环境变量输入,退出之后也能显示
vim ~/.bash_profile
export MY_ENV=hahahahhaha
环境变量的组织方式
每个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串
获取环境变量
#include <stdio.h>
int main(int argc, char *argv[], char *env[])
{int i = 0;for(; env[i]; i++){printf("%s\n", env[i]);}return 0;
}
#include <stdio.h>
int main(int argc, char *argv[])
{extern char **environ;int i = 0;for(; environ[i]; i++){printf("%s\n", environ[i]);}return 0;
}
常用getenv和putenv来访问特定的环境变量
#include <stdio.h>
#include <stdlib.h>
int main()
{printf("%s\n", getenv("PATH"));return 0;
}
环境变量通常具有全局属性,可以被子进程继承下去
#include <stdio.h>
#include <stdlib.h>
int main()
{char * env = getenv("MYENV");if(env){printf("MYENV:%s\n", env);}return 0;
}
进程地址空间
概念:进程地址空间是一个内核的数据结构对象
先看一个现象地址一样,值却不一样
变量内容不一样,所以父子进程输出的变量绝对不是同一个变量地址值是一样的,说明,该地址绝对不是物理地址,在Linux地址下,这种地址叫为虚拟地址用C/C++语言看到的地址,都是虚拟地址,物理地址,用户一概看不到,由OS统一管理
那为什么需要进程地址空间呢?
- 当可执行程序任意的放在内存当中,发现不影响查找,这是因为进程可以通过地址空间+页表可以将乱序的内存数据,变成有序,将无序变有序
- 存在的虚拟地址空间,可以有效的进行进程访问内存的安全检查,当进程地址空间以写的权限访问时,而页表的访问权限字段是读的权限就会禁止访问
- 通过页表,让进程映射到不同的物理内存中,从而实现进程的独立性
分页和虚拟地址空间示意图
上面的图可以说明同一个变量,地址相同,其实是虚拟地址相同,内容不同其实是被映射到了不同的物理地址