ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 进程与信号(一)

进程与信号(一)

原创 Linux操作系统 作者:mylxiaoyi 时间:2009-08-10 19:16:00 0 删除 编辑

第11章 进程与信号

进程与信号构成了Linux操作环境的基础部分。他们控制了几乎所有由Linux与其他的类Unix计算机系统所执行的活动。理解Linux与Unix如何管理进程将会使得系统程序员,程序编写者,或是系统管理处于一个有利的位置。

在这一章,我们将会了解在Linux环境中进程中如何被处理的以及如何确定在指定的时刻计算机正在做什么。我们同时也会了解如何在我们自己的程序中启动与停止其他的进程,如何使得进程发送与接收消息,以及如何避免僵尸进程。具体而言,我们将会了解下列内容:

进程结构,类型与调度
使用不同的方法启动一个新进程
父进程,子进程以及僵尸进程
什么是信号以及如何使用信号

什么是进程

Unix规范第2版,以及之前的第1版,将进程定义为"一个地址空间,在这个地址空间中运行一个或是多个线程,以及这些线程所需要的系统资源"。我们将会在第12章来了解线程。就目前而言,我们只是将进程看作一个正在运行的程序。

一个多任务操作系统例如Linux会允许多个程序同时运行。每一个正在运行的程序实例构成一个进程。对于一个窗口系统,例如X Window系统,更是如此。与Windows类似,X提供了一个图形用户接口允许多个程序同时运行。每一个程序都可以显示一个或是多个窗口。

作为一个多用户系统,Linux允许多个用户同时访问系统。每一个用户会同时运行多个程序,或是同一个程序的多个实例。系统本身运行其他的程序来管理系统资源并且控制用户访问。

正如我们在第4章所看到的,一个程序,或进程,是由程序代码,数据,变量(占用系统内存),打开的文件(文件描述符),以及环境组成。通常,Linux系统会在进程之间共享代码与系统库,从而每次在内存中只有一份代码拷贝。

进程结构

下面我们来看一下一个进程在操作系统中是如何安排的。如果两个用户,neil与rick,同时运行grep程序在不同的文件中查找不同的字符串,所运行的进程如下图11-1所示。

如果我们运行ps命令,所得到的输出结果如下所示:

$ ps -af
UID PID PPID C STIME TTY TIME CMD
rick 101 96 0 18:24 tty2 00:00:00 grep pid_t /usr/include/sys/*.h
neil 102 92 0 18:24 tty4 00:00:00 grep XOPEN /usr/include/features.h

每一个进程都被分配了一个唯一的数字,称为进程标识或是PID。这通常是2到32768之间的一个正数。当一个进程被启动时,队列中下一个未被使用的数字就会被选中,而数据由2重新开始,从而他们可以循环。数字1通常是为特殊进程init所保留的,init进程管理其他的进程。我们会在稍后讨论init进程。在这里我们可以看到由neil与rick所启动的两个进程已经被标识为101与102。

将会由grep命令所执行的程序代码存储在一个磁盘文件中。通常,Linux进程并不会改写用于保存程序代码的内存区域,所以代码是以只读方式装入内存的。我们可以在上图中看到,因为这个区域不可以被改写,所以他可以被安全的共享。

系统库也可以被共享。所以,例如在内存中就可以只需要一份printf拷贝,尽管会有多个程序调用他。这更为复杂,但是与Windows中动态链接库的工作方式相似。

正如我们在前面的图中所看到的,另一个好处就是包含可执行程序grep的磁盘文件更小,因为他并不包含共享库代码。这对于单个程序而言并不是明显,但是却在整个操作系统上为标准C库节省的大量的空间。

当然,并不是一个程序所需要的所有内容都可以共享。例如,每一个进程所使用的不同变量。在这个例子中,我们可以看到搜索字符串是作为一个进程数据空间的变量s传递给grep命令的。这些是单独的,并且通常不能被其他的进程所读取。两个grep命令中所用的文件也是不同的,进程拥有其自己的用户文件访问的文件描述符集合。

另外,进程拥有其自己的堆栈空间,用于函数中的局部变量以及函数调用与返回的控制。同时他也拥有其自己的环境空间,包含为进程使用所建立的环境变量,正如我们在第4章了解putenv与getenv时所看到的。一个进程必须同时维护其自己的程序计数,在其执行中执行到哪里,哪一个是执行线程等的记录。在下一章,我们将会看到当我们使用线程时,进程可以有多个执行线程。

在许多Linux系统以及一些Unix系统上,在/proc目录中有一个特殊的文件集合。特殊之处就在于他们并不是真正的文件,而是允许我们在进程运行时查看进程的内部,就如同他们是目录中的文件一样。我们已经在第3章简要的了解了/proc文件系统。

最后,与Unix类似,因为Linux有一个虚拟内存系统可以将代码与数据换出到一个磁盘区域,可以管理更多的进程,而不仅是只适合物理内存。

进程表

Linux进程表是一个描述当装载入的所有进程的数据结构,例如,他们的PID,状态以及命令字符串,由ps所输出的信息等。操作系统使用他们的PID来管理进程,而他们被用作进程表中的索引。进程表是大小限制的,所以一个系统支持的进程数目也是有限制的。早期的Unix系统有支持256进程的限制。更为现代的实现已经放宽了这个限制,而所支持的进程数目只受形成一个进程表项的可用内存的限制。

查看进程

ps命令可以显示我们正在运行的进程,另一个用户正在运行的进程,或是系统上的所有进程。如下面的例子输出:

$ ps -af
UID PID PPID C STIME TTY TIME CMD
root 433 425 0 18:12 tty1 00:00:00 [bash]
rick 445 426 0 18:12 tty2 00:00:00 -bash
rick 456 427 0 18:12 tty3 00:00:00 [bash]
root 467 433 0 18:12 tty1 00:00:00 sh /usr/X11R6/bin/startx
root 474 467 0 18:12 tty1 00:00:00 xinit /etc/X11/xinit/xinitrc --
root 478 474 0 18:12 tty1 00:00:00 /usr/bin/gnome-session
root 487 1 0 18:12 tty1 00:00:00 gnome-smproxy --sm-client-id def
root 493 1 0 18:12 tty1 00:00:01 [enlightenment]
root 506 1 0 18:12 tty1 00:00:03 panel --sm-client-id default8
root 508 1 0 18:12 tty1 00:00:00 xscreensaver -no-splash -timeout
root 510 1 0 18:12 tty1 00:00:01 gmc --sm-client-id default10
root 512 1 0 18:12 tty1 00:00:01 gnome-help-browser --sm-client-i
root 649 445 0 18:24 tty2 00:00:00 su
root 653 649 0 18:24 tty2 00:00:00 bash
neil 655 428 0 18:24 tty4 00:00:00 -bash
root 713 1 2 18:27 tty1 00:00:00 gnome-terminal
root 715 713 0 18:28 tty1 00:00:00 gnome-pty-helper
root 717 716 13 18:28 pts/0 00:00:01 emacs
root 718 653 0 18:28 tty2 00:00:00 ps

Link URL: http://mylxiaoyi.javaeye.com/blog/394753

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/13670711/viewspace-611810/,如需转载,请注明出处,否则将追究法律责任。

下一篇: 调试(四)
请登录后发表评论 登录
全部评论

注册时间:2008-07-09

  • 博文量
    25
  • 访问量
    11044