《程序员的自我修养》--笔记01

001.线程调度部分:

优先级调度中,cpu偏好选择“频繁等待的进程”--通常是io密集型的任务,因为此类任务占用cpu时间较短;对于很少等待的进程--cpu密集型任务,通常占用cpu时间比较长,后者优先级会低一点;这样会存在一个“饿死”现象,高优先级任务一直占据cpu,低优先级难以执行。--系统会逐步提升等待时间过长的进程的优先级。

优先级需要注意:用户可以自己指定优先级;根据进入等待装填的频率提升或降低优先级;长时间得不到执行而被提升优先级。

=========================================

002 线程安全

原因:不同线程共享可访问的全局变量以及堆数据,可能由于多线程之间操作的不一致,出现一致性问题,即数据的修改因为多线程,出现预期之外的情况。

概念:原子操作--编译器的单指令操作;非原子操作的命令,可能由于编译器的执行优化以及cpu调度,导致命令执行顺序或者变量赋值超出预期。

锁的类型

二元信号量(仅允许单个线程访问)->多元信号量(信号flag,N,允许多个线程并发访问)->互斥量(类似二元信号量,区别是本尊--“谁主张谁负责”)->临界区(类似于互斥量,进一步要求--仅仅允许本进程获取该锁)->读写锁(对读和写的保护分离,允许多个线程同时读,但是对于写的操作需要多个线程同步好。读写锁有三种状态:自由,共享,独占。)->条件变量(条件变量类似于栅栏的作用,线程可以等待条件变量,线程可以唤醒条件变量。当多个线程等待某一个条件变量时候,该条件变量唤醒时候,所有线程一起恢复执行。)

函数可重入

当多个线程执行某一个函数时候,或者函数递归调用本身。可重入的5点要求:(1)仅仅依赖于调用方法提供的参数;(2)不调用任何不可重入的函数;(3)不依赖任何单个资源的锁;(4)不使用任何静态或全局的非const的变量;(5)不不返回任何静态或全局的非const的变量的指针。

过度优化:编译器层面的指令优化:使用volatile关键字禁止编译器优化;cpu的动态调度:使用barrier()类似的函数,阻止cpu换顺序。

线程模型

(用户线程和内核线程的区别)

(1)一对一模型

(2)多对一模型

(3)多对多模型

(多个用户线程对应到一个以上的内核线程,调度更加灵活--防止阻塞全死;上下文切换更便捷)。

=================================================

003 编译和链接

程序源代码到可执行文件一般是四个步骤:

预编译,编译,汇编,链接。其中主要步骤是编译步骤,包含:词法分析,语法分析,语义分析,中间代码生成,目标代码生成与优化。对于链接来说:地址和空间分配,符号决议和重定位三个步骤。

预编译

处理源代码中#开头的命令,例如#define--展开宏定义;#include--将包含的文件插入到预编译命令处;处理条件预编译指令;删除注释;添加行号和文件名标识;保留#pragma编译器指令。使用方法:gcc -E hello.c -o hello.i

编译

(1)词法分析——将代码的字符序列分割成一系列的记号;

(2)语法分析——将记号,生成语法树——节点为表达式;

(3)语义分析——静态语义分析,对语法树节点加上标志类型;

(4)中间语言生成——将语法树转换成中间代码,例如三地址码;中间代码使得编译器可以分为前端和后端,前端产生机器无关的中间代码,后端负责将中间代码转换成目标机器代码;

(5)目标代码生成与优化——这一部分属于编译器后端的工作,主要包括代码生成器——中间代码转换成机器码(考虑不同硬件的字长,寄存器,数据类型转换),和目标代码优化器——例如选择合适的寻址方式,使用位移替代乘法,删除多余的命令;

(gcc -S hello.i -o hello.s)

汇编

将汇编代码转换为机器可以执行的命令。根据汇编指令和机器指令的对照表,一一翻译。(gcc -c hello.s -o hello.o)

链接

ld xxxx xx.out;单个文件内部,变量和函数的地址表示symbol化,编译阶段解决单个文件的代码翻译,但是跨文件的地址依赖,还需进一步确定,思想类似于:符号拼图。

(每个源代码文件,经过编译之后变成目标文件.o;目标文件和库一起链接成可执行文件,另外,库——一系列目标文件的打包)

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值