


下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、. 进程的根本概念程序是为了完成某种任务而设计的软件 ,比方 vi 是程序 。什么是进程呢 ? 进程就是运 行中的程序。一个运行着程序,可能有多个进程。比方Web效劳器是Apache效劳器,当管 理员启动效劳后 , 可能会有好多人来访问 , 也就是说许多用户同时请求 d , Apache 效劳 器将会创立多个 d 进程来对其进行效劳 。首先我们看看进程的定义 。进程是一个具有独立功能的程序关于某个数据集合的一次可以 并发执行的运行活动 , 是处于活动状态的电脑程序 。 进程作为构成系统的根本细胞 , 不仅是系 统内部独立运行的实体 , 而且是独立竞争资源的根本实体 。了解进程的本质 ,对于理解
2、 、描述 和设计操作系统有着极为重要的意义 。 了解进程的活动 、状态, 也有利于编制复杂程序 。二. 进程的属性进程的定义 :一个进程是一个程序的一次执行的过程 ; 程序是静态的 ,它是一些保存在磁 盘上的可执行的代码和数据集合 ; 进程是一个动态的概念 , 它是 Linux 系统的根本的调度单 位。一个进程由如下元素组成 :程序读取的上下文 , 它表示程序读取执行的状态 。程序当前执行的目录 。程序效劳的文件和目录 。程序访问的权限 。内存和其他分配给进程的系统资源 。Linux 进程中最知名的属性就是它的进程号 (Process Idenity Number, PID) 和它的父进程号
3、(Parent Process ID,PPID)。 PID 、 PPID 都是非零正整数 。 一个 PID 唯一地标识一个进程 。 一个进程创立新进程称为创立了子进程 (Child Process)。 相反地 , 创建子进程的进程称为父进程 。 所有进程追溯其祖先最终都会落到进号为 1 的进程身上 , 这个 进程叫做 init 进程 ,是内核自举后第一个启动的进程 。 init 进程扮演终结父进程的角色 。 因为 init 进程永远不会终止 ,所以系统总是可以确信它的存在 , 并在必要的时候以它为参 照。 如果某个进程它在衍生出来的全部子进程结束之前被终止 , 就会出现必须以 init 为参照
4、 的情况 。 此时那些失去了父进程的子进程就都会以 init 作为它们的父进程 。如果执行一下ps-af 命令 , 可以列出许多父进程 ID 为 1 的进程来 。 Linux 提供了一条 pstree 命令 ,允 许用户查看系统内正在运行的各个进程之间的继承关系。 直接在命令行中输入 pstree 即可, 程序会以树状结构方式列出系统中正在运行的各进程之间的继承关系 。三. 理解 Linux 下进程的结构Linux 中一个进程在内存里有三局部数据 ,就是数据段 、堆栈段、代码段。基于 I386 兼容的中央处理器 ,都有上述三种段存放器 , 以方便操作系统的运行 , 如以下图所示 。代码段数据段
5、堆栈段代码段是存放了程序代码的数据, 假设机器中有数个进程运行相同的一个程序, 那么它们就可以使用同一个代码段 。 而数据段那么存放程序的全局变量、 常数及动态数据分配的数据空间。 堆栈段存放的就是子进程的返回地址、子程序的参数及程序的局部变量 。堆栈段包含在进程控制块PCB(Process Control Block)中。PCB处于进程核心堆栈的底部,不需要额外分配空间 。四 . 进程状态现在我们来看看 , 进程在生存周期中的各种状态及状态的转换 。 下面是 Linux 系统的进 程状态模型的各种状态 。用户状态 :进程在用户状态下运行的状态。内核状态 :进程在内核状态下运行的状态。内存中就
6、绪 :进程没有执行 , 但处于就绪状态 , 只要内核调度它 , 就可以执行 。内存中睡眠:进程正在睡眠并且进程存储在内存中,没有被交换到SWAP设备。就绪且换出 : 进程处于就绪状态 ,但是必须把它换入内存 ,内核才能再次调度它运行睡眠且换出 : 进程正在睡眠 ,且被换出内存 。被抢先 :进程从内核状态返回用户状态时 ,内核抢先于它做了上下文切换, 调度了另一个进程 。原先这个进程就处于被抢先状态 。僵死状态 (zombie) :进程调用 exit 结束 ,进程不再存在 ,但在进程表项中仍有记录 , 该记录可由父进程收集 。现在我们从进程的创立到退出来看看进程的状态转化 。需要说明的是 , 进
7、程在它的生命周 期里并不一定要经历所有状态 。五 .Linux 进程的创立fork 函数在 Linux 下产生新的进程的系统调用 ,这个函数名是英文中分叉的意思 。 为 什么取这个名字呢 ? 因为一个进程在运行中 ,如果使用了 fork ,就产生了另一个进程 , 于 是进程就分叉了 ,所以这个名字取得很形象。fork的语法如下所示:代码如下 :#include#includepid_t fork();在 Linux 网络编程中经常用到 fork() 系统调用 。 例如在一个客户机 /Web 效劳器构建的 网络环境中 , Web 效劳器往往可以满足许多客户端的请求 。 如果一个客户机要访问 We
8、b 效劳 器, 需要发送一个请求 , 此时由效劳器生成一个父进程 , 然后父进程通过 fork() 系统调用产 生一个子进程 , 此时客户机的请求由子进程完成 。 父进程可以再度回到等待状态不断效劳其他 客户端 。 原理如以下图所示 。有一个更简单的执行其他程序的函数 system , 参数 string 传递给一个命令解释器 ( 一 般为 sh) 执行 , 即 string 被解释为一条命令 , 由 sh 执行该命令 。 假设参数 string 为一个 空指针 , 那么检查命令解释器是否存在 。 该命令可以和同命令行下的命令形式相同 , 但由于命令 作为一个参数放在系统调用中 ,应注意编译时
9、对特殊意义字符的处理 。 命令的查找是按 PATH 环境变量的定义执行的 。 命令所生成的后果一般不会对父进程编程造成影响 。返回值 : 当参数 为空指针时 , 只有当命令解释器有效时返回值为非零 。 假设参数不为空指针 ,返回值为该命令 的返回状态 ( 同 waitpid() 的返回值 。 命令无效或语法错误那么返回非零值 , 所执行的命令被 终止 。其他情况那么返回 -1. 它是一个较高层的函数 ,实际上相当于在 shell 下执行一条命 令, 除了 system 之外 ,系统调用 exec 来执行一个可执行文件 , 来代替当前进程的执行映 像。 系统调用 exit 的功能是终止发出调用的
10、进程 。 sleep 函数调用用来指定进程挂起的秒 数。 wait 函数族用来等待和控制进程 。 poppen 函数和 system 函数类似 , 区别是它用管道 方式处理输出 。父进程和子进程的关系是管理和被管理的关系, 当父进程终止时 , 子进程也随之而终止 。但子进程终止时 , 父进程并不一定终止 。比方 d 效劳器运行时 ,我们可以杀掉其子进 程, 父进程并不会因为子进程的终止而终止 。六. 进程的管理1. 启动进程输入需要运行的程序的程序名 ,执行一个程序 ,其实也就是启动了一个进程 。在 Linux 系统中 , 每个进程都具有一个进程号 (PID) , 用于系统识别和调度进程 。
11、启动一个进程有两个 主要途径 :手工启动和调度启动 ,后者是事先进行设置 ,根据用户要求自动启动 。 由用户输入 命令 ,直接启动一个进程便是手工启动进程 。但手工启动进程又可以分为很多种 ,根据启动的 进程类型不同 ; 性质不同 , 实际结果也不一样 。(1) 前台启动前台启动是手工启动一个进程的最常用的方式。 用户键入一个命令 df , 就已经启动了一个进程 ,而且是一个前台的进程 。 这时候系统其实已经处于多进程状态 。有许多运行在后台 的、 系统启动时就已经自动启动的进程正在悄悄运行着 。有的用户在键入 df 命令以后赶紧使 用 ps -x 查看,却没有看到 df 进程 ,会觉得很奇怪
12、 。其实这里因为 df 这个进程结束太 快, 使用 ps 查看时该进程已经执行结束了 。如果启动一个比拟耗时的进程 ,例如在根命令下 运行 :find ,然后使用 ps aux 查看 ,就会看到在里面有一个 find 进程。(2) 后台启动直接从后台手工启动一个进程用得比拟小一些, 除非是该进程甚为耗时 ,且用户也不急着需要结果 。假设用户要启动一个需要长时间运行的格式化文本文件的进程 , 为了不使整个 shell 在格式化过程中都处于瘫痪状态 , 从后台启动这个进程是明智的选择 。2. 进程调度当需要中断一个前台进程的时候 , 通常使用 Ctrl+C 组合键 。 但是对于一个后台进程 , 就
13、不是一个组合键所能解决的了 ,这时就必须使用 kill 命令 。该命令可以终止后台进程 。至于终止后台进程的原因有很多 ,或许是该进程占用的 CPU 时间过多 ; 或许是该进程已经挂死 这种情况是经常发生的 。 kill命令的工作原理是 : 向 Linux 系统的内核发送一个系统操作信号和某个程序的进程标识号 ,然后系统内核就可以对进程标识号指定的进程进行操作 。七 .Linux的第一个进程 : initinit 是 Linux 系统执行的第一个进程 ,进程 ID 为 1, 是系统所有进程的起点 ,主要用 来执行一些开机初始化脚本和监视进程。Linux系统在完成核内引导以后就开始运行init程
14、序 , init 程序需要读取配置文件 /etc/inittab。 Inittab 是一个不可执行的文本文件, 它由假设干行命令所组成 。在 RHEL 4 系统中 ,inittab 配置文件的内容如下所示 :代码如下 :#inittab#author#Default runlevel.the runlevels used by rhs are:#0 - halt (do not set initdefault to this)#1 - single user mode#2 - multiuser,without nfs (the same as 3, if you do not haver n
15、etworking)#3 - full multiuser mode#4 - unused#5 - X11#6 - reboot (do not set initdefault to this)#/ 表示当前缺省运行级别为 5, 启动系统进入图形化界面id:5:initdefault:/ 启动时自动执行脚本#system initialization./ 当运行级别为 5 时, 以 5 为参数运行脚本 ,init 将等待其返回/ 在启动过程中允许按 ctrl-alt-delete 重启系统#trap ctrl-alt-deleteca:ctrlaltdel:/sbin/shutdown -t3
16、 -r now#/ 在运行级别 2、3、4、5 以上 ttyX 为参数执行 /sbin/mingetty 程序 ,翻开 ttyX 终端用于用户登录 ,如果进程退出那么再次运行 mingetty 程序#run gettys in standard runlevels1:2345:respawn:/sbin/mingetty tty12:2345:respawn:/sbin/mingetty tty23:2345:respawn:/sbin/mingetty tty34:2345:respawn:/sbin/mingetty tty45:2345:respawn:/sbin/mingetty tt
17、y56:2345:respawn:/sbin/mingetty tty6/ 在级别 5 上运行 xdm 程序 ,提供 xdm 图形方式登录界面 x:5:respawn:/etc/x11/prefdm -nodaemon#run xdm in runleverl 5Inittab 配置文件每行的根本格式如下 。 id:runlevels:action:procees 其中某些局部可以为空 , 下面我们逐一介绍 。12 个字符 , 配置行的惟一标识 ,在配置文件中不能重复 。配置行适用的运行级别 , 在这里可填入多个运行级别 ,比方 Linux 有 7 个运行级别 :0:关机1:单用户字符界面2
18、:不具备网络文件系统 (NFS) 功能的多用户字符界面 3:具有网络功能的多用户字符界面4:保存不用 5:具有网络功能的图形用户界面 6:重新启动系统init 有如下几种行为 , 如下表所示 。,并在退出时重新执行12345 或者 35 等 。init 行为行为描述respawn启动并监视第 4 项指定的 process , 假设 process 终止那么重启它wait执行第 4 项指定的 process , 并等待它执行完备once执行第 4 项指定的 process boot不管在哪个执行等级 , 系统启动时都会运行第 4 项指定的 process bootwait, 且一直不管在哪个执行
19、等级 , 系统启动时都会运行第 4 项指定的 process等它执行完备off关闭任何动作 , 相当于忽略该配置行ondemand进入 ondemand 执行等级时 ,执行第 4 项指定的 processinitdefault系统启动后进入的执行等级 , 该行不需要指定 processsysinit不管在哪个执行等级 , 系统会在执行 boot 及 bootwait 之前执行第 4 项指 定的 processpowerwait当系统的供电缺乏时执行第 4 项指定的 process , 且一直等它执行完备powerfailnow当系统的供电严重缺乏时执行第 4 项指定的 processctrla
20、ltdelkbrequest当用户按下特殊的组合键时执行第 4 项指定的 process ,此组合键需在keymaps文件定义当用户按下 ctrl+alt+del时执行的操作Process 为 init 执行的进程 ,这些进程都保存在目录中 ,其中的 X 代表运行级别 , rc 程序接收 X 参数 , 然后运行下面的程序 。使用如下命令可以查看目录内容 。代码如下 :total 112-rxwr-xr-x 1 root root 2352 2004-3-17 rc使用如下命令查看的内容代码如下 :这些文件都是符号链接 ,以 S 打头的标识启动该程序 , 而以 K 打头的标识终止该程序 , 后面
21、的数字标识执行顺序 ,越小越先执行 , 剩下的标识程序名 。系统启动或者切换到该运行级 别时会执行以 S 打头的程序 , 系统切换到该运行级别时会执行以 K 打头的程序 。这个目录下的程序可通过 chkconfig 程序进行管理 , 当然这个目录下的程序需要符合一 定标准 ,如果了解 shell 编程 ,可以查看这些符号链接所指向的程序的源码 。init 也是一个进程 ,和普通的进程具有一样的属性 。 比方修改了 /etc/inittab, 想让修改马上生效 ,可通过运行 kill-SIGHUP 1 来实现 ,也可通过运行 init q 来实现 。八 .Linux 的线程简介线程的定义线程 (
22、thread) 是在共享内存空间中并发的多道执行路径 ,它们共享一个进程的资源 ,如 文件描述和信号处理 。在两个普通进程 (非线程 ) 间进行切换时 ,内核准备从一个进程的上下 文切换到另一个进程的上下文要花费很大的开销。 这里上下文切换的主要任务是保存老进程CPU 状态并加载新进程的保存状态 ,用新进程的内存映像替换进程的内存映像 。线程允许你的 进程在几个正在运行的任务之间进行切换 ,而不必执行前面提到的完整的上下文 。 另外本文介 绍的线程是针对 POSIX 线程的 , 也就是 Pthread 。 也因为 Linux 对它的支持最好 ,相对进 程而言 , 线程是一个更加接近于执行体的概
23、念, 它可以与同进程中的其他线程共享数据,但拥有自己的栈空间 , 拥有独立的执行序列 。在串行程序根底上引入线程和进程是为了提高程序的 并发度 , 从而提高程序运行效率和响应时间。 也可以将线程和轻量级进程 (LWP) 视为等同的 ,但其实在不同的系统/实现中有不同的解释,LWP更恰当的解释为一个虚拟 CPU或内核的线 程。 它可以帮助用户态线程实现一些特殊的功能 。 Pthread 是一种标准化模型 , 它用来把一 个程序分成一组能够同时执行的任务 。2. 什么场合使用 Pthread ,即线程(1) 在返回前阻塞的 I/O 任务能够使用一个线程处理 I/O , 同时继续执行其他处理任 务。
24、(2) 在有一个或多个任务受不确定性事件 ,比方网络通信的可获得性影响的场合 ,能够使 用线程处理这些异步事件 , 同时继续执行正常的处理 。(3) 如果某些程序功能比其他的功能更重要 , 可以使用线程以保证所有功能都出现 , 但那 些时间密集型的功能具有更高的优先级 。以上三点可以归纳为 : 在检查程序中潜在的并行性时 ,也就是说在要找出能够同时执行任 务时使用 Pthread 。上面已经介绍了 ,Linux 进程模型提供了执行多个进程的能力 , 已经可 以进行并行或并发编程 , 可是纯种能够让你对多个任务的控制程序更好、 使用资源更少 ,因为一个单一的资源 , 如全局变量 ,可以由多个线程共享 。而且,在拥有多个处理器的系统上 ,多 线程应用会比用多个进程实现的应用执行速度更快 。进程和线程的开展1999 年 1 月发布的内核中 ,进程是通过系统调用 fork 创立的 , 新的进程是原来进程的 子进程 。需要说明的是 ,在版本中 ,不存在真正意义上的线程 (thread) 。 Linux 中常用的线 程 Pthread 实际上是通过进程来模拟的 。 也就是说 Linux 中的线程也是通过 fork 创立 的,是轻进程 。只默认允许 4096 个进程 / 线程同时运行 。高端系统同时要效劳上千个用户 , 所以这显然是一个问题 , 它一度是阻碍 L
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年法律法规的试题及答案
- 2025年大数据交易所行政人事招聘笔试预测试题及答案
- 2025年附条件股权转让合同范本-股权转让合同样本
- 2025年中央办公厅机关公开遴选公务员面试预测题及答案
- 2025年高中技术学业水平考试试题模拟题(答案+解析)
- 2025年高级经济师笔试真题及参考答案
- 2025年骨灰堂管理员招聘面试题库附答案
- 秦的统一大业历史事件背景探究教学方案
- 股东业务持续性协议
- 自己做菜600字(8篇)
- 报案材料范文模板
- 电商合伙经营合同
- 水利水电工程单元工程施工质量验收评定表及填表说明
- HG+20231-2014化学工业建设项目试车规范
- 《百变扭扭棒》大班艺术课件
- FZT 73013-2017 针织泳装行业标准
- 软件开发功能验收表
- 生产部门年度经营计划
- 售后工程师的安全意识与操作规范
- 热力公司入户维修培训课件
- 给予肠内营养支持品管圈课件
评论
0/150
提交评论