程序编译过程
1.预处理
解析 #ifdef #ifndef
解析 #include 将文件加载到当前位置
解析 #define
删除所有注释
对文件进行序号标识
保留# pramga
2.编译
对于处理后的文件,进行语义分析,词义分析
,编译优化,代码生成为汇编代码
3.汇编
讲汇编代码转换为机器码语言文件
4.链接
将二进制文件加载为.exe装入内存中
进程分配的空间
操作系统32位 进程32位 4gb虚拟地址空间 2^32
64位 进程64位/32位 16tb/4gb
虚拟空间是最大空间
32位分为三种模式
内核模式 所有进程共享
用户模式 进程的私有地址
空指针模式 调试程序使用
64位分为两种模式
内核模式
用户模式
关于cpu上线程执行方式
基于轮换时间片 , 一个人执行一会儿 (20ns)
并发 : 多个执行命令交替的执行 在一个cpu上
并行 : 多个执行命令同时在执行 在多个cpu上
线程与进程的关系
进程是分配空间的基本单位
线程是轮换时间片的基本单位
线程是进程中的基本单元
一个进程至少一个线程
线程隶属于进程一部分
线程组成部分
1.线程栈用来储存线程所需要的局部的临时资源
2.内核对象,计数器2次,挂起计数器,信号
用户空间是进程独有的
内核空间是所有进程共有的
线程种类
用户线程,内核线程
按照 1:1 n:1 n:m
线程提高效率通常通过提高工作密度
线程基本状态 (主要有三个)
1.获得cpu时间片
2.等待某个事件发生
3.等待io操作发生
4.时间用完了
5.x6.x
调用约定
参数由右往左,自身清除printf(); ——edcil支持可变参数
线程栈是私有的,堆是共有的
多线程并发的问题
线程同步:原子访问,同一时刻只允许一个线程访问共享资源(变量)
volatile 防止编译优化,直接操作内存
一.临界区(关键段) 同一时间只允许一个线程访问代码段
1.结构体的定义 CRITICAL_SECTION m_cs;
2.临界区的初始化 InitializeCriticalSection(&m_cs);
3.临界区的销毁 DeleteCriticalSection(&m_cs);
4.实现临界区 1)EnterCriticalSection(&cs);
2) LeaveCriticalSection(&m_cs);
临界区类似一个小房间,一个人进去了就锁上了
1)直接阻塞
2)旋转锁(等一会再阻塞) InitializeCriticalSectionAndSpinCount函数
3)非阻塞
二.内核对象
3.互斥量 初始拥有权
4.事件 人工状态
5.信号量 指定数量
不同点:1.适用范围
2.灵活性
3.安全性 内核对象更安全
4.效率 临界区效率更高
减少锁的力度可以提高效率