c语言多进程多线程编程
C语言多进程编程
一.多进程程序的特点
进程是一个具有独立功能的程序关于某个数据集合的一次可以并发执行的运行活动,是处
于活动状态的计算机程序。进程作为构成系统的基本细胞,不仅是系统内部独立运行的实体,而且是独立竞争资源的基本实体。
进程是资源管理的最小单位,线程是程序执行的最小单位。进程管理着资源(比如cpu、内存、文件等等),而将线程分配到某个cpu上执行。在操作系统设计上,从进程演化出线程,最主要的目的就是更好的支持多处理器系统和减小上下文切换开销。
进程的状态 系统为了充分的利用资源,对进程区分了不同的状态.将进程分为新建,运行,阻塞,就绪和完成五个状态.
新建 表示进程正在被创建, 运行 是进程正在运行,
阻塞 是进程正在等待某一个事件发生,
就绪 是表示系统正在等待CPU来执行命令, 完成 表示进程已经结束了系统正在回收资源.
由于UNIX系统是分时多用户系统, CPU按时间片分配给各个用户使用,而在实质上应该说CPU按时间片分配给各个进程使用, 每个进程都有自己的运行环境以使得在CPU做进程切换时不会\忘记\该进程已计算了一半的\半成品”. 以DOS的概念来说, 进程的切换都
是一次\中断\处理过程, 包括三个层次:
1) 用户数据的保存: 包括正文段(TEXT), 数据段(DATA,BSS), 栈段(STACK), 共享内存段(SHARED MEMORY)的保存.
2) 寄存器数据的保存: 包括PC(program counter,指向下一条要执行的指 令的地址),
PSW(processor status word,处理机状态字), SP(stack pointer,栈指针), PCBP(pointer of process control block,进程控制块指针), FP(frame pointer,指向栈中一个函数的local变量的首地址), AP(augument pointer,指向栈中函数调用的实参位置), ISP(interrupt stack pointer,中断栈指针), 以及其他的通用寄存器等. 3) 系统层次的保存:
包括proc,u,虚拟存储空间管理表格,中断处理栈.以便于该进程再一次得到CPU时间片时能正常运行。 既然系统已经处理好所有这些中断处理的过程, 我们做程序还有什么要担心 的呢? 我们尽可以使用系统提供的多进程的特点, 让几个程序精诚合作, 简单而又高效地把结果给它搞出来。
另外,UNIX系统本身也是用C语言写的多进程程序,多进程编程是UNIX的特点,当我们熟悉了多进程?将会对UNIX系统机制有一个较深的认识.首先我介绍一下多进程程序的
一些突出的特点:
1.1并行化
一件复杂的事件是可以分解成若干个简单事件来解决的, 这在程序员的大脑中早就形成了这种概念, 首先将问题分解成一个个小问题, 将小问题再细分, 最后在一个合适的规模上做成一个函数. 在软件工程中也是这么说的. 如果我们以图的方式来思考, 一些小问题的计算是可以互不干扰的, 可以同时处理, 而在关键点则需要统一在一个地方来处理, 这样程序的运行就是并行的, 至少从人的时间观念上来说是这样的. 而每个小问题的计算又是较简单的.
1.2简单有序
这样的程序对程序员来说不亚于管理一班人, 程序员为每个进程设计好相应的功能, 并通过一定的通讯机制将它们有机地结合在一起, 对每个进程的设计是简单的, 只在总控部分小心应付(其实也是蛮简单的), 就可完成整个程序的施工.
1.3.互不干扰
这个特点是操作系统的特点, 各个进程是独立的, 不会串位.
1.4.事务化
比如在一个数据电话查询系统中, 将程序设计成一个进程只处理一次查询即可, 即完成一个事务. 当电话查询开始时, 产生这样一个进程对付这次查询; 另一个电话进来时, 主控程序又产生一个这样的进程对付, 每个进程完成查询任务后消失. 这样的编程多简单, 只要做一次查询的程序就可以了.
二.常用的多进程编程的系统调用
2.1.fork() 创建一个新的进程.
功能:创建一个新的进程. 语法:
#include
说明:本系统调用产生一个新的进程, 叫子进程, 是调用进程的一个复制品. 调用进程叫父进程, 子进程继承了父进程的几乎所有的属性。
进程:代码段(程序代码)
堆栈段(局部变量、函数返回地址、函数参数) 数据段(全局变量、常数等)
在Linux系统中,系统调用fork后,内核为完成系统调用fork要进行几步操作: 第一步,为新进程在进程表中分配一个表项。系统对一个普通用户可以同时运行的进
程数是有限制的,对超级用户没有该限制,但不能超过进程表的最大表项的数目。
第二步,给子进程一个唯一的进程标识号(PID)。该进程标识号其实就是该表项在进
程表中的索引号。
第三步,复制一个父进程的进程表项的副本给子进程。内核初始化子进程的进程表项
时,是从父进程处拷贝的。所以子进程拥有与父进程一样的uid、当前目录、
当前根、用户文件描述符表等。
第四步,把与父进程相连的文件表和索引节点表的引用数加1。这些文件自动地与该子
进程相连。 第五步,内核为子进程创建用户级上下文。内核为子进程的代码段分配内存,并复制
父进程的区内容,生成的是进程的静态部分。
第六步,生成进程的动态部分,然后对父进程返回子进程的pid,对子进程返回0。
从父进程拷贝的内容主要有:
●用户标识符,包括实际用户号(real)和有效用户号(effective); ●环境变量
●打开的文件描述符、套接字描述符 ●信号处理设置 ●堆栈 ●目录
●进程组标志(process ID) ●会晤组标志(session ID) ●正文
子进程特有内容:
●进程号 ●父进程号
●进程执行时间
●未处理的信号被处理为空 ●不继承异步的输入输出操作
简述:fork() 调用成功时,分别返回两个整数,对父进程返回 〉0的整数,对子进程返回 0,
函数执行过程:
① 内核在系统进程表中,创建一个新条目;
② 复制父进程内容(已打开的文件描述符、堆栈、正文等);
③ 修改两者的堆栈,给父进程返回子进程号,给子进程返回0(父进程知道每个子进程
的标志号,而子进程可根据需要调用getppid() 来获得父进程的标志号)。 例子:
pid_t fork(void) #include
if((pid=fork())==0) {
//子进程代码 exit(0); }
else if(pid>0) {
//父进程代码 exit(0);
父进程 子进程1 子进程2 应用程序 fork ( ) } else
{
printf(\ exit(1); }
2.2.system() 子进程执行指定的命令
功能:产生一个新的进程, 子进程执行指定的命令. 语法:
#include
说明:
本调用将参数string传递给一个命令解释器(一般为sh)执行, 即string被解释为一条命令, 由sh执行该命令.若参数string为一个空指针则为检查命令解释器是否存在.
该命令可以同命令行命令相同形式, 但由于命令做为一个参数放在系统调用中, 应注意编译时对特殊意义字符的处理. 命令的查找是按PATH环境变量的定义的. 命令所生成的后果一般不会对父进程造成影响.
返回值:当参数为空指针时, 只有当命令解释器有效时返 …… 此处隐藏:2925字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [资格考试]机械振动与噪声学部分答案
- [资格考试]空调工程课后思考题部分整合版
- [资格考试]电信登高模拟试题
- [资格考试]2018年上海市徐汇区中考物理二模试卷(
- [资格考试]坐标转换及方里网的相关问题(椭球体、
- [资格考试]语文教研组活动记录表
- [资格考试]广东省2006年高应变考试试题
- [资格考试]LTE学习总结—后台操作-数据配置步骤很
- [资格考试]北京市医疗美容主诊医师和外籍整形外科
- [资格考试]中学生广播稿400字3篇
- [资格考试]CL800双模站点CDMA主分集RSSI差异过大
- [资格考试]泵与泵站考试复习题
- [资格考试]4个万能和弦搞定尤克里里即兴弹唱(入
- [资格考试]咽喉与经络的关系
- [资格考试]《云南省国家通用语言文字条例》学习心
- [资格考试]标准化第三范式
- [资格考试]GB-50016-2014-建筑设计防火规范2018修
- [资格考试]五年级上册品社复习资料(第二单元)
- [资格考试]2.对XX公司领导班子和班子成员意见建议
- [资格考试]关于市区违法建设情况的调研报告
- 二0一五年下半年经营管理目标考核方案
- 2014年春八年级英语下第三次月考
- 北师大版语文二年级上册第十五单元《松
- 2016国网江苏省电力公司招聘高校毕业生
- 多渠道促家长督导家长共育和谐 - 图文
- 2018 - 2019学年高中数学第2章圆锥曲线
- 竞争比合作更重要( - 辩论准备稿)课
- “案例积淀式”校本研训的实践与探索
- 新闻必须客观vs新闻不必客观一辩稿
- 福师大作业 比较视野下的外国文学
- 新编大学英语第二册1-7单元课文翻译及
- 年产13万吨天然气蛋白项目可行性研究报
- 河南省洛阳市2018届高三第二次统一考试
- 地下车库建筑设计探讨
- 南京大学应用学科教授研究方向汇编
- 2018年八年级物理全册 第6章 第4节 来
- 毕业论文-浅析余华小说的悲悯性 - 以《
- 2019年整理乡镇城乡环境综合治理工作总
- 广西民族大学留学生招生简章越南语版本
- 故宫旧称紫禁城简介




