




已阅读5页,还剩44页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Linux进程编程 授课老师 张涛ztflash 进程P242 在操作系统中 各个程序之间是并发执行的 共享系统资源 CPU需要在各个运行的程序之间来回地切换 这样的话 要想描述这些并发活动过程就变得很困难 为此 操作系统设计者提出了进程的概念 什么是进程 P242 Aprocess aprograminexecution 一个进程应该包括 程序的代码 程序的数据 PC中的值 用来指示下一条将运行的指令 一组通用的寄存器的当前值 堆 栈 一组系统资源 如打开的文件 总之 进程包含了正在运行的一个程序的所有状态信息 进程状态的转换P242 时间片轮转调度算法P242 在时间片轮转算法中 将所有的就绪任务按照FCFS FirstComeFirstServed 原则 排成一个队列 每次调度时将处理器分派给队首任务 让其执行一小段CPU时间 时间片 timeslice 在一个时间片结束时 如果任务还没有执行完的话 将发生时钟中断 在时钟中断中 调度程序将暂停当前任务的执行 并将其送到就绪队列的末尾 然后执行当前的队首任务 开始时 任务B位于队列之首 因此被调度执行 当它的时间片用完后 就把它送到就绪队列的末尾 同时 任务F成为新的队首 被调度运行 抢占调度方式P242 任务1 优先级 高低 时间 实际上创建进程就是给任务代码分配一个任务控制块 task struct中有一个指针指向files struct结构体 称为文件描述符表 其中每个表项包含一个指向已打开的文件的指针 typedefstructos tcb OS STK OSTCBStkPtr structos tcb OSTCBNext INT16UID 进程IDINT8UOSTCBPrio 进程优先级filestruct OS TCB 任务控制块P242 文件描述符表P242 用户程序不能直接访问内核中的文件描述符表 而只能使用文件描述符表的索引 即0 1 2 3这些数字 这些索引就称为文件描述符 FileDescriptor 用int型变量保存 当调用open打开一个文件或创建一个新文件时 内核分配一个文件描述符并返回给用户程序 该文件描述符表项中的指针指向新打开的文件 当读写文件时 用户程序把文件描述符传给read或write 内核根据文件描述符找到相应的表项 再通过表项中的指针找到相应的文件 进程与进程IDP245 程序被执行的实例被称为进程 进程空间包括 代码空间 数据空间 运行的堆栈空间 存在与内存中 程序是静态的 存放在硬盘上 是永久的 进程是动态的 是暂时的 有其生命周期的 操作系统为其分配好进程的空间时 从main函数开始运行时标志着进程的开始 当调用exit函数退出时标志着进程的结束 每个LINUX进程都有一个唯一的ID 进程ID总是一个非负数 getpid getppid 进程的控制 fork exec waitpid 1 用户IDgetuid 2 组IDgetgid 用户标识P247 出错处理P247 当LINUX函数出错时 会给整型变量errno设置一个值 errno每一个值都有特定含义 strerror i 将函数映射为一个出错信息字符串 perror constcharmsg 在标准出错上产生一条出错信息 基于errno Linux信号量 P249 信号量本质上是一个非负的整数计数器 它被用来控制对公共资源的访问 当公共资源增加时 调用函数sem post 增加信号量 只有当信号量值大于 时 才能使用公共资源 使用后 函数sem wait 减少信号量 Linux信号量 P249 1 忽略该信号 2 按系统默认方式处理 3 提供一个函数 信号发生时则调用该函数 Linux时间值 1 日历时间2 进程时间 时钟时间 用户CPU时间 系统CPU时间 time testreal0m0 06suser0m0 01sSys0m0 00s 系统调用和库函数 P250 1 系统调用 系统调用把应用程序请求传给内核 调用相应的内核函数完成所需的处理 使应用程序由用户态进入核心态 系统调用有自己单独的堆栈空间 2 库函数 存放在函数库中的函数 库函数具有明确的功能 入口调用参数和返回值 Linux库函数特指函数入口没有进行系统调用的库函数 库函数中常包含系统调用 库函数没有进行系统调用时 没有单独的堆栈空间 printf writestrcpyatoi 3 用户态 进程的普通执行状态 只能执行规定的指令 不能执行特权指令 进程在用户态下只能访问该进程的存储空间 不能与系统硬件相互作用 不能访问系统资源 当它需要系统硬件资源时 会通过系统调用进入核心态 4 核心态 能执行所有的机器指令 包括操作系统执行的特权指令 能访问所有的寄存器和存储区域 能直接控制所有系统资源和硬件资源 Linux进程环境P256 1 Linux进程控制块 PCB 的作用 Linux进程控制块是一个由结构体task struct所定义的数据结构操作系统利用PCB来控制和管理进程 地址 task next task next task next 等待态任务结构体 等待态任务结构体 等待态任务结构体 Linux进程等待列图 2 与进程有关的IDP257 进程真实用户号 UID getuid 有效用户号 EUID geteuid 真实用户组号 GID getgid 有效用户组号 EGID getegid 进程标识号 PID getpid 进程组标识号 PGID getpgid linux系统中每个进程都有2个ID 分别为用户ID和有效用户ID UID一般表示进程的创建者 属于哪个用户创建 而EUID表示进程对于文件和资源的访问权限 具备等同于哪个用户的权限 可以通过函数getuid 和geteuid 获得进程的两个ID值 一般情况下2个ID是相同的 但是某些情况下会出现2个ID不同的情况 进程终止P258 1 正常终止1 从main返回2 调用exit 3 调用 exit 2 异常终止1 调用abort2 由一个信号终止 exit与return的区别 C语言关键字与函数exit 在main函数退出时有相似之处 但两者有本质的区别 return退出当前函数主体 exit 函数退出当前进程 因此 在main函数里面return 0 和exit 0 完成一样的功能 return仅仅从子函数中返回 而子进程用exit 退出 调用exit 时要调用一段终止处理程序 然后关闭所有I O流 exit 与 exit P258 都是用来终止进程的 exit 直接使进程停止进行 清除其使用的内存空间 并清除其在内核中的各种数据结构 exit 函数在退出前检查文件的打开情况 把文件缓存中的内容写进文件 exit exit atexit 得到进程结束标志 通过执行码 echo 得到已结束进程的结束状态 1 程序中main函数运行结束 中保存main函数的返回值 2 程序运行中调用exit函数结束运行 中保存exit函数参数 3 程序异常退出 中保存异常出错的错误号 进程的堆栈空间P262 1 代码区 textsegment 加载的是可执行文件代码段 其加载到内存中的位置由加载器完成 2 全局初始化数据区 静态数据区 DataSegment 加载的是可执行文件数据段 存储于数据段 全局初始化 静态初始化数据 的数据的生存周期为整个程序运行过程 intcount 30 3 未初始化数据区 BSS 存储于数据段的数据 全局未初始化 全局静态 局部静态未初始化数据 的生存周期为整个程序运行过程 longsum 1000 4 栈区 stack 由编译器自动分配释放 存放函数的参数值 返回值 局部变量等 在程序运行过程中实时加载和释放 因此 局部变量的生存周期为申请到释放该段栈空间 5 堆区 heap 用于动态内存分配 堆在内存中位于BSS区和栈区之间 一般由程序员分配和释放 若程序员不释放 程序结束时有可能由OS回收 malloc calloc realloc函数 12 3Linux进程控制P267 1 进程标识每个进程都有一个非负整型的唯一进程ID ID0调度进程 不执行任何磁盘上的程序 是内核的一部分 ID1init进程 读与系统有关的初始化文件 并将系统引导到一个状态 绝不会终止 是一个普通用户进程 是所有孤儿进程的父进程 fork系统调用 P269 270 fork从已存在的进程中创建一个新进程 新进程成为子进程 原进程为父进程 fork调用一次 返回两次 在父进程中返回为子进程的进程号 在子进程中返回为0 使用fork函数得到了父进程的一个复制品 从父进程处继承了整个进程的地址空间 子进程独有的只是它的地址号 fork复制了父进程中数据段和堆栈段中绝大部分内容 使的fork系统调用的执行速度并不快 fork所有由父进程打开的文件描述符都被复制到子进程中 父子进程有相同编号的文件描述符 fork系统调用时完成的操作 P270 1 为新进程分配task struct任务结构体内存空间 2 把父进程task struct任务结构体复制到子进程task struct 3 为新进程建立内核堆栈 4 对子进程task struct任务结构体中部分变量进行初始化设置 5 把父进程有关信息复制给子进程 建立共享关系 6 把子进程加入到可运行队列 7 结束fork 函数 8 当子进程开始时 操作系统返回0给子进程中栈段变量id P271 调用fork前 内存只有X进程 调用fork后 内存中不仅有X进程 还有XX进程 fork的时候 系统几乎把整个父进程堆栈段复制给了子进程 形成两个独立的进程 只不过子进程中变量id为1000 XX中为0 fork调用完毕后 X进程由系统态回到用户态 此后 X进程和XX进程各自需要从自己代码段指针指向的代码点继续往下执行 父进程执行时判断id大于0 子进程执行时 判断等于0 P270 intpidpid fork if pid 0 perror forkfailed if pid 0 message Thisisthechild n else message Thisistheparent n fork后的两种处理情形 1 父进程希望复制自己 使父子进程同时执行不同的代码段 2 另一种为fork后 通过exec执行另一个程序 fork之后处理文件描述符两种情况 1 父进程等待子进程完成 此时父进程无需对文件描述符做任何处理 2 父子进程各执行不同的程序段 在这种情况下 fork之后父子进程各自关闭它们不需要使用的文件描述符 并且不干预对方使用文件描述符 父子进程的区别 P273 1 fork返回值2 进程ID3 不同的父进程ID4 子进程tms utime tms stime tms cutime tms ustime设置为0 5 父进程设定的锁 子进程不继承 6 未处理的闹钟信号子进程将清理 7 子进程的未决告警被清除 8 子进程的未决信号集设置为空集 Vfork函数P273 fork函数完整地复制了父进程的整个堆栈空间 因此执行速度比较慢 vfork并不会将父进程中的堆栈空间完全复制到子进程 因为子进程会立即调用exec或exit 所以不会访问地址空间 不过在子进程调用exec前或exit前 它在父进程空间中运行 exec函数P275 exec函数提供了一个在进程中启动另一个程序执行的方法 它可以根据指定的文件名或目录名找到执行文件 并用它来取代原调用进程的数据段 代码段 和堆栈段 执行完之后 原调用进程的内容除了进程号外 其它全部被新程序内容替代了 二进制文件可执行的脚本文件 wait和waitpid P280 当一个进程正常或异常终止时 内核就向其父进程发送SIGCHLD 因为其子进程终止是个异步事件 这种信号也是内核向父进程发的异步通知 父进程等待子进程退出时 则调用wait函数 此时父进程可能会有如下三种情况 1 阻塞 如果所有子进程都还在运行 2 带回子进程的终止状态立刻返回 3 出错立刻返回 wait int status P280 wait int status 会暂时停止目前进程 直到有信号来到或子进程结束 如果在调用wait 是子进程已经结束 则wait 会立刻返回子进程的结束状态 如果不在意结束状态值 status设定为null 若status为空代表不记录子进程结束状态 若status不为空则返回子进程的结束状态值 waitpid pid int status option P280 waitpid pid int status option waitpid会暂时停止目前进程的执行 直到有信号来到或子进程结束 如果调用waitpid时子进程已经结束 则waitpid返回子进程的结束值 pid0等待任何子进程识别码为pid的子进程 wait与waitpid两函数P281 如果父进程的所有子进程还在运行 调用wait将使父进程阻塞 而调用waitpid时如果options参数中指定WNOHANG 可以使父进程不阻塞而立刻返回0 wait等待第一个终止子进程 而waitpid函数可以通过pid参数指定等待哪一个子进程 waitpid函数提供了wait函数没有提供三个功能 1 waitpid等待一个特定进程 而wait返回任一终止子进程状态 2 waitpid提供一个wait非阻塞版本 有时希望取得一个子进程的状态 但不想进程阻塞 3 waitpid支持作业控制 1 获得子进程的终止状态 2 使父进程阻塞等待子进程 起到进程间同步 进程中三种用户IDP287 实际用户ID实际组ID标识我们究竟是谁 取自用户登录时口令文件等录项 有效用户ID有效用户组ID决定了文件访问权限 主要在校验文件权限时使用 比如打开文件 创建文件 修改文件等 保存的设置用户ID和设置组ID在执行一个程序时 保存了有效用户ID和有效组ID副本 12 4进程关系 1 终端 在Linux系统中 用户通过终端登录系统后得到一个Shell进程 这个终端成为Shell进程的控制终端 每个进程的标准输入 标准输出和标准错误输出都指向控
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高校教研室教学督导执行计划
- 那一刻我长大了国际视野作文范文
- 幼儿园配班教学计划衔接工作计划
- 二零二五年度公司食堂员工营养膳食配送服务合同
- 二零二五年度班主任新手带教与教学辅导合同
- 二零二五年度惠州房地产投资居间服务协议书
- 2025年度市场营销资料翻译与市场调研服务合同
- 二零二五年互联网数据资源共享服务合同
- 店面设计案例讲解
- 2025年城市公共交通电话通讯服务采购合同
- 华为门禁出入管理办法
- 2025年贵州省中考英语真题
- 2024年温州平阳县第二人民医院招聘真题
- 政务讲解培训课件
- 流行病学的试题及答案
- 幼儿游泳活动方案
- 艾灸普及培训课件
- 基于机器学习构建减重代谢手术效果的预测模型
- 显微外科术后护理
- 2025至2030中国热成型钢(PHS)市场销售模式及未来投资风险评估报告
- oracle考试试题及答案
评论
0/150
提交评论