菜鸟看世界之Linux C学习笔记

欢迎进入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]

也会有想更换的念头。旅行,正好提供了这样一个机会,

菜鸟看世界之Linux C学习笔记

相关文章:

你感兴趣的文章:

标签云: