当前课程知识点:基于Linux的C++ >  第十三讲 进程编程 >  13.05 进程管理(二) >  LinuxCPP1305

返回《基于Linux的C++》慕课在线视频课程列表

LinuxCPP1305在线视频

LinuxCPP1305

下一节:LinuxCPP1306

返回《基于Linux的C++》慕课在线视频列表

LinuxCPP1305课程教案、知识点、字幕

在Linux操作系统里边

进程的调度有很多种策略

比如先进先出策略

我一个进程先来 那个进程后来

那么新来的进程就会先被调度

这叫先进先出策略

我还有同样一系列的进程

它们好几个要同时被调度

那怎么办呢

我们就时间片轮转

公平起见 一个给你一片时间

一个给你一片时间

一段时间让你去做

做完了就换一个 做完了就换一个

这叫时间片轮转 这是一个

还有呢 就是用普通调度

按批次进行调度

还有就是抢先式的

高优先级的优先

把进程分出特定的优先级

有的优先级高的 它就先做

优先级低的就后做

它就抢先

当一个低优先级的进程

正在运行的时候

如果一个高优先级的进程到达

那么就抢先

把低优先级的那个进程

从CPU里给踢出来不让做了

把CPU资源抢夺过来

这叫抢先式 就这个

整个进程调度啊

它是很多种策略的折中

你甚至可以在编程的时候

选择不同的调度策略 都是可以的

有一点是需要说明的

子进程和父进程这个调度本身

是没有固定顺序的

如果你没有设它的调度顺序

如果你没有去做进程间的同步

那么你就没有办法

对子进程和父进程的执行顺序

做任何的假定

可能是子进程先做

也可能是父进程先做

可能子进程先做完

可能父进程先做完

你注意啊

先做并部分一定就先做完

所以这些都是没有办法假定的

完全未知的

跟当时调度的情况是相关的

不能对子进程和父进程的执行的顺序

有任何的假定

如果你需要它们的先后顺序

就必须进行进程间的同步

进程调度策略的一系列的函数

都放在“sched.h”这个头文件里

你比如讲 获取进程调度策略的函数

sched_getscheduler()

设置它的Set函数

获取进程调度参数的

设置进程调度参数的

这些函数你都可以使用

还有呢 进程优先级的函数

可以调整它

每个进程都有个特定的优先级吗

你就可以调整进程的优先级

那么这些函数呢 都在这里

改变进程的优先级 nice()这个函数

它很特殊

它实际上是在 “unistd.h”这个头文件里

剩下的就是获取进程优先级

或设置进程优先级

要用到的是这个标准的两个头文件

除了进程优先级的调整

你还可以设定整个进程在运行的时候

它的处理器的亲和性

什么叫处理器的亲和性呢

就是这个进程

它倾向于在第几号CPU上面去做

你可以预先对它进行设定

比如讲你的计算机是多核的

你有4 颗CPU

或者是1 颗CPU里面有4 个核心

那么它标定的时候

就是CPU 0、CPU 1、CPU 2、CPU 3

那么你这个进程创建出来 你想运行

你说我这个进程优先选择1号CPU去做

行不行呢 行

这个就叫处理器的亲和性

优先选择1号CPU

你可以通过这个来设定它

获取和设置一对

可以去做特定的改变和设置

想终止进程的时候

就需要调用kill()这个函数

kill()这个函数实现在

“sys/types.h”这个头和“signal.h”这个头里

它带两个参数

一个是pid_t pid那个进程的PID

一个是sig 它对应的信号

发送一个信号是什么

向哪一个进程发送哪一个信号 就这个

当你想等待这个进程结束的时候

就可以使用函数wait()

wait()这个函数有两个

一个是只带一个单参数的状态参数

返回值是对应的pid_t

还有一个waitpid()

它带着一个参数pid 一个参数状态

它就是等待特定的pid号的

那个进程结束

其实就是这个意思

当你调用wait()这个函数的时候

因为这个函数

要等待另外一个进程结束

所以这个进程本身 它就做不下去了

它这个进程就会被阻塞

它一直到你等待的那个进程结束了

它才会继续做下去

所以wait()单参数这个版本

主要是用来等待子进程结束

而waitpid()呢

就等待一个特定的进程结束

可以通过WEXITSTATUS这个宏

来查看子进程的退出码

可以通过WIFEXITED这个宏

来确定子进程的退出 是正常退出

还是出了问题 意外死亡的

我们看例子

还是刚才那个例子的修正

spawn()函数 执行ls命令

我们在spawn()这个函数做完了以后

我们在这里wait( &child_status )

等待子进程结束 做完了

我就拿到了它的子进程的状态

wait()这个参数不是传给wait()的

是wait()要传出来的 我们要用的

它替我们设置这个值

我们就看 得到的这个参数

是不是正常退出

如果是 说明它是正常退出的

一测试WIFEXITED

它是不是正常退出的

测试出来正常退出 OK

你就可以做特定的处理

如果不是 那你就做其它的处理

就按照这个模式等待这个进程终止

尤其是等待子进程终止

接下来一个问题就是

如果这个子进程终止了

但父进程并没有调用我们的wait()函数

去等待它结束

会发生什么事情

在这个时候子进程已经终止了

但父进程并没有等待它

这就意味着那个子进程本身

没有被正确地清除

它变成了僵尸进程

它有一些特定的资源就没有被释放

包括子进程的状态 就没有被处理

所以很多时候

它实际上是对资源的一种浪费

正常情况下面 僵尸进程

其实我们程序中都应该处理它

所以清除子进程的一个技术手段

其实很简单

就是在父进程里边调用wait()

我们等它子进程做完

把它状态取出来

OK 它就死掉了 你就没事了

所有的东西都被我们清除了

你如果不等 那就不成

它就是僵尸了嘛 对吧

所以即使子进程

在父进程调用wait()之前

它就已经死掉了

它就已经成为僵尸了

那这种情况下面它的退出状态

我们还是可以通过wait()这个函数

把它抽取出来 然后清除掉

注意这一点

如果你没有清除这个子进程

它都会被init这个进程领养

会变成init进程的子进程

你不增加init进程的负担吗 对吧

OK 你看我们这个例子

fork() 我们要fork()一个子进程

if( child_pid > 0 )

那是在父进程里

我们睡眠 速度睡眠60秒

然后ls 那是在子进程里

exit() 子进程立即退出

一构造出来然后就退

什么也不做 退出就完了

现在这个结果就是什么呢

子进程不就变成僵尸了嘛

父进程没处理它呀

它立马就做完了嘛

你fork()一个子进程出来

然后你啥也不管 然后你睡觉去了

那子进程呢

它exit() 退出了 你也没等它

结果呢 子进程不就变成僵尸了嘛

那现在这种情况

这就是形成了一个僵尸进程

基于Linux的C++课程列表:

第一讲 C/C++基本语法元素

-1.1 提纲

--LinuxCPP0101

-1.2 程序设计的基本概念

--LinuxCPP0102

-1.3 简单C/C++程序介绍

--LinuxCPP0103

-1.4 程序设计的基本流程

--LinuxCPP0104

-1.5 基本语法元素

--LinuxCPP0105

-1.6 程序设计风格

--LinuxCPP0106

-1.7 编程实践

--LinuxCPP0107

-第一讲 C/C++基本语法元素--编程实践提交入口

第二讲 程序控制结构

-2.1 提纲

--LinuxCPP0201

-2.2 结构化程序设计基础

--LinuxCPP0202

-2.3 布尔数据

--LinuxCPP0203

-2.4 分支结构

--LinuxCPP0204

-2.5 break语句

--LinuxCPP0205

-2.6 循环结构

--LinuxCPP0206

-2.7 编程实践

--LinuxCPP0207

-第二讲 程序控制结构--编程实践提交入口

第三讲 函数

-3.1 提纲

--LinuxCPP0301

-3.2 函数声明、调用与定义

--LinuxCPP0302

-3.3 函数调用栈框架

--LinuxCPP0303

-3.4 编程实践

--LinuxCPP0304

-第三讲 函数--编程实践提交入口

第四讲 算法

-4.1 提纲

--LinuxCPP0401

-4.2 算法概念与特征

--LinuxCPP0402

-4.3 算法描述

--LinuxCPP0403

-4.4 算法设计与实现

--LinuxCPP0404

-4.5 递归算法(一)

--LinuxCPP0405

-4.6 递归算法(二)

--LinuxCPP0406

-4.7 容错与计算复杂度

--LinuxCPP0407

-4.8 编程实践

--LinuxCPP0408

-第四讲 算法--编程实践提交入口

第五讲 程序组织与开发方法

-5.1 提纲

--LinuxCPP0501

-5.2 库与接口

--LinuxCPP0502

-5.3 随机数库(一)

--LinuxCPP0503

-5.4 随机数库(二)

--LinuxCPP0504

-5.5 作用域与生存期

--LinuxCPP0505

-5.6 典型软件开发流程(一)

--LinuxCPP0506

-5.7 典型软件开发流程(二)

--LinuxCPP0507

-5.8 编程实践

--LinuxCPP0508

-第五讲 程序组织与开发方法--编程实践提交入口

第六讲 复合数据类型

-6.1 提纲

--LinuxCPP0601

-6.2 字符

--LinuxCPP0602

-6.3 数组(一)

--LinuxCPP0603

-6.4 数组(二)

--LinuxCPP0604

-6.5 结构体

--LinuxCPP0605

-6.6 编程实践

--LinuxCPP0606

-第六讲 复合数据类型--编程实践提交入口

第七讲 指针与引用

-7.1 提纲

--LinuxCPP0701

-7.2 指针基本概念

--LinuxCPP0702

-7.3 指针与函数

--LinuxCPP0703

-7.4 指针与复合数据类型(一)

--LinuxCPP0704

-7.5 指针与复合数据类型(二)

--LinuxCPP0705

-7.6 字符串

--LinuxCPP0706

-7.7 动态存储管理(一)

--LinuxCPP0707

-7.8 动态存储管理(二)

--LinuxCPP0708

-7.9 引用

--LinuxCPP0709

-7.10 编程实践

--LinuxCPP0710

-第七讲 指针与引用--编程实践提交入口

第八讲 链表与程序抽象

-8.1 提纲

--LinuxCPP0801

-8.2 数据抽象(一)

--LinuxCPP0802

-8.3 数据抽象(二)

--LinuxCPP0803

-8.4 链表(一)

--LinuxCPP0804

-8.5 链表(二)

--LinuxCPP0805

-8.6 链表(三)

--LinuxCPP0806

-8.7 链表(四)

--LinuxCPP0807

-8.8 函数指针(一)

--LinuxCPP0808

-8.9 函数指针(二)

--LinuxCPP0809

-8.10 抽象链表(一)

--LinuxCPP0810

-8.11 抽象链表(二)

--LinuxCPP0811

-8.12 编程实践

--LinuxCPP0812

-第八讲 链表与程序抽象--编程实践提交入口

第九讲 类与对象

-9.1 提纲

--LinuxCPP0901

-9.2 程序抽象与面向对象

--LinuxCPP0902

-9.3 类类型

--LinuxCPP0903

-9.4 对象(一)

--LinuxCPP0904

-9.5 对象(二)

--LinuxCPP0905

-9.6 类与对象的成员(一)

--LinuxCPP0906

-9.7 类与对象的成员(二)

--LinuxCPP0907

-9.8 类与对象的成员(三)

--LinuxCPP0908

-9.9 继承(一)

--LinuxCPP0909

-9.10 继承(二)

--LinuxCPP0910

-9.11 继承(三)

--LinuxCPP0911

-9.12 多态(一)

--LinuxCPP0912

-9.13 多态(二)

--LinuxCPP0913

-9.14 编程实践

--LinuxCPP0914

-第九讲 类与对象--编程实践提交入口

第十讲 操作符重载

-10.1 提纲

--LinuxCPP1001

-10.2 四则运算符重载(一)

--LinuxCPP1002

-10.3 四则运算符重载(二)

--LinuxCPP1003

-10.4 关系与下标操作符重载

--LinuxCPP1004

-10.5 赋值操作符重载(一)

--LinuxCPP1005

-10.6 赋值操作符重载(二)

--LinuxCPP1006

-10.7 赋值操作符重载(三)

--LinuxCPP1007

-10.8 赋值操作符重载(四)

--LinuxCPP1008

-10.9 赋值操作符重载(五)

--LinuxCPP1009

-10.10 流操作符重载(一)

--LinuxCPP1010

-10.11 流操作符重载(二)

--LinuxCPP1011

-10.12 流操作符重载(三)

--LinuxCPP1012

-10.13 操作符重载总结

--LinuxCPP1013

-10.14 编程实践

--LinuxCPP1014

-第十讲 操作符重载--编程实践提交入口

第十一讲 泛型编程

-11.1 提纲

--LinuxCPP1101

-11.2 泛型编程概览

--LinuxCPP1102

-11.3 异常处理机制(一)

--LinuxCPP1103

-11.4 异常处理机制(二)

--LinuxCPP1104

-11.5 运行期型式信息(一)

--LinuxCPP1105

-11.6 运行期型式信息(二)

--LinuxCPP1106

-11.7 模板与型式参数化

--LinuxCPP1107

-11.8 题外话:术语翻译

--LinuxCPP1108

-11.9 泛型编程实践(一)

--LinuxCPP1109

-11.10 泛型编程实践(二)

--LinuxCPP1110

-11.11 泛型编程实践(三)

--LinuxCPP1111

-11.12 泛型编程实践(四)

--LinuxCPP1112

-11.13 泛型编程实践(五)

--LinuxCPP1113

-11.14 泛型编程实践(六)

--LinuxCPP1114

-11.15 泛型编程实践(七)

--LinuxCPP1115

-11.16 泛型编程实践(八)

--LinuxCPP1116

-11.17 泛型编程实践(九)

--LinuxCPP1117

-11.18 泛型编程实践(十)

--LinuxCPP1118

-11.19 编程实践

--LinuxCPP1119

-第十一讲 泛型编程--编程实践提交入口

第十二讲 Linux系统编程基础

-12.1 提纲

--LinuxCPP1201

-12.2 程序执行环境(一)

--LinuxCPP1202

-12.3 程序执行环境(二)

--LinuxCPP1203

-12.4 程序执行环境(三)

--LinuxCPP1204

-12.5 程序执行环境(四)

--LinuxCPP1205

-12.6 输入输出(一)

--LinuxCPP1206

-12.7 输入输出(二)

--LinuxCPP1207

-12.8 文件系统

--LinuxCPP1208

-12.9 设备

--LinuxCPP1209

-12.10 库(一)

--LinuxCPP1210

-12.11 库(二)

--LinuxCPP1211

-12.12 makefile文件(一)

--LinuxCPP1212

-12.13 makefile文件(二)

--LinuxCPP1213

-12.14 makefile文件(三)

--LinuxCPP1214

-12.15 编程实践

--LinuxCPP1215

-第十二讲 Linux系统编程基础--编程实践提交入口

第十三讲 进程编程

-13.01 提纲

--LinuxCPP1301

-13.02 进程基本概念

--LinuxCPP1302

-13.03 信号

--LinuxCPP1303

-13.04 进程管理(一)

--LinuxCPP1304

-13.05 进程管理(二)

--LinuxCPP1305

-13.06 进程管理(三)

--LinuxCPP1306

-13.07 进程间通信(一)

--LinuxCPP1307

-13.08 进程间通信(二)

--LinuxCPP1308

-13.09 进程间通信(三)

--LinuxCPP1309

-13.10 进程间通信(四)

--LinuxCPP1310

-13.11 进程池

--LinuxCPP1311

-13.12 编程实践

--LinuxCPP1312

-第十三讲 进程编程--编程实践提交入口

第十四讲 线程编程

-14.1 提纲

--LinuxCPP1401

-14.2 线程基本概念

--LinuxCPP1402

-14.3 线程管理(一)

--LinuxCPP1403

-14.4 线程管理(二)

--LinuxCPP1404

-14.5 线程管理(三)

--LinuxCPP1405

-14.6 线程管理(四)

--LinuxCPP1406

-14.7 线程同步机制(一)

--LinuxCPP1407

-14.8 线程同步机制(二)

--LinuxCPP1408

-14.9 C++11线程库(一)

--LinuxCPP1409

-14.10 C++11线程库(二)

--LinuxCPP1410

-14.11 C++11线程库(三)

--LinuxCPP1411

-14.12 C++11线程库(四)

--LinuxCPP1412

-14.13 C++11线程库(五)

--LinuxCPP1413

-14.14 编程实践

--LinuxCPP1414

-第十四讲 线程编程--编程实践提交入口

第十五讲 网络编程

-15.1 提纲

--LinuxCPP1501

-15.2 Internet网络协议

--LinuxCPP1502

-15.3 套接字(一)

--LinuxCPP1503

-15.4 套接字(二)

--LinuxCPP1504

-15.5 编程实践

--LinuxCPP1505

-第十五讲 网络编程--编程实践提交入口

课程文档

-课程PDF文件

LinuxCPP1305笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。