前言:
进程是linux中非常重要的概念,执行的每一个程序都是进程。因此我们需要了解进程。
1. 冯洛伊曼体系结构
我们常见的计算机以及不常见的计算机大多都遵循冯洛伊曼体系结构。
冯洛伊曼体系结构由五部分组成,分别是输出设备,输入设备,存储器,运算器和控制器组成。
输入设备包括键盘鼠标等。
输出设备包括显示器,投影仪等。
其中输入设备和输出设备并称为外设。
运算器和控制器并称为CPU。
注意:
存储器指的是内存。
CPU只能对内存中的数据进行读写,不能直接获取外设的数据。
外设只能通过存储器进行输入输出数据。
即所有设备都只能直接和内存打交道。
2. 操作系统
操作系统的功能:对下将软硬件资源管理起来,对上提供一个良好(稳定,安全,可靠)的执行环境。
2.1 那如何理解管理呢?
管理的下层的软硬件程序。
通过将各个软硬件用struct进行属性描述,再将其用链表或其他数据结构进行组织。这便是管理。
2.2 系统调用和库函数概念
系统调用的是操作系统给出的部分接口,供上层开发使用,这部分由操作系统提供的接口叫系统调用。其man中的是2号页。
由于系统调用对用户要求较高,并且功能比较基础。因此部分开发者对其进行适度封装。从而形成库,更有利于对上层用户进行二次开发。对应man中的三号页
操作系统对进程的管理很简单,就是先描述进程,再组织进程。
3. 进程
什么是进程呢?
进程是程序的一个执行实例,正在执行的程序等。
3.1 如何描述进程
进程的信息被放在进程控制块里面,是进程属性的集合。
PCB(process control block):进程控制块。linux操作系统下面的pcb是:task_struct
task_struct是linux内核中的一种数据结构,里面包含着进程的信息。
3.1.1 task_struct内容分类
标识符:描述进程的唯一标识符
状态:任务状态等
优先级:相对于其他进程的优先级(renice,nice)
上下文数据:进程的各种数据,如页表等。
3.2 查看进程
可以使用 ls /proc查看进程的信息
也可以使用top或ps等查看进程信息。
eg:ps axj | head -1 &&ps axj |grep a.out
结果:
解释:使用grep筛选出只含test,但是因为grep要再开一个进程,所以还会出现一个含test的结果。因此使用-v排除掉
代码:ps axj | head -1 &&ps axj |grep a.out|grep -v grep
3.2.1 获取pid和ppid
pid即标识符,是区分其他进程的唯一标识。
进程id:pid。通过getpid()得到。
父进程id:ppid。通过getppid()得到。
3.3 fork()函数
fork函数是进程里面一个极其重要的函数,其作用是开辟一个子进程,让子进程执行与父进程不一样的代码。
基础使用:
int ret = fork();
if(ret ==0)
{
............
}
if(ret>0)
{
............
}
if(ret <0)
{
perror("");
}
fork函数有三种返回值,如果返回值是>0的,那么下面执行的就是父进程,如果返回值==0,那么就是子进程。如果<0,那么函数就报错。
3.4 进程状态
什么是正在运行的进程呢?我们需要知道进程的不同状态,在linux内核中,进程有时候也叫任务。
R状态:运行态,进程在运行中,要么在运行队列里
S状态:休眠态,进程在等待其他资源,也叫可中断睡眠
D磁盘休眠状态:也叫补课中断休眠状态,通常出现在进程向磁盘中写入数据的时候。
T状态:停止状态,通过sigstop信号给进程来停止进程,也可以通过sigcont信号让进程继续运行
x状态:死亡状态,即进程结束后的返回状态
z状态:僵尸状态,即进程死亡后没有人将其进行回收,进程就会一直保持该状态,最终导致内存泄漏。
我们还是通过ps等进行进程信息的查看
这里s后面的+表示的是该进程在前台运行。
为什么这个进程在运行,但是状态却显示的s状态呢?
因为CPU的运行速度不是靠人力能想象的,运行的非常快,而且CPU对每个进程会有时间片的概念,即每个进程在CPU上面运行的时间是很短很短的,这样是为了让每个进程在短时间内都能运行上。
3.5 孤儿进程
如果父进程提前退出,那么子进程退出后就会进入z状态,那么这种情况该如何处理呢?
这种情况的子进程称为孤儿进程。此时的子进程需要被1号进程领养,然后进程回收。
3.6 进程优先级
CPU资源分配的先后顺序就是指进程的优先权。
优先权高的进程优先执行。配置进程优先级对于多任务环境的linux很有用,能够有效改善系统性能。
这里面的NI是进程的nice值。
UID指的是执行者身份
pri是进程的优先级:其值越小越早被执行。
nice值加入后,pri(new) =pri(old) + nice;
当nice为负值时,pri减小,优先级变高,越快被执行。
nice的取值范围为-20到19,共40个级别。pri一开始为80。
如何查看优先级呢?
使用top查看进程优先级。
也可以用top更改进程的nice。
进入top后按r,再输入进程pid,再输入nice值,既可以完全对已存在进程的nice值的修改。
3.7 进程间的特性:
竞争性:多个进程争夺同一个CPU资源。
独立性:多进程独享各自资源,多进程运行期间互不干扰
并行:多个进程在多个CPU下分别同时运行
并发:多个进程在同一个CPU下才用进程切换的方式,在一段时间内,让多个进程都得以推进,称为并发。