b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

tls现代的应用程序都运行在一个内存空间里,在32位的系统里(6)

电脑杂谈  发布时间:2018-02-13 20:45:13  来源:网络整理

综合以上分析,我们可以把_start改写成一段更具有可读性的伪代码:

其中argv除了指向参数表外,还隐含接着环境变量表。这个环境变量表要在_libc_start_main里从argv内提取出来。

实际执行代码的函数是_libc_start_main

这是_libc_start_main的函数头部,可见和_start函数里的调用一致,一共有7个参数,其中main由第一个参数传入,紧接着是argc和argv。除了main的函数指针之外,外部还要传入3个函数指针,分别是:

1)init:main调用前的初始化工作。

2)fini:main结束后的收尾工作

3)rtld_fini:和动态加载有关的收尾工作,rtld是runtime loader的缩写。

最后的stack_end标明了栈底的地址,即最高的栈地址。

在main函数结束之后调用的,在_libc_start_main的末尾,关键的两行代码:

在最后,mian函数终于被调用,并退出。然后我们看看exit函数:

在其中的_exit_funcs是存储由_cxa_atexit和atexit注册的函数的链表,而这里的这个while环则遍历该链表并逐个调用这些注册的函数。在_exit调用后,进程就会直接结束。程序正常结束有两种情况,一种是main函数的正常返回,一种是程序中用exit退出。在_libc_start_main里面我们看到,即使main返回了,exit还是会被调用,exit是进程正常退出的必经之路。因此把调用atexit注册的函数的任务交给exit来完成万无一失。

2.2.1 C语言运行库

任何一个C程序,它的背后都有一套庞大的代码来进行支撑,以使得程序能够正常运行。这套代码至少包括入口函数,及其所依赖的函数所构成的函数集合。当然,它还理应包括各种标准库函数的实现。

这样的一个代码集合称之为运行时库。而C语言的运行时库,即被称为C运行库(CRT)。

一个C语言运行库大概包含了如下功能:

1)启动与退出:包括入口函数及入口函数所依赖的其他函数等。

2)标准函数:由C语言标志规定的C语言标准库所拥有的函数实现

3)I/O:I/O功能的封装和实现

4)堆:堆的封装和实现

5)语言实现

6)调试:实现调试功能的代码

tls_不安全的tls安全设置_tls与ssl的区别

2.3.1 CRT的多线程困扰

线程的访问能力非常自由,它可以访问进程内存里的所有数据,甚至包括其他线程的堆栈(如果它知道其他线程的堆栈地址),但实际运用中线程也拥有自己的私有存储空间,包括:

1)栈

2)线程局部存储(TLS)。线程局部存储是某些操作系统单独提供的私有空间,但通常只具有很有限的尺寸。

3)寄存器(包括PC寄存器)

由于当初设计CRT的时候没有考虑多线程的环境,因此C/C++运行库在多线程方面吃了不少苦。例如:

1)errno:在C标准库里,大多数错误代码是在函数返回之前赋值在名为errno的全局变量里的。多线程并发的时候,有可能A线程的errno的值在获取之前就被B线程给覆盖掉,从而获得错误的出错信息。

2)strtok()等函数都会使用函数内部的局部静态变量来存储字符串的位置,不同的线程调用这个函数将会把它内部的局部静态变量弄混乱。

3)malloc/new与free/delete:堆分配/释放函数或关键字在不加锁的情况下是线程不安全的。

4)异常处理:在早期的C++运行库里,不同的线程抛出的异常会彼此冲突,从而造成信息丢失的情况

5)printf/fprintf及其他I/O函数:流输出函数同样是线程不安全的,因为它们共享了同一个控制台或文件输出。不同的输出并发时,信息会混杂在一起。


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-76057-6.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...