10_Linux下进程的创建与使用

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

scheduling)
• Linux操作系统负责在各个进程之间进行调度,轮流使每个进程占用 一个CPU时间片。
• Linux中,每个进程在创建时都会被分配一个数据结构,称为进程控
制块(Process Control Block,简称PCB),其中有一个优先级属性, Linux根据它来决定各个进程从CPU获得的时间片大小。
15
• 文件系统信息:
– 进程可以打开文件系统中的文件,系统需要对这些文件进行跟踪。
– 系统使用这类字段记录进程所打开的文件描述符信息。 – 不同的进程打开同一个文件时,其使用的文件描述符不同。
• 时间和定时器:
– 系统在这些字段中保存进程的建立时间,以及在其生命周期中所 花费的 CPU 时间。
16
• 进程的task_struct数据结构包括了进程标识符PID、进 程的状态、调度信息、相关文件标识符等信息。
12
进程的状态
• Linux 进程主要有如下几种状态: 运行、就绪、和等待(休眠)
• Running(运行态):得到CPU控制权,它的程序正在运行,该进程所处的状态为运行状态。
(在系统中,只有一个进程处于此状态) 。
5
1. 进程的概念
–一个程序可以对应多个进程。程序的每一个正在运行的副本都 有其自己的进程。同时运行的多个进程之间相互隔开,除非需 要交换数据,否则互不影响。
• 进程和任务的区别:
任ຫໍສະໝຸດ Baidu(命令)cat abc | more运行了两个进程。
6
进程的特点
–并发性:引入进程的目的是为了实现在系统中同时运 行多个程序。 –动态性:进程随着创建而诞生,随着撤销而消亡。
23
system2程序
Linux下进程的结构
• Linux下一个进程在内存里有三部份的数据:
– 代码段:存放了程序代码的数据,假如机器中有数个进程运行相同的一个程序,那么 它们就可以使用同一个代码段。 – 堆栈段:存放的就是子程序的返回地址、子程序的参数以及程序的局部变量。 – 数据段:存放程序的全局变量,常数以及动态数据分配的数据空间(比如用malloc之 类的函数取得的空间)。
1274 pts/2 S 0:00 -bash
1463 pts/1 S 0:00 oclock -transparent -geometry 135x135-10+40 1465 pts/1 S 0:01 emacs Makefile 1480 pts/1 S 0:00 ./system1 1481 pts/1 R 0:00 ps -ax Done.
改变只影响其本身,不会对其它进程产生影响。
– 一个进程的运行出现错误时并不会影响到其它进程的
顺利运行,这是Linux系统具有高度稳定性的原因之一。
19
目录
1. 进程简介
2. 启动新进程
3. 替换进程映像 4. 复制进程映像(fork函数)
2. 启动新进程
• system函数它是一个较高层的函数,实际上相当于在SHELL环境下执行一条命令。
• 进程相关的上下文信息:
– 进程可被看成是系统状态的集合,随着进程的运行,这一集合发 生变化。进程上下文就是用来保存系统状态的 task_struct 字段。
– 当调度程序将某个进程从运行状态切换到暂停状态时,会在上下 文中保存当前的进程运行环境,包括 CPU 寄存器的值以及堆栈信
息;
– 当调度程序再次选择该进程运行时,则会从进程上下文信息中恢 复进程的运行环境。
#include <stdlib.h>
#include <stdio.h> int main(){ printf(“Running ps with system\n”); system(“ps -ax”); printf(“Done.\n”); exit(0); }
21
system1程序
程序运行结果
$ ./system1
Running ps with system PID TTY STAT TIME COMMAND 1 ? S 0:05 init
2 ? SW 0:00 [keventd]
... 1262 pts/1 S 0:00 /bin/bash 1273 pts/2 S 0:00 su -
– 程序是存储在磁盘上的可执行的机器指令和数据的实体,是静态的;而进程 则可以看成是运行中的程序,包括所有当前CPU中的活动信息等,进程是动态
的。
– 和进程联系在一起的不仅有程序的指令和数据,而且还有当前的指令指 针、所有的 CPU 寄存器以及用来保存临时数据的堆栈等,所有这些都随
着程序指令的执行在变化。
目录
1. 进程简介
2. 启动新进程
3. 替换进程映像 4. 复制进程映像(fork函数)
目录
1. 进程简介
2. 启动新进程
3. 替换进程映像 4. 复制进程映像(fork函数)
1. 进程的概念
• 进程是一个具有独立功能的程序对某个数据集在处理机上 的执行过程和分配资源的基本单位。
• 程序与进程的区别:
• 系统将PID=0分配给调度进程,PID=1分配给初始化进程。
10
ps命令的结果
11
• 系统中每一个进程都包含一张 PCB表,每张PCB表对应到
一个 task_struct 数据结构,所有指向这些数据结构的
指针组成一个进程指针数组task,系统缺省的进程向量 数据大小是512,表示系统中可同时容纳512个进程。
#include <unistd.h> char **environ; int execl(const char *path, const char *arg0, ..., (char *)0); int execlp(const char *file, const char *arg0, ..., (char *)0); int execle(const char *path, const char *arg0, ..., (char *)0, char *const envp[]); int execv(const char *path, char *const argv[]); int execvp(const char *file, char *const argv[]); int execve(const char *path, char *const argv[], char *const envp[]);

zombie僵尸进程:进程已终止,但在 task 数组中仍占据着一个 task_struct 结 构。
13
14
• 调度信息: 调度程序利用该信息完成进程之间的切换。 • 进程间通讯的信息: 系统利用这一信息实现进程间的通讯。
• 进程链信息(进程间关系):
– 除初始化进程之外,任何一个进程都具有父进程。每个进程都是从父进 程中“克隆”出来的。 – 进程链则包含进程的父进程指针、和该进程具有相同父进程的兄弟进程 指针以及进程的子进程指针。 – 利用这个链表中的信息,内核可以很容易地找到某个进程。
26
利用exec系列函数启动ps程序示例
#include <unistd.h> /* Note that we need a program name for argv[0] */ char *const ps_argv[] ={“ps”, “-ax”, 0}; /* Example environment, not terribly useful */ char *const ps_envp[] ={“PATH=/bin:/usr/bin”, “TERM=console”, 0};
9
• PCB表中包含了很多重要的信息,供系统调度和进程本身执行使 用,其中最重要的是进程 ID( process ID ,进程标识符),是 一个非负整数,在Linux操作系统中唯一地标志一个进程,在最 常使用的 I386架构(即PC使用的架构)上,是一个非负的整数 的变化范围是0~32767,这是我们所有可能取到的进程ID。
• 文件系统uid 和 gid:用于检测进程对文件系统访 问的权限;
• 保存的uid 和 gid:进程第一次调用某程序时设置的最初的有效uid和 gid。
18
• 进程所占的内存区域:
– 每个进程执行都需要占用一定的内存区域,此区域用 于保存该进程所运行的代码和所使用的数据变量。 – 此区域是分配给一个进程的虚拟空间,其内部数据的
17
• 安全信息:
– Linux 使用用户标识符和组标识符判断用户对文件和目录的访问 许可。 – Linux 系统中的所有文件或目录均具有所有者和许可属性,Linux 据此判断某个用户对文件的访问权限。 – 对一个进程而言,系统在 task_struct 结构中记录如下四对标识
符:
• 实际uid 和 gid:文件本身的uid和 gid; • 有效uid 和 gid:进程目前运行的uid和 gid;
– 若需要相互合作进行数据的交流,则需要在各进程之间建立一种“进程 间通讯( Inter-Process Communication ,IPC)”机制,常见的有信号 和管道等;
– 若出现互斥关系,如调用同一程序(此程序不允许同时被运行,如数据
库、文件操作),则采用锁定机制。
8
• Linux 中 多 进 程 同 时 运 行 的 实 现 原 理 : 进 程 调 度 ( process
多进程是操作系统,尤其是并发程序设计中非常重 要的概念,目的是为提高程序的运行效率,保持 CPU 的最大利用率。
7
进程的特点
• 多进程之间相互独立,必要时发生联系。
– 进程在运行过程中,要使用许多计算机资源,例如 CPU、内存、文件、 Printer等。若使用相同资源,为避免冲突,必须设定轮流使用;
系统如果同时运行数个相同的程序,它们之间就 不能使用同一个堆栈段和数据段。
24
目录
1. 进程简介
2. 启动新进程
3. 替换进程映像 4. 复制进程映像(fork函数)
3.替换进程映像
• 在Linux中可使用exec系列函数使一个进程来启动另一个程序的执行。 • exec系列函数包括:execl,execlp,execle,execv,execve和execvp

Waiting(就绪态):它们已经准备就绪,一旦得到CPU,就立即可以运行,这些进程所取
的状态为就绪状态。(有多个进程处于此状态)

Stop(等待态、停止态、休眠态):进程不能使用CPU。若一个进程正在等待某个事件
的发生(如等待I/O的完成),而暂停执行,这时,即使给它CPU时间,它也无法执行,则称 该进程处于等待状态。
22
system(“ps -ax”); --> system(“ps -ax &”);
$ ./system2
Running ps with system PID TTY STAT TIME COMMAND 1 ? S 0:05 init 2 ? SW 0:00 [keventd] ... Done. $ 1246 ? S 0:00 kdeinit: klipper -icon klipper -miniicon klipper 1274 pts/2 S 0:00 -bash 1463 pts/1 S 0:00 oclock -transparent -geometry 135x135-10+40 1465 pts/1 S 0:01 emacs Makefile 1484 pts/1 R 0:00 ps -ax
/* Possible calls to exec functions */
execl(“/bin/ps”, “ps”, “-ax”, 0); /* assumes ps is in /bin */ execlp(“ps”, “ps”, “-ax”, 0); /* assumes /bin is in PATH */ execle(“/bin/ps”, “ps”, “-ax”, 0, ps_envp); /* passes own environment */
Ch5_1 Linux下的多进程编程
复习与回顾
• 上节课内容
– 格式化输入输出(fprintf,fscanf,sprintf) – 缓冲区函数
(setbuf,setbuffer,setlinebuf,setvbuf,fflush,fpurge)
– 文件定位与出错检测(rewind,fseek,ftell,feof,ferror) – 系统调用(底层文件访问)(open、write)
相关文档
最新文档