1. 进程:
a. 如果过于频繁地调用fork()来创建进程,可能会产生性能问题
b. 每个进程都有自己的地址空间和上下文信息,大量进程会导致大量的内存消耗,从而影响性能
c. 频繁切换进程,也会造成开销
d. 线程的上下文切换的开销比进程的切换开销小得多,而且一个进程之间的多个线程之间可以共享进程的地址空间和上下文,节省不少内存。
e. linux下的线程有两种:
i.用户态的线程。它的切换开销比较小,但在“多处理器的服务器”中表现不好
ii.内核级的线程。一个线程对应一个linux的“轻量级进程”,它对“多处理器的服务器”的支持较好,但切换的开销较大
2.进程调度
a. Scheduler会维护不同状态的进程队列
b. 进程可以告诉scheduler它想要要的优先级,但最终的优先级由scheduler决定
c. 进程切换:主要动作是把寄存器里的东西压栈到内存中,然后把另一个进程的东西装入到寄存器中
d. 系统指标有: load, priority
3.进程调度的监控
a. top一下,看pr和ni, 前者代表priority,越低的优先级越高;后面是nice的缩写,代表优先级将要发生的变化,即 pr_new = pr_old + ni; 如果进程的ni值是正数,则表示它愿意降低自己的优先级,让出cpu时间片,也就是说它很nice;
b. 看load: cat /proc/loadavg 或 top 或w ; 如何搞出高load? 对httpd搞一个高并发的ab就可以
c. 软件nmon 可以监视每秒上下文切换次数