目录
一.冯诺依曼体系
为什么程序运行会加载到内存
二.进程概念
1.进程控制块PCB
2.进程标识符
使用ps命令
使用pgrep命令
使用系统调用
3.进程状态
孤儿进程
守护进程(精灵进程)
4.进程优先级
三.环境变量
一.冯诺依曼体系
数据在设备之间的传输实质是数据的来回拷贝,拷贝的速度是决定计算机的速度的重要指标
- 距离cpu越近的储存单元效率越快,单体容量越小,造价越贵
- 距离cpu越远的储存单元效率越慢,单体容量越大,造价越便宜
如果输入设备直接和cpu交互,再由cpu到输出设备,就会导致cpu很多时候都在等待数据拷贝进来,处于闲置状态
冯诺依曼体系引入内存,让输入设备的数据加载到内存,由内存到cpu,cpu将数据处理后拷贝回内存,由内存到输出设备,同时内存还能够进行预加载,缓存等增加效率
为什么程序运行会加载到内存
由冯诺依曼体系解释,我们的二进制可执行程序在被执行时是需要cpu去执行里面的指令的,要把该程序从输入设备(磁盘)加载到内存,然后交给cpu处理,再返回到内存,然后根据指令比如这个程序就是向显示器打印,那么输出设备就是显示器
二.进程概念
我们的二进制程序可执行程序被执行时会被加载到内存,而这个可执行程序和操作系统为了管理这个程序的内核数据结构叫做进程,在内核角度上,进程是承担系统分配资源的基本单位
1.进程控制块PCB
PCB是操作系统内核管理进程的一个数据结构,里面包括了进程的各个属性,比如
- 标示符: 描述本进程的唯一标示符,用来区别其他进程
- 状态: 任务状态,退出代码,退出信号等
- 优先级: 相对于其他进程的优先级
- 程序计数器: 程序中即将被执行的下一条指令的地址(pc指针)
- 内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
- 上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]
- I/O状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表
- 记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等
- 其他信息
在Linux下,进程的PCB是task_struct,各个进程互相独立,由内核数据结构统一做管理
进程特性:
- 竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高 效完成任务,更合理竞争相关资源,便具有了优先级
- 独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰
- 并行: 多个进程在多个CPU下分别,同时进行运行,称之为并行
- 并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发
2.进程标识符
在Linux中,进程描述符为PID,通过一下几种方法可以获取进程的PID
-
使用ps命令
比如查看bash进程的pid
ps -axj 查看所有进程 再使用管道给grep命令过滤出bash
-
使用pgrep命令
可以通过进程PID从系统查看大部分进程信息,进程信息存在/ptoc
包括了进程的大部分信息,包括进程的工作目录,可执行程序,状态,优先级,打开的文件描述符等
-
使用系统调用
可在程序中调用获得进程的PID
3.进程状态
我们看到进程信息中有一个状态标识,根据进程的行为决定状态
- R状态:运行状态,表示进程当前要么正在运行要么在运行队列中
- S状态:睡眠状态,表示进程当前意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠)
- D状态:磁盘休眠状态,有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束
- T状态:停止状态,可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行
- Z状态:僵尸状态,进程已经退出但进程的PCB等资源并未被父进程回收,(注意:僵尸进程如果一直不被回收就会导致内存泄漏)
- s状态: 这表明该进程是一个会话的领导进程
- +状态:表面进程在前台运行
孤儿进程
当父进程先于子进程退出,就称这个子进程为孤儿进程
为了回收这个子进程的资源和退出状态,就会将这个子进程交付给init进程(PID:1),init进程会成为这个进程的父进程,负责对该进程的终止和资源清理。
守护进程(精灵进程)
进程组:由多个进程组成,进程组PGID是第一个进程的PID,这些进程通常共享一个终端并能够相互发送信号
会话:是一个或多个进程组的集合,通常由一个登录 shell 创建。它是一种逻辑上的概念,用来管理一组进程的集合,这些进程通常可以共享一些系统资源(如控制终端)
打开一个终端相当于创建了一个会话,当终端被关闭,会话被关闭,会话中的所有进程都将退出,为了能让进程在终端关闭的时候一直运行,就需要将这些进程单独放在一个会话中,不受当前终端的影响,这样的进程就是守护进程(精灵进程),守护进程通常提供系统级服务,如网络服务(HTTP 服务器、FTP 服务器)、数据库服务、打印服务等。
使用系统调用创建守护进程
nochdir:表示是否更改工作目录,如果更改,那么该进程的工作目录会更新为"/"
noclose:表示是否进行输入输出处理,因为后台进程无法访问标准输入输出,如果选择进行处理,那么标准输入,标准输出,标准错误会被重定向到一个指定地方
使用jobs命令查看后台作业
jobs + [fg|bg] [作业号] 放到[前台|后台]
4.进程优先级
PRI :代表这个进程可被执行的优先级,其值越小越早被执行
NI :代表这个进程的nice值,优先级的修正数据
PRI(new)=PRI(old)+nice
在Linux下,调整进程优先级,就是调整nice值,通过nice值修正进程的优先级,进程的nice值不是进程的优先级
修改进程优先级
进入top后按“r”–>输入进程PID–>输入nice值
三.环境变量
环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数
使用env命令查看当前的所有环境变量
常见的环境变量比如
- PATH : 指定命令的搜索路径
- HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)
- SHELL : 当前Shell,它的值通常是/bin/bash
- PWD : 当前目录
- USER : 当前登录的用户名
- LOGNAME : 当前用户的登录名
使用echo $[环境变量名] 查看特定的环境变量
使用export用于将环境变量导入到当前 shell 会话中,并使其在子进程中可用
通过命令行参数得到环境变量
env会以NULL结尾
#include <stdio.h>
int main(int argc, char *argv[], char *env[])
{int i = 0;for(; env[i]; i++){printf("%s\n", env[i]);}return 0;
}
使用系统调用获得环境变量