Linux操作系统基本介绍

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;
    }
    

Leave a Reply