嵌入式之经典知识点(五)

信号量与互斥锁的区别

1.互斥量用于线程的互斥,信号量用于线程的同步。

互斥:是指某一资源同时只允许一个访问者对其访问,具有唯一性和排他性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。

2.同步:是指在互斥的基础上,通过其他机制实现访问者对资源的有序访问,在大多数情况下,同步已经实现了互斥,特别是所有写入资源的事件都是互斥的。少数情况允许多个访问者同时访问资源。互斥量只能为0或者1,而信号量可以为非负整数。

也就是说一个互斥量只能用于一个资源的互斥访问,不能实现多个资源的多线程互斥问题。信号量可以解决多个同类资源的多线程互斥和同步。当信号量为单值时,也可以像互斥量一样实现一个资源的互斥访问。

浅谈text段,data段和bss段

一般情况下,一个程序本质上都是由text段,data段,bss段三个段组成的--这是计算机程序设计中重要的基本概念。

在采用段式内存管理的架构中(如intel的8086),bss段(Block Started by Symbol segment)通常用来存放程序中未初始化的全局变量的一块内存区域,一般在初始化时bss段会清零(bss段属于静态内存分配),程序一开始就清零。

比如,在C语言程序编译完成后,已初始化的全局变量保存在data段中,未初始化的全局变量放在bss段中。

text段:用于存放程序代码的区域,编译时确定,只读。更进一步讲text段存放的是机器指令,当各个源文件单独编译之后生成目标文件,经连接器链接各个目标文件并解决各个源文件函数之间的关系,同时,还得将所有的目标文件的text段合在一起,但不是简单地堆在一起,还需要处理各个段之间的函数引用问题。

在嵌入式系统中,如果处理器带MMU(Memory Management Unit)内存管理单元,通常就会将text段设置为只读。如果没有MMU,就无法获得这种代码保护功能。

data段:用于存放在编译阶段而非运行阶段,就能确定的数据,可读可写。就是通常说的静态存储区,赋了初值的全局变量,常量和静态变量都存放在这里。

bss段不在可执行文件中,由系统初始化。

int a;
int main()
{
  //
  return 0;
}


int a=1000;
int main()
{
  //
  return 0;
}

发现程序2的可执行文件大小比程序1大得多。

因为程序1中的a未被初始化,放在bss段中,而bss段不在可执行文件中,由系统执行。bss段(未手动初始化的变量)并未给该段的数据分配空间,只是记录数据所需空间的大小。

包含data段和bss段的区段通常被叫作数据区

猜你喜欢

转载自blog.csdn.net/weixin_40288381/article/details/81087094