目录
一、进程切换
并发:多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发
前提引入
为什么函数返回值会被外部拿到呢?因为通过CPU寄存器存放临时变量
return a(假设数值为10) 即 mov eax 10
系统如何的得知我们的进程当前执行到哪行代码了?
系统通过CPU中的寄存器eip(或者被称之为程序计数器pc),记录当前进程正在执行指令的下一行指令的地址
寄存器有很多,例如
通用寄存器:eax,ebx,ecx,edx
栈帧有关的寄存器 ebp,esp,eip
状态寄存器 status
为了提高效率,进程会将高频数据放入寄存器中
cpu内的寄存器里面保存的是 进程相关的数据(访问或者修改)
这些寄存器里保存的进程的临时数据被称为 进程的上下文
进程从cpu上离开的时候要将自己的上下文数据保存好带走,以便于未来再被调度的时候恢复上下文,保存的目的,未来都是为了恢复
进程在被切换的过程中不断在保存自身的上下文和将自身上下文恢复到cpu的过程中重复。
这些内容可以被保存在进程的pcb中
二、环境变量
1.查看环境变量的方法
echo $NAME //NAME:你的环境变量名称
2.什么是环境变量
环境变量是一组name=vaule形式的变量,不同的用户具有不同的环境变量,环境变量具有全局性
它的作用是帮助系统“认识你是谁”
3.一些常见的环境变量
1.PATH
PATH : 指定命令的搜索路径
我们使用ls pwd等指令不需要带路径是因为系统默认会到PATH中的路径里面去寻找
修改(等号左右不带空格)
覆盖:PATH=路径 例如 PATH=/home/myh/test
添加:PATH=$PATH:路径 例如PATH=$PATH:/home/myh/test
2.HOME
因为有这个环境变量,在我们登录时,默认会处在我们的家目录下
3.USER
用户是谁
4.SHELL
查看当前在哪个shell中
4.和环境变量有关的指令
1.echo:
显示某个环境变量值
2.export
设置一个新的环境变量
在命令行直接导入的name=vaule被称为本地变量,bash自己使用
我们要在前面添加export
例如export myh=0
3. unset:
清除环境变量
unset name
例如unset myh
4.env
显示所有环境变量
再介绍一些环境变量
HISTSIZE:系统能保存的历史命令条数
SSH_TTY:终端设备文件是谁
如图左右是两个终端,右边的终端文件为/dev/pts/25,在左边终端指定路径,字符就可以被输入到右边的终端中
PWD:当前程序所在路径
OLDPWD:上次处在的目录
我们还可以通过系统调用接口来获取环境变量
在代码中getenv(环境变量名)即可
5.set
显示本地定义的shell变量和环境变量
5.知识补充命令行参数
第一个是指令+选项的数目,第二个参数是一个指针数组,每一个指针指向一个字符串 ,以NULL结尾
通过实验,我们可以看到
我们的指令会被存入第一个位置,后续的选项会被存入后面的位置
因此我们可以通过if else语句来实现不同的功能
为什么要有命令行参数 ?
为指令,工具,软件提供命令行选项的支持
linux下大部分指令都是c写的,因此需要引入命令行参数来对指令提供选项支持
6.环境变量也会被传入main函数
也会传入像argv一样的一个向量表 ,一样可以打印
7.通过第三方变量environ获取环境变量
#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;
}
libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时 要用extern声明。
8.环境变量可被子进程继承并且有全局属性
我们运行的进程都是子进程,bash本身在启动的时候会从操作系统的配置文件中读取环境变量信息 ,如果我们创建子进程,那么子进程就会基础父进程的环境变量
环境变量也是数据,默认情况下是父子共享的,但是如果子进程要修改数据,它不能影响到父进程,即要进行写时拷贝
注意点
bash并不是接收所有指令都会区创建子进程的
例如echo与cd
假设我们现在定义了一个本地变量,myh=0
我们echo myh,假设echo是bash的子进程,因为我们定义的是本地变量,因此echo的环境变量中是没有myh这个环境变量的
以及cd,每个进程都有当前的工作目录,如果cd创建子进程,那么修改的应该是子进程的路径,父进程的路径不会发生更改
因此我们有两批命令
1.常规命令--通过创建子进程完成的
2.内建命令--bash不创建子进程,而是由自己亲自执行,类似于bash调用了自己写的或者系统提供的函数
通过调用chdir,我们可以让程序自己改变自己的路径