进程
6.3 多个进程间的关系
在Linux系统中,通常都有多个进程同时运行。对一个多个进程系统来说,各个不同进程要在同一系统中协调运行,处理好它们之间的关系是必不可少的。
6.3.1 进程组
#include <sys/types.h>
#include <unistd.h>
pid_t getpgrp(void);
此函数用于返回调用它的进程的进程组号。
一个进程组有其生命期,即从该进程组创建至该进程组中最后一个进程离开进程组的时间。
创建一个新的进程组或将一个进程加入一个已存在的进程组,所使用的函数如下:
#include <sys/types.h>
#include <unistd.h>
int setpgid(pid_t pid,pit_t pgid);
当pid与pgid相同时,创建一个新的进程组。当pgid是一个已存在的进程组ID时,将pid代表的进程加入该进程组。
6.3.2 时间片的分配
1.调度策略与参数
#include <sched.h>
int sched_setscheduler(pid_t pid,int policy,const struct sched_param * param); //设置进程调度策略函数, 成功返回0,失败返回-1
int sched_getscheduler(pid_t pid); //获得进程的调度策略, 成功返回一个非负数,失败返回-1
参数pid是所设置的进程的ID。参数policy标示所设置的调度策略,其取值及相应含义如下:
SCHED_OTHER: 默认的调度策略,按通常的方法分配时间片。
SCHED_FIFO: 对应于先进先出的规则,实时分配时间片,可以抢占SCHED_OTHER的进程。使用SCHED_FIFO只能被优先级比它高的进程抢占。
SCHED_RR:轮换规则,实时分配时间片。也可以抢占使用SCHED_OTHER的进程。使用SCHED_RR的进程在需要与其他进程共享时间片时可以被相同优先级的进程抢占,但errno将被设置为相应值。
参数param时sched_param结构指针。此结构用于保存进程的调度参数。
2.优先级设定
系统对不同进程所分配的CPU时间的多少主要由进程的优先级决定。每一个进程都有自己的优先级。静态优先级高的进程回抢占静态优先级低的进程。对静态优先级为0的进程将依照其动态优先级来分配运行时间。优先级的值越小,优先权越高。对进程执行一定的操作可以改变进程动态优先级。
有关的优先级操作的函数如下:
#include <unistd.h>
int nice(int inc);
#include <sys/time.h>
#include <sys/resource.h>
int setpriority(int which,int who, int prio); //函数成功返回0,失败返回-1,并将errno设置为相应值
int getpriority(int which,int who); //函数成功,返回值为所有匹配的进程中优先级最小的值;调用失败时,返回-1,并将errno设置为相应的值
#include <sched.h>
int sched_set_priority_max(int policy);
int sched_set_priority_min(int policy);
函数nice改变进程的动态优先级。inc为正优先级降低,为负优先级升高。但只有超级用户进程调用nice函数时,才可以将inc的值设为负值。调用成功返回0,失败返回-1,并将errno设置为相应值。
函数setpriority和getpriority分别用于设置和获取进程、进程组或用户的动态优先级。参数which用于指定所做操作的对象,其相应关系如下:
which取值 含义
PRIO_PROECSS 设置进程的动态优先级
PRIO_PGRP 设置进程组的动态优先级
PRIO_USER 设置用户的动态优先级
参数who用于指定函数所设置的进程。参数prio用于指定进程优先级,其取值介于-20~20之间。
注意:调用getpriority函数时,其返回值是进程的优先级。而一个进程的优先级可能为-1.因此调用函数getpriority时,如果返回值为-1时,并不能表示函数的调用失败,而需要根据errno值来确定。因此调用getpriority函数前应将errno清除,调用完毕后检测errno的相应设置来确定调用是否成功。
sched_set_priority_max和sched_set_priority_min分别用于获取由参数policy所指定的调度策略下优先级的最大值和最小值。
6.3.3 进程的同步