3 Linux 进程编程幻灯片

上传人:m****5 文档编号:54220875 上传时间:2018-09-09 格式:PPT 页数:60 大小:760.51KB
返回 下载 相关 举报
3 Linux 进程编程幻灯片_第1页
第1页 / 共60页
3 Linux 进程编程幻灯片_第2页
第2页 / 共60页
3 Linux 进程编程幻灯片_第3页
第3页 / 共60页
3 Linux 进程编程幻灯片_第4页
第4页 / 共60页
3 Linux 进程编程幻灯片_第5页
第5页 / 共60页
点击查看更多>>
资源描述

《3 Linux 进程编程幻灯片》由会员分享,可在线阅读,更多相关《3 Linux 进程编程幻灯片(60页珍藏版)》请在金锄头文库上搜索。

1、Linux 进程编程,Linux Process programme,课程目标,进程的概念 进程的内存布局 Linux下进程的控制 创建新进程 进程间同步 僵尸进程 Exec执行进程 守护进程,进程概念,进程的概念,通俗的讲,进程就是一个在运行的程序. 进程是一个具有独立功能的 程序 关于某个数据集合的一次可以并发执行的运行活动,是处于活动状态的计算机 程序 。 有一些特殊情况,多进程程序.一个程序的主进程,可能创建若干个子进程. 进程作为构成 系统 的基本细胞,不仅是 系统 内部独立运行的实体,而且是独立竞争资源的基本实体。 这里资源一般指CPU运行时间,内存,外部设备访问权,可执行文件,一

2、般讲软件是一个包含可以执行代码的文件,或者说是一些规定格式的二进制文件. 存在计算机的文件系统里面.而进程是一个开始执行但是还没有结束的程序的实例. 存在系统的内存之中.就是可执行文件的具体实现. 不同操作系统可执行程序的格式都不一样,如Linux下采用称为ELF的格式.而Windows采用称为PE的可执行格式.但总体上大体的结构类似.每一个程序都有一些固定段.而运行时进程操作系也是一样,大体上分为比较固定的几个段.,Linux 查看进程的命令,ps 查看进程的标准状况 top 看进程的CPU占用率和内存使用情况 /proc/ 这是一个虚拟目录,下面各个文件表示进程各种情息,可以用cat 查看

3、 比如1号进程,可以用查看各种状态 cat /proc/1/status,进程内存布局,进程内存分局,在长期计算机科学的发展当中,程序在内存分区已经形成固定的布局.无论Linux/Unix下的应用程序.还是Windows下的程序,甚至是在没有操作系统的下运行底层程序,如bootloader,以及ARM的单纯的C程序.它们都按大致固定的段来进行布局. 其它的开发语言,如Java之类也采用同样布局方式,保存时的分段,对于一个C程序而言,当一个程序还是一个可执行文件时.至少包含如下几个段 Text 段: 保存是机器代码 Data段 : 保存是已经初始化变量 BSS段(Block Storage St

4、art).:保存是未初始化的变量 这里只保存变量所占用空间尺寸一个数值,并未在内存中开展所有数 清晰的知道不同类型的变量分布在哪一个段里,是一个C开发者必备知识之一,可执行程序段的分配原则,代码段(text segment):存放CPU执行的机器指令(machine instructions)。也就是存储你的程序代码编译后的机器代码,在内存中,这一段是只读的.所有可执行代码即C的语句和函数都会被编译到可执行段中. 初始化数据段/数据段(initialized data segment/data segmen,包含静态初始化的数据,所以有初值的全局变量和static变量在data区。 未初始化数

5、据段/bss段,bss是英文Block Started by Symbol的简称,通常是指用来存放程序中未初始化的全局变量和静态变量的一块内存区域,在程序载入时由内核清0,所有未初始化的全局变量,包括括静态或非静态的,均保存在这一个段. 因为没有初始化数据,为了节约可执行文件空间,所以所有在BSS段里的程序只占一个标识符空间,和记录所占空间大小,其变量所占空间没有展开, 所有在BSS段里变量在装入时由操作系统统一清0 注意在可执行文件是不会有局域变量的空间的,因为他们要等于执行后在进程的空间动态在stack区创建.,分配实例,#include int a; /* 未初始,分配到bss 段 */

6、 static int b=3; /* 已初始化变量,分配到data段中*/ int c=4; /*已初始化变量,分配到data段中*/ static char d10=3,4;/*已初始始化变量,分配到data段中,其中数据直接写在data空间*/ main() int e=3; /* 局域变量,在程序文件里没有位置*/printf(“hello !”); printf(“%d,%d,%d,%s,%d”,a,b,c,d,e); ,验证分配空间,在Linux下,可以用nm导出符号表来查看变量是否分配在哪一个段中nm proc symbol.txt,运行后内存分区,当程序运行后.除了上述段会装入

7、进程空间,还有两个新的区分配在进程空间中. 栈段(stack), 保存函数的局部变量和函数参数。是一种“后进先出”(Last In First Out,LIFO)的数据结构,这意味着最后放到栈上的数据,将会是第一个从栈上移走的数据。 对于哪些暂时存贮的信息,和不需要长时间保存的信息来说,LIFO这种数据结构非常理想。在调用函数或过程后,系统通常会清除栈上保存的局部变量、函数调用信息及其它的信息。栈另外一个重要的特征是,它的地址空间“向下减少”,即当栈上保存的数据越多,栈的地址就越低。栈(stack)的顶部在可读写的RAM区的最后。因为栈是有限度的.因此.无限递归之类调用会将栈空间用关. 堆段(

8、heap):用于动态内存分配(dynamic memory allocation)。所有malloc的分配的内存空间都是从这一个区域分配出来.保存函数内部动态分配内存,是另外一种用来保存程序信息的数据结构,更准确的说是保存程序的动态变量。 堆是“先进先出”(First In first Out,FIFO)数据结构。它只允许在堆的一端插入数据,在另一端移走数据。堆的地址空间“向上增加”,即当堆上保存的数据越多,堆的地址就越高。,堆,栈分配原因,函数参数,函数返回值.局域变量均是保存在栈(stack)中. 所有malloc分配的空间,都是从堆(heap)中进行分配.用free把不用空间送回堆 C+

9、的new/delete是malloc的封装,进程典型分区,代码段(text segment)从地址低端开始(往上),栈底从地址高端地址往下(在这个特定的表示结构中,栈段从高地址向低地址扩展)。在堆顶和栈顶之间的虚拟地址空间是很大的(这保证了2个段不会互相干扰)。,程序运行的布局,代码段 (TEXT),数据段 (DATA),未初始化 数据段 (BSS),堆(heap),栈(stack),低地址,高地址,0x3FFFFFFF,0x00000000,Linux 进程内存布局,代码段 (TEXT),数据段 (DATA),未初始化 数据段 (BSS),堆(heap),栈(stack),低地址,高地址,0

10、x3FFFFFFF,0x00000000,命令行参数,环境变量,共享内存,.bss段和.data段的区别,用gcc编译可以发现program2编译之后所得的可执行文件比program1的要大得多。这是因为未初始化的变量会保存BSS段,并且只是这个段里放一个全局变量ar标识符和尺寸,并未占用太多空间.所以程序1较小,而程序2中的变量ar被初始化,将在data段中展开,因为整个程序也变得较大,栈区与堆区的区别,在一个应用程序的虚拟空间里,堆的尺寸远大于栈.而栈被频繁的使用,局域变量.函数参数等都需要栈的来处理.栈比一般开发者想象还要小.有时会小到只有4096字节. 因此在一个应用程序,分配一个巨大

11、的自动变量和分配一个巨大的全局变量一样,是一件非常不明智的事情,在运行时,会立刻造成程序段错误.比较好的做法是用动态分配的方法来分配巨大的结构.,进程控制,常见进程控制函数,常见进程控制函数 fork 创建一个新进程 exec 用一个新进程去执行一个命令行 exit 正常退出进程 abort 非正常退出一个进程 kill 杀死进程或向一个进程发送信号 wait 等待子进程结束 sleep 将当前进程休眠一段时间 getpid 取得进程编号 getppid 取得父进程编号,进程标识符,进程ID 也被称作进程标识符,是一个非负的整数,在Linux 操作系统中唯一地标志一个进程,进程ID相关的系统调

12、用,#include #include pid_t getpid(void); 取得当前进程标识 pid_t getppid(void); 取得当前进程父母进程标识 uid_t getuid(void); 来取得执行目前进程的用户识别码 uid_t geteuid(void); 用来取得执行目前进程有效的用户识别码 uid,euid区别请看下页 gid_t getgid(void); 取得当前进程组编号 gid_t getegid(void); 取得当前进程有效组编号,真实ID与有效ID,每个进程会被分配三个ID 真实,有效和保存ID(Real, Effective, Saved UID) 内

13、核会给每个进程关联两个和进程ID无关的用户ID,一个是真实用户ID,还有一个是有效用户ID或者称为setuid(set user ID)。 真实用户ID用于标识由谁为正在运行的进程负责。 有效用户ID用于为新创建的文件分配所有权、检查文件访问许可,还用于通过kill系统调用向其它进程发送信号时的许可检查。内核允许一个进程以调用exec一个setuid程序或者显式执行setuid系统调用的方式改变它的有效用户ID。,进程状态,进程状态(state)说明了它在某一个特定时刻的状况。大多数操作系统都允许如下几种状态 新建(new) 正在创建 运行(running) 正在执行指令 阻塞(blocked

14、) 等待像I/O这样的事件 就绪(ready) 等待分配处理器 完成(done) 结束,进程状态迁延图,新建,就绪,运行,阻塞,完成,进程被创建军,被选中运行,I/O完成,时间片到,I/O请求,正常结束,Linux 进程的状态,每个进程从创建到激活的整个生存周期.Linux 进程分为几个状态, 用户状态:进程在用户状态下运行的状态。 内核状态:进程在内核状态下运行的状态。 内存中就绪:进程没有执行,但处于就绪状态,只要内核调度它,就可以执行。 内存中睡眠:进程正在睡眠并且进程存储在内存中,没有被交换到SWAP设备。 就绪且换出:进程处于就绪状态,但是必须把它换入内存,内核才能再次调度它进行运行

15、。 睡眠且换出:进程正在睡眠,且被换出内存。 被抢先:进程从内核状态返回用户状态时,内核抢先于它,做了上下文切换,调度了另一个进程。原先这个进程就处于被抢先状态。 创建状态:进程刚被创建。该进程存在,但既不是就绪状态,也不是睡眠状态。这个状态是除了进程0以外的所有进程的最初状态。 僵尸状态(zombie):进程调用exit结束,进程不再存在,但在进程表项中仍有纪录,该纪录可由父进程收集。 各种状态可以互相转换,进程在它的生命周期里并不一定要经历所有的状态。,Linux 进程状态翻转,ps 查看进程状态,PS显示状态 D 不可中断睡眠 (通常是在IO操作) R 正在运行或可运行(在运行队列排队中) S 可中断睡眠 (在等待某事件完成) T Stopped, either by a job control signal or because it is being traced. W 正在换页(2.6.内核之前有效) X 死进程 (should never be seen) Z 僵尸,

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号