关于进程的nice值: 内容来自与wiki百科
Nice值是类操作系统中表示静态优先级的数值。每个进程都有自己的静态优先级,优先级高的进程得以优先运行。Nice值的范围是-20~+19,拥有Nice值越大的进程的实际优先级越小(即Nice值为+19
的进程优先级最小,为-20的进程优先级最大),默认的Nice值是0。由于Nice值是静态优先级,所以一经设定,就不会再被内核修改,直到被重新设定。Nice值只起干预CPU时间分配的作用,实际中的细节,由动态优先级决定。
STAT值表示进程当前的状态,在ps命令的man手册里可以看到如下说明:
Here are the different values that the s, stat and state output
specifiers (header "STAT" or "S") will display to describe the state of
a process.
D Uninterruptible sleep (usually IO)
R Running or runnable (on run queue)
S Interruptible sleep (waiting for an event to complete)
T Stopped, either by a job control signal or because it is being
traced.
W paging (not valid since the 2.6.xx kernel)
X dead (should never be seen)
Z Defunct ("zombie") process, terminated but not reaped by its
parent.
For BSD formats and when the stat keyword is used, additional
characters may be displayed:
< high-priority (not nice to other users)
N low-priority (nice to other users)
L has pages locked into memory (for real-time and custom IO)
s is a session leader
l is multi-threaded (using CLONE_THREAD, like NPTL pthreads do)
+ is in the foreground process group
启动的新的进程最简单的方法时使用system函数
int system (const char* string)
|
其中string参数为要运行的命令,例如
#include <stdlib.h>
#include <stdio.h>
int main()
{
printf("Running ps with system\n");
system("ps ");
printf("Done.\n");
exit(0);
}
|
程序运行结果为
Running ps with system
PID TTY TIME CMD
2827 pts/0 00:00:00 su
2834 pts/0 00:00:00 bash
29556 pts/0 00:00:00 system1
29557 pts/0 00:00:00 ps
Done.system函数实为启动一个shell,然后用这个shell运行所给参数命令,待system函数返回后,继续往下运行,故可以看到在ps命令的输出结果全部打印完毕后,看到最后的输出Done。
我们知道在运行命令时,后面加个"&"符号,可使此命令在后台运行,我们将程序中的system函数调用改为
其余不变,输出结果变为
Running ps with system
Done.[root@localhost]# PID TTY TIME CMD
2827 pts/0 00:00:00 su
2834 pts/0 00:00:00 bash
13922 pts/0 00:00:00 ps
注意标红的
Done位置的提前,因为变为后台运行,所以不用等到system所启动的shell的返回,可以理解为程序变成了并发。因为system的调用需要时间,所以后面的Done先输出了,并返回了启动该程序的 shell,然后由system启动的ps命令才打印其输出。
因为system必须要启动一个shell,所以其效率不是很高,使用的频率也很少。
我们可以使用exec函数族来进行当前进程的进程替换。我们下面使用两个程序演示exec函数。
system1.c 程序:
#include <stdlib.h>
#include <stdio.h>
int main()
{
printf("This is in system1.c\n");
system("ps ");
printf("Done in system1.c\n");
printf("pid is %d\n",getpid());
exit(0);
}
|
system2.c 程序:
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
int main()
{
printf("This is in system2.c\n");
printf("pid is %d\n",getpid());
execv("system1",NULL);
printf("Done in system2.c\n");
printf("pid is %d\n",getpid());
exit(0);
}
|
在system2.c中用execv函数,参数为system1程序,运行结果为:
This is in system2.c
pid is 14042
This is in system1.c
PID TTY TIME CMD
2827 pts/0 00:00:00 su
2834 pts/0 00:00:00 bash
14042 pts/0 00:00:00 system1
14043 pts/0 00:00:00 ps
Done in system1.c
pid is 14042
可以看到system2中调用了execv后,就被参数所指向的system1程序所替换,后面的“
Done in system2.c\n
”,并没有输出,而system1中所有语句均被执行,通过输出进程pid可以看到,从头到尾只有一个进程,并无新进程产生(不算system调用产生的shell)。
阅读(893) | 评论(0) | 转发(0) |