本节主要陈述Linux进程相关概念,进程是Linux系统编程中非常重要的知识,下面让我们来一起学习Linux进程相关知识。
目录
程序与进程
程序: | 程序就是我们所写的特定功能的代码集,其存在于磁盘上,不占用系统资源,程序是静态的概念。 |
---|---|
进程: | 当我们执行一个程序,让程序运行起来,系统会为该运行起来的程序分配系统资源,如分配内存空间存储全局变量,堆、栈等,此时改程序就变成了一个进程,进程就是运行起来的程序,进程是动态的概念。 |
并发: | 并发是常见的概念,就是cpu在同一时间内运行很多个程序,且这些程序都处于运行期间,我们在打游戏同时听音乐,和对象聊微信等,但某一时刻cpu只能执行其中一个程序。 |
CPU和MMU
CPU内部主要由ALU算数逻辑单元、译码器、预取器、寄存器、以及MMU虚拟内存映射单元组成,其通过预取器在cache中预取指令后交给译码器进行译码处理,处理后交给ALU运算器进行运算,ALU将运算过程中的临时数据在暂存到寄存器中,其存储介质主要含硬盘、内存、cache缓存,以及寄存器,硬盘其是物理操作,其速度较慢,当一个程序开始运行时需要将数据从磁盘加载到内存当中,但内存访问的速度远不足以匹配CPU处理速度,在此基础上就诞生了cache缓存,cpu通过与cache缓存交互,将经常反复调用的数据加载到cache中,这样就提高了程序的处理速度。
MMU称为内存管理单元,主要完成虚拟地址到物理地址之间的映射,从上图可以看出,两个进程中的数据区会被MMU映射到不同的内存空间,而kernel内核区被映射到了同一块内存区,这就是为什么两个独立的进程之间可以通信,MMU映射时会对内核太和用户太进行分级,内核太称为0级,用户区为3级。
进程PCB
进程pcb称为进程控制块,描述了整个进程运行过程中的信息,其本质就是一个结构体,这个结构体主要存放一下内容。
struct tast_struct {
进程ID
进程的状态:初始态、就绪态、运行态、阻塞/挂起态、停止态
进程切换时需要保存和恢复的一些cpu寄存器
描述虚拟地址的空间信息
当前工作目录位置
umask掩码
文件描述符表
用户ID和组ID
和信号相关的信息
}
环境变量
PATH—可执行文件的位置
SHELL—shell命令解析器
TERM—当前终端
LANG—当前语言
HOME—家目录
进程共享
进程间仅仅共享文件描述符表,mmap映射区
父子进程相同:全局变量、data数据段、text代码段、堆栈、环境变量、宿主目录、用户ID和组ID
父子进程不同:进程ID、各自父进程、未决信号集、闹钟、进程运行时间
文件描述符
之前我们在文件编程阶段,利用系统调用函数操作文件时都是通过一个文件描述符来进行,open函数打开一个文件返回一个文件描述符,其是一个 int 类型整数。
在进程PCB当中存在一个成员是文教描述符表,其本质是一个指针,指向了struct file 文件结构体,这个结构体中存放操作文件过程中很多信息,其中就包含文件描述符,linux文件描述符展示给我们操作的文件描述符的就是一个整数,文件描述符从0-1023依次递增,0称为标准输入,1是标准输出,2标准错误,所以通常我们打开文件返回的文件描述都是从3开始。