Linux进程

进程

一、冯诺依曼体系结构

​ 这里的存储器指的是内存,而磁盘、U盘等都是外存;

​ 输入设备和输出设备都是外设,输入设备包括:键盘、摄像头、话筒、磁盘、网卡、鼠标;输出设备包括:显示器、播放器、磁盘、网卡;

​ CPU包括运算器和控制器,分别进行算术逻辑运算和流程控制;

​ 外设和CPU之间使用总线连接起来,进行传输;

​ CPU寄存器是纳秒级别,内存是微秒级别,外设是毫秒级别的;由木桶原理可知,最终的效率是由外设决定的,速度相差太大。而内存可以起到适配速度差的效果,最终表现出来的就是内存的速度;

​ 执行可执行文件的时候,会将磁盘数据预加载到内存中,之后的交互过程实际上是CPU与内存之间的,并行IO过程靠的就是CPU与内存的交互,而CPU的运算过程必须保证是串行的;

冯诺依曼体系结构规定程序运行先载入到内存中,这是由硬件决定的,即软件依赖硬件;

二、操作系统

2.1认识操作系统

​ 操作系统是一款进行软硬件资源管理的软件。

​ 对于软件的运行通常是从上往下贯穿执行的,依次是用户->用户操作接口(shell、库函数)->系统调用->操作系统内核(内存模块、进程模块、文件模块、驱动模块)->驱动程序->硬件;

​ 操作系统的核心工作就是通过对下管理好软硬件资源,对上提供一个良好的使用和操作环境;

​ 系统调用是用c实现的函数,专门用来调用操作系统;由于操作系统不相信用户,防止非法地访问,只是对外提供来系统调用接口;

2.2操作系统管理

​ 先描述再组织,将被管理对象的属性提取出来,然后用某中数据结构将对象存储起来;即用结构体对象来描述不同的对象,这其实就是计算机世界对现实世界的抽象建模;

三、进程的认识

3.1进程

​ 一个正在运行的程序叫做进程。进程之前一定是相互独立的;

shell 复制代码
ps axj
#查看所有进程
top
#查看当前运行的进程
kill -9 pid
#杀死pid进程
kill -l
#查看所有信号

​ 操作系统将进程对象管理起来,使用结构体对象PCB(进程控制块)描述,然后使用双向链表进行组织;

​ Linux中的结构体对象是task_struct,存放着当前进程的属性,包括标识符如pid,状态,优先级,程序计数器用来恢复进程上下文,内存指针找代码和数据,记账信息:记录调度时间;

​ /proc目录下存放着进程的信息,通过pid来查找相应的目录,exe指的是当前程序所在的目录,cwd指的是当前工作目录。每一个命令行都是是一个bash进程;

shell 复制代码
getpid()#获取当前进程pid
getppid()#获取父进程pid
fork()#创建子进程

​ 子进程和父进程如果看到的是同一份资源,为了保证进程的独立性,其中进行写入的一方要进行写时拷贝;

3.2进程状态

3.2.1一般进程状态

​ 一般的操作系统进程状态分为运行、阻塞、挂起;

​ 运行队列的进程处于运行态,随时可以被调度器进行调度;为防止一个进程长时间占有CPU时间,导致其他进程饥饿,使用了时间片进行管理,即时间片时间一到,就切换进程;

​ 由于需要硬件响应,进程会从运行队列移动到等待队列,等待响应,此时进程处于阻塞状态;

​ 当内存资源严重不足时,会将等待队列的阻塞态进程等较为闲置的进程换出到磁盘,缓解内存压力,等到压力减小时再换回,此时换到磁盘的进程叫做挂起态;

3.2.2Linux进程状态
shell 复制代码
dd
#模仿高IO像磁盘写入
exit(0)
#进程终止,退出码为0

​ R:运行状态,R+表示的是前台运行;

​ S:浅阻塞状态,等待响应;

​ D:深度睡眠状态,该进程一般是处于磁盘读写时,不会接收任何请求,直至读写完成;

​ T:暂停状态,18(继续信号)/19(暂停信号)控制;

​ t:暂停状态,gdb调试时断点暂停;

​ X:死亡状态,终止;

​ Z:僵尸状态,等待父进程回收,在此期间内不可以被杀死,最终会导致内存泄露;

​ 如果父进程被回收了,那么子进程就变成了孤儿进程,会被操作系统领养释放;

3.3进程优先级

​ 进程根据优先级的不同,会优先被调度器进行调度;

shell 复制代码
ps -l#查看当前终端的优先级
ps -al#查看所有优先级

​ 新的优先级=旧的优先级+nice值,PRI:优先级,NI:nice值。nice值范围-20,19;不能随意修改优先级;

​ 更改优先级的本质就是修改nice值

shell 复制代码
nice -n nice值 命令
renice -n nice值 pid 
进入top后按"r"-->输入进程PID-->输入nice值

3.4进程调度

​ Linux O(1)调度算法

​ 操作系统根据优先级进行调度,O(1)调度算法以空间换时间,使用位图管理队列数组,有两个队列数组,分别是run和wait队列数组,数组大小为140个队列,队列数组安数组下标,优先级逐渐降低。同一个优先级维护在一个队列,通过实现了两个数组的指针实现两个数组的轮换。通过位图是否为零,来判断队列是否为空。时间片运行时间结束,将进程连接到等待队列,使用CR3和eip寄存器来恢复上下文;

3.5环境变量和命令行参数

3.5.1环境变量

​ 环境变量表存放在系统的配置文件中,根据环境变量实现一些默认动作如:指令的默认查找路径,白名单添加;环境变量是系统提供的一组kv变量,不同的用户使用不同的环境变量

常见的环境变量:

​ PATH,记录着取那些路径下查找指令,修改使用PATH=$PATH:增加内容;

shell 复制代码
env
#查看环境变量
getenv("PATH")
#获取环境变量
3.5.2命令行参数

​ 命令行参数,int argc,char* argv\[\];用来实现指令带选项,实现不同的功能;

​ 命令行参数以空格为分隔符,argc指的是字符串数量,argv是字符串表;

​ 最终形成了两个向量表,一个命令行参数表,一个环境变量表,都以NULL结尾;

3.5.3设置环境变量
shell 复制代码
$myvalue=123
#定义本地变量
export myvalue
#将本地变量导出环境变量
unset myvalue
#取消环境变量
set
#查看所有变量(环境变量与本地变量)
3.5.4内建命令

​ 命令分为常规命令(由bash的子进程完成)和内建命令(由bash亲自完成)

shell 复制代码
chdir()
#修改进程当前工作目录
extern char**environ
#第三方变量指向环境变量表
相关推荐
大树8821 小时前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠21 小时前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质21 小时前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush421 小时前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5201 天前
Linux 11 动态监控指令top
linux
小宇宙Zz1 天前
Maven依赖冲突
java·服务器·maven
Inhand陈工1 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智1 天前
ARP代理--工作原理
运维·网络·arp·arp代理
不会C语言的男孩1 天前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言
shushangyun_1 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化