linux c编程:进程控制(四)进程调度
当系统中有多个进程到时候,哪个进程先执行,哪个进程后执行是由进程的优先级决定的。进程的优先级是由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编程:进程控制(四)进程调度的更多相关文章
- Linux系统编程@进程通信(一)
进程间通信概述 需要进程通信的原因: 数据传输 资源共享 通知事件 进程控制 Linux进程间通信(IPC)发展由来 Unix进程间通信 基于System V进程间通信(System V:UNIX系统 ...
- Linux系统编程@进程管理(一)
课程目标: 构建一个基于主机系统的多客户即时通信/聊天室项目 涉及的理论知识 进程控制:僵尸进程/孤儿进程.进程控制.守护进程... 进程间通信:管道.命名管道.信号... 多线程编程: 锁.信号量. ...
- Linux C 程序 进程控制(17)
进程控制 1.进程概述现代操作系统的特点在于程序的并行执行.Linux是一个多用户多任务的操作系统.ps .pstree 查看进程进程除了进程id外还有一些其他标识信息,可以通过相应的函数获得.// ...
- linux 命令及进程控制
main.c main.o/main.obj main/main.exe 编译 连接 程序运行; 两步: gcc/g++ -c mai ...
- [linux] C语言Linux系统编程进程基本概念
1.如果说文件是unix系统最重要的抽象概念,那么进程仅次于文件.进程是执行中的目标代码:活动的.生存的.运行的程序. 除了目标代码进程还包含数据.资源.状态以及虚拟化的计算机. 2.进程体系: 每一 ...
- linux系统编程-进程
进程 现实生活中 在很多的场景中的事情都是同时进行的,比如开车的时候 手和脚共同来驾驶汽车,再比如唱歌跳舞也是同时进行的: 如下是一段视频,迈克杰克逊的一段视频: http://v.youku.com ...
- linux与Windows进程控制
进程管理控制 这里实现的是一个自定义timer用于统计子进程运行的时间.使用方式主要是 timer [-t seconds] command arguments 例如要统计ls的运行时间可以直接输入t ...
- linux系统调用之进程控制
1 进程控制: fork 创建一 ...
- linux c编程:进程控制(四)进程关系
每一个进程除了有一个进程ID外,还属于一个进程组. 进程组是一个或多个进程的集合,通常情况下,他们是在同一作业中结合起来的,同一进程组的个进程接受来自同一终端的各种信号. 每一个进程组有一个唯一的进 ...
随机推荐
- python——父类与子类的一些说明
Python中类的初始化方法是__init__(),因此父类.子类的初始化方法都是这个,如果子类不实现__init__()这个函数,初始化时调用父类的初始化函数, 如果子类实现了这个函数,则要在这个函 ...
- js获取屏幕高度/浏览器高度
1.window.screen.height window.screen.height:设备显示屏的高度 (1)分辨率为1080px的显示屏 (2)手机屏 2.window.screen.avail ...
- 【DB2】db2命令Export与Import
环境准备 1.新建表 qinys@Linux:~> db2 "create table tb1(id int,dt timestamp,name varchar(100))" ...
- (四)Thymeleaf标准表达式之——[3->6] 操作符(文本、算术、布尔、比较及相等)
2.3 文本操作符 模板名称:text.html 连接符: + 可以是任意字符和表达式等 文本替换符:| 不能表达出条件表达式(官网:只能是变量表达式) e.g. 1.<span th ...
- 介绍C#结构体与类区别
1. 结构体与类定义方式 结构体定义使用struct类定义使用class 结构体: struct testDemo{ int num; void action(){ } } 类: class test ...
- 转: Appium ---移动自动化测试
转自:http://www.cnblogs.com/nbkhic/p/3803830.html 什么是appium? 下面这段介绍来自于appium的官网. Appium is an open-sou ...
- nginx日志统计流量
cat access.log |awk '{sum+=$10} END {print sum/1024/1024/1024}' $10是nginx字段bytes_sent 字段,根据自己的日志格式修改 ...
- Lua学习十----------Lua数组
© 版权声明:本文为博主原创文章,转载请注明出处 1.LUA数组 - 一维数组 - 多维数组 2.array.lua -- 一维数组 print("一维数组") array1 = ...
- SSH框架整合时,如果某一个action提交请求时数据校验失败,后续请求全部失败
© 版权声明:本文为博主原创文章,转载请注明出处 1.问题描述 SSH框架搭建好进行验证时发现,执行某个请求时,若参数校验失败,修改参数符合要求后再次请求依然失败.该请求一直报错如下: No resu ...
- 《HTML 5网页开发实例具体解释》样章、内容简单介绍、前言
http://spu.jd.com/1167757597.html http://product.dangdang.com/23484942.html 样章 http://download.csdn. ...