当系统中有多个进程到时候,哪个进程先执行,哪个进程后执行是由进程的优先级决定的。进程的优先级是由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. C#与数据结构--图的遍历

    http://www.cnblogs.com/abatei/archive/2008/06/06/1215114.html 8.2 图的存储结构 图的存储结构除了要存储图中各个顶点的本身的信息外,同时 ...

  2. 接口测试工具(Postman)

    给大家介绍一款HTTP接口测试工具 -- Postman ! 优点: 1. 支持参数名与参数值自定义,无论head还是body 2. 支持多种方法调用,包含get与post 3. 支持鉴权加密,包含b ...

  3. Angular 学习笔记——sublime

    div.row>div.col-md-12*10 就等于 <div class="row">    <div class="col-md-12&q ...

  4. vue笔记四

    十一.过渡与动画 1.使用限制Vue 提供了 transition 的封装组件,在下列情形中,可以给任何元素和组件添加 entering/leaving 过渡条件渲染 (使用 v-if)条件展示 (使 ...

  5. Laravel之Session

    一.配置 Session 配置文件位于config/session.php .默认情况下,Laravel 使用的session 驱动为文件驱动,这对许多应用而言是没有什么问题的.在生产环境中,你可能考 ...

  6. Hbase笔记3 shell命令

    http://www.jb51.net/article/31172.htm 这个文章写得挺好 1.HBase的shell就和我们用Mysql的终端是一个意思,比如我们安装好Mysql,配置好了环境变量 ...

  7. 02-2设置第一启动项--进入Bios界面设置U盘为第一启动项

    进入Bios界面设置U盘为第一启动项: 开机,当电脑处于启动状态,屏幕显示电脑LOGO时,按下F2键.(根据电脑的不同,进入BIOS的功能键也不同,可根据自己电脑的型号百度搜索相关功能键) 按电脑方向 ...

  8. Android事件的分发

    1 http://blog.csdn.net/guolin_blog/article/details/9097463 2

  9. LVM卷组命令

    一般维护命令  #vgscan //检測系统中全部磁盘  #vgck [卷组名] //用于检查卷组中卷组描写叙述区域信息的一致性.  #vgdisplay [卷组名] //显示卷组的属性信息  #vg ...

  10. Ajax分页功能的实现

    电脑换了固态硬盘,准备重装系统,因此打算把项目里一直延用的代码总结出来,防止丢失,以后也方便查阅.Ajax分页已经是非常普遍的技术了,所以也没什么需要特别说明的,直接贴代码: html部分 <! ...