并发
进程切换、时间片:基于进程切换基于时间片轮转的调度算法
为什么函数返回值,会被外部拿到?
答:通过CPU寄存器。
return a; ——>move eax 10
系统如何得知我们的进程当前执行到哪行代码?
答:程序计数器pc,eip:记录当前进程正在执行指令的下一行指令的地址
寄存器
通用寄存器:eax,ebx,ecx,edx
栈帧:ebp,esp,eip
状态寄存器:status
那么寄存器扮演者一个什么角色?
答:为了提高效率,将进程的高频数据放入寄存器中,因此cpu内的寄存器里面保存的是进程相关的数据,简而言之,cpu寄存器里面保存的是进程的临时数据,称为当前进程的上下文。
那为什么要有上下文数据?
答:进程在CPU上离开的时候,要将自己的上下文数据保存好,甚至带走,目的是为了恢复数据
因此,进程在被切换的时候,有两个操作:
- 保存上下文
- 恢复上下文
环境变量
基本概念
- 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数;
- 如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动静态库在哪里,但是可以照样链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找;
- 环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性。
见一见环境变量
指令:echo $PATH
echo $PATH
PATH:LINUX系统指定的指令搜索路径,以“:”为分割符。
添加指令路径
前置:编写一个自己写的可执行程序,
指令名:
PATH=$PATH:可执行文件所在的路径名
**注意:**不加$PATH则会覆盖所有环境变量
如果环境变量改错了,将xshell退了重新登陆一下即可
查看环境变量
指令:
env
HISTSIZE :最多能保存的历史数据
命令行参数
int main(int argc,char* argv[],char* env)
{
}
我们先看前两个,那么这里的argc,argv是什么作用呢?
我们先写一个mycmd.c文件
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main(int argc,char* argv[])
{
int i=0;
for(;i<argc;i++)
{
printf("argv[%d]->%s\n",i,argv[i]);
}
return 0;
}
make一下生成可执行程序,依次输入指令
.\mycmd
.\mycmd -a
.\mycmd -a -b
.\mycmd -a -b -c
以下是输出结果:
首先,main函数是函数,也就是说main函数也可以被调用,实际上,第一个被调用的函数是Startup();
其次,命令行输入时,在bash看来就是一串字符串,会以空格符为间隔打散为几个子串,bash会将这些子串传入argv[]中,那么具体会有什么作用呢?让我们在mycmd.c里做点小小的改动:
if(argc!=2)
{
printf("Usag:%s -[a|b|c|d]\n",argv[0]);
return 0;
}
if(strcmp(argv[1],"--help")==0)
{
printf("Usage:%s -[a|b|c|d]\n",argv[0]);
}
else if(strcmp(argv[1],"-a")==0)
{
printf("功能1\n");
}
else if(strcmp(argv[1],"-b")==0)
{
printf("功能2\n");
}
else if(strcmp(argv[1],"-c")==0)
{
printf("功能3\n");
}
else if(strcmp(argv[1],"-d")==0)
{
printf("功能4\n");
}
else
{
printf("default功能\n");
}
编译生成可执行文件后,依次运行如下指令:
./mycmed
./mycmed --help
./mycmed -a
./mycmed -b
./mycmed -c
./mycmed -d
./mycmed -d
以下是运行结果:
可以看到随着命令行参数的不同,程序所执行的功能也会有所不同。
所以命令行参数的意义是:为指令、工具、软件等提供命令行选项的支持
env参数
有名字可以看出来,这是环境变量。,接下来我们遍历一下环境变量。
我们再对mycmd.c进行修改:
int i=0;
for(;env[i];++i)
{
printf("env[%d]->%s\n",i,env[i]);
}
编译一下后进行运行,下面是运行结果:
所以我们也能自己获得环境变量。
所以main函数中有两张重要的向量表:
- 命令行参数表
- 环境变量表
并且我们发现我们所运行的进程,都是子进程,会从操作系统的配置文件中读取环境变量信息,子进程会继承父进程交给我的所有环境变量。
我们所运行的进程,都是子进程,bash本身在启动的时候,会从操作系统的配置文件中读取环境变量信息,子进程会继承父进程交给他的所有环境变量
导入自己的环境变量
export 环境变量
本地变量&& 内建命令
本地变量:可以在命令行中直接定义,本地变量只会在本bash中有效,不会被继承
查看本地变量
set
常规命令——通过创建子进程完成的
内建命令——bash不创建子进程,而是自己亲自执行,类似于bash调用了自己写的或者系统提供的函数。