欢迎进入Linux社区论坛,与200万技术人员互动交流 >>进入
7.3 多个进程间的关系
7.3.1 进程组
所谓进程组,就是一个或多个进程的集合。作为一个进程组,里面的每一个进程都有统一的进程标识。在Linux系统中,可以通过getpgrp()函数获取进程组ID,该函数原型为:
#include<sys/types.h>
#include<unistd.h>
pid_t getpgrp(void)
调用该函数可以返回调用该函数的进程所在的进程组ID.在进程组中有一个特殊的进程,该进程ID与进程组的ID相同。
每一个进程都有其生命期,从创建进程到进程终止,这是一个进程的生命期,而进程组的生命期是从该进程组的创建到最后一个进程终止。在Linux系统中,可以使用setpgid()函数创建一个新的进程组,或者将一个进程加入到一个进程组中,该函数的原型为:
#include<sys/types.h>
#include<unistd.h>
int setgpid(pid_t,pid_t pgid)
当该函数setpgid()调用成功时,返回值为0;当调用失败时,返回值为-1.
7.3.2 时间片分配
在操作系统中,多个进程看似是同时运行的,实质上十多个进程之间不断地切换,每个进程运行一段时间,然后切换到下一个进程执行一段时间,这个所谓的”一段时间”就是一个时间片。多个进程之间进行切换,需要很好地调度策略。
1)时间片轮转调度策略
2)有钱选调度策略(抢占式和非抢占式)
在Linux系统中,提供了几个函数,用于设置和获取进程的调度策略等信息。在设置进程的调度策略时,可以通过参数pid确定需要设置的进程,通过参数policy设置调度策略,然后通过参数param保存进程的调度参数。
#include<sched.h>
int sched_setscheduler(pid_t pid, int policy, const struct sched_param *param)
int sched_getscheduler(pid_t pid)
关于优先级调度策略,在Linux系统中也提供了一些关于优先级的操作函数,如nice()函数用于改变进程的动态优先级;setpriority和getpriority()函数用于设置和获取进程的动态优先级。
7.4 线程
7.4.1 线程概述
线程,又称轻量进程,代表一个进程中某个单一顺序的控制流。线程是进程中的一个实体,是被系统独立调度和分配的基本单位。
一个进程的若干个线程是共享进程中所拥有的全部资源的,每个线程本身不拥有系统资源,只拥有少量的必备资源,如程序计数器、寄存器、栈等。
在Linux多处理器系统中,不同线程可以同时运行在不同的CPU上,一个线程可以创建和终止另外一个线程,一个进程中的多个线程可以并发执行。
7.4.2 线程的属性
在Linux系统中,每一个线程都拥有一个自身的属性,用于代表该线程的特性,而一个进程中的多个线程也有其共同的属性。
1)摧毁与初始化线程属性对象
当使用一个现成的属性对象前,需要首先初始化该对象,然后才可以对现成的属性进行设置和修改。初始化线程属性的函数原型为:
#include<pthread.h>
int pthread_attr_init(pthread_attr_t *attr)
若该函数调用成功,返回值为0;若调用失败,则返回非0值。
pthread_attr_init()函数必须在创建贤臣函数之前调用,可以使用函数中参数attr的属性来初始化线程属性的对象。
pthread_attr_destory()函数的功能是摧毁attr所指向的线程属性对象。销毁的attr属性对象可以使用上述初始化函数重新初始化,该摧毁属性对象的函数原型为:
#include<pthread.h>
int pthread_attr_destory(pthread_attr_t *attr)
参数attr是pthread_attr_t结构体类型。该结构体类型中定义的attr参数的属性如下:
typedef struct
{
int __detachstate; /*线程的分离状态*/
int __schedpolicy; /*线程调度策略*/
struct sched_param_schedparam; /*现成的调度参数*/
int __inheritsched; /*线程的继承性*/
int __scope; /*现成的作用域*/
size_t __guardsize;
int __stackaddr_set;
void *__stackaddr; /*线程堆栈位置*/
unsigned long int __stacksize; /*线程对线大小*/
}pthread_attr_t;
在pthread_attr_t结构体类型中定义了上述线程属性,这些属性的意义如下:
①detachstate 若表示线程的可连接状态,可以取值为PTHREAD_CRETE_JOINABLE;若表示现成的分离状态,可以取值为PTHREAD_CREATE_DETACHED
②schedpolicy:该变量表示现成的调度策略,当取值为SCHED_OTHER时,属性表示普通,非实时的调度策略;若取值为SCHED_RR,属性表示实时、轮转的调度策略;当取值为SCHED_FIFO时,属性表示实时、先进先出的调度策略。
③schedparam:该比阿娘代表现成的调度参数,改制由线程的调度策略决定。
④inheritsched:表示线程的继承性。当取值为PTHEAD_EXPLICIT_SCHED时,表明从父进程处继承调度属性;当取值为PTHEAD_INHERIT_SCHED时,表明从父进程继承。
⑤scope:该变量表示线程的作用域,当取值为PTHREAD_SCOPE_SYSTEM时,表明每个线程占用一个系统时间片。
2)设置与获取线程的分离状态
#include<pthread.h>
int pthread_attr_setdetachstate(pthread_attr_t* attr, int detachstate)
int pthread_attr_getdetachstate(pthread_attr_t* attr, int detachstate)
3)设置与获取线程属性对象的调度策略
#include<pthread.h>
int pthread_attr_setschedpolicy(pthread_attr_t* attr, int policy)
int pthread_attr_getschedpolicy(pthread_attr_t* attr, int policy)
[1][2][3]
也会有想更换的念头。旅行,正好提供了这样一个机会,