【Linux】Linux进程概念(一)
目录
- 前言
- 一、冯诺依曼体系结构
- 二、操作系统(OS)
- 三、进程、PCB
前言
【Linux】Linux调试器----gdb/cgdb详情请点击,今天将介绍一个新的内容【Linux】Linux进程概念(一):主要讲解冯诺依曼体系、操作系统、进程、PCB
一、冯诺依曼体系结构
冯诺依曼体系是由冯诺依曼提出的计算机设计基本框架,包括五大部件:输入设备、存储器、运算器、控制器、输出设备;我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系。
- 其中运算器和控制器就是我们常说的
中央处理器(CPU)
- 输入设备和输出设备是我们常说的
外设
(外部设备),外设相比于CPU特别慢
- 存储器:存储器指的是内存
- 输入设备:鼠标、键盘、摄像头、话筒、网卡、磁盘…
- 输出设备:显示器、打印机、网卡、磁盘…
- 从上面结构上看,CPU能且只能对内存进行读写,不能访问外设(输入或输出设备)(数据层面),外设(输入或输出设备)要输入或者输出数据,也只能写入内存或者从内存中读取。所有设备都只能直接和内存打交道
- 一个程序(程序是二进制文件,里面有数据和逻辑,程序本质上就是数据)要运行,必须先将程序加载到内存中,因为在数据层面,CPU只和内存打交道
- 存储是分级的,CPU的运行速度非常快(纳米级别),磁盘(外设)的运行速度是毫秒级别的,如果计算机CPU直接去读取和写入磁盘数据,那么根据木桶效应,计算机的效率会下降很多,所以让内存(微秒级别)作为中间枢纽分别和CPU、外设打交道,整体计算机的效率会比直接和外设打交道高得多
二、操作系统(OS)
任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。笼统的理解,操作系统包括内核(进程管理,内存管理,文件管理,驱动管理)和其他程序(函数库,shell程序)
- 操作系统对下管理好软硬件资源,目的是对上为用户提供良好(稳定、高效、安全)的环境
- 操作系统并不相信用户,因此为了服务用户且保证自身数据的安全,操作系统以接口的方式给用户提供调用的接口,让用户通过接口访问操作系统
- 在开发角度,操作系统对外会表现为⼀个整体,但是会暴露自己的部分接口,供上层开发使用,
这部分由操作系统提供的接口,叫做系统调用 - 系统调用在使用上,功能比较基础,对用户的要求相对也比较高,所以有心的开发者可以对部
分系统调用进行适度封装,从而形成库,有了库,就很有利于更上层用户或者开发者进行二次开
发
操作系统的定位是:⼀款纯正的“搞管理”的软件,那么操作系统如何进行管理的呢?
- 先描述,再组织。在管理结构中分为管理者(操作系统)、执行者(驱动程序)、被管理者(底层硬件)
- 管理的本质是对数据的管理,通过对数据的管理(增删查改),数据通过执行者拿到
- 操作系统管理首先先描述,描述被管理者对象属性,Linux操作系统是由C语言写的,因此描述对象属性的数据被封装在struct结构体中,当管理对象的时候,首先使用结构体去实例化出具体对象,包含属性+指针(指向某个空间)
- 多个事物进行管理,只需要用指针将struct结构关联起来,这样就使用单链表将被管理者组织起来了,这个组织过程叫做建模
- 用单链表组织起来后,对事物的管理就转变成了对链表的增删查改
- 所以,在操作系统中,管理任何事物都是先描述再组织,最终都可以转化为对数据结构的增删查改,所以操作系统一定会存在大量的数据结构
三、进程、PCB
概念:加载到内存中的程序、正在运行的程序叫做进程
细致来说:进程是由内核PCB数据结构+代码和数据构成
- 内核PCB数据结构:进程属性的集合,这个集合放在了进程控制块中
- 程序是二进制文件,由代码和数据构成
- 不同操作系统的PCB不同,Linux 操作系统下的PCB是: task_struct
- 通过操作系统如何进行管理的我们知道,任何一个事物要进行管理都需要先描述再组织,多个进程也需要被操作系统管理,那么对多个进程的管理,也要先创建用于描述进程属性的结构体对象再进行组织,最终会转化为对某种数据结构的增删查改
- task_struct 是 Linux 内核的⼀种数据结构类型,它会被装载到RAM(内存)里并且包含着进程的信息
PCB结构体大致包括:
- 标示符:描述本进程的唯⼀标⽰符,⽤来区别其他进程
- 进程的状态,进程是启动,是休眠,还是关闭
- 进程的优先级,同时存在多种进程优先执行哪个进程
- 程序计数器:程序中即将被执行的下⼀条指令的地址
- 内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
- 上下文数据:进程执行时处理器的寄存器中的数据
- 其它信息
- 我们使用ps ajx来获取操作系统上的所有进程信息
- 现在运行一个死循环程序并使用ps ajx |head -1 && ps ajx | grep 二进制文件名查看进程信息,其中PID就是该进程的标识符
- Linux中在/proc系统目录中,存储着进程的进程的信息
- 使用
ll /proc/标识符
,查看该进程的属性
- exe文件时链接文件,exe对应着二进制可执行文件的绝对路径
- cwd是当前进程的工作目录,进程的所有工作都将默认在这个工作目录中执行,进程在运行时产生临时文件的路径即默认为cwd对应的工作目录下
- 如果要修改当前进程的工作目录,使用函数
chdir()
,传入修改后的工作路径即可