当系统中有多个进程到时候,哪个进程先执行,哪个进程后执行是由进程的优先级决定的。进程的优先级是由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. cocos2d-x ios游戏开发初认识(六) 渲染的优化

    做程序开发肯定要考虑到内存的优化,毕竟iphone本身的内存就不是非常大.这一节主要说这个cocos2d开发对内存的优化,详细表如今,既能够对同样的精灵(图片)仅仅渲染一次,也能够对不能的精灵仅仅渲染 ...

  2. redis学习笔记——数据类型

    对象处理机制 Redis 构建了自己的类型系统,这个系统的主要功能包括:• redisObject 对象.• 基于redisObject 对象的类型检查.• 基于redisObject 对象的显式多态 ...

  3. PS 文字有锯齿怎么办

    1 可以在矢量绘图软件里面做,就没有锯齿了,画好之后导入到PS即可. 2 可以把PSD文件的像素值变大一些,比如调成500像素/英寸,但是这样会导致做出来的东西体积比较大,所以最好还是学会矢量绘图.

  4. react-navigation-easy-helper

    本组件旨在不更改源码情况下,简单配置即可实现一些复杂的功能.如在任意位置进行跳转.根据路由名字返回指定页面.简化参数的获取.快速点击的拦截.统一页面跳转的拦截等. 安装: npm install re ...

  5. 跟踪运行时错误 vue

    如果在组件渲染时出现运行错误,错误将会被传递至全局 Vue.config.errorHandler 配置函数 (如果已设置).利用这个钩子函数来配合错误跟踪服务是个不错的主意.比如 Sentry,它为 ...

  6. java编程思想读书笔记 第十二章 通过异常处理错误(下)

    1.异常的限制 当覆盖方法的时候,仅仅能抛出在基类方法的异常说明里列出的那些异常. 这意味着,当基类使用的代码应用到其派生类对象的时候,一样能够工资,异常也不例外. 以下的样例是在编译时施加在异常上面 ...

  7. pomodoro源码

    有网友问我要pomodoro源码.事实上这个程序非常easy,仅仅是定时器,定时弹出置顶窗体.用c++builder6.0写.放一个TPopupMenu 右键菜单,一个TTrayIcon 一个托盘图标 ...

  8. 代理工具Charles使用

    代理工具Charles使用 分类: MAC 2014-03-27 20:41 7810人阅读 评论(2) 收藏 举报 手机开发 一.跟踪HTTPS 1.下载官方的证书ssl.zip证书,解压成*.cr ...

  9. vs无法引用项目问题

    vs无法引用项目问题 2017年12月13日 14:45:31 阅读数:582 开发时编译报错--项目A未被引用,展开项目的引用,发现该项目实质已经被引用了,但是该引用上有个黄色三角感叹号,遂移除该引 ...

  10. Https所涉及名词及相关后缀名解释

    HTTPS: HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版.即 ...