- 1、本文档共40页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
8 进程与进程管理
进程调度——调度时机 定义 在什么情况下要执行调度程序,则称为调度时机。 调度时机 当前进程调用系统调用sleep( )或者exit( )。 进程终止,永久地放弃对CPU的使用。 在时钟中断处理程序执行过程中,发现当前进程连续运行的时间过长。 当唤醒一个睡眠进程时,发现被唤醒的进程比当前进程更有资格运行。 一个进程通过执行系统调用来改变调度策略或者降低自身的优先权(如nice命令),从而引起立即调度。 守护进程 守护进程(Daemon)是运行在后台的一种特殊进程,其脱离于终端,之所以脱离于终端是为了避免进程被任何终端所产生的信息所打断,其在执行过程中的信息也不在任何终端上显示。守候进程周期性地执行某种任务或等待处理某些发生的事件,Linux的大多数服务器就是用守护进程实现的。比如,Internet服务器inetd,Web服务器httpd等。 一般情况下,守护进程可以通过以下方式启动: 在系统启动时由启动脚本启动,这些启动脚本通常放在/etc/rc.d目录下; 利用inetd超级服务器启动,如telnet等; 由cron定时启动以及在终端用nohup启动的进程也是守护进程。 守护进程编程要点 守护进程编程要点 守护进程编程要点 日志信息及其管理 建立与日志守候进程联系 openlog() 写日志信息 其中:可中断等待进程可以被信号中断; 不可中断等待进程直接在硬件条件等待,并且任何情况下都不可中断。 僵死进程:在子进程终止后到父进程调用wait()前的时间里,子进程被称为zombie。父进程遗忘回收子进程资源孤儿进程:父进程先于子进程退出所造成。 * * 进程查看方式 (1)ps aux ——进程信息查看,但不是动态显示。 (2)ps auxf——以树状方式查看进程。 (3)top——实时查看进程状态 输出项解释 (1)USER 进程的属主; (2)PID 进程的ID; (3)PPID 父进程; (4)%CPU 进程占用的CPU百分比; (5)%MEM 占用内存的百分比; (6)NI 进程的NICE值,数值大,表示较少占用CPU时间,负值优先级最大; (7)VSZ 进程虚拟大小; (8)RSS 驻留中页的数量; (9)WCHAN 正在等待的进程资源; (10)TTY 终端ID (11)STAT 进程状态 ——D Uninterruptible sleep (usually IO) R 正在运行可中在队列中可过行的; S 处于休眠状态; T 停止或被追踪;Z 僵尸进程; 优先级高的进程 N 优先级较低的进程 L 有些页被锁进内存;s 进程的领导者(在它之下有子进程); l is multi-threaded (using CLONE_THREAD, like NPTL pthreads do) + 位于后台的进程组; (12)START 启动进程的时间; (13)TIME 进程消耗CPU的时间; (14)COMMAND 命令的名称和参数; * * 注意:Linux的fork()使用写时拷贝 (copy- on-write)页实现。 写时拷贝是一种可以推迟甚至避免拷贝数据的技术。内核此时并不复制整个进程的地址空间,而是让父子进程共享同一个地址空间。只用在需要写入的时候才会复制地址空间,从而使各个进行拥有各自的地址空间。也就是说,资源的复制是在需要写入的时候才会进行,在此之前,只有以只读方式共享。这种技术使地址空间上的页的拷贝被推迟到实际发生写入的时候。在页根本不会被写入的情况下---例如,fork()后立即执行exec(),地址空间就无需被复制了。fork()的实际开销就是复制父进程的页表以及给子进程创建一个进程描述符。 例如: #include stdio.h#include sched.h#include stdlib.hint data = 10;int child_process(){??? printf(Child process %d, data %d\n,getpid(),data);??? data = 20;??? printf(Child process %d, data %d\n,getpid(),data);??? while(1);}int main(int argc, char* argv[]){??? void **child_stack;??? child_stack = (void **) malloc(16384);??? clone(child_process, child_stack, CLONE_VM|CLONE_FILES|CLONE_SIGHAND, NULL);??? sleep(1
文档评论(0)