毕设答辩问题总结
下位机问题:
1.简述51与STM32的区别
内核:
51单片机采用的是51 Core,8Bit;
STM32采用的是ARM Cortex-M3,32Bit
地址空间:
51单片机只有64KB;
STM32有4GB
片上储存器:
51单片机ROM(只读存储器)只有2K-64K,RAM(易挥发性随机存取存储器)仅为128B-1K;
STM32的ROM为20K-1MB,RAM有8K-256K
外设:
51单片机仅有三个定时器和一个串口;
STM32却拥有AD,DA,Timer,WWDG,IWDG,CRC,DMA,IIC,SPI,USART等众多外设
操作系统:
51单片机连RTOS都很难能跑;
STM32采用的是uClinux,uC/OS
STM32可通过调用库函数进行编程开发,而51只能采用寄存器编程
STM32是哈弗结构的, 数据处理起来很快。
2.简述RTC的功能以及程序实现过程
功能:
STM32的RTC外设,实质是一个掉电后还继续运行的定时器,它的功能十分简单,只有计时功能(也可以触发中断).但是从掉电还能继续运行来看,它是STM32中唯一一个具有这个功能功能的外设.(RTC外设的复杂之处不在于它的定时,而在于它掉电还可以继续运行的特性) 。
程序实现过程:
编程过程:
1.选择RTC_CLK的时钟源;
2.配置RTC_CLK的分频系数,包括异步和同步两个;
3.设置初始时间,包括日期;
4.获取时间和日期,并显示。
在程序中RTC 时钟配置函数主要实现两个功能:
一、选择 RTC_CLK 的时钟源,根据宏定义来 决定使用 LSE 还是 LSI 作为 RTC_CLK 的时钟源,这里为了方便我们选择 LSE;
二、设置 RTC_CLK 的 预 分 频 系 数 , 包 括 异 步 和 同 步 两 个 , 这 里 设 置 异 步 分 频 因 子 为 ASYNCHPREDIV(127),同步分频因子为 ASYNCHPREDIV(255),则产生的最终驱动日历的时钟 CK_SPRE=32.768/(127+1)*(255+1)=1HZ,则每秒更新一次。
注:
在STM32中,有五个时钟源,为HSI、HSE、LSI、LSE、PLL。
①HSI是高速内部时钟,RC振荡器,频率为8MHz。
②HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。
③LSI是低速内部时钟,RC振荡器,频率为40kHz。
④LSE是低速外部时钟,接频率为32.768kHz的石英晶体。
⑤PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。
3.简述串口通信(USART)原理:
串口通讯的数据包由发送设备通过自身的 TXD接口传输到接收设备的 RXD 接口。在串口通讯的协议层中,规定了数据包的内容,它由起始位、主体数据、校验位以及停止位组成,通讯双方的数据包格式要约定一致才能正常收发数据,
串口通讯的一个数据包从起始信号开始,直到停止信号结束。
数据包的起始信号由一个逻辑0的数据位表示,而数据包的停止信号可由0.5、1、1.5或2个逻辑1的数据位表示, 只要双方约定一致即可。
在数据包的起始位之后紧接着的就是要传输的主体数据内容,也称为有效数据,有效数据的长度常被约定为5、6、7或8位长。
在有效数据之后,有一个可选的数据校验位。由于数据通信相对更容易受到外部干扰导致传输数据出现偏差,可以在传输过程加上校验位来解决这个问题。校验方法有奇校验 (odd)、偶校验(even)、0校验(space)、1校验(mark)以及无校验(noparity),
一般我们会默认使用“8-N-1”参数,即 8个数据位、不用校验、一位停止位
TX:发送数据输出引脚。
RX:接收数据输入引脚。
USART只需两根信号线即可完成双向通信,对硬件要求低,使得很多模块都预留 USART接口来实现与其他模块或者控制器进行数据传输,比如指纹模块、WIFI模块。
编程过程:
1.使能RX和TX引脚的GPIO时钟和USART时钟;
2.初始化GPIO,并将GPIO复用到USART上;
3.配置USART参数;
4.配置中断控制器并使能USART接收中断;
5.使能USART;
6.在USART中断服务函数实现数据接收和发送
波特率指数据信号对载波的调制速率,它用单位时间内载波调制状态改变次数来表示, 单位为波特。比特率指单位时间内传输的比特数,单位 bit/s(bps)。对于 USART 波特率与 比特率相等,以后不区分这两个概念。波特率越大,传输速率越快。
4.简述RFID的寻卡步骤:
RFID系统的基本工作流程是:阅读器通过发射天线发送一定频率的射频信号,当射频卡进入发射天线工作区域时产生感应电流,射频卡获得能量被激活;射频卡将自身编码等信息通过卡内置发送天线发送出去;系统接收天线接收到从射频卡发送来的载波信号,经天线调节器传送到阅读器,阅读器对接收的信号进行解调和解码然后送到后台主系统进行相关处理;主系统根据逻辑运算判断该卡的合法性,针对不同的设定做出相应的处理和控制,发出指令信号控制执行机构动作。
程序执行步骤:
1.对RC522传感器进行初始化配置 => RC522_Init ();
2.对RC522传感器进行复位 => PcdReset ();
3.读写器在寻感应区内寻找所有符合14443A标准的卡 => if (( ucStatusReturn = PcdRequest ( PICC_REQALL, ucArray_ID ))!= MI_OK )
4.当寻卡成功后根据防冲突机制从其中选择一张,并将卡的ID保存到ucArray_ID数组中=> if ( PcdAnticoll ( ucArray_ID ) == MI_OK ){…}
5.最后通过读取数组的数据,将结果分别通过串口调试助手和液晶显示屏显示出来
该程序是可以实现寻卡、防冲撞等功能,但是在调用此功能的过程中我们需要配置SPI的时钟和片选,以及读写的次序。
通信方式SPI通信(买的模块支持的是SPI接口,其实RC522还支持IIC和串行UART(类似RS232))
SPI:串行外围设备接口,是一种高速全双工的通信总线。在ADC/LCD等与MCU间通信。
SPI 总线包含 4 条总线,分别为SS 、SCK、MOSI、MISO。
(1)SS(SlaveSelect):片选信号线,当有多个 SPI 设备与 MCU 相连时,每个设备的这个片选信号线是与 MCU 单独的引脚相连的,而其他的 SCK、MOSI、MISO 线则为多个设备并联到相同的 SPI 总线上,低电平有效。
(2)SCK (Serial Clock):时钟信号线,由主通信设备产生,不同的设备支持的时钟频率不一样,如 STM32 的 SPI 时钟频率最大为 f PCLK /2。
(3)MOSI (Master Output, Slave Input):主设备输出 / 从设备输入引脚。主机的数据从这条信号线输出,从机由这条信号线读入数据,即这条线上数据的方向为主机到从机。
(4)MISO(Master Input, Slave Output):主设备输入 / 从设备输出引脚。主机从这条信号线读入数据,从机的数据则由这条信号线输出,即在这条线上数据的方向为从机到主机。
SPI各个引脚的作用
MISO 数据线接收到的信号经移位寄存器处理后把数据转移到接收缓冲区,然后这个数据就可以由我们的软件从接收缓冲区读出了。
当要发送数据时,我们把数据写入发送缓冲区,硬件将会把它用移位寄存器处理后输出到 MOSI 数据线。
SCK 的时钟信号则由波特率发生器产生,我们可以通过波特率控制位(BR)来控制它输出的波特率。
控制寄存器 CR1 掌管着主控制电路,STM32 的 SPI 模块的协议设置(时钟极性、相位等)就是由它来制定的。而控制寄存器 CR2 则用于设置各种中断使能。
最后为 NSS 引脚,这个引脚扮演着 SPI 协议中的SS 片选信号线的角色,如果我们把 NSS 引脚配置为硬件自动控制,SPI 模块能够自动判别它能否成为 SPI 的主机,或自动进入 SPI 从机模式。但实际上我们用得更多的是由软件控制某些 GPIO 引脚单独作为SS信号,这个 GPIO 引脚可以随便选择。
SPI相关原理:https://blog.csdn.net/u010183728/article/details/81631303
引脚名称 | 引脚说明 |
---|---|
VCC | 供电 3.3V |
RST | 信号输出引脚,接I/O引脚 |
GND | GND |
IRQ | 中断信号,没用到,所以悬空 |
MISO | 主输入从输出,接I/O引脚 |
MOSI | 主输出从输入,接I/O引脚 |
SCK | 时钟,接I/O引脚 |
SDA | 片选脚(其实是SPI的SS引脚),接I/O引脚 |
5.简述AS608指纹写入以及采集步骤
使用串口调试助手向 STM32发送命令,STM32通过解析调试助手发送的命令,向指 纹模块发送控制指令,而后等待指纹模块向 STM32反馈的应答信息,STM32接收到反馈 信息后,通过指令解析向串行助手显示指纹模块的处理结果。该实验使用了 2个中断,中 断 1使用串口接收中断,采用环形缓冲方式缓存来自指纹模块反馈的应答包。中断 2使用 EXTI中断方式,通过指纹模块的 TouchOut线电压变化检测有无手指按下,发现有手指按 下指示灯亮,反之则灭。
引脚名称 | 引脚说明 |
---|---|
TouchVin | 供电 3.3V |
TouchOut | 触摸中断引脚 |
Vin | 供电 3-5.5VD |
Tx | 串行数据输出 |
Rx | 串行数据输入 |
GND | 地 |
在配置 as608时要特别注意,串口通信的中断配置,除了要使能接收中断外, 还要使能总线空闲中断,目的是为了使环形缓冲区能完整的把来自指纹识别模块的应打包 数据记录下来,防止丢包。
如下:
该实验使用了2个中断,中断1使用串口接受收中断,采用环形缓冲方式缓存来自指纹模块反馈的信息。中断2通过EXTI中断方式,通过指纹模块的wak线电压变化检测有无手指按下,发现有手指按下指示灯亮,反之则灭。
在该实验中使用了 2个中断,一个是 STM32 USART串口接收中断,用以接收来自指纹 识别模块反馈的应答包,并将数据缓存到环行缓冲区中,QUEUE_DATA_TYPE是一类环 形数据结构体类型。环形缓冲区,顾名思义该缓冲区是环形结构,就是缓冲区利用写指针不断缓存接受到的数据时,当写指针访问到缓冲区的最后一个内存位置的时候,当来新的数据需要缓存的时候,写指针回到环形缓冲区的起点位置。缓存过程就类似一个环一样。 代码 data_p->head中是指向环形缓冲区的写指针的头位置,从头指针位置开始,每当缓冲 区缓存一个字节,写指针向下偏移一个位置,如此一个一个缓存应答包数据( *(data_p->head + data_p->len) = ucCh; )。
另一个是 EXTI 上升沿/下降沿触发中断( if (EXTI_GetITStatus(AS608_TOUCHOUT_INT_EXTI_LINE) != RESET) ),来一次中断信号灯反转一次: 灯初始化配置为熄灭状态,当手指放入指纹识别模块时,会产生一个边沿触发,灯反转 ( LED1_TOGGLE; )变亮,当手指从传感器移开时,再次触发一个边沿中断信号,灯再次反转 熄灭,如此来探测传感器上有无手指触摸。另外,串口通信中断优先级高于 EXTI中断,
如下:
在指纹库不存在用户指纹模版时,录指纹过程可以分为以下几个步骤:
(1) 录取 2 次指纹,并分别将 2 次录指纹所生成的指纹特征存放于 CharBuffer1 和 CharBuffer2中;
(2) 精确比对这两次指纹特征;
(3) 比对成功后,合并特征并生成用户指纹模版;
(4) 输入用户指纹存储 ID,保存指纹模版。
如果指纹库中已经存在某用户的指纹模版,再次录入该用户指纹模版,这样会浪费指纹库容量,所以在录第一次指纹后,先比对(识别)指纹,搜索指纹库中是否存在用户指纹模版,如果存在就结束录指纹的程序,不存在就继续完成录取指纹操作。另外,在录指 纹特征的某些特殊情况下,比如一段时间内未识别到指纹或者录取指纹过程连续失败 4 次, 程序就会退出录指纹的程序。
代码中 rx_data->head 是指向环形缓冲区的读指针的头位置,该位置缓存着应答包的第 一个数据。当环形缓冲区调用(使用)完毕之后,要重新更新读指针的位置(如第 19 行代 码),即上一次写指针的最后位置,作为下一次使用环形缓冲区的头指针。 根据 AS60x通信协议我们知道我们所需要的确认码位于应答数据包的第 9位,于是我 们从环形缓冲区读取出第 9位(第 17行代码)数值,就可以知道指纹处理模块的运行状态 了。
6.简述ESP8266的传输过程
ESP8266模块还支持STA/AP/STA+AP三种工作模式
AP模式:允许其它无线设备接入,提供数据访问,一般的无线路由/网桥工作在该模式下。AP和AP之间允许相互连接。
Sta模式:类似于无线终端,sta本身并不接受无线的接入,它可以连接到AP,一般无线网卡即工作在该模式。
相当于可以类似APC220那样模块对模块进行通信,也可以通过连接同一个路由器,利用IP地址进行通信。
引脚名称 | 引脚说明 |
---|---|
VCC | 电源,3V3供电 |
GND | 地 |
URXD | 串行数据输入 |
UTXD | 串行数据输出 |
CH_PD | 片选 |
RST | 复位脚 |
通过串口发送AT指令控制无线模块
操作步骤:
1.选择WF-ESP8266模块的工作模式(AT+CWMODE=1)
2.连接外部WiFi(WiFi账号,密码)
3.配置是否多连接
4.WF-ESP8266模块连接外部服务器(IP地址,端口号)
7.简述触摸屏的实现过程
液晶显示屏:
内部包含了一个型号为 ILI9806G的液晶控制器芯片,该液晶控制器使用8080接口与单片机通讯,液晶面板引出的FPC信号线即8080接口(RGB接口已在内部直接与ILI9806G相连),且控制器中包含有显存,单片机把要显示的数据通过引出的8080接口发送到液晶控制器,这些数据会被存储到它内部的显存中,然后液晶控制器不断把显存的内容刷新到液晶面板,显示内容。
该芯片最主核心部分是位于中间的GRAM(Graphics RAM),它就 是显存。GRAM中每个存储单元都对应着液晶面板的一个像素点。它右侧 的各种模块共同作用把GRAM存储单元的数据转化成液晶面板的控制信号, 使像素点呈现特定的颜色,而像素点组合起来则成为一幅完整的图像。 框图的左上角为ILI9806G的主要控制信号线和配置引脚,根据其不同状态设置可以使芯片工作在不同的模式,如每个像素点的位数是8、16 还是24位;可配置使用SPI接口、8080接口还是RGB接口与MCU进行通讯。 MCU通过SPI、8080接口或RGB接口与ILI9806G进行通讯,从而访问它的 控制寄存器(CR)、地址计数器(AC)、及GRAM。 在GRAM的上侧还有一个LED控制器(LED Controller)。LCD为非发光性的显示装置,它需要借助背光源才能达到显示功能,LED控制器就 是用来控制液晶屏中的LED背光源。
ILI9806G控制器根据自身的IM[3:0]信号线电平决定它与MCU的通讯方式,它本身支持SPI及8080通讯方式,本示例中液晶屏的ILI9806G控制器在出厂前就已经按固定配置好(内部已连接硬件电路),它被配置为通过 8080接口通讯,使用16根数据线的RGB565格式,且背光LED引脚不与 ILI9806G相连,而是直接引出到排针供外部控制器控制。
STM32通过该接口与ILI9806G芯片进行通讯,实现对液晶屏的控制。通讯的内容主要包括命令和显存数据,显存数据即各个像素点的RGB565内容;命令是指对ILI9806G 的控制指令,MCU可通过8080接口发送命令编码控制ILI9806G的工作方式, 例如复位指令、设置光标指令、睡眠模式指令等等,具体的指令在《ILI9806GData Sheet.pdf》数据手册均有详细说明。
写命令时序由片选信号CSX拉低开始,对数据/命令选择信号线D/CX也置低 电平表示写入的是命令地址(可理解为命令编码,如软件复位命令:0x01),以写信号 WRX为低,读信号RDX为高表示数据传输方向为写入,同时,在数据线D[23:0](或 D[15:0])输出命令地址,在第二个传输阶段传送的是命令的参数,所以D/CX要置高电平,表示写入的是命令数据,命令数据是某些指令带有的参数,如复位指令编码为 0x01,它后面可以带一个参数,该参数表示多少秒后复位(实际的复位命令不含参数, 此处只是为了讲解指令编码与参数的区别)。
当需要把像素数据写入GRAM时,过程很类似,把片选信号CSX拉低后,再把数据/命令选择信号线D/CX置为高电平,这时由D[23:0]传输的数据则会被ILI9806G 保存至它的GRAM中。
注:8080时序: 8080总线又叫Intel总线。 大致来说,Intel总线的控制线有四根,RD写使能, WR读使能, ALE地址锁存, CS片选。
RD,WR可以同时为高, 不能同时为低!! RD为低时表示要从LCD中读出数据在D0-D7脚上, WR为低时表示:将当前D0-D7上的数据写入LCD。
而12864和1602采用的则是6800时序
6800中: 用E(读写总使能脚)和W/R(Write/Read)来完成上面的功能:
E:为高时才允许进行读或写的操做, W/R=1是写,W/R=0是读
触摸屏:
触摸屏分为电阻触摸屏(较便宜),电阻触摸屏(毕设用的)
作用:把触摸位置转化坐标数据的输入设备
原理:X轴电极与Y轴电极在交叉处形成电容,即这两组电极构成了电容的两极,这样的结构覆盖了整个电容屏,每个电容单元在触摸屏中都有其特定的物理位置,即电容的位置就是它在触摸屏的XY坐标
触摸检测的主体是型号为GT5688的芯片,它接收触摸屏的信号进行处理,把触摸信息使用 I2C接口输出到 STM32控制器
编程步骤:
1.初始化通讯使用的目标引脚及端口时钟;
2.使能FSMC外设的时钟;
3.配置FSMC位异步NOR FLASH模式以仿真8080时序;
4.建立机制使用FSMC向也仅够发送命令及数据;
5.发送控制命令初始化液晶屏;
6.编写相关应用程序
8.简述FSMC原理(大概思路)
由FSMC模拟出的8080接口向ILI9341写入控制命令或GRAM的数据
STM32F407系列芯片使用 FSMC外设来管理扩展的存储器,FSMC是 Flexible Static Memory Controller的缩写,译为灵活的静态存储控制器。它可以用于驱动包括 SRAM、 NOR FLASH 以及 NAND FLSAH 类型的存储器,不能驱动如 SDRAM这种动态的存储器而 在 STM32F4系列的控制器中,它具有 FMC外设,支持控制 SDRAM存储器。
*编程要点 *
(1) 初始化通讯使用的目标引脚及端口时钟;
(2) 使能 FSMC外设的时钟;
(3) 配置 FSMC SRAM的时序、工作模式;
(4) 建立机制访问外部 SRAM存储器;
(5) 编写测试程序,对读写数据进行校验。
9.简述IIC原理
I2C 通讯协议(Inter-Integrated Circuit)是由 Phiilps公司开发的,由于它引脚少,硬件 实现简单,可扩展性强,不需要 USART、CAN等通讯协议的外部收发设备,现在被广泛 地使用在系统内多个集成电路(IC)间的通讯。
一个 I2C 总线只使用两条总线线路,一条双向串行数据线(SDA) ,一条串行时钟线 (SCL)。数据线即用来表示数据,时钟线用于数据收发同步。
I2C使用 SDA信号线来传输数据,使用 SCL信号线进行数据同步。
SDA 数据线在 SCL的每个时钟周期传输一位数据。传输时,SCL为高电平的时候 SDA表示的数据有效,即此时的 SDA为高电平时表示数据“1”,为低电平时表示数据“0”。当 SCL 为低电平时,SDA的数据无效,一般在这个时候 SDA进行电平切换,为下一次表示数据做好准备。
如果我们直接控制 STM32的两个 GPIO 引脚,分别用作 SCL及 SDA,按照时序要求,直接像控制 LED 灯那样控制引脚的输出(若是接收数据时则读取 SDA电平), 就可以实现 I2C通讯。同样,假如我们按照 USART的要求去控制引脚,也能实现 USART通讯。所以只要遵守协议,就是标准的通讯。
由于直接控制 GPIO 引脚电平产生通讯时序时,需要由 CPU 控制每个时刻的引脚状态, 所以称之为“软件模拟协议”方式。 相对地,还有“硬件协议”方式,STM32 的 I2C 片上外设专门负责实现 I2C 通讯协议, 只要配置好该外设,它就会自动根据协议要求产生通讯信号,收发数据并缓存起来,CPU 只要检测该外设的状态和访问数据寄存器,就能完成数据收发。这种由硬件外设处理 I2C 协议的方式减轻了 CPU的工作,且使软件设计更加简单。
(1) 配置通讯使用的目标引脚为开漏模式;
(2) 使能 I2C外设的时钟;
(3) 配置 I2C外设的模式、地址、速率等参数并使能 I2C外设;
(4) 编写基本 I2C按字节收发的函数
10.舵机驱动原理
数字舵机区别于传统的模拟舵机,模拟舵机需要给它不停的发送PWM信号,才能让它保持在规定的位置或者让它按照某个速度转动,数字舵机则只需要发送一次PWM信号就能保持在规定的某个位置。”
舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms-2.5ms范围内的角度控制脉冲部分,总间隔为2ms。以180度角度伺服为例,那么对应的控制关系是这样的:
0.5ms————–0度;
1.0ms————45度;
1.5ms————90度;
2.0ms———–135度;
2.5ms———–180度;
在我的程序中,0 ~ 180度对应的程序为:
TIM_SetCompare1(GENERAL_TIM,5) ~ TIM_SetCompare1(GENERAL_TIM,25)
上位机问题:
1.简述socket原理与编程实现步骤:
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。
编程步骤:
1.创建socket对象
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#创建TCP Socket
2.需要自己绑定一个ip地址和端口号
s.bind( (‘192.168.0.106’,8080) )#注:每次连接WIFI后IP地址可能发生改变
3.将套接字绑定到地址, 在AF_INET下,以元组(host,port)的形式表示地址
4.服务端监听操作时刻注意是否有客户端请求发来
s.listen(3)#可以同时监听3个,但是这里只有一个客户请求,因为没有写多线程
5.开始监听TCP传入连接。backlog指定在拒绝连接之前,操作系统可以挂起的最大连接数量。该值至少为1,大部分应用程序设为5就可以了。
6.接受TCP连接并返回(s1,address),其中s1是新的套接字对象,可以用来接收和发送数据。address是连接客户端的地址。
#s 是服务端的socket对象s1是接入的客户端socket对象
s1,addr=s.accept()
2.简述线程与进程的原理与关系
进程概念
进程是表示资源分配的基本单位,又是调度运行的基本单位。例如,用户运行自己的程序,系统就创建一个进程,并为它分配资源,包括各种表格、内存空间、磁盘空间、I/O设备等。然后,把该进程放人进程的就绪队列。进程调度程序选中它,为它分配CPU以及其它有关资源,该进程才真正运行。所以,进程是系统中的并发执行的单位。
线程概念
线程是进程中执行运算的最小单位,亦即执行处理机调度的基本单位。如果把进程理解为在逻辑上操作系统所完成的任务,那么线程表示完成该任务的许多可能的子任务之一。例如,假设用户启动了一个窗口中的数据库应用程序,操作系统就将对数据库的调用表示为一个进程。假设用户要从数据库中产生一份工资单报表,并传到一个文件中,这是一个子任务;在产生工资单报表的过程中,用户又可以输人数据库查询请求,这又是一个子任务。这样,操作系统则把每一个请求――工资单报表和新输人的数据查询表示为数据库进程中的独立的线程。线程可以在处理器上独立调度执行,这样,在多处理器环境下就允许几个线程各自在单独处理器上进行。操作系统提供线程就是为了方便而有效地实现这种并发性
引入线程的好处
(1)易于调度。
(2)提高并发性。通过线程可方便有效地实现并发性。进程可创建多个线程来执行同一程序的不同部分。
(3)开销少。创建线程比创建进程要快,所需开销很少。。
(4)利于充分发挥多处理器的功能。通过创建多线程进程(即一个进程可具有两个或更多个线程),每个线程在一个处理器上运行,从而实现应用程序的并发性,使每个处理器都得到充分运行。
进程和线程的关系
(1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。线程是操作系统可识别的最小执行和调度单位。
(2)资源分配给进程,同一进程的所有线程共享该进程的所有资源。 同一进程中的多个线程共享代码段(代码和常量),数据段(全局变量和静态变量),扩展段(堆存储)。但是每个线程拥有自己的栈段,栈段又叫运行时段,用来存放所有局部变量和临时变量。
(3)处理机分给线程,即真正在处理机上运行的是线程。
(4)线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。