项目学习总结:线程邮箱、frambuffer、习题复习与学习(1)
一、线程邮件
(一)概念:项目的框架结构,以及各个模块间如何通信。
1.每个模块用一个线程表示,将所有线程用链表穿起来
2.每个链表节点都有一个队列,用作缓冲区缓冲数据
(二)操作步骤
1.创建邮件类型结构体
①存储链表头节点
②定义互斥锁 //出入队列时需看情况加锁,防止同一时刻不同线程操作同一队列空间
2.定义消息体的结构体:发送方和接收方模块的名字,数据内容
3.typedef void*(*Pfun)(void *) //定义线程函数类型
4.定义节点结构体 //功能模块名字,线程id,队列指针,内核链表前后指针,线程函数名
5.创建线程邮件
6.插入节点(注册线程函数)
7.发送和接收消息和功能函数,用于线程检测函数调用
8.阻塞等待所有线程结束,回收资源
(三)定义结构体展示
(四)部分功能函数示例
1.list_for_each_entry_safe(p,n,&mbs->head,node)//安全遍历节点,可能删除某个节点
内核链表提供的遍历链表的函数,p表示正在遍历的节点,node存为前后指针
2.注册节点函数示例
3.发送消息函数 //将消息结构体的指针加入,接收方的队列
二、framebuffer //帧缓存
(一)基本操作步骤
1.open //打开显示设备/dev/fb0
2.ioctl //获取显示设备参数
3.mmap //建立显存和用户空间映射关系
4.写入数据
5.close //解除映射,关闭设备文件
(二)图片显示
1.windows修改图片参数
2.复制到ubuntu指定目录
3.设置图片属性,打开图片,偏移跳过前54字节头信息。
4.遍历图片像素点写入显示
(三)通过字模和字库工具显示文字
1.通过工具获取自模数据复制到函数(通过字库工具生成字库,复制到项目文件下)
2.通过函数调用显示
三、习题复习与学习(1)
1.子网掩码是255.255.192.0,那么下面那个ip地址与130.12.127.231处于同一个子网上(A)?
A.130.12.64.23
B.130.45.130.1
C.130.12.167.127
D.130.22.130.1
解:①将IP地址和子网掩码都转换为二进制
②对IP地址和子网掩码进行“按位与”运算,得到网络地址。
③比较两个ip地址算出网络地址
④如果网络地址相同,则它们属于同一子网;如果不同,则不属于同一子网。
255.255.192.0-->11111111.11111111.11000000.00000000:这表示IP地址前18位是网络位,剩下的14位是主机位
因此,要判断两个IP是否在同一子网,只需看它们的前18位是否完全相同。
130.12.127.231--> 10000010.00001100.01(只看前18位)
因为子网掩码前2个字节为全1所以IP和它相与得到的就是IP前两个字节,所以只需要判断第三个字节的前两位
第三个字节子网掩码为11,IP为01,相与得到01,所以第三字节大小范围为(64(2的6次方)~127(2的7次方-1))
2.若一组记录的排序码为(46,79,56,38,40,84),则利用堆排序的方法建立的初始堆为 (84,79,56,38,40,46)
解:①堆排序基本概念
大顶堆:一种特殊的完全二叉树,其中每个节点的值都大于或等于其左右孩子节点的值(交换条件)。
堆排序建堆:将一个无序的完全二叉树调整成一个大顶堆。
②步骤
将排序码按序构造为完全二叉树
46
79 56
38 40 84
最后一个非叶子节点即56,不满足条件,则交换
调整56节点的前一个节点,满足条件
调整78节点的前一个节点,不满足条件,则交换(与最大的孩子84交换)
现在节点2的值是46,需要继续检查它所在的子树是否满足大顶堆。
循环执行直到满足“大顶堆”
3.对象间存在一对多关系,当一个对象被修改时,则会自动通知他的依赖对象,采用以下那种设计模式最好(A)
A.建造者模式:主要用于将一个复杂对象的构建与它的表示分离,通常用于创建过程复杂、步骤明确的对象。
B.策略模式:定义了一系列算法,并将每个算法封装起来,使它们可以相互替换。
C.观察者模式:正确定义了对象间的一种一对多的依赖关系,当一个对象(称为“主题”或“被观察者”)的状态发生改变时,所有依赖于它的对象(称为“观察者”)都会得到通知并自动更新。
D.代理模式:为其他对象提供一种代理以控制对这个对象的访问。
4.操作系统内核不能调度哪一项(B)
A.进程:进程是操作系统进行资源分配和调度的基本单位。内核完全可以调度进程。
B.用户级线程:用户级线程是在用户空间中,由用户态的线程库(如Pthreads)来自行管理和调度的。操作系统内核完全不知道这些线程的存在,它只能“看见”这些线程所属的进程。因此,内核无法直接调度用户级线程。
C.其他都不是
D.内核级线程:内核级线程是由操作系统内核直接管理和支持的。内核负责它们的创建、调度和同步。内核完全可以调度内核级线程。
5.线程的优点,不正确的是(C)
A.线程是具有最少开销的程序执行实体
B.线程间切换比进程间切换花费的时间短
C.由于共享资源,一个进程中的线程不能并发执行(×) //可以并发执行,并且可通过共享全局变量通信
D.撤销线程比撤销进程花费的时间短
6.软件生命周期中,能准确 确定软件系统必须做的什么 和 必须具备哪些功能 的阶段是(C)
A.详细设计:这是在概要设计的基础上,进一步细化各个模块的内部实现细节
B.概要设计:也称为总体设计,主要任务是划分系统的模块、确定模块间的接口和关系。
C.需求分析:这个阶段的核心任务就是准确地理解、分析并定义用户的需求和约束,明确软件必须完成的功能和性能指标。
D.可行性分析:这个阶段在需求分析之前,主要从技术、经济、法律等方面评估项目是否值得进行
7.C
8.执行MySQL的DELETE命令时出现“foreign key constraint”错误,意味着(A)
A.在另一个表中存在引用的数据
B.外键未定义
C.数据库连接出现问题
D.表为空
9.进栈序列为1,2,3,4,5,6且进栈和出栈可以穿插进行,则不能出现的出栈序列是(C)
A.4,3,2,1,5,6
B.2,4,3,1,5,6
C.2,3,5,1,6,4 //1应该在4后面出栈
D.3,2,4,1,6,5
10.在TCP/IP参考模型中TCP协议工作在(传输层)
11.并发性是指若干事件在(同一时间间隔)发生
并行性是指若干事件在同一时刻执行
12.完全二叉树节点数是25,高度为(5)
解:当最后一层铺满时,节点数n = 2的h次方-1
13.进程的基本状态有:就绪,运行,阻塞
14.浏览器和服务器在基于https进行请求连接到数据传输过程中,运用到来如下哪些技术(ABCD)
A.对称加密技术
B.散列(哈希)算法
C.非对称加密技术
D.数字证书
15.稳定的排序算法:在排序过程中,如果两个元素的值相等,那么它们在排序前后的相对位 置? 保持不变(直接插入排序、冒泡排序)
16.C
17.单元测试一般需要那两个模块作为辅助(桩模块、驱动模块)
18.进程间通信方式都有哪些:系统管道、消息队列、共享内存、信号量、信号、套接字
19.便于插入和删除的数据结构是:链表
20.面向对象的程序设计语言具有(多态性、继承性、封装性)等共同特性