📄 0440processcontrol.htm
字号:
系统都会将他定义成为一个程序,并且给予这个程序一个 ID ,称为
PID,同时依据启发这个程序的使用者与相关属性关系,
给予这个 PID 一组有效的权限设定。</span>』
从此以后,这个 PID 能够在系统上面进行的动作,就与这个 PID 的权限有关了!<br><br>
看这个定义似乎没有什么很奇怪的地方,不过,您得要了解什么叫做『触发事件』才行啊!
我们在什么情况下会触发一个事件?而同一个事件可否被触发多次?呵呵!来了解了解先!<br><br>
<hr><a name=whatis_program_process></a><img src="../images/penguin-s.gif" alt="小标题的图示" height="23" width="16" align="middle" /><span class=text_h2>程序与执行档
(process & program)</span><br>
<div class=block2>
我们如何产生一个 Process ID (PID) 呢?其实很简单啦,就是『执行一个程式或指令』
就可以触发一个事件了而取得一个 PID 棉!我们说过,系统应该是仅认识 binary file 的,
那么当我们要让系统工作的时候,当然就是需要启动一个 binary file 棉,
那个 binary file 就是程式 (program) 啦!<br><br>
那我们知道,每个程式都有三组人马的权限,每组人马都具有 r/w/x 的权限,
所以∶『不同的使用者身份执行这个 program 时,系统给予的权限也都不相同!』
举例来说,我们可以利用 touch 来建立一个空的档案,当 root 执行这个 touch
指令时,他取得的是 UID/GID = 0/0 的权限,而当 dmtsai (UID/GID=501/501)
执行这个 touch 时,他的权限就跟 root 不同啦!<br><br>
再举个更常见的例子,我们要操作系统的时候,通常是利用连线程式或者直接在主机前面登入,
然后取得我们的 shell 对吧!那么,我们的 shell 是 bash 对吧,这个 bash 在 /bin/bash 对吧,
那么同时间的每个人登入都是执行 /bin/bash 对吧!不过,每个人取得的权限就是不同!
也就是说,我们可以这样看∶<br>
<center><img src="0440processcontrol/program_process.png"
title="程式与程序之间的差异"
alt="程式与程序之间的差异"><br>
图一、程式与程序之间的差异<br></center><br>
也就是说,当我们登入并执行 bash 时,系统已经给我们一个 PID 了,
这个 PID 就是依据登入者的 UID/GID (/etc/passwd) 来的啦~
以上面的图来做说明的话,我们知道 /bin/bash 是一个程式 (program),当 dmtsai
登入后,他取得一个 PID 号码为 2234 的程序,这个程序的 User/Group 都是 dmtsai,
而当这个程式进行其他作业时,例如上面提到的 touch 这个指令时,
那么由这个程序衍生出来的其他程序在一般状态下,也会沿用这个程序的相关权限的!<br><br>
<hr><li><span class=text_import1>子程序与父程序∶</span></li>
<div class=block2>
在上面的说明里面,我们有提到所谓的『衍生出来的程序』,那是个啥咚咚?
这样说好了,当我们登入系统后,会取得一个 bash 的 shell ,然后,我们用这个 bash
提供的介面去执行另一个指令,例如 /usr/bin/passwd 或者是 touch 等等,
那些另外执行的指令也会被触发成为 PID ,呵呵!那个 PID 就是『子程序』了,
而在我们的 bash 环境下,就称为『父程序』了!<br><br>
另外,是否还记得我们在 <a href="0320bash.php">bash shell</a> 那一篇里面有提到
『环境变数』在不同程序之间的呼叫呢?现在稍微晓得是什么意思了吗?
是啦!因为我们有执行不同的 bash 嘛!既然执行两次,自然就会取得两个 PID,
而因为要让两个 PID 之间具有一些相关性,我们的 bash 就使用了环境变数棉!<br><br>
<table border=1 width=90% cellspacing=0 cellpadding=5><tr><td>
例题∶请在目前的 bash 环境下,再触发一次 bash ,并以『 ps -l 』这个指令观察程序相关的输出资讯。<br>
答∶<ul>直接执行 bash ,会进入到子程序的环境中,然后输入 ps -l 后,出现∶
<pre><font size=-1>F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 500 21337 21336 0 75 0 - 1348 wait pts/1 00:00:00 bash
0 S 500 22573 21337 2 75 0 - 1348 wait pts/1 00:00:00 bash
0 R 500 22591 22573 0 76 0 - 1302 - pts/1 00:00:00 ps</pre></font>
有看到那个 PID 与 PPID 吗?第一个 bash 的 PID 与第二个 bash 的 PPID 都是 21337 啊,
因为第二个 bash 是来自于第一个所产生的嘛!<ul>
</td></tr></table><br>
重点来啦!所以说,在系统上面的各个程序可能是有相关性的喔!
也就是有所谓的父程序与子程序的关系~至于程序的相关性,我们可以使用 pstree 这支程式去查验,
就能知道彼此之间的关系了。<br><br>
另外要注意的是∶所谓『擒贼先擒王』,
如果哪天你一直发现『奇怪,怎么有个程式关闭后,不久又会自动产生?
而且自动产生的 PID 还不一样!』,呵呵!大概不需要怀疑的是,如果不是
<a href="0430cron.php">例行性命令</a> 的影响,
肯定有一支父程序存在,他会一直重新触发你想要关闭的那个程序,
导致你老是关不了。那怎么办?不是说过擒贼先擒王吗?关闭那支父程序啦! ^_^<br><br>
其实子程序与父程序之间的关系还挺复杂的,最大的复杂点在于程式互相之间的呼叫,
以及两者权限的相关性!这个可能就得要您自己多多建立自己的经验了~<br><br>
</div>
<hr><li><span class=text_import1>系统或网路服务∶常驻在记忆体的程序</span></li>
<div class=block2>
如果就我们之前学到的一些指令资料来看,其实我们下达的指令都很简单,
包括用 ls 显示档案啊、用 touch 建立档案啊、rm/mkdir/cp/mv 等指令管理档案啊、
chmod/chown/passwd 等等的指令来管理权限等等的,不过,这些指令都是执行完就结束了。
也就是说,该项指令被触发后所产生的 PID 很快就会终止呢!
那有没有一直在执行的程序啊?当然有啊!而且多的是呢!<br><br>
举个简单的例子来说好了,我们知道系统每分钟都会去扫瞄 /etc/crontab 以及相关的设定档,
来进行工作排程吧?那么那个工作排程是谁负责的?当然不是鸟哥啊!
呵呵!是 crond 这个程式所管理的,我们将他启动在背景当中一直持续不断的运作,
套句以前 DOS 年代常常说的一句话,那就是『常驻在记忆体当中的程序』啦!<br><br>
这些常驻在记忆体当中的程序有很多,不过主要大致分成系统本身所需要的服务,
例如刚刚提到的 crond 及 atd ,还有 syslog 等等的。还有一些则是负责网路连线的服务,
例如 Apache, named, postfix, vsftpd... 等等的。这些网路服务比较有趣的地方,
在于这些程式被执行后,他会启动一个可以负责网路监听的埠口 (port) ,
以提供外部用户端 (client) 的连线要求。<br><br>
这部分我们会在认识系统服务的地方再好好的讲一讲,
在这里,您先有个概念,大概知道一下,系统上面的 PID 几乎都是透过执行一些指令所产生的,
而这些指令可能会负责一些重要的工作,例如网路伺服器啊、系统效能维持啊、
或是其他系统重要工作等等。若有兴趣的话,可以先以 netstat 检查一下您主机上的网路服务喔!
</div>
</div>
<hr><a name=whatis_milti_task></a><img src="../images/penguin-s.gif" alt="小标题的图示" height="23" width="16" align="middle" /><span class=text_h2>Linux 的多人多工环境</span><br>
<div class=block2>
我们现在知道了,其实在 Linux 底下执行一个指令时,系统会给予这个动作一个 ID,
我们称为 PID,而根据启用这个指令的使用者与相关的指令功能,而给予这个特定 PID 一组权限,
该指令可以进行的行为则与这个 PID 的权限有关。根据这个说明,我们就可以简单的了解,
为什么 Linux 这么多用户,但是却每个人都可以拥有自己的环境了吧!^_^<br><br>
<li><span class=text_import2>多人环境∶</span></li>
<div class=block2>
Linux 最棒的地方就在于他的多人多工环境了!那么,什么是『多人多工』?!在 Linux
上面允许不同的人使用,而且每个人都有其特殊的权限,只有一个人具有至高无上的权力,那就是
root (系统管理员),除了他之外,其他人都必须要受一些限制的!而每个人进入
Linux 的环境设定都可以随著每个人的喜好来设定 (还记得我们在 <a href="0320bash.php">BASH</a>
那一章提过的 ~/.bashrc 吧!?对了!就是那个光!)!现在知道为什么了吧?
因为每个人登入后取得的 shell 的 PID 不同嘛!<br><br>
</div>
<li><span class=text_import2>多工行为∶</span></li>
<div class=block2>
我想,在某些其他作业系统中,您可能会遇到这样的事情∶『这个档案正在使用中,
您无法开启这个档案!』我哩勒!还得将正在执行当中的程式关掉之后才能开这个中间暂存档!!
而且这个时候还只有我自己一个人在使用呢~受不了~呵呵!不过,
Linux 就不会这样棉!您可以同时在不同的画面,同时由不同的人 (当然棉,有的是经由
SSH 网路连线过来,有的是直接在萤幕前面的朋友棉!)使用『同一个档案』,
不论是开启或者是修改,只要您有权限,就可以使用该档案!!<br><br>
这个东西可有用的紧!由于鸟哥是很常使用程式的 (就是
Fortran 啦,吃饭的工具!) ,而由于我们有一部主机专门用来工作的,所以配备比较高档一点
PIII 的双 CPU ),那么我就可以同时的进行两个 compiler 的程序,而且还不会互相的影响,
并且资源分配的还蛮均匀的!哈哈!怎么会跑得这么顺畅呀!爽毙了!<br><br>
其实作业系统的多工是很复杂的行为啦!尤其涉及将多个工作直接丢给一颗 CPU 来处理~
现在我们应该比较清楚的是,所谓的『工作』其实是将多个指令触发成为系统程序 (PID),
而这些程序若同时被触发时,那么一颗 CPU 就得要同时负责许多工作了。
但我们晓得的是,并非每个程序都很耗系统资源,例如前一节提到的 crond 与 atd 这两个系统服务,
他们并没有消耗很多系统资源的。此时,当然棉, CPU 就可以进行其他工作,
这就是所谓的多工!<br><br>
</div>
<li><span class=text_import2>多重登入环境的七个基本终端视窗∶</span></li>
<div class=block2>
在 Linux 当中,预设提供了六个文字界面登入视窗,以及一个图形界面,你可以使用
[Alt]+[F1].....[F7] 来切换不同的终端机界面,而且每个终端机界面的登入者还可以不同人!
很炫吧!这个东西可就很有用啦!尤其是在某个程序死掉的时候!<BR><BR>
其实,这也是多工环境下所产生的一个情况啦!
我们的 Linux 预设会启动六个终端机登入环境的程式,所以我们就会有六个终端机介面。
您也可以减少啊!就是减少启动的终端机程式就好了。详细的资料可以先查阅
/etc/inittab 这个档案,未来我们在开机管理流程会再仔细的介绍的!<br><br>
</div>
<li><span class=text_import2>特殊的程序管理行为∶</span></li>
<div class=block2>
以前的鸟哥笨笨的,总是以为使用
Windows 98 就可以啦!后来,因为工作的关系,需要使用 Unix 系统,想说我只要在工作机前面就好,
才不要跑来跑去的到 Unix 工作站前面去呢!所以就使用 Windows 连到我的
Unix 工作站工作!<br><br>
好死不死,我一个程序跑下来要 2~3 天,唉~偏偏常常到了第 2.5 天的时候, Windows 98
就给他挂点去!当初真的是给他怕死了~后来因为换了新电脑,用了随机版的
Windows 2000 ,呵呵,这东西真不错 (指对单人而言) ,在当机的时候,
他可以仅将错误的程序踢掉,而不干扰其他的程序进行,呵呵!
从此以后,就不用担心会当机连连棉!不过,2000 毕竟还不够好,因为有的时候还是会死当!!<br><br>
那么 Linux 呢?哈哈!更棒了,几乎可以说绝对不会当机的!因为他可以在任何时候,
将某个被困住的程序杀掉,然后在重新执行该程序而不用重新开机!够炫吧!那么如果我在
Linux 下以文字界面登入,在萤幕当中显示错误讯息后就挂了~动都不能动,该如何是好!?
这个时候那预设的七个视窗就帮上忙啦!你可以随意的再按
[Alt]+[F1].....[F7] 来切换到其他的终端机界面,然后以 ps -aux 找出刚刚的错误程序,然后给他
kill 一下,哈哈,回到刚刚的终端机界面!恩~棒!又回复正常棉!<br><br>
为什么可以这样做呢?我们刚刚不是提过吗?每个程序之间可能是独立的,也可能有相依性,
只要到独立的程序当中,删除有问题的那个程序,当然他就可以被系统移除掉啦!^_^<br><br>
</div>
<li><span class=text_import2>bash 环境下的工作管理 (job control)</span></li>
<div class=block2>
我们在上一个小节有提到所谓的『父程序、子程序』的关系,那我们登入 bash 之后,
就是取得一个名为 bash 的 PID 了,而在这个环境底下所执行的其他指令,
就几乎都是所谓的子程序了。那么,在这个单一的 bash 介面下,我可不可以进行多个工作啊?
当然可以啦!可以『同时』进行喔!举例来说,我可以这样做∶<br>
<table class="term"><tr><td class="term"><pre>
[root@linux ~]# <span class=term_command>cp file1 file2 &</span>
</pre></td></tr></table>
在这一串指令中,重点在那个 & 的功能,他表示将 file1 这个档案复制为 file2 ,且放置于背景中执行,
也就是说执行这一个命令之后,在这一个终端介面仍然可以做其他的工作!而当这一个指令 (
cp file1 file2 )执行完毕之后,系统将会在您的终端介面显示完成的消息!很便利喔!<br><br>
</div>
<li><span class=text_import2>多人多工的系统资源分配问题考虑∶</span></li>
<div class=block2>
多人多工确实有很多的好处,但其实也有管理上的困扰,因为使用者越来越多,
将导致你管理上的困扰哩!另外,由于使用者日盛,当使用者达到一定的人数后,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -