nice
有人能告诉我指定级别和子进程之间有什么关系吗?
例如,如果我的默认值为nice
,0
并且我使用 启动一个脚本nice 5
,该脚本又启动一些子进程(在本例中大约有 20 个并行进程),那么子进程的优点是什么?
答案1
子进程继承nice
父进程在分叉时所持有的任何值(在您的示例中为5
)。
但是,如果nice
在 fork 子进程后父进程的值发生更改,则子进程不会继承新nice
值。
您可以使用监控工具轻松观察到这一点top
。如果nice
默认情况下未显示该字段 (NI),您可以通过按f
并选择 来添加它I
。这会将NI
列添加到top
显示中。
* I: NI = Nice value
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1937 root 20 0 206m 66m 45m S 6.2 1.7 11:03.67 X
好的信息来自man 2 fork
fork() 通过复制调用进程来创建一个新进程。新进程(称为子进程)与调用进程(称为父进程)完全相同,但以下几点除外:
- 子进程有自己唯一的进程 ID,并且此 PID 与任何现有进程组 (setpgid(2)) 的 ID 都不匹配。
- 子进程的父进程 ID 与父进程 ID 相同。
- 子级不会继承其父级的内存锁(mlock(2)、mlockall(2))。
- 子进程中的进程资源利用率 (getrusage(2)) 和 CPU 时间计数器 (times(2)) 重置为零。
- 子级的待处理信号集最初为空 (sigpending(2))。
- 子级不会从其父级 (semop(2)) 继承信号量调整。
- 子级不会从其父级继承记录锁 (fcntl(2))。
- 子进程不会从其父进程继承计时器(setitimer(2)、alarm(2)、timer_create(2))。
- 子级不会从其父级继承未完成的异步 I/O 操作(aio_read(3)、aio_write(3)),也不会从其父级继承任何异步 I/O 上下文(请参阅 io_setup(2))。