1.进程上下文概念
并行 多个CPU,同一时间多个CPU运行多个进程
并发 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进
进程调度的算法有很多种,有一种是基于进程切换,基于时间片轮转的调度算法,每个进程上处理机运行会有一个时间片的概念,等到时间片一到,进程下处理机就会去waitqueue等待,直到runqueue的进程运行完毕,才会去waitqueue拿进程上处理机
进程在被切换的时候
1.保存上下文(下处理机的进程离开CPU时,将上下文数据保存,便于下一次上处理机恢复上下文,也就是保存CPU中寄存器的值,如果用软件的方式实现,可以将寄存器内容封装为struct保存到PCB,但是这样太慢了,一般结合硬件实现)
2.恢复上下文(上处理机的进程)

CPU内部的寄存器

eip就是PC,存储下一条指令的地址
寄存器存在的意义是提高效率,高频出现的信息会放到寄存器中,保存进程临时数据(上下文),进程对其访问或修改
函数返回值作为局部变量被拿到就是通过寄存器
2.环境变量
环境变量是系统提供的一组name, value形式的变量,不同的用户有不同的环境变量
见见猪跑
2.1 PATH
Linux下指令默认搜索路径
我们可以看到自己写的可执行程序proc不能通过直接在命令行输入proc运行,而要通过./proc来运行,但是ll等指令就可以通过指令对应的可执行程序名称来运行,为什么呢?这就和PATH有关系了,命令行输入的指令,默认系统会在PATH里面找,而我们写的程序不在这些路径下,所以必须通过路径来运行

我们可以通过echo $PATH打印,也可以把我们写的·程序放在PATH下(root才有的权限),就可以输入proc来运行了

也可以把当前路径加入PATH,proc也可以直接运行

PATH=可以直接更改PATH(我的机子退出重启Xshell也会保留上一次对PATH进行的更改)
如果更改PATH为当前目录,很多命令都用不了了

Windows下查看环境变量如下,一般Java, Python等解释型语言,在安装编译器/解释器的时候需要配置PATH


2.2 HOME
查看家目录


SHELL

ENV

SSHTTY是终端,root可以通过终端名称直接向guchen用户的终端写入,但是普通用户不可以向root写入

也有OLDPWD,我们使用cd -进入上一次在的路径,就是通过这个实现的

使用man getenv查看getenv


超级用户和普通用户的权限和USER有关,包括文件权限随用户身份不同,权限不尽相同

2.3 main函数参数
main函数也是有参数的,main函数被startup/CRTstartup函数调用,用来实现指令、工具、软件等的选项
因为argv[i]是以nullptr为结束标志,所以循环结束条件也可以是argv[i]


argv是向量表

Windows下的指令和选项举例

通过main函数参数查看环境变量
两种核心向量表,argv命令行参数表,env环境变量表



这时候proc作为bash的子进程继承了父进程的环境变量MY_VALUE

可以用unset取消环境变量,子进程继承于父进程的MY_VALUE也会随之不复存在

set可以查本地变量(只在本bash内部有效,不会被子进程继承)和环境变量(具有全局属性)

命令行格式,u是用户,h是主机名,W是当前工作目录

PS2表征续航符


运行的进程都是bash的子进程,bash启动的时候会从配置文件读取环境变量信息,子进程继承父进程的环境变量信息
本地变量不会被子进程继承
getenv获取指定的环境变量

但是echo如果是一个进程,作为bash的子进程,也不应该继承本地变量MY_VALUE,为什么还能打印呢?这是因为echo不是进程,是内建命令(类似C++的内联函数),由bash执行自行实现或者调用系统提供的函数


cd -
man chdir


cd -的实现大概如下

man environ




牛刀小试
- 使用shell时,默认的环境变量放在哪里
A.~/.bash_profile
B.~/.bash
C./etc/profile.d
D.~/bash
A
- 以下哪些命令可以查看环境变量 [多选]
A.echo
B.env
C.set
D.export
ABC
- 以下描述正确的有 [多选]
A.子进程默认会复制拥有与父进程相同的环境变量
B.环境变量使shell运行环境配置变的更加复杂
C.环境变量可以使用export命令设置
D.删除一个环境变量可以使用unset和rm命令
AC