-
竞争性:进程数目多,资源少,竞争手段通过入队列,得到优先级
竞争方式很多, -
独立性:不会因为一个进程挂掉导致其它进程出现问题
如何做到
在进程地址空间中讲
大部分电脑是单CPU,但是有很多进程在运行
多个进程在系统中运行,不带表他们是在同时运行
不能认为一个进程占有了CPU,就会一直执行到结束才释放CPU资源
-
并行:多个进程在多个CPU下分别同时运行
-
并发:操作系统会给每一个进程,在一次调度周期中,赋予一个时间片的概念,大部分操作系统是分时的,一段时间内,多个进程都会通过切换交叉的方式,让多个进程代码在一段时间内都能得到推进。这种叫并发
环境变量
环境变量是保持当前程序运行环境参数的变量,处于终端
优点:
-即时生效
-通过环境变量设置
系统中有两种变量,一种是环境变量,另一种是普通变量(直接在命令行写 字符串=值)
env
现象:
- 自己写的可执行程序要执行要加路径 ---- ./
系统中也有很多命令,也是可执行程序,直接运行命令名字- 为什么系统中的命令可以找到:
因为系统中存在相关的环境变量,保存了程序的搜索路径- 环境变量是系统生成的变量,变量有变量名和变量内容,这些环境变量有不同应用场景
环境变量是在系统开机的时候形成的一组变量
查看系统环境变量的方式env
- 主要是name=value,每个变量有自己独特的内容
- 系统中搜索可执行程序的环境变量是path
echo $PATH显示path的内容
- 内容都是一堆路径,用:分隔
path
把程序放入这个目录下就可以直接运行了
因为程序在运行时有一个默认检测的路径
usr/bin就是在PATH这个环境变量下
将自己的exe添加到环境变量中
- 自己的可执行程序所在路径没有在path环境中,如果直接放到/usr/bin目录下,这就叫安装软件
cp myexe /user/bin/ - 把自己的exe所处路径添加到环境变量中
Linux命令行可以直接定义变量
- 本地变量a=100,不会以环境变量存在
- 环境变量export bb=1234
export:导出环境变量
环境变量在系统启动的时候会自动执行配置文件
修改环境变量:
- 临时修改:直接在命令行中执行修改命令,只针对当前终端有效终端重启失效
- 命令1. export+环境变量名称= 环境变量名称: + 新添加环境变量的值例如: e x p o r t P A T H = 环境变量名称:+新添加环境变量的值 例如:export PATH= 环境变量名称:+新添加环境变量的值例如:exportPATH=PATH:(exe的路径)
$环境变量的意思是:将之前环境变量保留,如果不写原环境变量值会被覆盖- 命令2. source+环境变量文件,就会使其立即生效(让操作系统内核重新加载环境变量文件)
- 永久修改:将修改命令直接写到环境变量文件当中;
$后面说明这是变量,不是字符串
常用命令
- env:查看所有环境变量
env ${环境变量}- export:设置环境变量
export PATH=$PATH:(exe的路径)- unset:清除环境变量。
- set:查看所有变量,包括普通变量
- which+命令:查看某个可执行程序所在的路径
函数:char* getenv(char* name)
将参数对应的环境变量值返回
常见环境变量:
- PATH:指定可执行程序的搜索路径(在PATH环境变量中保存了命令所在的路径)
- HOME:指定用户的主要工作目录(当前用户的家目录)
- SHELL:当前SHELL,它的值通常是/bin/bash(当前命令行解释器具体是哪个)
本地变量只在本shell内有效
环境变量是全局有效
bash也是进程,在usr/bin目录下
命令行中启动的进程的父进程都是bash
如何理解环境变量具有全局属性
环境变量会被子进程继承下去的
从bash处定义的环境变量,就能被所有子进程拿到
本地变量是在bash内部定义的变量
Linux中大部分命令是通过子进程执行,还有一部分命令是由bash自己执行
识别到ench,export就会调用自己的函数完成特定功能
这些命令称为内建命令
程序地址空间不是内存,本质是进程地址空间
是操作系统上的概念
环境变量文件:
系统级/etc/bashrc
- /etc/bashrc这是一个文件,这里保存了很多环境变量,这个环境变量会被当前的所有用户加载;
- 不要更改这个文件,哪个用户就更改自己的文件
用户级(两个):~/.bashrc 和 ~/.bash_profile
- .说明当前文件是一个隐藏文件,意味着在当前用户的家目录下使用ls命令是看不到的,ls-a可以
每个用户下都有两个或其中之一的用户级环境变量
环境变量的获取
进程获取环境变量,三种方式
mian的第三个参数
全局变量方式
代码方式
方式一:通过main函数的第三个参数传递
main函数的参数
- argc:程序运行参数的个数
执行ls的时候,后面给-a,-l就是程序运行参数
这些参数在运行的时候传递给程序内部- argv[ ]:逐个保存了所有的运行参数,以空格分开
argv[0]首元素就是程序名
程序根据不同的参数,就执行不同的代码,- env[ ]:
这就是ls后跟-a还是-l,显示出不同信息的原因
第三个参数
每个元素是一个环境变量,每一个进程都会被传入环境变量
程序运行后,变成进程,进程被调用方传入环境变量(谁传的后面讲)
函数定义的时候无参,强制给函数传参不会报错
加void后就不行了
方式二:C语言会自动定义一个第三方变量
extren char** environ声明要使用这个全局变量
在使用前进行声明
通过这个也可以把环境变量传入
使用for循环可以打印出来外界传入的环境变量
方式三:获取环境变量的结课
char* val=getenv(环境变量名)
通过环境变量名直接获得
这个val是一个字符串类型,用%s可以打印出对应环境变量的内容
为什么获取环境变量
通过环境变量获取运行该程序的当前用户名
如果不是指定用户不同,就会报错,root也不行
int main()
{
char* id=getenv("USER");
if(strcmp(id,"lzy")!=0)
printf("权限不足\n");
}
环境变量是谁给我的
本地变量与环境变量
本地变量只在本shell内有效
环境变量是全局有效
如何理解环境变量具有全局属性
- bash也是进程,在usr/bin目录下,命令行中启动的进程的父进程都是bash
- 环境变量会被子进程继承下去的
- 从bash处定义的环境变量,就能被所有子进程拿到
本地变量是在bash内部定义的变量
- Linux中大部分命令是通过子进程执行,还有一部分命令是由bash自己执行
- 识别到ench,export就会调用自己的函数完成特定功能
这些叫内建命令
程序地址空间不是内存,本质是进程地址空间
是操作系统上的概念