一、进程相关概念
1.什么是进程
程序:静态的,编译好的可执行文件,存放在磁盘中的指令和数据的集合
进程:动态的,是程序的一次执行过程,是独立的可调度的任务
2.进程的特点
(1)对32位系统,系统会为每个进程分配0~4G的虚拟空间,其中,0~3G(用户空间)是每个进程独有的,3~4G(内核空间)是所有进程共有
进程间通信:通过内核空间
(2) CPU调度进程时会给进程分配时间片(几毫秒~十几毫秒),当时间片用完后,cpu再进行其他进程的调度,实现进程的轮转,从而实现多任务的操作。(没有外界干预的情况下怎么调度进程是CPU随机分配的 )
(3)进程控制块task_struct(了解)
● 进程控制块pcb:包含描述进程的相关信息
● 进程标识PID:唯一的标识一个进程
主要进程标识:
进程号(PID: Process Identity Number)
父进程号:(Parent Process ID: PPID)
● 进程用户
● 进程状态、优先级
● 文件描述符(记录当前进程打开的文件)
3.进程段
Linux中的进程大致包含三个段:
数据段:存放的是全局变量、常数以及动态数据分配的数据空间(如malloc函数取得的空间)等。
正文段:存放的是程序中的代码
堆栈段:存放的是函数的返回地址、函数的参数以及程序中的局部变量 (类比内存的栈区)
4.进程分类
交互进程:该类进程是由shell控制和运行的。交互进程既可以在前台运行,也可以在后台运行。 该类进程经常与用户进行交互,需要等待用户的输入,当接收到用户的输入后,该类 进程会立刻响应,典型的交互式进程有:shell命令进程、文本编辑器等
批处理进程:该类进程不属于某个终端,它被提交到一个队列中以便顺序执行。
5.进程状态
6. 进程状态切换
7.进程相关命令
补充优先级调度
根据进程的优先级进行调度,优先级高的进程先执行。
两种类型:
1. 非剥夺式(非抢占式)优先级调度算法。当一个进程正在处理上运行时,即使有某个更为重要或紧迫的进程进入就绪队列,仍然让正在进行的进程继续运行,直到由于其自身原因而主动让出处理机(任务完成或等待事件),才把处理机分配给更为重要或紧迫的进程。
2. 剥夺式(抢占式)优先级调度算法。当一个进程正在处理机上运行时,若有某个更为重要或紧迫的进程进入就绪队列,则立即暂停正在运行的进程,将处理机分配给更重要或紧迫的进程。
二、进程函数接口
1.创建进程 fork()
#include <sys/types.h>
#include <unistd.h>
/*
功能:创建子进程
返回值: 成功:父进程-->返回子进程进程号
子进程-->返回0
失败:父进程-->返回-1,并设置errno
子进程并未创建
*/
pid_t fork(void);
特点:1)子进程几乎拷贝了父进程的全部内容。包括代码、数据、系统数据段中的pc值、栈中的数据、父进程中打开的文件等;但它们的PID、PPID是不同的。
2)父子进程有独立的地址空间,互不影响;当在相应的进程中改变全局变量、静态变量,都互不影响。
3)若父进程先结束,子进程成为孤儿进程,被init进程收养,子进程变成后台进程。
4)若子进程先结束,父进程如果没有及时回收资源,子进程变成僵尸进程(要避免僵尸进程产生)