进程控制与进程间通信.

上传人:我** 文档编号:116570212 上传时间:2019-11-16 格式:PPT 页数:108 大小:863KB
返回 下载 相关 举报
进程控制与进程间通信._第1页
第1页 / 共108页
进程控制与进程间通信._第2页
第2页 / 共108页
进程控制与进程间通信._第3页
第3页 / 共108页
进程控制与进程间通信._第4页
第4页 / 共108页
进程控制与进程间通信._第5页
第5页 / 共108页
点击查看更多>>
资源描述

《进程控制与进程间通信.》由会员分享,可在线阅读,更多相关《进程控制与进程间通信.(108页珍藏版)》请在金锄头文库上搜索。

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

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

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

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

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

6、ame *.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 10 procs memory swap io system cpu r b w swpd free buff cache si so bi bo in cs us sy id 0 0 0 0 55916 6128 38156 0 0 439 118 146 180 8 15 76 0

7、0 0 0 55252 6160 38160 0 0 0 32 112 54 26 1 73 系统调用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_cstim

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

9、坐标的0是1970年1月1日零点 u可以精确到微秒s(10-6秒) n localtime() u将坐标值转换为本地时区的年月日时分秒 n mktime u将年月日时分秒转换为坐标值 n ctime()和asctime() u坐标值和年月日时分秒转换为可读字符串 忙等待 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);

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

11、例如:copy-on-write技 术),但是系统核心的这些安排,对程序员透明 fork举例(1) 执行结果 1 ./fork1: BEGIN 2 a+b=30 3 a+b=230 4 ./fork1: END 3 a+b=230 4 ./fork1: END int 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

12、 + b); printf(“4 %s: ENDn“, argv0); fork举例(2) 执行结果 Hello pid=815 ppid=814,a=6 Bye Pid=814 child=815,a=6 Bye main() int a, pid; printf(“Hellon“); a = 3; pid = fork(); a += 3; if (pid 0) printf(“Pid=%d child=%d, a=%dn“, getpid(), pid, a); else if (pid = 0) printf(“pid=%d ppid=%d, a=%dn“, getpid(), get

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

14、ng格式列出每一个进程(控制列的数目 ) 命令ps举例 例:ps -ef命令的输出 UID 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 roo

15、t 173 1 0 16:11:14 ? 0:00 syslogd root 296 1 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 clien

16、t_ap 1403 命令ps列出的进程属性 uUID:用户ID(注册名) uPID:进程ID uC:CPU占用指数:最近一段时间(秒级别)进程占用CPU 情况。不同系统算法不同,例如:正占CPU进程10ms加1 ,所有进程1秒衰减一半 uPPID:父进程的PID uSTIME:启动时间 uSZ:进程逻辑内存大小(Size) uTTY:终端的名字 uCOMMAND:命令名 uWCHAN:进程睡眠通道(Wait Channel) uTIME:累计执行时间(占用CPU的时间) uPRI:优先级 uS:状态,S(Sleep),R(Run), Z(Zombie) exec系统调用 n 功能 u用一个指定的程序

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

最新文档


当前位置:首页 > 高等教育 > 大学课件

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