当系统中有多个进程到时候,哪个进程先执行,哪个进程后执行是由进程的优先级决定的。进程的优先级是由nice值决定的、nice值越小,优先级越高。可以看做越友好那么调度优先级越低。进程可以通过nice函数获取更改它的nice值,进程只能影响自己的nice值,不能影响其他进程的nice值

#include <unistd.h>

int nice(int incr)

incr参数被增加到调用进程的nice值上,如果nice值太大,系统直接将它降到最大合法值。

可以通过nice命令来查看系统的默认nice值。一般都是为0

root@zhf-maple:/home/zhf/桌面# nice

0

使用ps -l也可以查看当前进程的nice值。NI就是nice值

root@zhf-maple:/home/zhf/桌面# ps -l

F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD

4 S     0  6678  6668  0  80   0 - 15612 wait   pts/0    00:00:00 su

4 S     0  6679  6678  0  80   0 -  5850 wait   pts/0    00:00:00 bash

4 R     0  6900  6679  0  80   0 -  8809 -      pts/0    00:00:00 p

下面的这个程序我们通过改变2个并行运行进程的nice值,运行程序10秒,期间对各个进程进行计数。最后统计进程的计数值

unsigned long long count;  #设置全局变量进行进程的计数

struct timeval end;

#checktime判断进程的运行时间

void checktime(char *str){

struct timeval tv;

gettimeofday(&tv,NULL);

if (tv.tv_sec >  end.tv_sec && tv.tv_sec >= end.tv_usec){

printf("%s count =%lld\n",str,count);

exit(0);

}

}

void schedule_try(){

pid_t pid;

char *s;

int adj=0;

int ret;

int nzero=20;

gettimeofday(&end,NULL);

end.tv_sec+=10;

if((pid=fork()) == 0){

s="child";

printf("current nice value in child is %d,adjusting by %d\n",nice(0)+nzero,adj);

ret=nice(adj);

printf("now child nice value is %d\n",ret+nzero);

}

else{

s="parent";

printf("current nice value in parent is %d\n",nice(0)+nzero);

}

for(;;){

if (++count == 0)

printf("error occured");

checktime(s);

}

}

首先设置adj也就是nice值的调整量为0.此时父子进程的nice值都为20.

运行结果如下:可以看到由于父子进程的nice都为20.因此在10秒内父子进程的计算基本上差不多。可以认为父子进程占用了相同的CPU资源。

除了nice函数,我们还可以通过getpriority/setpriority函数来获取和设置进程的优先级

#include <sys/resource.h>

int getpriority(int which, int who);

int setpriority(int which,int who,int value);

1、PRIO_PROCESS,一个特定的进程,此时who的取值为进程ID

2、PRIO_PGRP,一个进程组的所有进程,此时who的取值为进程组的ID

3、PRIO_USER,一个用户拥有的所有进程,此时who的取值为实际用户ID

getpriority的用法:

void schedule_try2(){

pid_t pid;

int prio;

pid=fork();

if (pid == 0){

prio=getpriority(PRIO_PROCESS,getpid());

printf("The priority of child is %d\n",prio);

}

}

所以nice函数也可以用getpriority和setpriority来实现

int  nice( int  increment)

{  

 int oldprio = getpriority( PRIO_PROCESS,  getpid());

 return setpriority(PRIO_PROCESS, getpid(), oldprio + increment);

}

linux c编程:进程控制(四)进程调度的更多相关文章

  1. Linux系统编程@进程通信(一)

    进程间通信概述 需要进程通信的原因: 数据传输 资源共享 通知事件 进程控制 Linux进程间通信(IPC)发展由来 Unix进程间通信 基于System V进程间通信(System V:UNIX系统 ...

  2. Linux系统编程@进程管理(一)

    课程目标: 构建一个基于主机系统的多客户即时通信/聊天室项目 涉及的理论知识 进程控制:僵尸进程/孤儿进程.进程控制.守护进程... 进程间通信:管道.命名管道.信号... 多线程编程: 锁.信号量. ...

  3. Linux C 程序 进程控制(17)

    进程控制 1.进程概述现代操作系统的特点在于程序的并行执行.Linux是一个多用户多任务的操作系统.ps .pstree 查看进程进程除了进程id外还有一些其他标识信息,可以通过相应的函数获得.// ...

  4. linux 命令及进程控制

    main.c  main.o/main.obj  main/main.exe          编译                连接 程序运行;      两步: gcc/g++  -c  mai ...

  5. [linux] C语言Linux系统编程进程基本概念

    1.如果说文件是unix系统最重要的抽象概念,那么进程仅次于文件.进程是执行中的目标代码:活动的.生存的.运行的程序. 除了目标代码进程还包含数据.资源.状态以及虚拟化的计算机. 2.进程体系: 每一 ...

  6. linux系统编程-进程

    进程 现实生活中 在很多的场景中的事情都是同时进行的,比如开车的时候 手和脚共同来驾驶汽车,再比如唱歌跳舞也是同时进行的: 如下是一段视频,迈克杰克逊的一段视频: http://v.youku.com ...

  7. linux与Windows进程控制

    进程管理控制 这里实现的是一个自定义timer用于统计子进程运行的时间.使用方式主要是 timer [-t seconds] command arguments 例如要统计ls的运行时间可以直接输入t ...

  8. linux系统调用之进程控制

    1 进程控制: fork                                                                                     创建一 ...

  9. linux c编程:进程控制(四)进程关系

    每一个进程除了有一个进程ID外,还属于一个进程组.  进程组是一个或多个进程的集合,通常情况下,他们是在同一作业中结合起来的,同一进程组的个进程接受来自同一终端的各种信号. 每一个进程组有一个唯一的进 ...

随机推荐

  1. navigationItem的设置和titleView的设置

    设置导航栏中间的标题 self.navigationItem.title = @"title"; 设置导航栏的主题颜色 self.navigationBar.barTintColo ...

  2. mysql误操作后通过binlog恢复,同时解决tmp目录满的问题

    注意: 本文的恢复,并不是基于恢复某个时间点的全量备份后的增量恢复,而是指在现有数据库基础上基于binlog的恢复.适用于较小的数据误操作. 提取日志文件为sql语句: /usr-ext/local/ ...

  3. Centos6.6 以rpm方式安装mysql5.6

    一.查看系统中有没有mysql的源 yum repolist all | grep mysql 二.配置源 1.配置源参考mysql官方给出的源配置,https://dev.mysql.com/doc ...

  4. JavaScript Array pop(),shift()函数

    pop() 删除数组的最后一个元素并返回删除的元素 shift() 删除并返回数组的第一个元素

  5. JDBC编程理论知识(1)

    1.SUN公司为统一对数据库的操作,定义了一套Java操作数据库的规范,称之为JDBC 2.JDBC全称为:Java Data Base Connectivity(java数据库连接),它主要由接口组 ...

  6. BufferedReader 使用 readLine() 读取 UTF-8 格式的文本第一行第一个字符是空字符的解决办法

    BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(ksmgVo.getFiledata( ...

  7. WordPress系列之钩子hook的作用及基本用法

    WordPress 的插件机制实际上只的就是这个 Hook 了,它中文被翻译成钩子,允许你参与 WordPress 核心的运行,是一个非常棒的东西,下面我们来详细了解一下它.钩子分类 钩子分为两种,一 ...

  8. linux下 apache启动、停止、重启命令

    假设你的apahce安装目录为/usr/local/apache2,这些方法适合任何情况 apahce启动命令:推荐/usr/local/apache2/bin/apachectl start apa ...

  9. Android新浪微博client(一)——主框架搭建

    原文出自:方杰| http://fangjie.sinaapp.com/?p=62 转载请注明出处 该项目代码已经放到github:https://github.com/JayFang1993/Sin ...

  10. 自动清理DataGuard备机日志

    >> from zhuhaiqing.info #!/usr/bin/bash #删除DataGuard备机归档日志备份 export ORACLE_HOME=/opt/oracle/pr ...