单道程序设计:一段时间只有一个程序在运行。
多道程序设计:时钟中断是硬件基础,让多道程序设计的理论得以实现,多个程序轮流使用cpu(时间片),当下常见的cpu为纳秒级,而人眼的反应速度是毫秒级,所以看似在同时运行。
实质上,并发是宏观,微观依然是串行。
MMU在cpu内部,以page为单位,在32位机上,一个page就是4k。
它主要完成两个工作,其一是把虚拟内存映射到物理地址,其二是设置内存访问权限。
linux中访问级别是2种,1种是3级,1种是0级。
windows中访问级别是4种。
在程序开始运行后,MMU就开始起作用了,预取器阶段就是在虚拟内存空间里工作。
每个进程在内核中都有一个进程控制块(pcb)来维护进程相关信息,linux内核的进程控制块是task_struct结构体。
它位于/usr/src/linux-headers/include/linux/sched.h文件中,内部成员很多。
用grep -r “task_struct” 来查询该结构体。
环境变量: 为了多用户而创建的,指定操作系统运行环境的一些参数。它保存在进程的stack区。
①PATH 可执行文件的搜索路径,ls命令也是一个程序,执行它不需要提供完整的路径名,这个路径名就保存在PATH环境变量里。变量的值可以包含多个目录,互相用冒号隔开。
echo $PATH
查找顺序是从前往后,所以如果有新的同名程序放在前面的路径中,就会执行这个新的同名程序。
还有echo $SHELL ,echo $HOME ,echo $LANG ,echo $TERM等。
xterm表明是图形终端。
环境变量在程序中的使用和命令行参数很接近,存储是字符串的形式,以NULL结尾。
需要全局变量引入 extern char**environ;
#include <stdio.h>
extern char**environ;
int main()
{
int i;
for (i=0;environ[i];i++)
{
printf("%s\n",environ[i]);
}
return 0;
}
执行结果:
相当多。
这个输出的环境变量表,是编写的该程序运行后进程的环境变量。
对环境变量操作的3个函数:getenv、setenv、unsetenv
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("%s\n",getenv("SESSION"));
return 0;
}
如果没有找到,getenv返回null(仍然是个字符串)
setenv 设置环境变量
int setenv(const char *name, const char *value, int overwrite);
第3个参数非零的话,说明要修改原有值或者添加新的环境变量。
unsetenv取消设置。
#include <stdio.h>
#include <stdlib.h>
int main()
{
const char*name="SESSION";
const char*value="ubuntu 16.04";
setenv(name,value,1);
printf("%s\n",getenv("SESSION"));
return 0;
}
执行结果:
unsetenv没有那么智能,它仅仅是删除该环境变量,而不是“取消上次修改”
#include <stdio.h>
#include <stdlib.h>
int main()
{
const char*name="SESSION";
const char*value="ubuntu 16.04";
setenv(name,value,1);
unsetenv(name);
printf("%s\n",getenv("SESSION"));
return 0;
}
这样的话,执行结果会报错: