触发 任何一个事件时,系统都会将他定义成为一个进程,并且给予这个进程一个 ID ,称为 PID,同时依据启发这个进程的用户与相关属性关系,给予这个 PID 一组有效的权限设定。从此以后,这 个 PID 能够在系统上面进行的动作,就与这个 PID 的权限有关了!

进程与程序 (process & program)

我们如何产生一个进程呢?其实很简单啦,就是『执行一个程序或指令』就可以触发一个事件而取得 一个 PID 啰!我们说过,系统应该是仅认识 binary file 的,那么当我们要让系统工作的时候,当然 就是需要启动一个 binary file 啰,那个 binary file 就是程序 (program) 。

我们知道,每个程序都有三组人马的权限,每组人马都具有 r/w/x 的权限,所以:『不同的使用 者身份执行这个 program 时,系统给予的权限也都不相同!』举例来说,我们可以利用 touch 来建 立一个空的文件,当 root 执行这个 touch 指令时,他取得的是 UID/GID = 0/0 的权限,而当 dmtsai (UID/GID=501/501) 执行这个 touch 时,他的权限就跟 root 不同啦!

程序被加载成为进程以及相关数据的示意图

程序一般是放置在实体磁盘中,然后透过用户的执行来触发。触发后会加载到内存中成 为一个个体,那就是进程。 为了操作系统可管理这个进程,因此进程有给予执行者的权限/属性等参 数,并包括程序所需要的脚本与数据或文件数据等, 最后再给予一个 PID 。系统就是透过这个 PID 来判断该 process 是否具有权限进行工作的!

举个更常见的例子,操作系统的时候,通常是利用联机程序或者直接在主机前面登入,然后取 得我们的 shell 对吧!那么,我们的 shell 是 bash 对吧,这个 bash 在 /bin/bash 对吧,那么同时 间的每个人登入都是执行 /bin/bash 对吧!不过,每个人取得的权限就是不同!也就是说,我们可以 这样看:

程序与进程之间的差异

也就是说,当我们登入并执行 bash 时,系统已经给我们一个 PID 了,这个 PID 就是依据登入者的 UID/GID (/etc/passwd) 来的啦~以上面的图来做说明的话,我们知道 /bin/bash 是一个程序 (program),当 dmtsai 登入后,他取得一个 PID 号码为 2234 的进程,这个进程的User/Group 都是 dmtsai ,而当这个程序进行其他作业时,例如上面提到的 touch 这个指令时, 那 么由这个进程衍生出来的其他进程在一般状态下,也会沿用这个进程的相关权限的!

让我们将程序与进程作个总结:

  • 程序 (program):通常为 binary program ,放置在储存媒体中 (如硬盘、光盘、软盘、磁带等), 为实体文件的型态存在;

  • 进程 (process):程序被触发后,执行者的权限与属性、程序的程序代码与所需数据等都会被加载内存中,操 作系统并给予这个内存内的单元一个标识符 (PID),可以说,进程就是一个正在运作中的程序。


  • 子进程与父进程:

『衍生出来的进程』,那是个啥咚咚?这样说好了,当我们登 入系统后,会取得一个 bash 的 shell ,然后,我们用这个 bash 提供的接口去执行另一个指令,例 如 /usr/bin/passwd 或者是 touch 等等,那些另外执行的指令也会被触发成为 PID ,那个后 来执行指令才产生的 PID 就是『子进程』了,而在我们原本的 bash 环境下,就称为『父进程』了!

进程相关系之示意图

所以你必须要知道,程序彼此之间是有相关性的!以上面的图示来看,连续执行两个 bash 后,第二 个 bash 的父进程就是前一个 bash。因为每个进程都有一个 PID ,那某个进程的父进程该如何判断? 就透过 Parent PID (PPID) 来判断即可。


  • fork and exec: 进程呼叫的流程

在 Linux 的 进程呼叫通常称为 fork-and-exec 的流程 (注 1)!进程都会藉由父进程以复制 (fork) 的方式产生一个 一模一样的子进程, 然后被复制出来的子进程再以 exec 的方式来执行实际要进行的程序,最终就 成为一个子进程的存在。

进程使用fork and exec 呼叫的示意图

(1)系统先以 fork 的方式复制一个与父进程相同的暂存进程,这个进程与父进程唯一的差别就是 PID 不同! 但是这个暂存进程还会多一个 PPID 的参数,PPID 如前所述,就是父进程的进程标识符啦!

2)暂存进程开始以 exec 的方式加载实际要执行的程序,以上述图标来讲,新的程序名称为 qqq , 最终子进程的程序代码就会变成 qqq 了!


  • 系统或网络服务:常驻在内存的进程

我们下达的指令都很简单,包括用 ls 显示文件啊、 用 touch 建立文件啊、rm/mkdir/cp/mv 等指令管理文件啊、chmod/chown/passwd 等等的指令来管理 权限等等的,不过, 这些指令都是执行完就结束了。也就是说,该项指令被触发后所产生的 PID 很 快就会终止!那有没有一直在执行的进程啊?

举个简单的例子来说好了,我们知道系统每分钟都会去扫瞄 /etc/crontab 以及相关的配置文件, 来 进行工作排程吧?那么那个工作排程是谁负责的?当然不是鸟哥啊! 呵呵!是 crond 这个程序所管 理的,我们将他启动在背景当中一直持续不断的运作, 套句鸟哥以前 DOS 年代常常说的一句话, 那就是『常驻在内存当中的进程』啦!

常驻在内存当中的进程通常都是负责一些系统所提供的功能以服务用户各项任务,因此这些常驻程序 就会被我们称为:服务 (daemon)。大致分成系统本身所需要的服务,例如刚刚提到的 crond 及 atd ,还有 rsyslogd 等等的。还有一些则是负责网络联机的服务,例如 Apache, named, postfix, vsftpd。

Linux 的多人多任务环境

Linux 底下执行一个指令时,系统会将相关的权限、属性、程序代码与数 据等均加载内存,并给予这个单元一个进程标识符 (PID),最终该指令可以进行的任务则与这个 PID 的权限有关。


  • 多人环境:

在 Linux 系统上面 具有多种不同的账号, 每种账号都有都有其特殊的权限,只有一个人具有至高无上的权力,那就是 root (系统管理员)。除了 root 之外,其他人都必须要受一些限制的!而每个人进入 Linux 的环境设 定都可以随着每个人的喜好来设定。


  • 多任务行为:

我们的 Linux 可以让 CPU 在各个工作间进行切换, 也就是说,其实每个工作都仅占去 CPU 的几个指令次数,所以 CPU 每秒就能够在各个进程之间进行切换啦!

CPU 切换进程的工作,与这些工作进入到 CPU 运作的排程会影响到系统的整体效能! 目前 Linux 使用的多任务切换行为是非常棒的一个机制,几乎可以将 PC 的 性能整个压榨出来! 由于效能非常好,因此当多人同时登入系统时,其实会感受到整部主机好像就 为了你存在一般! 这就是多人多任务的环境


多重登入环境的七个基本终端窗口:

在 Linux 当中,默认提供了六个文字界面登入窗口,以及一个图形界面,你可以使用 [Alt]+[F1].....[F7] 来切换不同的终端机界面,


  • 特殊的进程管理行为:

如果我在 Linux 下以文字界面登入,在屏幕当中显示错误讯息后就挂了~动都不能动,该如何是好!? 这个时候那 默认的七个窗口就帮上忙啦!你可以随意的再按 [Alt]+[F1].....[F7] 来切换到其他的终端机界面,然后以 ps -aux 找出刚刚的错误进程,然后给他 kill 一下,哈哈,回到刚刚的终端机界面!恩~棒!又回复正常啰!

为什么可以这样做呢?我们刚刚不是提过吗?每个进程之间可能是独立的,也可能有相依性, 只要 到独立的进程当中,删除有问题的那个进程,当然他就可以被系统移除掉啦!


  • bash 环境下的工作管理 (job control)

我们登入 bash 之后, 就是取得一 个名为 bash 的 PID 了,而在这个环境底下所执行的其他指令,就几乎都是所谓的子进程了。那么, 在这个单一的 bash 接口下,我可不可以进行多个工作啊? 当然可以啦!可以『同时』进行喔!举 例来说,我可以这样做:

[root@study ~]# cp file1 file2 &

在这一串指令中,重点在那个 & 的功能,他表示将 file1 这个文件复制为 file2 ,且放置于背景中 执行, 也就是说执行这一个命令之后,在这一个终端接口仍然可以做其他的工作!而当这一个指令 (cp file1 file2) 执行完毕之后,系统将会在你的终端接口显示完成的消息!


  • 多人多任务的系统资源分配问题考虑:

多人多任务确实有很多的好处,但其实也有管理上的困扰,因为使用者越来越多, 将导致你管理上 的困扰哩!另外,由于使用者日盛,当使用者达到一定的人数后, 通常你的机器便需要升级了,因 为 CPU 的运算与 RAM 的大小可能就会不敷使用!

posted on 2017-10-27 11:25  uetucci  阅读(4906)  评论(0编辑  收藏  举报