1、程序与进程
- 程序相当于剧本,而进程则相当于根据剧本上演的戏;
2、多进程
- 单道程序设计模式:
- 同一时间只能有一个进程占用CPU资源
- 如:DOS操作系统
- 多道程序设计模式:
- CPU划分多个时间轮片,通过时钟中断的方式切换进程,硬件手段
- 如:100ns为一个时间轮片,人的眼睛识别在毫秒级别;
- 从人的感知上,CPU是同时执行了多个程序;
3、CPU工作原理
- 硬盘—> 内存—> Cache —> 预取器 —> 译码器 —> 寄存器 —> 算术逻辑单元(ALU) —> 寄存器 —> 内存 —> 硬盘
4、MMU工作原理(内存管理单元)
- 虚拟地址与物理内存的映射
- 设置修改内存访问级别(0 ~ 3),Linux只使用了0级与3级
- 0级最高,用于访问内核心区(3G-4G地址范围)
- 3级最低,用于访问用户区(0G-3G地址范围)
- 进程相互独立,同一程序不同进程之间有独立的物理地址映射
- 相同程序不同进程内核心区映射的物理内存为同一片空间
5、进程控制块PCB(进程描述符)
- PCB的低层实现是task_struct结构体
- 进程id,系统中每一个进程都有唯一id,pid_t类型(实质为非负整数)
- 进程的五种状态
- 准备 —> 可与就绪合并成一个状态
- 就绪 —> 等待时间轮片
- 运行 —> 占用CPU
- 挂起 —> 等待CPU外的其他资源,主动放弃CPU
- 停止 —> 运行结束
- 进程切换时需要保存和恢复寄存器数据
- 描述虚拟地址空间信息
- MMU维护,但存储在PCB中
- 描述控制终端信息
- 当前工作目录,进程目录
- umask掩码,保护文件默认权限
- 文件描述符表,包含很多指向file的结构体指针
- 和信号相关的信息
- 用户id和组id
- 会话(Session)和进程组
- 进程可以使用的资源上限(ulimit -a)
6、环境变量
- 操作中用来指定操作系统运行环境的一些参数
- 字符串
- 键值对
- 描述环境信息
- PATH:记录了应用程序所在的路径
- shell只所以可以直接运行程序,是因为shell使用环境变量进行了搜索
- 其他环境变量
- $SHELL —> 终端类型
- $HOME —> 主目录路径
- $LANG —> 当前语言
- 存储形式
- 与命令行参数类似
- 使用形式
- 与命令行参数类似
- 加载位置
- 高于栈的起始位置
- 引入环境变量表:
- extern char ** environ
-
打印当前所有的环境变量
#include <stdio.h> #include <stdlib.h> // 环境变量一个全局变量,外部声明后即可直接使用 extern char** environ; int main(){ // enviorn是一个指向指针的指针,*environ即为一个批向环境变量的指针 // enviorn++可使得指针后移一位,*environ指针为空则全部遍历 while(*environ){ // %s可以直接打印指向环境变量指针的指向的内容 printf("%s\n", *environ); environ++; } return 0; }
-
相关函数有:getenv、setenv、unsetenv
#include <stdio.h> #include <stdlib.h> extern char** environ; int main(int argc, char* argv[]){ // 预设一个环境变量的kye值 const char* name = "ABCDEFG"; // 1、获取该环境变量的值 char* val = getenv(name); printf("%s:%s\n", name, val); // 2、设置环境变量值 int ret = setenv(name, "Your are right!!", 1); if (ret == -1){ perror("setenv"); exit(1); } printf("%s:%s\n", name, getenv(name)); // 3、清除该环境变量 ret = unsetenv(name); if (ret == -1){ perror("unsetenv"); exit(1); } printf("%s:%s\n", name, getenv(name)); return 0; }