编译系统8大组成
❶ 编译器是什么。
1、 visual c++6.0 (win8系统下不好用,C/C++)-Microsoft Visual C++ ;
2、 visual studio (2005、2008、2010、2012、2013)- Microsoft Visual Studio ;
3、 win-tc非常方便:不骗你,2000/XP/7都可以用 ;
4、 Code::Blocks(win7、8都可以用);
5、 Turb C(只能编译c语言) ;
6、 gcc (GNU编译器套件) ;
7、 DEV C++;
8、 C-Free;
9、 Borland C++、WaTCom C++、Borland C++ Builder、GNU DJGPP C++、Lccwin32 C Compiler3.1、High C、My Tc等,由于C语言比较成熟,所以编程环境很多;
10、还常用souceinsight ,在工作中还用Labwindows编程,直接调试运行,不过那是有工程背景,有工作经验的技术人员用的。
❷ 编译器支持的最大偏移地址是多少位
2位编译器
char :1个字节
char*(即指针变量): 4个字空侍核节(32位的寻址空间是2^32, 即32个bit,也就是4个字节。同理斗掘64位编译器) short int : 2个字节
int: 4个字节
unsigned int : 4个字节
float: 4个字节
double: 8个字节
long: 4个字节
long long: 8个字节
unsigned long: 4个字节
[cpp] view plain
64位编译器
char :1个字节
char*(即指针变量): 8个字节
short int : 2个字节
int: 4个字节
unsigned int : 4个字节
float: 4个字节
double: 8个字谈橡节
long: 8个字节
long long: 8个字节
❸ 深入理解计算机系统的目录2
第1章计算机系统漫游1
1.1信息就是位+上下文1
1.2程序被其他程序翻译成不同的格式3
1.3了解编译系统如何工作是大有益处的4
1.4处理器读并解释存储在存储器中的指令5
1.4.1系统的硬件组成5
1.4.2运行hello程序7
1.5高速缓存至关重要7
1.6存储设备形成层次结构9
1.7操作系统管理硬件10
1.7.1进程11
1.7.2线程12
1.7.3虚拟存储器12
1.7.4文件13
1.8系统之间利用网络通信13
1.9重要主题15
1.9.1并发和并行15
1.9.2计算机系统中抽象的重要性17
1.10小结17
参考文献说明18
.第一部分程序结构和执行
第2章信息的表示和处理20
2.1信息存储22
2.1.1十六进制表示法22
2.1.2字25
2.1.3数据大小25
2.1.4寻址和字节顺序26
2.1.5表示字符串31
2.1.6表示代码31
2.1.7布尔代数简介32
2.1.8c语言中的位级运算34
2.1.9c语言中的逻辑运算36
2.1.10c语言中的移位运算36
2.2整数表示38
2.2.1整型数据类型38
2.2.2无符号数的编码39
2.2.3补码编码40
2.2.4有符号数和无符号数之间的转换44
2.2.5c语言中的有符号数与无符号数47
2.2.6扩展一个数字的位表示49
2.2.7截断数字51
2.2.8关于有符号数与无符号数的建议52
2.3整数运算54
2.3.1无符号加法54
2.3.2补码加法57
2.3.3补码的非59
2.3.4无符号乘法60
2.3.5补码乘法60
2.3.6乘以常数63
2.3.7除以2的幂64
2.3.8关于整数运算的最后思考67
2.4浮点数67
2.4.1二进制小数68
2.4.2ieee浮点表示70
2.4.3数字示例71
2.4.4舍入74
2.4.5浮点运算76
2.4.6c语言中的浮点数77
2.5小结79
参考文献说明80
家庭作业80
练习题答案90
第3章程序的机器级表示102
3.1历史观点103
3.2程序编码105
3.2.1机器级代码106
3.2.2代码示例107
3.2.3关于格式的注解109
3.3数据格式111
3.4访问信息112
3.4.1操作数指示符112
3.4.2数据传送指令114
3.4.3数据传送示例116
3.5算术和逻辑操作118
3.5.1加载有效地址118
3.5.2一元操作和二元操作119
3.5.3移位操作120
3.5.4讨论120
3.5.5特殊的算术操作122
3.6控制123
3.6.1条件码124
3.6.2访问条件码125
3.6.3跳转指令及其编码127
3.6.4翻译条件分支129
3.6.5循环132
3.6.6条件传送指令139
3.6.7switch语句144
3.7过程149
3.7.1栈帧结构149
3.7.2转移控制150
3.7.3寄存器使用惯例151
3.7.4过程示例152
3.7.5递归过程156
3.8数组分配和访问158
3.8.1基本原则158
3.8.2指针运算159
3.8.3嵌套的数组159
3.8.4定长数组161
3.8.5变长数组163
3.9异质的数据结构164
3.9.1结构164
3.9.2联合167
3.9.3数据对齐170
3.10综合:理解指针172
3.11应用:使用gdb调试器174
3.12存储器的越界引用和缓冲区溢出175
3.13x86-64:将ia32扩展到64位183
3.13.1x86-64的历史和动因184
3.13.2x86-64简介185
3.13.3访问信息187
3.13.4控制192
3.13.5数据结构200
3.13.6关于x86-64的总结性评论200
3.14浮点程序的机器级表示201
3.15小结201
参考文献说明202
家庭作业202
练习题答案212
第4章处理器体系结构230
4.1y86指令集体系结构231
4.1.1程序员可见的状态231
4.1.2y86指令232
4.1.3指令编码233
4.1.4y86异常237
4.1.5y86程序237
4.1.6一些y86指令的详情241
4.2逻辑设计和硬件控制语言hcl242
4.2.1逻辑门243
4.2.2组合电路和hcl布尔表达式243
4.2.3字级的组合电路和hcl整数表达式245
4.2.4集合关系248
4.2.5存储器和时钟248
4.3y86的顺序实现250
4.3.1将处理组织成阶段250
4.3.2seq硬件结构258
4.3.3seq的时序259
4.3.4seq阶段的实现262
4.4流水线的通用原理267
4.4.1计算流水线268
4.4.2流水线操作的详细说明269
4.4.3流水线的局限性271
4.4.4带反馈的流水线系统272
4.5y86的流水线实现273
4.5.1seq+:重新安排计算阶段273
4.5.2插入流水线寄存器276
4.5.3对信号进行重新排列和标号277
4.5.4预测下一个pc279
4.5.5流水线冒险280
4.5.6用暂停来避免数据冒险283
4.5.7用转发来避免数据冒险285
4.5.8加载/使用数据冒险288
4.5.9异常处理289
4.5.10pipe各阶段的实现291
4.5.11流水线控制逻辑297
4.5.12性能分析305
4.5.13未完成的工作306
4.6小结308
参考文献说明309
家庭作业309
练习题答案314
第5章优化程序性能324
5.1优化编译器的能力和局限性325
5.2表示程序性能328
5.3程序示例330
5.4消除循环的低效率332
5.5减少过程调用336
5.6消除不必要的存储器引用336
5.7理解现代处理器340
5.7.1整体操作340
5.7.2功能单元的性能343
5.7.3处理器操作的抽象模型344
5.8循环展开348
5.9提高并行性351
5.9.1多个累积变量351
5.9.2重新结合变换354
5.10优化合并代码的结果小结358
5.11一些限制因素359
5.11.1寄存器溢出359
5.11.2分支预测和预测错误处罚360
5.12理解存储器性能363
5.12.1加载的性能363
5.12.2存储的性能364
5.13应用:性能提高技术369
5.14确认和消除性能瓶颈369
5.14.1程序剖析370
5.14.2使用剖析程序来指导优化371
5.14.3amdahl定律374
5.15小结375
参考文献说明375
家庭作业376
练习题答案378
第6章存储器层次结构382
6.1 存储技术382
6.1.1随机访问存储器383
6.1.2磁盘存储389
6.1.3固态硬盘398
6.1.4存储技术趋势399
6.2局部性401
6.2.1对程序数据引用的局部性402
6.2.2取指令的局部性403
6.2.3局部性小结403
6.3存储器层次结构405
6.3.1存储器层次结构中的缓存406
6.3.2存储器层次结构概念小结408
6.4高速缓存存储器408
6.4.1通用的高速缓存存储器结构409
6.4.2直接映射高速缓存410
6.4.3组相联高速缓存416
6.4.4全相联高速缓存418
6.4.5有关写的问题420
6.4.6一个真实的高速缓存层次结构的解剖421
6.4.7高速缓存参数的性能影响422
6.5编写高速缓存友好的代码423
6.6综合:高速缓存对程序性能的影响426
6.6.1存储器山426
6.6.2重新排列循环以提高空间局部性430
6.6.3在程序中利用局部性433
6.7小结433
参考文献说明434
家庭作业434
练习题答案442
第二部分在系统上运行程序
第7章链接448
7.1编译器驱动程序449
7.2静态链接450
7.3目标文件450
7.4可重定位目标文件451
7.5符号和符号表452
7.6符号解析454
7.6.1链接器如何解析多重定义的全局符号455
7.6.2与静态库链接457
7.6.3链接器如何使用静态库来解析引用460
7.7重定位461
7.7.1重定位条目461
7.7.2重定位符号引用462
7.8可执行目标文件465
7.9加载可执行目标文件466
7.10动态链接共享库467
7.11从应用程序中加载和链接共享库468
7.12与位置无关的代码(pic)471
7.13处理目标文件的工具473
7.14小结473
参考文献说明474
家庭作业474
练习题答案479
第8章异常控制流480
8.1异常481
8.1.1异常处理481
8.1.2异常的类别482
8.1.3linux/ia32系统中的异常484
8.2进程487
8.2.1逻辑控制流487
8.2.2并发流487
8.2.3私有地址空间488
8.2.4用户模式和内核模式488
8.2.5上下文切换489
8.3系统调用错误处理491
8.4进程控制492
8.4.1获取进程id492
8.4.2创建和终止进程492
8.4.3回收子进程495
8.4.4让进程休眠499
8.4.5加载并运行程序500
8.4.6利用fork和execve运行程序502
8.5信号504
8.5.1信号术语505
8.5.2发送信号506
8.5.3接收信号509
8.5.4信号处理问题511
8.5.5可移植的信号处理516
8.5.6显式地阻塞和取消阻塞信号517
8.5.7同步流以避免讨厌的并发错误517
8.6非本地跳转521
8.7操作进程的工具524
8.8小结524
参考文献说明525
家庭作业525
练习题答案530
第9章虚拟存储器534
9.1物理和虚拟寻址535
9.2地址空间535
9.3虚拟存储器作为缓存的工具536
9.3.1dram缓存的组织结构537
9.3.2页表537
9.3.3页命中538
9.3.4缺页538
9.3.5分配页面539
9.3.6又是局部性救了我们539
9.4虚拟存储器作为存储器管理的工具540
9.5虚拟存储器作为存储器保护的工具541
9.6地址翻译542
9.6.1结合高速缓存和虚拟存储器544
9.6.2利用tlb加速地址翻译545
9.6.3多级页表546
9.6.4综合:端到端的地址翻译547
9.7案例研究:intel core i7/linux存储器系统550
9.7.1core i7地址翻译551
9.7.2linux虚拟存储器系统554
9.8存储器映射556
9.8.1再看共享对象557
9.8.2再看fork函数558
9.8.3再看execve函数559
9.8.4使用mmap函数的用户级存储器映射559
9.9动态存储器分配561
9.9.1malloc和free函数561
9.9.2为什么要使用动态存储器分配563
9.9.3分配器的要求和目标564
9.9.4碎片565
9.9.5实现问题565
9.9.6隐式空闲链表565
9.9.7放置已分配的块567
9.9.8分割空闲块567
9.9.9获取额外的堆存储器567
9.9.10合并空闲块568
9.9.11带边界标记的合并568
9.9.12综合:实现一个简单的分配器570
9.9.13显式空闲链表576
9.9.14分离的空闲链表576
9.10垃圾收集578
9.10.1垃圾收集器的基本知识579
9.10.2mark&sweep垃圾收集器580
9.10.3c程序的保守mark&sweep580
9.11c程序中常见的与存储器有关的错误581
9.11.1间接引用坏指针582
9.11.2读未初始化的存储器582
9.11.3允许栈缓冲区溢出582
9.11.4假设指针和它们指向的对象是相同大小的583
9.11.5造成错位错误583
9.11.6引用指针,而不是它所指向的对象583
9.11.7误解指针运算584
9.11.8引用不存在的变量584
9.11.9引用空闲堆块中的数据584
9.11.10引起存储器泄漏585
9.12小结585
参考文献说明586
家庭作业586
练习题答案589
第三部分程序间的交互和通信
第10章系统级i/o596
10.1unix i/o596
10.2打开和关闭文件597
10.3读和写文件598
10.4用rio包健壮地读写599
10.4.1rio的无缓冲的输入输出函数600
10.4.2rio的带缓冲的输入函数600
10.5读取文件元数据604
10.6共享文件606
10.7i/o重定向608
10.8标准i/o609
10.9综合:我该使用哪些i/o函数610
10.10小结611
参考文献说明612
家庭作业612
练习题答案612
第11章网络编程614
11.1客户端-服务器编程模型614
11.2网络615
11.3全球ip因特网618
11.3.1ip地址619
11.3.2因特网域名620
11.3.3因特网连接623
11.4套接字接口625
11.4.1套接字地址结构625
11.4.2socket函数626
11.4.3connect函数626
11.4.4open_clientfd函数627
11.4.5bind函数628
11.4.6listen函数628
11.4.7open_listenfd函数628
11.4.8accept函数629
11.4.9echo客户端和服务器的示例630
11.5web服务器633
11.5.1web基础633
11.5.2web内容633
11.5.3http事务634
11.5.4服务动态内容636
11.6综合:tiny web服务器639
11.7小结645
参考文献说明645
家庭作业646
练习题答案646
第12章并发编程648
12.1基于进程的并发编程649
12.1.1基于进程的并发服务器649
12.1.2 关于进程的优劣651
12.2基于i/o多路复用的并发编程651
12.2.1基于i/o多路复用的并发事件驱动服务器653
12.2.2i/o多路复用技术的优劣657
12.3基于线程的并发编程657
12.3.1线程执行模型657
12.3.2posix线程658
12.3.3创建线程659
12.3.4终止线程659
12.3.5回收已终止线程的资源660
12.3.6分离线程660
12.3.7初始化线程660
12.3.8一个基于线程的并发服务器661
12.4多线程程序中的共享变量662
12.4.1线程存储器模型663
12.4.2将变量映射到存储器663
12.4.3共享变量664
12.5用信号量同步线程664
12.5.1进度图667
12.5.2信号量668
12.5.3使用信号量来实现互斥669
12.5.4利用信号量来调度共享资源670
12.5.5综合:基于预线程化的并发服务器674
12.6使用线程提高并行性676
12.7其他并发问题680
12.7.1线程安全680
12.7.2可重入性682
12.7.3在线程化的程序中使用已存在的库函数682
12.7.4竞争683
12.7.5死锁685
12.8小结687
参考文献说明687
家庭作业688
练习题答案691
附录a错误处理694
a.1unix系统中的错误处理694
a.2 错误处理包装函数696
参考文献698
❹ ls151和74hc151引脚图是一样吗。
1、只是74hc151就行,不用管前缀和后缀。引脚图如下。要了解更多的芯片数据,到网络文库下载就行了。
2、ls151和74hc151引脚图一样吗。MC74HC151的引脚排列与LS151完全相同。器件输入与标准CMOS输出兼容,带有上拉电阻,与LSTTL输出兼容。该器件选择八个二进制数据输入中的一个,由地址输入决定。
3、如图所示:用138实现序列:用时序信号加入地址端C、B、A,从G1或G2A、G2B输入序列,从G1端输入,在输出得到的是反相信号(Y0~Y7),而从G2A、G2B输入序列则可以在输出得到同相序列信号。
4、数据选择器74LS151D的引脚~G的作用是使能控制输入脚,如下图,可以理解为选片端。当两片级联使用组成16选1时,就由G脚实现选片,选前8个数据输入时,第一片的G=0有效,被选中。
pcm编译器系统实验过程中发现的问题
1、本实验模块可以传输两路话音信号。采用TP3057编译器,它包括了图9-1中的收、发低通滤波器及PCM编译码器。编码器输入信号可以是本实验模块内部产生的正弦信号,也可以是外部信号源的正弦信号或电话信号。
2、PCM编码器将模拟信号转换成数字信号,并用二进制码流进行表示。而PCM解码器则将数字信号还原成原始模拟信号,以使其可以被音频设备播放。
3、量化,就是把经过抽样得到的瞬时值将其幅度离散,即用一组规定的电平,把瞬时抽样值用最接近的电平值来表示,通常是用二进制表示。
4、PCM编译码系统由哪些部分构成?各部分的作用是什么?其中,低通滤波器:把话音信号带宽限制为4KHz,把高于这个频率的信号过滤掉。
74ls151的功能及原理
ls151的逻辑功能控制变量的每种取值组合对应选中一路输入送至输出,特点是价格便宜,功耗小,简单。根据查询相关公开信息:逻辑功能是从多路输入中选中某一路送至输出端,输出对输入的选择受选择控制量控制。
ls151引脚图及功能:数据选择器74LS151D的引脚~G的作用是使能控制输入脚,如下图,可以理解为选片端。当两片级联使用组成16选1时,就由G脚实现选片,选前8个数据输入时,第一片的G=0有效,被选中。
典型的集成数据选择器。74LS151有三个地址端A2A1A0。可选择D0~D7八个数据,具有两个互补输出端W和。数据选择器(dataselector)根据给定的输入地址代码,从一组输入信号中选出指定的一个送至输出端的组合逻辑电路。
74HC151的连接方式和各输入端波形如图所示,画出输出段端Y的波形_网络...
74HC151的连接方式和各输入端波形如图所示,画出输出段端Y的波形_网络...
用138实现序列:用时序信号加入地址端C、B、A,从G1或G2A、G2B输入序列,从G1端输入,在输出得到的是反相信号(Y0~Y7),而从G2A、G2B输入序列则可以在输出得到同相序列信号。
设二极管为理想二极管,当Ⅴi≥-3时,Vo=-3v。当Ⅴ__-3时,Ⅴo=Ⅴi。波形图如下描红部分。
特性是电流小。74hc151输出驱动电压为5v,属于低输入电流。74hc151是单线输出的多路模拟开关,从一组输入信号中选出指定的一个送至输出端的组合逻辑电路。
你图看不清,我画的图中,假设输入是5V的正弦信号,稳压管是3V的话,当信号小于3V时,稳压管没有作用,输出与输入相同;当信号大于3V时候,输出稳压3V;当信号小于0时,稳压管正向导通,和二极管一样,所以输出是0。
74ls151的逻辑功能和特点
ls151是常用的8选1数据选择器,常用在各种数字电路和单片机系统的显示系统中。其原理是输出端根据3位地址ABC来选择接通8个输入端上。
ls153的逻辑功能是实现数据选择功能,即把多路数据中的某一路数据传送到公共数据线上,其作用相当于多个输入的单刀多掷开关。74ls153是双4选一数据选择器。
ls151引脚图及功能:数据选择器74LS151D的引脚~G的作用是使能控制输入脚,如下图,可以理解为选片端。当两片级联使用组成16选1时,就由G脚实现选片,选前8个数据输入时,第一片的G=0有效,被选中。
74ls151和74hc151引脚图一样吗?
数据选择器74LS151D的引脚~G的作用是使能控制输入脚,如下图,可以理解为选片端。当两片级联使用组成16选1时,就由G脚实现选片,选前8个数据输入时,第一片的G=0有效,被选中。
LS151和74HC151都是8选1数据选择器。74LS151是TTL器件,工作电源电压是5V,74HC151是CMOS器件,工作电源电压是2V-6V。两种器件在工作电源电压是5V时可互换。
工作电压不同:LS只能用5V;而HC一般为2V到6V;CMOS器件抗静电能力差,易发生栓锁问题,所以CMOS的输入脚不能直接接电源。
.不同的级别:LS是TTL级别;HC是COMS级别。CD代表标准4000系列3.不同的操作电压:LS只适用于5V;HC通常是2V到6V;CMOS器件抗静电能力差,容易出现插销和锁紧问题,导致CMOS的输入管脚不能直接连接到电源上。
❺ 计算机操作系统知识点
计算机操作系统知识点
网络的神奇作用吸引着越来越多的用户加入其中,正因如此,网络的承受能力也面临着越来越严峻的考验―从硬件上、软件上、所用标准上......,各项技术都需要适时应势,对应发展,这正是网络迅速走向进步的催化剂。下面是关于计算机操作系统知识点,希望大家认真阅读!
4.1.1操作系统的概念
操作系统:是管理计算机软硬件资源的程序,同时它又是用户与计算机硬件的接口。
4.1.2操作系统的构成
进程管理、内存管衫凳理、文件管理、输入/输出系统管理、二级存储管理、联网、保护系统、命令解释程序
4.2.1操作系统的类别
经过多年的发展,操作系统多种多样。为提高大型计算机系统的资源利用率,操作系统从批处理,多道程序发展为分时操作系统。为了满足计算机处理实时事件的需要,就有实时操作系统。为适应个人计算机系统的需要又出现了桌面操作系统。为适应并行系统的需要,就有了多处理器操作系统。为满足网络和分布计算的需要,就有了网络操作系统和分布式操作系统。此外,还有为支持嵌入式计算机的嵌入式操作系统。
4.2.2计算环境
从计算机诞生至今,操作系统总是与具体的计算环境相联系,它总是在某种计算环境中设置和使用,就目前来看计算环境可分为以下几类:
1.传统计算环境
指普通意义下的独立或联网工作的通用计算机所形成的计算环境。
2.基于Web的计算环境
互联网的普及使得计算被延伸到Web环境。
3.嵌入式计算环境
嵌入式计算机就是安装在某些设备上的计算部件,其计算相对比较简单。
4.3.1进程的概念
什么是进程?它与程序有什么区别?
程序:用户为完成某一个特定问题而编写的操作步骤。
进程:可以简单地被看作是正在执行的程序。但是进程需要一定的资源来完成它的任务(例如CPU时间、内存、文件和I/O设备)。
进程与程序的区别在于进程是动态的、有生命力的,而程序是静态的。一个程序加载到内存,系统就创建一个进程,程序执行结束后,该进程也就消亡了。
在计算机中,由于多个程序共享系统资源,就必然引发对CPU的争夺。如何有效地利用CPU资源,如何在多个请求CPU的进程中选择取舍,这就是进程管理要解决的问题。
4.3.3进程控制块PCB(略)
为了控制进程,操作系统就必须知道进程存储在哪里,以及进程的一些属性。
进程控制块是进程实体的一部老猜分,是操作系统中记录进程的专用数据结构。一个新的进程创建时,操作系统就会为该进程建立一个进程控制块。操作系统根据进程控制块对并发进程进行控制。
4.3.4进程调度及队列图
计算机采用多道程序的目的是使得计算机系统无论何时都有进程运行,单处理器的计算机在某一时刻CPU只能运行一个进程,如果存在多个进程,其它进程就需要等待CPU空闲时才能被调度执行。
当一个进程处于等待或CPU时间片用完时,操作系统就会从该进程中拿走CPU控制权,然后再交给其它进程使用,这就是进程的调度。
4.3.5CPU调度及其准则
在设计CPU调度程序时主要应该考虑的准则包括:
(1)CPU使用率。让CPU尽可能地忙。
(2)吞吐量。让CPU在一定时间内完成的进程数尽可能多。
(3)周转时间。让进程从提交到运行完成的时间尽可能短。
(4)等待时间。让进程在就绪队列中等待所花时间之和尽可能短。
(5)响或含旅应时间。让进程从提交请求到产生第一响应之间的时间尽可能短。
主要的CPU调度算法
1、先到先服务
2、最短作业优先
3、优先权
4、轮转
5、多级队列
6、多级反馈队列
4.3.7进程的同步与互斥
进程的同步就是指相互协作的进程不断调整它们之间的相对速度,以实现共同有序地推进。
换句话说,在操作系统中,允许多个进程并发运行。然而,有些进程之间本身存在某种联系,它们在系统中需要一种协作,以保证进程能正确有序地执行并维护数据的一致性。
在操作系统中,可能存在着多个进程。而系统中一些资源一次只允许一个进程使用,这类资源被称为临界资源。在进程中访问临界资源的那段程序称为临界区。当一个进程进入临界区执行时,其它进程就不允许进入临界区执行,否则就会导致错误结果。由此得出:
多个进程并发执行时,只允许一个进程进入临界区运行,这就是进程的互斥。
例如:多个进程在竞争使用打印机时表现为互斥。
一个文件可供多个进程共享,其中有一个进程在写操作时,其它进程则不允许同时写或读,表现为互斥。
4.3.8进程的死锁及处理方法
在多道程序设计中,多个进程可能竞争一定数量的资源。一个进程在申请资源时,如果所申请资源不足,该进程就必须处于等待状态。如果所申请的资源被其它进程占有,那么进程的等待状态就可能无法改变,从而形成进程之间相互一直等待的局面,这就是死锁。
竞争资源引起死锁
引起死锁的四个必要条件:
互斥:任一时刻只能有一个进程独占某一资源,若另一进程申请该资源则需延迟到该资源释放为止。
占有并等待:即该进程占有部分资源后还在等待其它资源,而该资源被其它进程占有。
非抢占:某进程已占用资源且不主动放弃它所占有的资源时,其它进程不能强占该资源,只有等其完成任务并释放资源。
循环等待:在出现死锁的系统中,一定存在这样一个进程链,其中每个进程至少占有其它进程所必需的资源,从而形成一个等待链。
处理死锁问题的三种方式:
可使用协议预防和避免死锁,确保系统从不会进入死锁状态。
可允许系统进入死锁状态,然后检测出死锁状态,并加以恢复。
可忽略进程死锁问题,并假装系统中死锁从来不会发生。即没有必要把精力花在小概率事件上。
处理死锁优先考虑的顺序:先预防和避免再检测和恢复
4.4内存管理
内存是现代操作系统的核心。内存用于容纳操作系统和各种用户进程,是可以被CPU和I/O设备所共同访问的数据仓库。计算机的所有程序运行时都要调入内存。
内存管理的主要工作是:为每个用户进程合理地分配内存,以保证各个进程之间在存储区不发生冲突;当内存不足时,如何把内存和外存结合起来,给用户提供一个比实际内存大得多的虚拟内存,使得程序能顺利执行。内存管理包括内存分配、地址映射、内存保护和扩充。
4.4.1用户程序执行与地址映射
用户编写程序在执行前,需要多个处理步骤,这些步骤可将源程序转变为二进制机器代码,然后在内存中等待执行。当然有时并非每个步骤都是必需的。
通常,将指令和数据的.地址映射成内存地址可以发生在以下三个执行阶段。(了解)
1.编译阶段:如果在编译时就知道进程将在内存中的什么位置驻留,那么编译器就可以直接以生成绝对地址代码。
2.加载阶段:不知道进程将驻留在什么位置,那么编译器就必须生成程序的逻辑地址,在加载阶段再转变成内存的绝对地址。
3.执行阶段:如果进程在执行时可以从一个内存段移动到另一个内存段,那么进程的绝对地址映射工作只能延迟到执行时进行。
4.4.2物理地址空间与逻辑地址空间
物理地址:是计算机内存单元的真实地址。
物理地址空间:由物理地址所构成的地址范围。
逻辑地址:用户程序地址,从0开始编址。
逻辑地址空间:由逻辑地址所构成的地址范围。
地址映射:用户程序在运行时要装入内存,这就需要将逻辑地址变换成物理地址,这个过程称为地址映射,也称重定位。
用户编写的源程序是不考虑地址的,源程序经CPU编译后产生逻辑地址。从CPU产生的逻辑地址转换为内存中的物理地址的映射是由计算机中被称为内存管理单元的硬件设备来实现的,将逻辑地址与内存管理单元中存放的内存基址相加就得到了物理地址。
4.4.3进程使用内存的交换技术
为了更加有效地使用内存,进程在不运行时,可以暂时从内存移至外存上,直到需要再运行时再重新调回到内存中。也就是说内存管理程序可将刚刚运行过的进程从内存中换出以释放出占用的内存空间,然后将另一个要运行的进程占据前者释放的内存空间。
计算机工作时,为了将多个进程放入到内存就必须考虑在内存中如何放置这些进程。
4.4.4内存分配方案-连续
对于连续内存分配方案,开始时所有内存是一个大的孔,随着内存分配的进行就会形成位置上不连续的大小不一的孔。在连续内存分配方案中,当新进程需要内存时,为其寻找合适的孔,实现内存分配。该方案为每个进程所分配的内存物理地址空间在位置上是连续的。
4.4.5内存分配方案-分页式
分页管理基本思想:
o内存物理地址空间划分为若干个大小相等的块(页框)
o进程的逻辑地址空间也划分为同样大小的块(页面)
o内存分配时每个页面对应地分配一个页框,而一个进程所分得页框在位置上不必是连续的。
页表:操作系统为每个用户程序建立一张页表,该表记录用户程序的每个逻辑页面存放在哪一个内存物理页框。
4.5虚拟内存方案
虚拟内存是一个容量很大的存储器的逻辑模型,它不是任何实际的物理存储器,它一般是借助硬盘来扩大主存的容量。
虚拟内存:对于一个进程来讲,如果仅将当前要运行的几个页面装入内存便可以开始运行,而其余页面可暂时留在磁盘上,待需要时再调入内存,并且调入时也不占用新的内存空间,而是对原来运行过的页面进行置换。这样,就可以在计算机有限的内存中同时驻留多个进程并运行。而对用户来讲感觉到系统提供了足够大的物理内存,而实际上并非真实的,这就是虚拟内存。
4.5.2页面请求与页面置换算法
页面请求:在虚拟内存技术中,进程运行时并没有将所有页面装入到内存,在运行过程中进程会不断地请求页面,如果访问的页面已在内存,就继续执行下去;但如果要访问的页面尚未调入到内存,便请求操作系统将所缺页面调入内存,以便进程能继续运行下去。
页面置换:如果请求页面调入内存时,分配给该进程的页框已用完,就无法立即装入所请求页面。此时,必须将进程中的某个页面从内存的页框调出到磁盘上,再从磁盘上将所请求的页面调入到内存的该页框中。这个过程叫做页面置换。
4.6文件管理
文件管理是操作系统最常见的组成部分。文件管理主要提供目录及其文件的管理。
4.6.1文件的概念
文件:保存在外部存储设备上的相关信息的集合。
文件命名:文件主名+扩展名
文件存取属性:
只读:只允许授权用户进行读操作。
读写:只允许授权用户进行读和写的操作。
文档:允许任何用户进行读写操作。
隐藏:不允许用户直接看到文件名。
文件系统:是对文件进行操作和管理的软件,是用户与外存之间的接口。这个系统将所有文件组织成目录结构保存在外存,一个文件对应其中的一个目录条。目录条记录有文件名、文件位置等信息。
操作系统对文件的基本操作包括:
创建文件、文件写、文件读、文件重定位、文件删除、文件截短。
对文件的其它操作包括:文件复制、重命名、更改属性等。
;❻ 为什么自己编译的linux内核和驱动比系统自带的要大的多
1、配置中有很多调试选项(不一定带“debug”字样),而且位置也很分散;
2、发行版自带内核往往经过长期、仔细的配置,会比个人十几分钟的配置更全面。
这两个原因对内核及模块的大小有影响,但不大。
编译出的内核模块中包含多个运行时用不到的段(编译连接时可能要用,不是错误),发行版中一般会删掉,这很有可能是原因所在。
可以考虑用 [strip -S mod_name.ko] 来处理一下内核模块(注意:这里选项要用大写S,小写s或不写会连符号表一起删掉,导致模块无法加载),看看文件有没有变小(别对内核本身这么干)。
如果以上命令明显减小了文件,可以考虑在编译内核前定义环境变量INSTALL_MOD_STRIP为1(数字),这样make moles_install后的内核模块都是经 strip 处理过的了。