您的位置:首页 > 职场人生

程序员自我修养第一章基础知识总结

2013-08-07 14:24 302 查看

1.3、站得高,望得远

应用程序编程接口(ApplicationProgramming Interface)

1.5、内存不够怎么办

如何将计算机上有限的物理内存分配给多个程序使用,需要考虑的问题(1)地址空间不隔离;(2)内存使用效率低;(3)程序运行的地址不确定。

提出的方法:分段方法,把一段程序所需要的内存空间大小的虚拟空间映射到某个地址空间(它解决了(1)(3)两个问题,但内存使用效率低)。分页方法,把地址空间人为地等分成固定大小的页。每一页大小有硬件或硬件支持多种页大小由操作系统决定(一般4KB每页)。

虚拟存储的实现需要依靠硬件的支持,对于不同的CPU来说是不同的,但几乎所有硬件都采用一个叫MMU(Memory Management Unit)的部件来进行页映射,它一般集成在CPU内部。

1.6.1、线程基础

线程(Thread),有时被称为轻量级进程(LightWeightProcess,LWP),是程序执行流的最小单位。一个标准的线程由线程ID、当前指令指针、寄存器集合和堆栈组成。通常意义上,一个进程由多个线程组成,各个线程之间共享程序的内存空间(包括代码段、数据段、堆等)及一些进程级的资源(打开文件和信号灯)。

线程私有的数据有:(1)局部变量;(2)函数的参数;(3)TLS(线程局部存储Thread Local Storage)数据;(4)寄存器,寄存器是执行流的基本数据,因此为私有。

线程通常拥有至少三种状态:就绪、运行、阻塞。就绪获得处理机变为运行,运行剥夺处理机变为就绪。运行发生等待事件则进入阻塞状态,事件发生则进入就绪状态。

Linux的多线程:Linux将所有的执行实体(无论是线程还是进程)都成为任务(Task)。

1.6.2、线程安全

同步与锁:(1)二元信号量,它只有占用与非占用两种状态。适合只能被唯一一个线程独占访问的资源。还有多元信号量,简称信号量(Semaphore);(2)互斥量(Mutex),与信号量类似,区别在于同一个信号量可以被系统中的一个线程获取之后由另一个线程释放,而互斥量则要求哪个线程获取了互斥量,哪个线程就要负责释放这个锁。(3)临界区(Critical
Section)是比互斥量更加严格的同步手段。区别,互斥量和信号量在系统的任何进程里都是可见的,即一个进程创建了一个互斥量或信号量,另一个进程试图去获取该锁是合法的。然而临界区的作用范围仅限于本进程,其他进程无法获取该锁。(4)读写锁,用于更特定的场合的同步。(5)条件变量(Condition Variable),线程可以等待条件变量或者唤醒条件变量。使用条件变量可以让许多线程一起等待某个事件的发生,当事件发生(条件变量被唤醒),所有线程一起恢复执行。

可重入(Reentrant)与线程安全:一个函数可重入(递归或多线程访问)表明该函数被重入后不会产生任何不良后果。

一个函数可重入必须具备的条件(全部满足):(1)不使用任何(包括局部)静态或全局的非const变量;(2)不返回任何(局部)静态或全局的非const变量的指针。(3)仅依赖于调用方提供的参数。(4)不依赖任何单个资源的锁。(5)不调用任何不可重入的函数。

阻止过度优化:可以使用volatile关键字阻止过度优化,它可以(1)阻止编译器为了提高速度将一个变量缓存到寄存器内而不写回(即都会写回~);(2)阻止编译器调整操作volatile变量的指令顺序(但还是无法阻止CPU动态调度换序)。

CPU的乱序执行能力(如(1)在内存位置调用构造函数;(2)将内存的地址赋值给指针p,这两个顺序可以被CPU颠倒,然而如果其他线程访问p,p还是悬垂指针···)让多线程安全保障变得困难。CPU提供一条指令(有的叫barrier)。该指令会阻止CPU将该指令之前的指令交换到该指令之后。

1.6.3、多线程内部情况

三种线程模型:(1)一对一模型;(2)多对一模型;(3)多对多模型。(用户线程与内核线程的对应关系)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: