第7章 Linux编程环境之进程控制与进程间通信

上传人:豆浆 文档编号:47458793 上传时间:2018-07-02 格式:PPT 页数:111 大小:653.50KB
返回 下载 相关 举报
第7章 Linux编程环境之进程控制与进程间通信_第1页
第1页 / 共111页
第7章 Linux编程环境之进程控制与进程间通信_第2页
第2页 / 共111页
第7章 Linux编程环境之进程控制与进程间通信_第3页
第3页 / 共111页
第7章 Linux编程环境之进程控制与进程间通信_第4页
第4页 / 共111页
第7章 Linux编程环境之进程控制与进程间通信_第5页
第5页 / 共111页
点击查看更多>>
资源描述

《第7章 Linux编程环境之进程控制与进程间通信》由会员分享,可在线阅读,更多相关《第7章 Linux编程环境之进程控制与进程间通信(111页珍藏版)》请在金锄头文库上搜索。

1、第7章 进程控制与进程间通信17.1 进程控制2进程与程序n 程序 u指令和数据的集合 u存放在磁盘上的一个普通文件里 u文件的i节点中标为可执行,内容符合系统要求 n 进程 u包括指令段、用户数据段和系统数据段的执行环境 n 进程和程序的关系 u程序用于初始化进程的指令段和用户数据段,初始 化后,进程和初始化它的程序之间无联系 u进程运行时磁盘上的程序文件不可修改/删除 u同时运行的多个进程可由同一程序初始化得到,进 程之间没什么联系。内核通过安排它们共享指令段 以节省内存,但这种安排对用户来说是透明的3进程的组成部分(1)四部分:指令段,数据段,堆栈段和系统数据 n 指令段(Text)u程

2、序的CPU指令代码,包括:主程序和子程序编译 后的CPU指令代码,以及调用的库函数代码 u指令段的大小固定不变,只读 n 用户数据段 u全局变量,静态(static)变量,字符串常数 u允许数据段增长和缩小,实现内存的动态分配 系统调用sbrk()允许编程调整数据段的大小 内存管理库函数,如:malloc(),free()4进程的组成部分(2)n 用户堆栈段 u程序执行所需要的堆栈空间,实现函数的调用 用于保存子程序返回地址 在函数和被调函数之间传递参数 函数体内部定义的变量(静态变量除外) umain函数得到的命令行参数以及环境参数 存放在堆栈的最底部 main函数运行之前,这些部分就已经被

3、系统初始化 u堆栈段的动态增长与增长限制 n 系统数据段 u上述三部分在进程私有的独立的逻辑地址空间内 u系统数据段是内核内的数据,每个进程对应一套 包括页表和进程控制块PCB5进程逻辑地址空间的布局 6进程的系统数据在UNIX内核中,含有进程的属性,包括: u页表 u进程状态,优先级信息 u核心堆栈 u当前目录(记录了当前目录的i-节点),根目录 u打开的文件描述符表 uumask值 u进程PID,PPID u进程主的实际UID/GID,有效UID/GIDu进程组组号7user结构和proc结构n 进程PCB被分为user结构和proc结构两部分 uuser结构(约5000字节), 进程运行

4、时才需要的数据在user结构 核心态堆栈占用了较多空间 uproc结构(约300字节), 进程不运行时也需要的管理信息存于proc结构 u用户程序不能直接存取和修改进程的系统数据 u系统调用可用来访问或修改这些属性 chdir, umask,open, close setpgrp, getpid, getppid8进程的基本状态n 基本状态 u进程创建之后,主要有运行状态和睡眠状态(也叫阻塞 状态,等待状态,挂起状态,等等) u内核总是在分时处理运行状态的进程,而不顾那些处 于睡眠状态的进程 u睡眠状态的进程,在条件满足后转化为运行状态 u进程在睡眠时,不占用CPU时间 注意:在编程时,程序不

5、要处于忙等待状态9进程的调度n 调度优先级 u内核将可运行进程按优先级调度,高优先级进程优先 u进程的优先级总在不停地发生变化 u处于睡眠状态的进程一旦被叫醒后,被赋以高优先级 ,以保证人机会话操作和其它外设的响应速度 u用户程序用nice()系统调用有限地调整进程的优先 级10scanf(“%d“, 程序在串口终端上执行时操作员输入756然后按下回车 11time:进程执行的时间n 进程执行时间包括 u睡眠时间,CPU时间(用户时间和系统时间) u外部命令/usr/bin/time uB-shell和C-shell都有个内部命令time /usr/bin/time find /usr -na

6、me *.c -print Real 6.06 User 0.36 System 2.13 uC-shell: time find /usr -name *.h -print 0.4u 6.2s 0:10 61% 4+28k 0+0io 0pf+0w n 与CPU时间有关的命令vmstat$ vmstat 10procs memory swap io system cpur b w swpd free buff cache si so bi bo in cs us sy id0 0 0 0 55916 6128 38156 0 0 439 118 146 180 8 15 760 0 0 0

7、55252 6160 38160 0 0 0 32 112 54 26 1 7312系统调用times()n 系统调用times() 当前进程CPU时间,已结束子进程占用过的CPU时间 clock_t times(struct tms *buf); struct tms clock_t tms_utime; /* user CPU time */clock_t tms_stime; /* system CPU time */clock_t tms_cutime; /* user CPU time, terminated children */clock_t tms_cstime; /* sys

8、tem CPU time, terminated children */ ; n clock() u返回times()的四个CPU时间的总和。单位是 1/CLOCKS_PER_SEC秒 n getrusage()函数,times()函数的升级版本 u返回CPU时间,还返回表示资源使用状况的另外 14个值,包括内存使用情况,I/O次数,进程切换 次数13与时间有关的函数n 标准函数库中time():获得当前时间坐标 u坐标0为1970年1月1日零点,单位:秒 ut=time(0);和time(都会使t值为当前时间 坐标 n 函数gettimeofday() u获得当前时间坐标,坐标的0是1970

9、年1月1日零点 u可以精确到微秒s(10-6秒) n localtime() u将坐标值转换为本地时区的年月日时分秒 n mktime u将年月日时分秒转换为坐标值 n ctime()和asctime() u坐标值和年月日时分秒转换为可读字符串14忙等待 n 多任务系统中“忙等待”的程序是不可取的1 #include 2 main(int argc, char *argv)3 4 unsigned char buf1024;5 int len, fd;6 if ( (fd = open(argv1, O_RDONLY) 0) 13 write(1, buf, len); 14 15 u程序14

10、行前增加sleep(1):1秒定时轮询 uselect()调用可将睡眠时间设为10毫秒级精度15fork:创建新进程n 功能 ufork系统调用是创建新进程的唯一方式 u原先的进程称做“父进程”,新创建进程被称作“子进程 ”u完全复制:新进程的指令,用户数据段,堆栈段 u部分复制:系统数据段 n fork返回值:父子进程都收到返回值,但不相同 u返回值很关键,它用于区分父进程(返回值0,是子进 程的PID)和子进程(返回值=0),失败时返回-1 n 内核实现 u创建新的proc结构,复制父进程环境(包括user结构和 内存资源)给子进程 u父子进程可以共享程序和数据(例如:copy-on-wr

11、ite技 术),但是系统核心的这些安排,对程序员透明16fork举例(1)执行结果 1 ./fork1: BEGIN 2 a+b=30 3 a+b=230 4 ./fork1: END 3 a+b=230 4 ./fork1: ENDint a; int main(int argc, char *argv) int b;printf(“1 %s: BEGINn“, argv0);a = 10;b = 20;printf(“2 a+b=%dn“, a + b);fork();a += 100;b += 100;printf(“3 a+b=%dn“, a + b);printf(“4 %s: EN

12、Dn“, argv0); 17fork举例(2)执行结果 Hello PID=18378 ppid=18377, a=6 Bye PID=18377 child=18378, a=6 Byemain() int a, ret;printf(“Hellon“);a = 3;ret = fork();a += 3;if (ret 0) printf(“PID=%d child=%d, a=%dn“,getpid(), ret, a); else if (ret = 0) printf(“PID=%d ppid=%d, a=%dn“,getpid(), getppid(), a); else per

13、ror(“Create new process“);printf(“Byen“); 18命令psn 功能 u查阅进程状态(process status)(实际上就是将 内核中proc和user数组的内容有选择地打印 出来) n 选项 u用于控制列表的行数(进程范围)和列数(每进程列 出的属性内容) u无选项:只列出在当前终端上启动的进程 列出的项目有:PID,TTY,TIME,COMMAND ue选项:列出系统中所有的进程(进程范围) uf选项:以full格式列出每一个进程(控制列的数目) ul选项:以long格式列出每一个进程(控制列的数目 )19命令ps举例例:ps -ef命令的输出UID

14、 PID PPID C STIME TTY TIME COMMAND root 0 0 0 16:11:14 ? 0:00 sched root 1 0 0 16:11:14 ? 0:01 /etc/init root 2 0 0 16:11:14 ? 0:00 vhand root 3 0 0 16:11:14 ? 0:00 bdflush root 6547 335 0 16:15:05 01 0:00 server 4 1 root 175 1 0 16:11:14 ? 0:00 inetd root 173 1 0 16:11:14 ? 0:00 syslogd root 296 1

15、0 16:11:21 ? 0:00 /tcb/files/no_luid/sdd root 6551 291 80 16:17:16 08 0:37 busy_check root 335 1 0 16:11:31 01 0:00 server_ctl root 337 1 0 16:11:33 01 0:05 server_ap root 353 1 0 16:12:01 12 0:00 client_ctl 100.1.1.3 root 356 295 0 16:12:07 12 0:04 client_ap 140320命令ps列出的进程属性uUID:用户ID(注册名) uPID:进程ID uC:CPU占用指数:最近一段时间(秒级别)进程占用CPU 情况。不同系统算法不同,例如:正占CPU进程10ms加1 ,所有进程1秒衰减一半 uPPID:父进程的PID uSTIME:启动时间 uSZ:进程逻辑内存大小(Size

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 毕业论文

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