*nix Documentation Project
·  Home
 +   man pages
·  Linux HOWTOs
·  FreeBSD Tips
·  *niX Forums

  man pages->Tru64 Unix man pages -> priocntl (2)              
Title
Content
Arch
Section
 

priocntl(2)

Contents


NAME    [Toc]    [Back]

       priocntl - manage scheduling properties of process

SYNOPSIS    [Toc]    [Back]

       #include  <sys/types.h> #include <sys/priocntl.h> #include
       <sys/rtpriocntl.h> #include <sys/tspriocntl.h>

       long priocntl(
               idtype_t idtype,
               id_t id,
               int cmd,
               void *arg );

PARAMETERS    [Toc]    [Back]

       Identifies the type of process to be affected.  It is used
       with  the  id parameter to specify the process or group of
       processes that will change.   Specifies  the  process  ID,
       parent process ID, process group ID, session ID, class ID,
       user ID, or group ID of a process or group  of  processes.
       It  is  used with the idtype parameter.  Specifies the how
       the process or group of processes are affected.  Specifies
       a pointer to a structure.

DESCRIPTION    [Toc]    [Back]

       The  priocntl function is used to change the class, priority,
 and other scheduling properties of one or more active
       processes.  Processes are divided into four classes: realtime,
 time-sharing, POSIX round robin, and the POSIX  fifo
       class.   Although  the  class  and attributes of a process
       within a class  can  change,  each  class  has  predefined
       scheduling properties that cannot change.

       To identify a process or set of processes that you want to
       change, you must specify the  id  and  idtype  parameters.
       The  cmd  parameter defines how the process or set of processes
 is to be affected. Depending on which cmd parameter
       you  select, the data type and value for the arg parameter
       differs.

       This discussion of the priocntl function is  divided  into
       the following sections: Process Selection Command Descriptions
 Command Arguments Scheduling  and  Priority  Classes
       Include Files

       The  RESTRICTIONS section additionally describes instances
       in which a class or process may not change.

   Process Selection    [Toc]    [Back]
       Using the idtype and id  parameters,  you  can  specify  a
       group or group of processes that are to be affected by the
       priocntl function.  The definition of the id parameter  is
       determined  by  the  value of the idtype parameter as follows:










       -------------------------------------------------------
       idtype   id
       -------------------------------------------------------
       P_PID    Defines id as a process ID.  A single process
                with this process ID is targeted.
       P_PPID   Defines  id as a parent process ID.  All processes
 with this specific parent  process  ID
                are targeted.
       P_PGID   Defines  id  as a process group ID.  All processes
 with this specific  process  group  ID
                are targeted.
       P_SID    Defines  id  as  a session ID.  All processes
                within the specified session are targeted.
       P_CID    Defines id as  a  class  ID.   All  processes
                within the specified class are targeted.
       P_UID    Defines  id  as  a  user  ID.   All processes
                within the effective user ID are targeted.
       P_GID    Defines id as  a  group  ID.   All  processes
                within the effective group ID are targeted.
       P_ALL    The  value  of  id  is ignored.  All existing
                processes are targeted for change.   See  the
                RESTRICTIONS section for exceptions.
       -------------------------------------------------------

       The  id parameter can also specify the value P_MYID which,
       when used with the idtype parameter, specifies the calling
       process's process ID, parent process ID, process group ID,
       session ID, class ID, user ID, or group ID.

   Command Descriptions    [Toc]    [Back]
       The five commands  currently  supported  by  the  priocntl
       function  are as follows: Retrieves the class ID and class
       attributes for a specific class given the class name.  The
       idtype  and  id arguments are ignored. If the value of the
       arg parameter is non-null, the class ID and attribute data
       are  returned in a pcinfo_t structure that is discussed in
       the next subsection.  If the value of the arg parameter is
       null,  attribute  data  is  not returned, but the priocntl
       function does return the  configured  number  of  classes.
       Retrieves  the  class name and class attributes for a specific
 class given the class ID.  The idtype and  id  arguments
  are  ignored.  If the value of the arg is non-null,
       the class  name  and  attribute  data  is  returned  in  a
       pcinfo_t  structure  that is discussed in the next subsection.
   If  the  value  of  the  arg  parameter  is  null,
       attribute  data is not returned, but the priocntl function
       returns the configured number of  classes  (including  the
       sys  class).  Sets the class and class-specific scheduling
       parameters of the process or processes specified by the id
       and idtype parameters. The arg parameter is a pointer to a
       pcparms_t structure that is discussed in the next  subsection.
    Retrieves  either  the  class  or  class-specific
       scheduling parameters of a process or both.   The  process
       type  is  specified  by the id and idtype parameters.  The
       arg parameter points to a pcparms_t structure that is discussed
  in  the  next  subsection.  Specified for use by a
       specific command and is not intended for  general  use  by
       any other application.









   Command Arguments    [Toc]    [Back]
       The  data  type and value of the arg parameter is specific
       to the type of command specified  by  the  cmd  parameter.
       This section highlights the value for the arg parameter as
       it pertains to the commands.

       For both the PC_GETCID and PC_GETCLINFO commands, the  arg
       parameter if not null, points to the following structure:

       typedef struct {
             id_t  pc_cid;
             char  pc_clname[PC_CLNMSZ];
             long  pc_clinfo[PC_CLINFOSZ]; } pcinfo_t;

       For  the PC_GETCID command, the pc_cid field specifies the
       class ID on return. The pc_clname field specifies the name
       of  the  class  whose  attributes you are retrieving.  The
       pc_clinfo field specifies the class attributes on  return.
       The  format  of  the  attribute  data  that is returned is
       defined by the  <sys/rtpriocntl.h>  or  the  <sys/tspriocntl.h>
 header files.

       For  the  PC_GETCINFO  command, the pc_cid field specifies
       the class  ID  of  the  class  whose  attributes  you  are
       retrieving.   The pc_clname field specifies the class name
       on  return.   The  pc_clinfo  field  specifies  the  class
       attributes  on  return.  The  format of the attribute data
       that is returned is defined by the  <sys/rtpriocntl.h>  or
       the <sys/tspriocntl.h> header files.

       For  both the PC_SETPARMS and PC_GETPARMS command, the arg
       parameter points to the following structure:

       typedef struct {
             id_t  pc_cid;
             char  pc_clparms[PC_CLPARMSZ]; } pcparms_t;

       For PC_SETPARMS, the pc_cid field specifies the  class  ID
       that  you  want  to set. The pc_clparms field contains the
       class  specific   parameters   you   are   setting.    The
       PC_CLPARMSZ  argument  specifies  the length of pc_clparms
       field and is defined in <sys/priocntl.h>.  The  format  of
       the  class  specific  data is defined by the <sys/rtpriocntl.h>
 or <sys/tspriocntl.h> header file.   These  formats
       are  discussed  in more detail under the discussion of the
       available classes.

       For the PC_GETPARMS command, the  pc_cid  field  specifies
       the class ID.  This is the class ID returned by the priocntl
 PC_GETCID request. The special class ID PC_CLNULL  may
       also  be  assigned to the pc_cid parameter. The pc_pcparms
       field specifies the buffer that  contains  the  class-specific
  scheduling  parameters.   The  PC_CLPARMSZ argument
       specifies the length of pc_clparms buffer and  is  defined
       in  <sys/priocntl.h>.   The  format  of the class specific
       data is defined by the <sys/rtpriocntl.h> or <sys/tspriocntl.h>
  header  file.  These formats are discussed in more
       detail under the discussion of the available classes.

       For  the  PC_GETPARMS  command,  the   contents   of   the
       pc_clparms  field  is  determined  by  the contents of the
       pc_cid field as follows: If the pc_cid field  specifies  a
       configured  class  and  the  process  that belongs to that
       class was specified by the idtype and the id parameters or
       by  the  procset  structure, the pc_clparms field contains
       the scheduling parameters of that process. If the  process
       does not exist or the process does not belong to the specified
 class, the priocntl function returns  the  value  -1
       with  errno set to [ESRCH].  If the pc_cid field specifies
       a configured class and a set of  processes  is  specified,
       only the scheduling parameters of one process belonging to
       the specified class is returned in this field.  The priocntl
  function  returns the process ID of the selected process.
  In this instance, selecting a process to return  is
       class-dependent.  If the specified process does not exist,
       or if none of  the  processes  belongs  to  the  specified
       class,  the  priocntl  function  returns the value -1 with
       errno set  to  [ESRCH].   If  the  pc_cid  field  contains
       PC_CLNULL  and a single process is specified, the class of
       the specified process is returned in the pc_cid field  and
       its  scheduling  parameters are returned in the pc_clparms
       field.  If this special class ID and a single  process  is
       specified,  the class of the specified process is returned
       in the pc_cid field  and  the  scheduling  parameters  are
       returned in the pc_clparms field.

   Scheduling and Priority Classes    [Toc]    [Back]
       There  are  four types of classifications that can be used
       when managing the scheduling priorities of  a  process  or
       set  of  processes. These classes are the real-time, timesharing,
 POSIX round-robin, and  the  POSIX  fifo  classes
       discussed in the next sections.

   Real-time Class    [Toc]    [Back]
       Processes that require quick response and complete control
       of its scheduling priorities through the user or  application
  are  placed in this class.  The real-time class provides
 a fixed scheduling policy that can only  be  changed
       by  an  explicit  request from either the user or application.
  If this class is configured on the system, any running
  real-time  process should obtain the services of the
       CPU before a process that belongs to another class.

       To distinguish the priority of processes within the  realtime
  class,  all processes are assigned a priority value.
       A priority value can range from zero (0) to x, where x  is
       a  configurable value that can be specified for a specific
       installation using the PC_GETCID or PC_GETCLINFO commands.
       The  higher the numerical priority value of a process, the
       higher its priority on the system.

       Each priority value that is configured into the system has
       a  separate  scheduling  queue  that  the system's process
       scheduler manages. Processes with the same priority  value
       share  the  same  scheduling queue. All processes within a
       queue are placed in First-In-First-Out (FIFO) order.

       The priocntl function not only controls priority, it  also
       controls the time quantum that is allotted to a process in
       the real-time class.  The time  quantum  value  determines
       the  maximum  time  that  a  running process which has not
       entered a resource or event wait state  (sleep)  may  run.
       Note  that  regardless  of  the time quantum specified, if
       another process at a higher priority makes  a  request  to
       run,  a  running process may be preempted before receiving
       its full time quantum.  A process that is preempted  by  a
       higher priority process remains first its scheduling queue
       with the remainder of its  specified  time  quantum  still
       available.

       Note  that  after  a  fork system call by a real-time time
       process, the parent process continues  to  run  while  the
       child  process  inherits  the priority value of the parent
       and is placed at the back of the queue.

       The structures used by the real time class to  define  the
       scheduling  priorities  and  class attributes of a process
       are discussed in the section on Include Files.

       To change the class of a process to  real-time  (from  any
       other  class)  the  process invoking the priocntl function
       must have superuser privileges.  In order  to  change  the
       priority  or  time  quantum setting of a real-time process
       the process invoking the priocntl function must have superuser
  privileges  or  must  itself be a real-time process
       whose real or effective user ID matches the real of effective
 user ID of the target process.

       The real-time priority and time quantum are inherited

   Time-Sharing Class    [Toc]    [Back]
       Processes  that  vary  in CPU consumption, but which still
       require a reasonable  response  time  with  some  user  or
       application  control  over  scheduling should be placed in
       this class.  To  determine  the  scheduling  of  processes
       within  the  time-sharing  class, a user priority value is
       assigned to a process.  This value may range  from  -x  to
       +x, where the value of x is configurable and may be determined
 for a specific  installation  using  the  PC_CID  or
       PC_GETCLINFO commands.

       Typically,  a  process  with  a  higher user priority runs
       before a process with a lower user priority allowing  some
       control  over  the  scheduling of processes in this class.
       However, other factors also affect the priority of a  process
 in this class such as the amount of CPU usage already
       expended by a process.  There is also a per  process  user
       priority limit that can be set for a given process.

       The  structures  used  by the time sharing class to define
       the scheduling priorities and class attributes of  a  process
 are discussed in the section on Include Files.

   POSIX Round Robin Class    [Toc]    [Back]
       This  class  is  the  same  as  the real-time class when a
       finite time quantum is specified.  The  POSIX  round-robin
       class  uses  the same structures as the real-time class to
       define the scheduling priorities and attributes of a  process.


       To  set  or  request the scheduling parameters for a POSIX
       round robin class, only one process can be  selected.   If
       more than one process is selected, all POSIX processes are
       ignored.  This is true even when all of the  processes  in
       the specified set belong to the POSIX round-robin scheduling
 class.

       The priority value for a processes in this class  has  the
       range  -20  to  20.  The time quantum must be a valid time
       quantum value and not a reserved value as discussed in the
       Include Files section.







   POSIX Fifo Class    [Toc]    [Back]
       This  class  is  the  same  as the real-time class when an
       infinite time quantum is specified.  The POSIX fifo  class
       uses  the same structures as the real-time class to define
       the scheduling priorities and attributes of a process.

       To set or request the scheduling parameters  for  a  POSIX
       fifo  class,  only  one  process can be selected.  If more
       than one process is  selected,  all  POSIX  processes  are
       ignored.  This  is  true even when all of the processes in
       the specified set belong  to  the  POSIX  fifo  scheduling
       class.

       The  priority  value specified for processes has the range
       -20, 20. There are restrictions set on the  usage  of  the
       time  quantum field as discussed in the Include Files section.


   Include Files    [Toc]    [Back]
       The real-time, POSIX round robin, and POSIX  fifo  classes
       use structures defined in <sys/rtpriocntl.h> to define the
       format and class specific priorities of  a  process.   The
       time   sharing   class  uses  the  structures  defined  in
       <sys/tspriocntl.h> to define the format and class specific
       priorities of a process.

       These structures are defined in the next two sections.

   The rtpriocntl.h Header File    [Toc]    [Back]
       The  PC_GETCID  and PC_GETCLINFO commands return real time
       class attributes in the pc_clinfo buffer in using the following
 format:

       typedef struct {

       short  rt_maxpri;  /*  Maximum  real-time  priority  */  }
       rtinfo_t;

       The rt_maxpri field specifies the configured maximum  priority
  value  (rt_pri) for the real time class.  For example,
 if rt_maxpri is x, the  valid  real  time  priorities
       range from zero (0) to x).

       If you use the PC_SETPARMS or PC_GETPARMS commands and the
       pc_cid buffer specifies the real-time class, the  data  in
       the pc_clparms buffer is in the following format:

       typedef struct {
          short rt_pri;    /* Real-Time priority */
          ulong rt_tqsecs; /* Seconds in time quantum */
          long   rt_tqnsecs;/*  Additional nanoseconds in quantum
       */ } rtparms_t;

       Used, depending on the command specified,  to  either  set
       the  real  time  priority value or to get the current real
       time priority value.

              If the real time priority value  of  a  running  or
              runnable process is set, this causes the process to
              be placed at the back of the scheduling  queue  for
              the  specified  priority regardless of the previous
              priority value setting.  Note that a  running  process
  can release the CPU and return to the back of
              the scheduling  queue  by  resetting  its  priority
              value to its current real time priority value.

              When  getting  the real time priority value, if the
              pc_cid field specifies the real time class and more
              than  one  real  time  process  is  specified,  the
              scheduling parameters of the real time process with
              the  highest  priority value of the set is returned
              adn the process ID of this process is  returned  by
              the  priocntl  function.   If more than one process
              shares the highest priority, the  one  returned  is
              implementation-dependent

              Note that you can change the time quantum of a process
 without setting the priority or affecting  the
              process's  position on the queue. In this instance,
              the rt_pri field should  be  set  to  the  reserved
              value  RT_NOCHANGE  defined below.  Specifying this
              value RT_NOCHANGE when changing the class of a process
  to real-time from some other class results in
              the real time priority being set  to  zero.   Used,
              depending  on  the command specified, to set or get
              the time quantum associated with a process or group
              of processes.

              The rt_tqsecs field specifies the number of seconds
              in the time quantum.  Used, depending on  the  command
  specified,  to  set  or  get the time quantum
              associated with a process or group of processes.

              The rt_tqnsecs field specifies the number of  additional
  nanoseconds  in  the  quantum. Specifying a
              value that exceeds 999,999,999  in  the  rt_tqnsecs
              field  results  in  an  error.  For rt_tqnsecs, the
              specified time quantum length is rounded up by  the
              system  to the next integral multiple of the system
              clock's resolution.

              The maximum time quantum that can be  specified  is
              implementation-specific and equal to LONG_MAX ticks
              which is defined in <sys/time>.  Requesting a  time
              quantum  greater than the maximum results in error.
              Requesting a time quantum of zero by  setting  both
              rt_tqsecs  and  rt_tqnsecs  to  zero  results in an
              error.

              The rt_tqnsecs field can also be set to one of  the
              following reserved values (defined in <sys/rtpriocntl.h>).
 If  one  of  these  values  is  specified,
              rt_tqsecs  is  ignored.  Note that these values may
              not be used if your process or process  is  in  the
              POSIX  round  robin  class:  Sets  an infinite time
              quantum.  This must be used if  you  have  selected
              the POSIX fifo class for your process or processes.
              Sets the time quantum to the default for this  priority.
   Does  not  set  a time quantum. Specifying
              this value when changing the class of a process  to
              real  time  from  some other class is equivalent to
              specifying RT_TQDEF.

   Setup of Structures in tspriocntl.h    [Toc]    [Back]
       The PC_GETCID and PC_GETCLINFO commands return  time-sharing
  class  attributes in the pc_clinfo buffer in the following
 format:

       typedef struct {
         short ts_maxupri;  /* Limits of user priority range */ }
       tsinfo_t;

       The ts_maxupri field specifies the configured maximum user
       priority value for the time-sharing class.  If the ts_maxupri
  field  is 2x1, the valid range for both user priorities
 and user priority limits is from -x to +x.

       If you use the PC_SETPARMS or PC_GETPARMS commands and the
       pc_cid  buffer  specifies the time sharing class, the data
       in the pc_clparms buffer is in the following format:

       typedef struct {
         short ts_uprilim;  /* Time-Sharing user  priority  limit
       */
         short  ts_upri;      /*  Time-Sharing user priority */ }
       tsparms_t;

       Specifies the maximum user priority limit for a process or
       set of processes.

              All  time  sharing  processes  can  lower  its  own
              ts_uprilim value (or that of another  process  with
              the same user ID). Only a time-sharing process with
              superuser privileges can increase this value.

              If changing the class of  a  process  to  the  time
              sharing  class  from  some  other  class, superuser
              privileges  are  required  to   set   the   initial
              ts_uprilim  to  a  value  greater  than  zero  (0).
              Attempts by a  nonprivileged  process  to  increase
              this  value or to set an initial value greater than
              zero (0) results in an error.  Specifies  the  user
              priority limit of a process or set of processes.

              If used with the PC_GETPARMS command and the pc_cid
              field specifies the  time-sharing  class  and  more
              than  one  time-sharing  process  is specified, the
              scheduling parameters of the  time-sharing  process
              with  the highest ts_upri value among the specified
              processes is returned and the process  ID  of  this
              process  is  returned by the priocntl function.  If
              there is more than one process sharing the  highest
              user  priority, the one returned is implementationdependent.


              Any time sharing process can set  its  own  ts_upri
              value  (or  that  of  another process with the same
              user ID) to any value less than  or  equal  to  the
              process's  ts_uprilim  value.   Attempts to set the
              ts_upri  above  the  ts_uprilim  (and/or  set   the
              ts_uprilim  value  below the ts_upri) value results
              in  the  ts_upri  value  being  set  equal  to  the
              ts_uprilim value.

       Note   that  a  reserved  value,  TS_NOCHANGE  defined  in
       <sys/tspriocntl.h>)  can  be  used  to  set   either   the
       ts_uprilim  or  ts_upri value without affecting the other.
       Specifying TS_NOCHANGE for  the  ts_upri  value  when  the
       ts_uprilim  value  is  set below the current ts_upri value
       causes the ts_upri value to be set equal to the ts_uprilim
       value that is being set.

       Specifying  TS_NOCHANGE  for a parameter when changing the
       class of a process to time-sharing (from some other class)
       causes  the  parameter  to  be set to a default value. The
       default value of  the  ts_uprilim  is  zero  (0)  and  the
       default  for  ts_upri is to set it equal to the ts_uprilim
       which is being set.

       The time-sharing user priority and user priority limit are
       inherited across the fork and exec functions.

NOTES    [Toc]    [Back]

       The  following notes also apply: If a process which is not
       running in  a  scheduling  class  recognized  by  priocntl
       attempts  to  use P_CID with P_MYID, a -1 will be returned
       with errno set to [EINVAL].  The priocntl function  cannot
       be  used in multithreaded applications.  Attempts to do so
       result in failure.

RESTRICTIONS    [Toc]    [Back]

       Some restrictions exist when changing the class or priorities
  of  a  process or group of processes as follows: The
       sys scheduling class is a special purpose category that is
       used solely to manage the scheduling priorities of special
       system processes such as the swapper.  The class of a process
 that belongs to the sys class cannot be changed (with
       the exception of the init process).   Attempts  to  change
       the  class or priorities of a process in the sys class are
       ignored by the priocntl function.

              The class or scheduling properties of the init process
  (Process  ID  1)  can be changed if it is the
              only process identified by the id and idtype  arguments.
   Although it can be placed in any class, it
              is most suited  in  the  time-sharing  class.   The
              default  configuration  enables an executable realtime
  process  to  run  before   other   processes.
              Adverse system performance may occur if you are not
              careful when specifying changes to  real-time  processes.

RETURN VALUE    [Toc]    [Back]

       Unless otherwise noted above, the priocntl returns a value
       of zero (0) on success.  Upon failure, the priocntl  function
 returns -1 and sets errno to indicate the error.

ERRORS    [Toc]    [Back]

       The  priocntl  function  fails  under the following conditions:
 The calling process does not have the required permissions
   as  explained  above.   The  argument  cmd  was
       invalid, an invalid or unconfigured class  was  specified,
       or  one  of  the  parameters  specified  was invalid.  The
       requested time quantum is out of range.  None of the specified
 processes exist.  All or part of the area pointed to
       by one of the  data  pointers  is  outside  the  process's
       address  space.   An attempt to change the class of a process
 failed because of insufficient memory.  An attempt to
       change  the  class of a process failed because of insufficient
 resources other than memory (for example, class-specific
 kernel data structures).

SEE ALSO    [Toc]    [Back]

      
      
       Functions:  exec(2),   fork(2),   getpriority(2),   priocntlset(2), setpriority(2)

       Routines:  nice(3)



                                                      priocntl(2)
[ Back ]
 Similar pages
Name OS Title
sched_setscheduler Tru64 Sets the scheduling policy and scheduling parameters of the specified process (P1003.1b)
nsg_attach_pid Tru64 Attaches a process to, or detaches a process from a NUMA Scheduling Group (libnuma library)
nsg_detach_pid Tru64 Attaches a process to, or detaches a process from a NUMA Scheduling Group (libnuma library)
pthread_attr_setschedpolicy IRIX manage scheduling policy attributes
pthread_attr_setschedparam IRIX manage thread scheduling priority attributes
getpriority Tru64 Get or set process scheduling priority
sched_getparam IRIX get the scheduling parameters of a process
sched_getscheduler IRIX get the scheduling policy of a process
setpriority Tru64 Get or set process scheduling priority
sched_setscheduler IRIX set the scheduling policy of a process
Copyright © 2004-2005 DeniX Solutions SRL
newsletter delivery service