您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 销售管理 > 01_linux进程专题讲座v1.0.1-王保明
轻松入门实战应用从项目开发角度为你搭建完整的知识体系wangbaominglinux进程-应用编程-专题讲座writtenby王保明进程基本概念1程序pk进程什么是程序程序是完成特定任务的一系列指令集合。什么是进程从用户的角度来看进程是程序的一次执行过程从操作系统的核心来看,进程是操作系统分配的内存、CPU时间片等资源的基本单位。进程是资源分配的最小单位每一个进程都有自己独立的地址空间与执行状态。像UNIX这样的多任务操作系统能够让许多程序同时运行,每一个运行着的程序就构成了一个进程进程数据结构进程的静态描述:由三部分组成:PCB、有关程序段和该程序段对其进行操作的数据结构集。进程控制块:用于描述进程情况及控制进程运行所需的全部信息。代码段:是进程中能被进程调度程序在CPU上执行的程序代码段。数据段:一个进程的数据段,可以是进程对应的程序加工处理的原始数据,也可以是程序执行后产生的中间或最终数据进程和程序的区别进程是动态的,程序是静态的进程的生命周期是相对短暂的,而程序是永久的。进程数据结构PCB一个进程只能对应一个程序,一个程序可以对应多个进程。总结:中断早期是没有进程这个概念,当出现中断技术以后才出现进程这个概念分式操作系统基于时间片轮转进程是操作系统对资源的一种抽象,一个进程:代码段、数据段、堆栈段、+进程控制块(PCB)PCB是操作系统感知进程存在的一个重要数据结构(cpu通过进程控制块来控制进程)轻松入门实战应用从项目开发角度为你搭建完整的知识体系wangbaoming2进程状态进程状态操作系统经典三态就绪等待(阻塞)运行总结状态条件和原因因创建而就绪,因调度而执行;因时间片用完而重新就绪;执行中因I/O请求而阻塞;I/O完成而就绪注意:阻塞以后不能直接执行,必须进入就绪状态。Linux内核中的进程状态运行状态(TASK_RUNNING)可中断睡眠状态(TASK_INTERRUPTIBLE)不可中断睡眠状态(TASK_UNINTERRUPTIBLE)暂停状态(TASK_STOPPED)僵死状态(TASK_ZOMBIE)轻松入门实战应用从项目开发角度为你搭建完整的知识体系wangbaoming备注:就绪态深入理解:内存中就绪和交换空间中就绪,操作系统支持虚拟内存。虚拟内存实现需要操作系统支持:内存段式管理、业式管理、段页管理。进程状态编程事件进程调度及调度算法3进程编程相关术语进程控制块进程描述信息进程标识符用于唯一的标识一个进程。进程控制信息轻松入门实战应用从项目开发角度为你搭建完整的知识体系wangbaoming进程当前状态进程优先级程序开始地址各种计时信息通信信息资源信息占用内存大小及管理用数据结构指针交换区相关信息I/O设备号、缓冲、设备相关的数结构文件系统相关指针现场保护信息寄存器PC程序状态字PSW栈指针进程标示每个进程都会分配到一个独一无二的数字编号,我们称之为“进程标识”(processidentifier),或者就直接叫它PID.是一个正整数,取值范围从2到32768当一个进程被启动时,它会顺序挑选下一个未使用的编号数字做为自己的PID数字1一般为特殊进程init保留的进程创建不同的操作系统所提供的进程创建原语的名称和格式不尽相同,但执行创建进程原语后,操作系统所做的工作却大致相同,都包括以下几点:给新创建的进程分配一个内部标识,在内核中建立进程结构。复制父进程的环境为进程分配资源,包括进程映像所需要的所有元素(程序、数据、用户栈等),复制父进程地址空间的内容到该进程地址空间中。置该进程的状态为就绪,插入就绪队列。进程撤销进程终止时操作系统做以下工作:关闭软中断:因为进程即将终止而不再处理任何软中断信号;回收资源:释放进程分配的所有资源,如关闭所有已打开文件,释放进程相应的数据结构等;写记帐信息:将进程在运行过程中所产生的记帐数据(其中包括进程运行时的各种统计信息)记录到一个全局记帐文件中;置该进程为僵死状态:向父进程发送子进程死的软中断信号,将终止信息status送到指定的存储单元中;转进程调度:因为此时CPU已经被释放,需要由进程调度进行CPU再分配。进程创建其他实践1)WinPKLinux进程观察工具轻松入门实战应用从项目开发角度为你搭建完整的知识体系wangbaoming0号进程(也称为)空闲进程内存===》交换空间,支持虚拟内存。1号进程第一个用户进程。。。。2)whichinit/sbin/3)查看内核进程pid最大配置[root@localhost~]#cat/proc/sys/kernel/pid_max327684)终止进程方法中SIGABORT进程编程实践1fork系统调用相关说明复制一个进程映象fork使用fork函数得到的子进程从父进程的继承了整个进程的地址空间,包括:进程上下文、进程堆栈、内存信息、打开的文件描述符、信号控制设置、进程优先级、进程组号、当前工作目录、根目录、资源限制、控制终端等。子进程与父进程的区别在于:1、父进程设置的锁,子进程不继承2、各自的进程ID和父进程ID不同3、子进程的未决告警被清除;4、子进程的未决信号集设置为空集。fork系统调用包含头文件sys/types.h和unistd.h函数功能:创建一个子进程函数原型pid_tfork(void);参数:无参数。返回值:如果成功创建一个子进程,对于父进程来说返回子进程ID如果成功创建一个子进程,对于子进程来说返回值为0如果为-1表示创建失败轻松入门实战应用从项目开发角度为你搭建完整的知识体系wangbaoming注意点:理解1:fork系统调用之后,父子进程将交替执行。理解2:怎么样理解一次调用2次返回?理解3:怎么样理解,fork返回值大于零的是父进程,为什么这样设计:?理解4:怎么样理解分支在fork之后,而不是父进程main函数的开始?总结:怎么样理解,一次调用,二次返回?问题的本质是:两次返回,是在各自的进程空间中返回的。子进程和父进程各有自己的内存空间(fork:代码段、数据段、堆栈段、PCB进程控制块的copy)。总结:#includesys/types.h#includeunistd.h#includesys/stat.h#includefcntl.h#includestdlib.h#includestdio.h#includestring.h#includesignal.h#includeerrno.h#includesignal.hintmain(void){轻松入门实战应用从项目开发角度为你搭建完整的知识体系wangbaomingintfd;pid_tpid;signal(SIGCHLD,SIG_IGN);printf(beforforkpid:%d\n,getpid());intnum=10;//思考打印fd=open(11.txt,O_WRONLY);if(fd==-1){return0;}pid=fork();if(pid==-1){printf(pid0err.\n);return-1;}if(pid0){printf(parent:pid:%d\n,getpid());write(fd,parent,6);close(fd);//sleep(1);}elseif(pid==0){printf(child:%d,parent:%d\n,getpid(),getppid());write(fd,child,5);close(fd);//sleep(100);}printf(forkafter....\n);return0;}强化训练//请问打印几句hello….intmain(){fork();轻松入门实战应用从项目开发角度为你搭建完整的知识体系wangbaomingfork();fork();printf(hello…..\n);return0;}写时复制copyonwrite如果多个进程要读取它们自己的那部分资源的副本,那么复制是不必要的。每个进程只要保存一个指向这个资源的指针就可以了。如果一个进程要修改自己的那份资源的“副本”,那么就会复制那份资源。这就是写时复制的含义原因分析:加快速度,linux内核是段页式管理机制(因段管理从0开始,),也可叫页式管理机制。只复制对应的页。缺页,在中断查询,再赋值。概念要深入理解2孤儿进程和僵尸进程孤儿进程和僵尸进程如果父进程先退出,子进程还没退出那么子进程的父进程将变为init进程。(注:任何一个进程都必须有父进程)如果子进程先退出,父进程还没退出,那么子进程必须等到父进程捕获到了子进程的退出状态才真正结束,否则这个时候子进程就成为僵进程。孤儿进程如果父亲进程先结束,子进程会托孤给1号进程root1412114089022:20pts/1800:00:00su-wbm01wbm011412214121022:20pts/1800:00:00-bashwbm01143001022:38pts/1800:00:00./dm02_forkwbm011430814028022:38pts/1700:00:00ps-ef[wbm01@localhost01process]$ps–ef僵尸进程如果子进程结束,父进程还没有查询子进程的状态,那么子进程就会是僵尸状态[wbm01@localhost01process]$ps-uwbm01PIDTTYTIMECMD14028pts/1700:00:00bash14122pts/1800:00:00bash14233pts/1800:00:00dm02_fork14234pts/1800:00:00dm02_forkdefunct14235pts/1700:00:00ps避免僵尸进程#includesignal.hsignal(SIGCHLD,SIG_IGN);轻松入门实战应用从项目开发角度为你搭建完整的知识体系wangbaoming3fork之后父子进程共享文件父进程的文件描述符如果父进程中打开了一个文件,那么子进程不需要在打开会不会像int赋值两份。。。。。赋值的文件描述符是什么意思?voidmain(void){pid_tpid;signal(SIGCHLD,SIG_IGN);intfd;fd=open(test.txt,O_WRONLY);if(fd==-1){perror(openerr);exit(0);}pid=fork();if(pid==-1){perror(forkerr);轻松入门实战应用从项目开发角度为你搭建完整的知识体系wangbaomingreturn-1;}if(pid==0){printf(thisischildpid:%dppid:%d\n,getpid(),getppid());write(fd,child,5);//sleep(20);}if(pid0){printf(thisisparentpid:%dppid:%d\n,getpid(),getppid());write(fd,parent,5);//sleep(20);}printf(fork()after\n);sleep(1);close(fd);return0;}fd=open(test.txt,O_WRONLY);write(fd,parent,5);4fork和vfork1)在fork还没实现copyonwrite之前。Unix设计者很关心fork之后立刻执行exec所造成的地址空间浪费,所以引入了vfork系统调用。2)vfork有个限制,子进程必须立刻执行_exit或者exec函数。即使fork实现了copyonwrite,效率也没有vfork高,但是我们不推荐使用vfork,因为几乎每一个vfork的实现,都或多或少存在一定的问题。结论:1:fork子进程拷贝父进程的数据段Vfork
本文标题:01_linux进程专题讲座v1.0.1-王保明
链接地址:https://www.777doc.com/doc-3230072 .html