~~~~~~猫毛要开启疯狂写文章模式~~~~~~
前段时间简书不能发表文章可是把毛给憋坏了,希望同伴们多多留言点赞,这样猫毛才会更加有动力!!!
1 理解“什么是进程”(process)
当一个程序被加载到内存当中运作,那么在内存内的那个数据就被称为进程(process)。进程是操作系统上面非常重要的概念,所有系统上面跑的数据都会以进程的型态存在。
1.1 理解PID的定义
触发任何一个事件时,系统都会将他定义成为一个进程,并且给予这个进程一个ID,称为PID,同时依据启发这个进程的用户与相关属性关系,给予这个PID一组有效的权限设定。从此以后,这个PID能够在系统上面进行的动作,就与这个PID的权限有关了!
程序被加载成为进程以及相关数据的示意图
如图所示例,程序一般是放置在实体磁盘中(用windows的话来说就是D盘、E盘...),然后透过用户的执行来触发。触发后会加载到内存中成为一个个体,那就是进程。为了操作系统可管理这个进程,因此进程有给予执行者的权限/属性等参数,并包括程序所需要的脚本与数据或文件数据等,最后再给予一个PID。系统就是通过这个PID来判断该process是否具有权限进行工作的。
小总结:进程其实就是在计算机内存中运作的程序。
不过,linux是怎么为每一个bash设置不同权限的?如果人来做岂不是太烧脑了?😂
当我们登入并执行bash时,系统已经给我们一个PID了,这个PID就是依据登陆者的UID/GID(/etc/passward)来的。我们知道/bin/bash是一个程序,当dmtsai登入后,他取得一个PID号码为2234的进程,这个进程的User/Group都是dmtsai,而当这个程序进行其他作业时,例如执行touch命令时,那么由这个进程衍生出来的其他进程在一般状态下,也会沿用这个进程的相关权限的。
程序与进程之间的差
这里将程序与进程做个总结:
程序(program):通常为binary program,放置在储存媒体中(如硬盘,光盘),为实体文件的型态存在
进程(process):程序被触发后,执行者的权限与属性、程序的代码与所需数据等都会被加载内存中,操作系统并给予这个内存内的单元一个标识符(PID),可以说,进程就是一个正在运作中的程序。
1.2 子进程与父进程
当我们登入系统后,会取得一个bash的shell,然后,我们用这个bash提供的接口去执行另一个指令,例如/user/bin/passwd或者是touch等等,那些另外执行的指令也会被触发成为PID。那个后来执行指令才产生的PID就是子进程,而在我们原本的bash环境下,就称为父进程
因为每个进程都有一个PID,那某个进程的父进程是怎么判断的?实际上,通过Parent PID(PPID)就可以判断。我们在之前环境变量部分提到过环境变量的继承问题,子进程可以取得父进程的环境变量。
例如,在你的命令行中输入
ps -l
查询你当前的进程信息,这里用鸟哥的例子ps -l 输出的进程相关信息
在图中我们可以看到第一个bash的PID与第二个bash的PPID都是13928,因此就可以判断第一个bash是第二个的父程序。
有朋友会常常发现,明明将有问题的进程关闭了,怎么过一阵子又自动产生?而且新产生的那个进程的PID和原先的还不一样。这是怎么回事?不要怀疑,如果不是crontab工作排程的影响,肯定有一支父进程存在,所以你杀掉子进程后,父进程就会主动再生一支,因此要找出父进程,然后将它删除掉。
1.3 fork and exec 进程呼叫的流程
其实,子进程与父进程之间的关系还挺复杂的,最大的复杂点在于进程互相之间的呼叫。在Linux的进程呼叫通常称为 fork-and-exec的流程!
进程都会藉由父进程以复制(fork)的方式产生一个一模一样的子进程,然后被复制出来的子进程再以exec的方式来执行实际要进行的程序,最终就成为一个子进程的存在。
进程使用fork and exec 呼叫的情况示意图
1.4 了解常驻在内存的进程(daemon)
我们之前学的一些指令例如:ls/mv/cp等等都是执行完就结束了,也就是说,该项指令被触发后所产生的PID很快就会终止。那有没有一直在执行的进程呢?
我们知道系统每分钟都会去扫描/etc/crontab以及相关的配置文件,来进行工作排程。而这个工作排程就是crond这个程序所管理的,我们将他启动在背景当中一直持续不断的运作,也就是说“常驻在内存中的进程”。
常驻在内存中的进程通常都是负责一些系统所提供的功能以服务用户各项任务,因此这些常驻程序就会被我们称为服务(daemon)。系统的服务非常多,不过主要大致分成系统本身所需要的服务,例如刚提到的crond及atd,还有rsyslogd等等的。还有一些则是负责网络联机的服务,例如Apache,named,postfix,vsftpd...等等的。这些网络服务比较有趣的地方,在于这些程序被执行后,他会启动一个可以负责网络监听的端口(prot),以提供外部客户端(client)的联机要求。
以crontab来说,他的主要执行程序名称应该是cron或at才对,为什么要在最后加d?是因为Linux希望我们可以简单的判断该程序是否为daemon,所以,一般daemon类型的程序都会加上d在文件名后头,包括服务器篇我们会看到的httpd,vsftpd等等都是。
2. Linux 的多人多任务环境
通过前面的学习,我们现在知道了,其实在Linux系统底下执行一个指令时,系统会将相关的权限、属性、程序代码与数据等均加载内存,并给予这个单元一个进程标识符(PID),最终该指令可以进行的任务则与这个PID的权限有关。这也就是为什么Linux这么多用户,但是却每个人都可以拥有自己的环境。
- 多人环境:除了root之外,其他人都必须要受一些限制,而每个人进入Linux的环境设定都可以随着每个人的喜好设定(~/.bashrc)
- 多任务行为:
目前的CPU速度可高达几个GHz,这代表CPU每秒钟可以运作10的9次方这么多次指令。我们的Linux可以让CPU在各个工作间进行切换,其实每个工作都仅占去CPU的几个指令次数,所以CPU每秒就能够在各个进程之间进行切换啦。
CPU切换进程的工作,与这些工作进入到CPU运作的排程(CPU排程,非rontab排程)会影响到系统的整体效能!目前Linux使用的多任务切换行为是一个非常棒的机制,几乎可以将PC的性能整个压榨出来。由于效能非常好,因此当多人同时登入系统时,其实会感受到整部主机好像就是为了你存在一般。这就是多人多任务的环境。
2.1 多重登入环境的七个基本终端窗口
在Linux当中,默认提供了六个文字界面登入窗口以及一个图形界面,你可以使用[Alt]+[F1].....[F7]来切换不同的终端机界面,而且每个终端机界面的登陆者还可以不同人。其实,这也是多任务环境下所产生的一个情况,我们的Linux默认会启动六个终端机登入环境的程序,所以我们就会有六个终端机接口。
举例:六个终端机接口的好处
进行特殊的进程管理
Linux几乎可以说绝对不会当机的。因为他可以在任何时候,将某个被困住的进程杀掉,然后再重新执行进程而不用重新启动。如果我在Linux以下文字界面登入,在屏幕当中显示错误讯息后就挂了:动都不能动,如何是好?这个时候默认的七个窗口就榜上忙了,可以随意切换到其他的终端机界面,然后以ps-aux
找出刚刚的错误进程,然后给他kill
一下,回到刚刚的终端机界面,又恢复正常了。
2.2 单一bash接口下进行多个工作 &
其实,我们登入bash之后,就是取得一个名为bash的PID了,而在这个环境底下所执行的其他命令,就几乎都是所谓的子进程了。那么,在这个单一的bash接口下,我可不可以进行多个工作?当然可以,(使用&)
eg: cp file1 file2 &
在这串指令中,重点放在&
的功能,他表示将file1这个文件复制为file2,且放置于背景中执行,也就是说执行这个命令之后,在这个终端接口仍然可以做其他工作。而当cp file1 file2
指令执行完毕之后,系统会在你的终端接口显示完成的消息。
多人多任务的系统资源分配问题考虑
多人多任务确实又很多的好处,但其实也有管理上的困扰,因为使用者越来越多,将导致管理的困扰。另外,由于使用者日盛,CPU的运算与RAM的大小可能就会不敷使用。
网友评论