学IT要买什么书

学IT要买什么书,第1张

首先,我觉得你需要明确自己的发展方向,你想学习的课程起码串联起来是个完整的体系,以后能够帮助你就业

书籍整理如下:

C++开发

1.《C++ Primer》:全面学习C++的必备书籍

2.《Thinking in C++》:了解C++背后的一些机bai制

3.《深度探索C++对象模型》:深入了解C++,也是学习COM的必经之路

Windows平台

入门

1.《Windows程序设计》:这本书主要讲的是Windows API的使用,是Windows编程入门书籍。上册涉及到的知识基本上就够用了,时间不充裕的话阅读上册即可。

2.《Win32多线程程序设计》:Windows下多线程编程必备

3.《Windows核心编程》:Window平台基础知识:消息机制,内存管理,多线程,动态链接库等

4.《Windows网络编程》:介绍Windows下各种网络协议的开发和并发处理模型。

进阶

1.《深入浅出MFC》:Windows下编程,MFC虽然有些过时,但其机制还是有学习的价值。重点学习书中提到的MFC 6大机制

2.《COM本质论》:COM是Windows构建用户态的重要技术之一,Windows开发必修课,本书对COM的设计动机作了深入阐述

3.《深入解析ATL》:ATL全名Active Templete Library,是用C++的模版封装了COM,这本书主要讲的是对源码分析

4.《WTL White Paper》:WTL源自微软,基于ATL的一套开源模版库,主要用于界面编程和工具类的使用

5.《代码大全》:这边书主要讲的是工程编码规范

高级

1.《深入解析Windows *** 作系统》:Windows大牛书籍,讲的主要是Windows *** 作系统的内核原理

调试技术

1.《软件调试》

2.《Windows高级调试》

3.《windows用户态程序高效排错》

Linux平台

Linux内核

1.《Linux Kernel Development》/《Linux内核设计与实现》:Robert Love的著作,不厚的一本书,深入浅出地将Linux内核娓娓道来

Linux使用和Shell编程

1.《sed &awk》/《sed与awk》:sed与awk都是Linux下常用的日志分析利器

Linux编程

1.《Beginning Linux Programming》/《Linux程序设计》:老牌的Linux编程入门书

2.《Advanced Programming in the Unix Environment》/《Unix环境高级编程》:对Unix编程环境做了细致的总结,涵盖了进程间通讯、网络通讯、文件系统等各方面的知识

网络编程

1.《TCP/IP Illustrated, Volume I》/《TCP/IP详解,卷一》:对理解TCP/IP协议的设计理念和协议细节有显著的帮助。

2.《Unix Network Programming》/《Unix网络编程》,卷一、卷二:网络编程方面难以逾越的著作,事无巨细、深入浅出,强烈推荐

对这些书目抱有100%的信心,全部掌握,融会贯通,即可打通奇经八脉,天下无双。

对了,你没有基础最好从c与c++基础开始。找些基础书开始看。

[C语言入门经典(第四版)].(美)霍顿.扫描版,《C++ Primer》就不错。

博客园首页联系管理

jiffies相关时间比较函数time_after、time_before详解

1. jiffies简介

首先, *** 作系统有个系统专用定时器(system timer),俗称滴答定时器,或者系统心跳。

全局变量jiffies取值为自 *** 作系统启动以来的时钟滴答的数目,数据类型为 unsigned long volatile (32位无符号长整型),最大取值是2^32-1。

2. jiffies与秒的转换

将 jiffies转换为秒,可采用公式:(jiffies/HZ) 计算。

将 秒转换为jiffies,可采用公式:(seconds*HZ) 计算。

示例(本博客后面将介绍涉及到的time_before):

unsgned long delay = jiffies + 2*HZ

while(time_before(jiffies, delay))// 忙等待两秒,占用CPU的一个核心,期间不执行调度

3. jiffies的溢出介绍

当时钟中断发生时,jiffies值就加1。

假定HZ=100,那么1个jiffies等于1/100 秒,jiffies可记录的最大秒数为(2^32 -1)/100=42949672.95秒,约合497天或1.38年,

当取值到达最大值时仍继续加1,就变为了0!

即HZ=100时,连续累加的溢出时间是一年又四个多月,如果程序对jiffies的溢出没有加以充分考虑,那么在连续运行一年又四个多月后,这些程序还能够稳定运行吗?

4. 示例1,一个 jiffies溢出造成程序逻辑出错 的示例

复制代码

unsigned long timeout = jiffies + HZ/2/* timeout in 0.5s */

/* do some work ... */

do_somework()

/* then see whether we took too long */

if (timeout >jiffies) {

/* we did not time out, call no_timeout_handler() ... */

no_timeout_handler()

} else {

/* we timed out, call timeout_handler() ... */

timeout_handler()

}

复制代码

本例的意图:

从当前时间起,如果在0.5秒内执行完do_somework(),则调用no_timeout_handler()。如果在0.5秒后执行完do_somework(),则调用timeout_handler()。

然后当溢出时呢? 该意图会被打破吗?

假设程序开始执行前,timeout值已经接近最大值(即2^32-1 ) ,jiffies的值是(timeout-HZ/2),

之后do_some_work执行了挺久(超过0.5秒),jiffies的值也发生了溢出(jiffies做自增 *** 作的中途超过了32位无符号数的最大值),

溢出后的值,可能是很小的一个数字,所以造成jiffies的值 <timeout,

之后的代码执行流就走到了no_time_handler()这里,这显然和程序设计者的初衷(意图)是违背的。

5. Linux内核如何来防止jiffies溢出

Linux内核中提供了一些宏,可有效地解决由于jiffies溢出而造成程序逻辑出错的情况。

PS:下图源自Linux Kernel version 3.10.14

* time_after:

* time_after(a,b) returns true if the time a is after time b.

同时根据 #define time_before(a,b)time_after(b,a) ,我们可以知道

* time_before(a,b) returns true if the time b is after time a.

6. time_after 在驱动代码中的应用展示

7. time_after等用于时间比较的宏的原理简介

下面的文字摘录自博文:https://blog.csdn.net/jk110333/article/details/8177285

读者先大致浏览一遍即可,不必纠结于绞尽脑汁的细节理解, 后面我将表达个人理解,读者也可以直接向下浏览,看我的个人理解。

/**********************************开始摘录********************************************/

 我们仍然以8位无符号整型(unsigned char)为例来加以说明。仿照上面的time_after宏,我们可以给出简化的8位无符号整型对应的after宏:

 #define uc_after(a, b) ((char)(b) - (char)(a) <0)

设a和b的数据类型为unsigned char,b为临近8位无符号整型最大值附近的一个固定值254,下面给出随着a(设其初始值为254)变化而得到的计算值:

a b (char)(b) - (char)(a)

254 254 0

255 - 1

0 - 2

1 - 3

...

124 -126

125 -127

126 -128

127 127

128 126

...

252 2

253 1

 从上面的计算可以看出,设定b不变,随着a(设其初始值为254)不断增长1,a的取值变化为:

254, 255, (一次产生溢出)

0, 1, ..., 124, 125, 126, 127, 126, ..., 253, 254, 255, (二次产生溢出)

0, 1, ...

...

而(char)(b) - (char)(a)的变化为:

0, -1,

-2, -3, ..., -126, -127, -128, 127, 126, ..., 1, 0, -1,

-2, -3, ...

...

从上面的详细过程可以看出,当a取值为254,255, 接着在(一次产生溢出)之后变为0,然后增长到127之前,uc_after(a,b)的结果都显示a是在b之后,这也与我们的预期相符。但在a取值为 127之后, uc_after(a,b)的结果却显示a是在b之前。

从上面的运算过程可以得出以下结论:

使用uc_after(a,b)宏来计算两个8位无符号整型a和b之间的大小(或先/后,before/after),那么a和b的取值应当满足以下限定条件:

. 两个值之间相差从逻辑值来讲应小于有符号整型的最大值。

. 对于8位无符号整型,两个值之间相差从逻辑值来讲应小于128。

从上面可以类推出以下结论:

对于time_after等比较jiffies先/后的宏,两个值的取值应当满足以下限定条件:

两个值之间相差从逻辑值来讲应小于有符号整型的最大值。

对于32位无符号整型,两个值之间相差从逻辑值来讲应小于2147483647。

对于HZ=100,那么两个时间值之间相差不应当超过2147483647/100秒 = 0.69年 = 248.5天。

对于HZ=60,那么两个时间值之间相差不应当超过2147483647/60秒 = 1.135年。

在实际代码应用中,需要比较的先/后的两个时间值之间一般都相差很小,范围大致在1秒~1天左右,所以以上time_after等比较时间先 /后的宏完全可以放心地用于实际的代码中。 

/***********************************摘录结束******************************************/

看完这段文字,感觉有点绕的,那么原理到底是啥呢? 是一堆数学计算吗?是啊 ,就是这数学规律!

凡事都是有利有弊的,针对一件事物的优化,有利处,必然带来不利之处,从哲学角度来进行理解,事物的两面性。

本文第4部分,示例1介绍了jiffies的一个例子,它的弊处是会溢出,如果我们不抓住溢出这个弊处来看待这件事物,那么timeout的值可以做的很大,这是优势。

然而溢出是真实存在的,无法满足客观需求的,所以需要改进,

从该数学规律入手进行改进后,不溢出了,这是优势,

但是改进后对timeout的值也缩小了使用范围,这是为了达到该优势所带来的必要开销或损耗。这就是事物的两面性。

8. 示例2,对示例1进行改进:使用time_before宏后的正确代码

复制代码

unsigned long timeout = jiffies + HZ/2/* timeout in 0.5s */

/* do some work ... */

do_somework()

/* then see whether we took too long */

if (time_before(jiffies, timeout)) {

/* we did not time out, call no_timeout_handler() ... */

no_timeout_handler()

} else {

/* we timed out, call timeout_handler() ... */

timeout_handler()

}

复制代码

.

/************* 社会的有色眼光是:博士生、研究生、本科生、车间工人重点大学高材生、普通院校、二流院校、野鸡大学年薪百万、五十万、五万这些都只是帽子,可以失败千百次,但我和社会都觉得,人只要成功一次,就能换一顶帽子,只是社会看不见你之前的失败的帽子。 当然,换帽子决不是最终目的,走好自己的路就行。 杭州.大话西游 *******/

分类: Linux驱动

标签: 内核编程

好文要顶 关注我 收藏该文

一匹夫

粉丝 - 28 关注 - 3

+加关注

00

« 上一篇: 为什么我觉得需要熟悉vim使用,难道仅仅是为了耍酷?

» 下一篇: 九鼎S5PV210开发板的SD卡启动、uboot tftp升级内核镜像

posted @ 2021-01-30 14:39 一匹夫 阅读(2508) 评论(0) 编辑 收藏 举报

刷新评论刷新页面返回顶部

登录后才能查看或发表评论,立即 登录 或者 逛逛 博客园首页

【推荐】阿里云新人特惠,爆款云服务器2核4G低至0.46元/天

编辑推荐:

· .Net 6 使用 Consul 实现服务注册与发现

· SQLSERVER 的复合索引和包含索引到底有啥区别?

· [ASP.NET Core] 按用户等级授权

· 深入理解 Linux 物理内存分配全链路实现

· 巧用视觉障眼法,还原 3D 文字特效

阅读排行:

· 既然有MySQL了,为什么还要有MongoDB?

· C#开发的插件程序 - 开源研究系列文章

· 2022年工作总结,迟到比没到好

· 20 张图带你全面了解 HTTPS 协议,再也不怕面试问到了!

· .net core *** 作MongoDB

公告

音乐2 - 林海

00:00 / 00:00An audio error has occurred, player will skip forward in 2 seconds.

1 音乐1Valentin

2 音乐2林海

3 音乐3赵海洋

昵称: 一匹夫

园龄: 5年9个月

粉丝: 28

关注: 3

+加关注

< 2023年1月 >

日 一 二 三 四 五 六

1 2 3 4 5 6 7

8 9 10 11 12 13 14

15 16 17 18 19 20 21

22 23 24 25 26 27 28

29 30 31 1 2 3 4

5 6 7 8 9 10 11

搜索

找找看

谷歌搜索

常用链接

我的随笔

我的评论

我的参与

最新评论

我的标签

我的标签

linux(24)

系统编程(21)

C++(16)

BOOST(10)

ffmpeg(7)

更多

随笔分类

C++之QT(4)

C++之STL、Boost(12)

C++之语言与时俱进(17)

C语言活用(9)

C语言自身(12)

GUI(3)

Linux驱动(8)

Linux系统编程(32)

Linux应用(13)

MCU和物联网等(20)

RTOS(10)

shell 和 makefile(9)

uboot(3)

编程思维技巧(5)

编译器特性(2)

*** 作系统(2)

电路-EDA设计(2)

电路-基础知识(2)

调试篇(3)

汇编(1)

密码学|安全|(2)

配置相关(8)

嵌入式外设相关(2)

设计模式(12)

数据结构(3)

网络(13)

我的程序人生(1)

音视频(10)

随笔档案

2022年2月(3)

2022年1月(1)

2021年12月(5)

2021年11月(2)

2021年10月(1)

2021年8月(1)

2021年7月(2)

2021年5月(1)

2021年4月(6)

2021年3月(6)

2021年2月(6)

2021年1月(23)

2020年12月(11)

2020年11月(4)

2020年10月(29)

2020年9月(12)

2020年8月(12)

2020年5月(4)

2020年2月(6)

2020年1月(4)

2019年12月(2)

2019年11月(2)

2019年10月(3)

2019年8月(9)

2019年7月(2)

2019年6月(1)

2019年5月(1)

2019年4月(2)

2019年3月(5)

2019年2月(11)

2019年1月(6)

2018年1月(2)

2017年5月(1)

相册

大话西游经典照片(1)

阅读排行榜

1. C++函数默认参数 详解(29043)

2. 玩转Libmodbus(一) 搭建开发环境(16605)

3. 玩转Libmodbus(二) 写代码体验(7565)

4. RTThread DFS文件系统使用: 基于使用SFUD驱动的SPI FLASH之上的ELM FATFS文件系统(4537)

5. std(标准库)和STL(标准模板库)的关系(4149)

6. STM32CubeMX HAL库串口: 使用DMA数据发送、使用DMA不定长度数据接收(4016)

7. Arduino+ESP32 之 SD卡读写(3673)

8. KEIL查看ARM-Cortex M架构soc的内核寄存器之 MSP(3668)

9. 图解MQTT概念、mosquitto编译和部署 ,写代码,分别使用外网和本地服务器进行测试(3275)

10. RT Thread的SPI设备驱动框架的使用以及内部机制分析(2787)

11. STM32的CCM RAM以及使用方式(2540)

12. vscode废掉了,跳转不到函数定义,无法自动补全,重装也没用的解决办法(2511)

13. jiffies相关时间比较函数time_after、time_before详解(2508)

14. Arduino+ESP32 之 驱动GC9A01圆形LCD(一),基于Arduino_GFX库(2504)

15. 图解连接阿里云(一)创建阿里云物联网平台产品和设备,使用MQTT.fx快速体验(2372)

16. MDK内的KEEP关键字以及$$Base $$Limit(2358)

17. RT Thread SPI设备 使用(2246)

18. ESP32的Linux开发环境搭建,将示例程序编译、下载、运行(2243)

19. AD设置过孔盖油和过孔开窗, 过孔塞油科普(2186)

20. Linux 串口工具 lsz lrz 移植(2172)

评论排行榜

1. 在KEIL下查看单片机编程内存使用情况(2)

2. 玩转Libmodbus(一) 搭建开发环境(2)

3. C语言普通写法实现:针对多次同步失败的节能处理机制(2)

推荐排行榜

1. C++函数默认参数 详解(5)

2. 如何更好地谋生,从事嵌入式软件开发五年的感悟和职业焦虑(4)

3. Arduino+ESP32 之 SD卡读写(2)

4. 玩转Libmodbus(一) 搭建开发环境(2)

5. Arduino+ESP32 之 驱动GC9A01圆形LCD(一),基于Arduino_GFX库(1)

最新评论

1. Re:在KEIL下查看单片机编程内存使用情况

@HQ_嗨海 谢谢...

--一匹夫

2. Re:如何更好地谋生,从事嵌入式软件开发五年的感悟和职业焦虑

说的不错

--Chance_21_12_12

3. Re:在KEIL下查看单片机编程内存使用情况

感谢大佬

--HQ_嗨海

Copyright © 2023 一匹夫

Powered by .NET 7.0 on Kubernetes

就不从别的地方抄过来成打的论据了。说说我自己的看法和经验吧

为什么用Linux呢?

回答这个问题之前,能不能看看目前Linux都用在了哪里?

(1)服务器:曾经有人通过程序统计对Internet上网络节点使用的 *** 作系统进行了统计。具体数字忘记了,不过Linux/Unix的服务器占了90%多吧。从这个数据,多少可以看出来,商业公司也越来越信任Linux了。当然,这就是Linux稳定、安全、开源带来的最好回报:)

(2)桌面/笔记本/上网本:具报道,Linux/UNIX桌面只占1%的市场,Windows占了90%多的市场,剩下的基本都是MacOS的了。大家都知道,现在都开始搞云计算了。你用过360的云桌面吧,至少用过WebQQ吧?这就是将来的发展趋势。大家以后的计算机生活基本都是在浏览器中开展的,这个说法,目前听上去,应尬已经没有前几年那么不可思议了,大家可以理解的。

(3)手机/平板电脑/MID/PDA等:从今年的出货亮来看,Android跟iPhone基本平分90%的市场的,Android应该会稍多些。Windows基本就是吃些残羹冷炙了。这说明,如果没有Office的需求,终端用户已经开始讨厌使用Windows了。(虽然Win8对用户界面做了改善,不过,这个市场的格局是很难改变的了)

(4)路由器、交换机等:(当然,这里不是说的家里的那种4口路由器……)在中国骨干网、城域网、接入网中的众多路由器、交换机设备目前基本都是由Cisco、中兴、华为提供的。在这三家公司中,目前很多设备都是以Linux为核心的哦。(当然,他们自己都有所修改的,主要为了实时性)这三家厂商自有的OS,在通信设备上的装机量呈现了越来越少的趋势。

(5)其它嵌入式设备:往往使用的uCLinux等简化版的系统。比如电表系统等。在这类系统中,Windows的优势也还是有的。主要就是开发周期短,来钱快,而且UI比较有亲和力。比如安捷伦等公司的示波器等仪器,还有银行的ATM机。不过随着Android铺天盖地袭来,这个市场也正在被Linux一步步鲸吞蚕食。

前面说了Linux的应用。市场决定一切。一个人说好,那可能还未必好;但除了Windows以外的人,都认为Linux更好,那她肯定是好了:)我个人感觉,如果把使用Linux内核的系统都叫做Linux OS(包括GNU/Linux,也包括Android这种使用Apache开源协议的“伪”Linux,也包括那些不愿开源,偷偷摸摸使用Linux的OS),那么可以借用Linux基金会一个负责人的话,Linux已经彻底把Windows打败了,Windows已经不再是Linux的竞争对手了。(你说不让攻击Windows,不过,没有Windows,MacOS作对比,那真的就孤独求败了……)

上面说的是市场应用。其实从个人学习来讲,我们也更应该使用Linux。即使将来在工作的时候,可能还是用的Windows,但是如果你对Linux理解的非常透彻的话,对自己的工作也是很有力的。我个人的感觉:Windows、Intel这些大公司,最喜欢的就是整概念,把技术人员架的高高的,美其名曰是解放生产力,不过,事实上是把技术人员弄的更傻些罢了。对于我这种“技术控”来说,理解事情的本质,才会让我更有创新的意识。会用MFC,不是高手,能把MFC造出来,那才是高手。但跟随Windows的人(除了大师),一辈子,也不会知道Windows是怎么搞出了这么的新奇的事物,当“精通”了一个工具之后,却发现,Windows又弄出了一个听上去更好的工具~~累啊~~

举个例子,看了很多讲OS的大部头,尤其是Windows相关人员写的什么解密啊之类的,不过,我一直搞不清楚“进程”、"线程"为何物。但,当我读了Linux的源码之后,我才醍醐灌顶了~~

其他例子不举了,网上你可以搜到一大堆的。

Linux方面,可以继续沟通,大家共勉学习。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/11498559.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存