0%

对一些概念的理解(持续更新)

不是标准理解,也不是全面理解

  1. 交换区——主存和辅存之间交换数据的地方,是辅存的一部分。但它和主存一起组成虚拟存储空间。

  2. 软连接和硬连接是为共享文件而存在的。

  3. 区别自增减操作符重载时前后缀:后缀式接受一个额外的(无用)的int型形参。编译器提供0作为这个形参的实参。

  4. 有状态和无状态:有状态是指程序段本身能储存静态数据,并在不同执行过程中保持不同的数据,程序段根据这些状态数据影响其他接口的行为;无状态是指没有存储静态数据。有状态是线程不安全,无状态是线程安全。比如说zmq中的push-pull模型,push是无状态的,每次发送数据在他看来都跟上次的没什么不一样,只管一个一个发送,pull只管一个一个接,pull知道的就是有数据到来。

  5. 同步和异步:同步指函数得到结果前不返回,一直等着数据的到来,在数据来之后自己去处理,当前线程一般是激活的;异步指函数发出指令后立即返回,处理好的结果通过状态、通知、回调发给调用者。主要差别是主要事情是谁干的。

  6. 阻塞和非阻塞:阻塞在函数执行过程中线程会被挂起,得到结果后才会返回;非阻塞指函数先返回,待得出结果后通过回调等方式通知调用者。主要差别是程序在这里是不是要停一停。

  7. 信号—->异步,异步就是踩不准步调,比方说一个函数执行着执行着,忽然加进来一个信号,这个信号随时都能加进来,不在原来函数的执行流程中,他就这么闷头闷脑的闯了进来,踩着原来函数的右脚了.

  8. 心跳:判断超时还是断开连接,阻塞的话有超时时间,仍可发送心跳数据,断开的话就没办法发送心跳数据。

  9. 序列化:
    它可以让你把一个对象或组对象存储在磁盘;或通过有线或无线传输到另一台计算机,然后通过反向过程:唤醒原始的对象。基本机制是把对象扁平化(flatten)为一维的字节流,然后把字节流再变成原始的对象。
      如同星际迷航中的运输机,把复杂的东西扁平化为1和0的序列,然后把1和0的序列(可能在另一个地方,另一个时间)重新构造为原有的复杂“东西”。转自这里
      将整型、浮点型数据转换成字符串格式发送/接收。这主要是基于两方面的考虑:一是实现平台无关,而是能以字符串方式处理数值型数据(整形、浮点型数据在内存中是以二进制格式表达的),以规避字符串方式处理二进制字节流的能力的不足(在C/C++语言中尤为明显)。
    ——《消息设计与开发——分布式应用开发的核心技术》

  10. 使用TCP发送数据有两种方法:1)直接拷贝struct;2)序列化

  11. RPC:远程过程调用,就是把本地的服务放到远端服务器,本地请求服务后服务器进行处理,处理完把结果传回来。只要能进行网络传输的框架都可实现RPC。

  12. 现在还做不到完美的控制c内存,更关键的是,连稍微控制都没做到-,-

  13. printf("\n&(bt_time->mouth)=%p\t&bt_time->mouth=%p\n", &(bt_time->mouth),&bt_time->mouth);结果一样,说明->的运算级比&高

  14. 必须有足够的时间和人手,才能在项目中应用一项新技术,以保证进度能跟上,否则只是在做无用功。

  15. 互斥锁锁住的是锁本身这个变量。因此上锁以后接下来的这段程序就被单独执行了。比如说线程1给某个函数A之间一段代码上锁,这个函数A从上锁到解锁之间的这段代码就被锁定,如果此时有线程2执行这个函数A,则线程2需要等着线程1执行完解锁操作以后才能执行加锁操作,另外,如果有另外一个函数B也有一段代码使用相同的互斥锁变量进行加锁控制,则线程3执行函数B的这段代码的时候,需要等着线程1解锁后才能跟线程2进行抢加锁这个动作,谁抢到谁就先执行。、

  16. 跨平台问题有几个领域:跨平台运行,跨平台开发,跨平台通信。

  17. 跨平台通信中需要考虑:流数据在64位与32位体系间的兼容;流数据中字符串的编码方式;流数据在不同编程语言之间(如java和c/c++)的兼容。

  18. 任何c变量的声明都由两部分组成:类型以及一组类似表达式的声明符号(declarator)。声明符从表面上看与表达式有些类似,对它求值应该返回一个声明中给定类型的结果。
    ——《c语言缺陷与陷阱》

  19. 对信号处理唯一安全的方法就是打印一条错误信息,然后longjmp退出或直接exit退出。
    ——《c语言缺陷与陷阱》

  20. 严格表述的数学是一门系统的演绎科学,但在形成过程中的数学则是一门实验性的归纳科学。
    ——《怎样解题》G.波利亚

  21. 在c程序中使用完用malloc族申请过来的变量时就立即释放,使用完就立即释放,有时候会避免一些出错。

  22. 基本的进程控制原语:fork(), exec(), exit(), wait(), waitpid()

  23. 不可重入函数:(a)已知它们使用静态数据结构,(b)它们调用malloc()free(),(c)它们是标准I/O函数(标准I/O库的很多实现都以不可重入方式使用全局数据结构)
    ——apue

  24. 程序包括语义和实现,语义包括状态、动作、处理方式……, 实现包括算法、设计模式、结构化、模块化、具体技术原理……。看别人程序的时候需要把握住这两点。
    —— suntus

  25. 错误处理有三类:(a)程序编写问题造成的,本来应该输出整数结果输出了字符串,这种错误称之为bug,bug是必须修复的。(b)用户输入造成的,比如让用户输入一个email地址,结果得到了一个空字符串,这种错误可以通过检查用户输入做相应的处理。(c)完全无法在程序运行过程中预测的,比如写文件的时候,磁盘满了,写不进去了,或者从网络抓取数据,网络突然断掉了,这种错误也成为异常,在程序中通常必须处理的,否则,程序会因为各种问题终止并退出。
    —— 廖雪峰的官方博客

  26. 用返回值进行错误处理的最大问题是不方面,需要增加大量代码,而try…catch块的处理方式只需要在你认为错误的地方包上处理语句就行了。

  27. break只中断一层循环

  28. “const引用”是”指向const对象的引用”
    ——《c++ primer》

  29. c的非静态函数能操作静态变量

  30. 运算符的结合性。比如“+”号是左结合的,是针对数字(运算因子)来说的,这个数字左右都出现“+”号时,比如9+3+2,中间的3先跟左边的“+”号结合,也就是(9+3)+2的计算顺序。又比如”=”赋值语句,是右结合的,a=b=c,中间的b先跟右边的”=”结合,也就是这样的求值顺序a=(b=c)。这些是在编译阶段需要明确规定出来的。

  31. twisted跟tornado长得真是像。

  32. 设计互联网的那些人对网络错误处理有两种处理方式选择,一种是把错误交给终端去处理,一种是网络本身去处理。前者的好处是网络可以设计的简单些,网络中间的设备也不用那么复杂,缺点是错误都交给终端,终端要足够强大以应付这些错误。后者的好处是终端不需要处理错误,可以设计的简单些,错误处理都交给网络中间设备。后者应用到了电话网,因此电话交换机会相当复杂;前者就形成了互联网,在网络层上设计了尽力交付的IP协议。

  33. 从效果看,一个符号表的作用是将信息从声明的地方传递到实际使用的地方——《编译原理》

  34. 一定要记得初始化。。。——suntus

  35. 全局未初始化变量和局部未初始化的static变量默认都是0或NULL,为了节省编译后文件的大小,C就把这些变量放到BSS段中(Block Started Symbol,也有人叫Better Save Space)。

  36. 终端和串行线路。串行线路发送来的数据,内核接收处理后会传递给进程,进程发送出去的数据,内核会接收并转给串行线路,再发出去;键盘和屏幕相当于一个终端,键盘发来的数据,内核接收处理后传递给进程(shell程序或其他);进程发送的数据,内核接收后会转发给屏幕,显示出来。所以键盘和屏幕就相当于一个串行线路的发送端和接收端。

  37. 函数只需要做自己要做的那个件事,至于判断要不要做,交给调用者去判断。比如存储一个数据,只需要验证输入参数是否正确,是否存储到位,返回给调用者一个成功或者失败的消息——什么情况下存储,什么情况下不存储,要交给调用者去判断。调用者判断要不要做,被调用者判断能做成不能(做成需要哪些条件)。

  38. 你只需要写出来,改错是将来的自己和看到的人的事。

  39. 感觉表达能力都退化了,还是应该坚持写写东西。

  40. 异步回调后需要反过来想想回调中会做什么事。