- 博客(54)
- 资源 (8)
- 收藏
- 关注
转载 C语言核心技术
================================================C语言编译分析记号,有一个原则是尽可能靠左合并符号使其得到符合语法的记号,所以a+++b 会被解释为 (a++)+b 而不是 a+(++b)================================================函数作用域和语句块作用域:一直以为函
2015-01-22 10:41:16 655
原创 Lua源代码阅读(五)数据栈与调用栈组成的 线程(协程)
1: 若 lua 仅作为一种独立语言,支持协程可能并不算麻烦。可困难在于 lua 生来以一门嵌入式语言存 在,天生需要大量与宿主系统 C 语言做交互。 2: 典型的应用环境是由 C 语言开发的系统,嵌入 lua 解析器, 加载 lua 脚本运行。同时注入一些 C 函数供 lua 脚本调用。lua 作为控制脚本,并不直接控制外界的模块, 做此桥梁的正是那些注入的
2015-01-20 15:49:42 1434
原创 Lua源代码阅读(四)tm元方法优化
1: Lua实现复杂数据结构,大量依赖给 table 附加一个元表(metatable)来实现。故而table 本身的一大作用就是作为元表存在。 2: 查询元表中是否存在一个特定的元方法就很容易成为运行期效率的热点。如果不能高效的解决这个热点,每次对带有元表的table的操作,都需 要至少多作一次hash查询。3: 但是,并非所有元表都提供了所有元方法的,对于
2015-01-20 11:11:34 702
原创 Lua源代码阅读(三)table的算法
/* 1:Table按照Lua语言的定义,需要实现四种基本操作:读、写、迭代和获取长度。 2:Lua中并没有删除操作,而仅仅是把对应键位的值设置为nil。 3:写操作被实现为查询已有键位,若不存在则创建新键。 得到键位后,写入操作就是一次赋值。 4:所以,在table模块中,实际实现的基本操作为:创建、查询、迭代和获取长度*
2015-01-20 10:01:03 801
原创 Lua源代码的阅读(三)table的实现
数据结构/* 1: table的数组部分被储存在TValue *array中,其长度信息存于int sizearray; 2: 哈希表储存在Node *node,哈希表的大小用 lu_byte lsizenode 表示; 3:由于哈希表的大小一定为2的整数次幂,所以这里的lsizenode表示的是幂次,而不是实际大小 4:每个table结构,
2015-01-19 20:50:09 634
原创 Lua内存管理
Lua 要求用户给出一个内存管理函数,在Lua创建虚拟机的时候传入。。 它利用C 标准库中的函数实现了一个默认的内存管理器,这也可以帮助我们理解这个内存管理器的语义。 1: Lua定义的内存管理器仅有一个函数,虽然接口上类似
2015-01-19 17:00:39 2543
原创 Lua源代码阅读(一)
lualib.h 打开Lua api库函数 Lua5.3中❤️增utf8库#define LUA_UTF8LIBNAME "utf8"LUAMOD_API int (luaopen_utf8) (lua_State *L);jks
2015-01-19 14:31:10 2101
转载 安全科普:密码学之碰撞攻击
转载自FreeBuf.COM]前言密码学贯穿于网络信息安全整个过程,在解决信息安全的机密性保护、可鉴别性、完整性保护和信息抗抵赖等方面发挥着极其重要的作用,可以毫不夸张地说“对密码学或密码技术一无所知的人是不可能从技术层面上完全理解信息安全的!”(摘自《应用密码学》= =)最近SSL中间人证书攻击根本停不下来,真正的数字证书伪造有多难?有人会提起当年引起世界轩然大波
2015-01-15 16:15:05 5518
转载 GCC内置原子内存存取函数
__sync_fetch_and_op系列type __sync_fetch_and_add (type *ptr, type value, ...)type __sync_fetch_and_sub (type *ptr, type value, ...)type __sync_fetch_and_or (type *ptr, type value, ...)type __sync_f
2015-01-14 20:39:35 807
原创 bit32位运算库
位运算库lua中的位运算由于数值类型是浮点型,所以支持效果不太好。lua中利用一些位运算实现一些算法。如:左移相当于乘以2,右移相当于除以2.而对于按位与和按位或这两个概念则需要额外讨论了,这也是由于浮点型数值所带来的影响。lua5.2中通过位库提供了位运算来修正这些影响,而不是lua中的预定义操作。这种接口设计表明lua中实现位运算不是
2015-01-14 17:14:54 5616
原创 LUA string库详解
1. string库中所有的字符索引从前往后是1,2,...;从后往前是-1,-2,...2. string库中所有的function都不会直接操作字符串,而是返回一个结果 string.byte(string [,pos]):返回第pos个字符的整数表示形式.如a为97.string.char(i1,i2...):i1,i2为整型,将i1,i2..等转化为对应的字符然后连接成字符
2015-01-14 17:13:42 910
原创 指针和引用的区别总结
指针和引用的区别总结1.从现象上看:指针在运行时可以改变其所指向的值,而引用一旦和某个对象绑定后就不再改变2.从内存分配上看:程序为指针变量分配内存区域,而引用不分配内存区域3.从编译上看:程序在编译时分别将指针和引用添加到符号表上,符号表上记录的是变量名及变量所对应地址。指针变量在符号表上对应的地址值为指针变量的地址值,而引用在符号表上对应的地址值为引用对象的地址值。符号表生成后就不
2015-01-13 14:15:02 420
转载 JIT(动态编译)和AOT(静态编译)编译技术比较
Java 应用程序的性能经常成为开发社区中的讨论热点。因为该语言的设计初衷是使用解释的方式支持应用程序的可移植性目标,早期 Java 运行时所提供的性能级别远低于 C 和 C++ 之类的编译语言。尽管这些语言可以提供更高的性能,但是生成的代码只能在有限的几种系统上执行。在过去的十年中,Java 运行时供应商开发了一些复杂的动态编译器,通常称作即时(Just-in-time,JIT)编译器。
2015-01-13 14:13:33 1188
原创 Lua5.3 released 变化
待总结Main changesintegers (64-bit by default)official support for 32-bit numbersbitwise operatorsbasic utf-8 supportfunctions for packing and unpacking valuesHere are the other changes int
2015-01-13 10:34:30 1153
原创 生产者/消费者模式
★简介 在实际的软件开发过程中,经常会碰到如下场景:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类、函数、线程、进程等)。产生数据的模块,就形象地称为生产者;而处理数据的模块,就称为消费者。 单单抽象出生产者和消费者,还够不上是生产者/消费者模式。该模式还需要有一个缓冲区处于生产者和消费者之间,作为一个中介。生产者把数据放入缓冲区,而
2015-01-13 10:04:07 500
原创 Linux文件系统的实现
Linux文件管理从用户的层面介绍了Linux管理文件的方式。Linux有一个树状结构来组织文件。树的顶端为根目录(/),节点为目录,而末端的叶子为包含数据的文件。当我们给出一个文件的完整路径时,我们从根目录出发,经过沿途各个目录,最终到达文件。我们可以对文件进行许多操作,比如打开和读写。在Linux文件管理相关命令中,我们看到许多对文件进行操作的命令。它们大都基于对文件的打开和读写操作。
2015-01-08 10:21:35 576
原创 Linux常用命令
下面是格式说明,你现在可以跳过,直到遇到疑问时再来查询。$ 命令行提示符粗体表示命令斜体表示参数 filename, file1, file2 都是文件名。有时文件名有后缀,比如file.zip command 命令名 dir 文件夹名 string 字符串 username 用户名 gro
2015-01-08 10:21:27 387
原创 Linux进程间通信
我们在Linux信号基础中已经说明,信号可以看作一种粗糙的进程间通信(IPC, interprocess communication)的方式,用以向进程封闭的内存空间传递信息。为了让进程间传递更多的信息量,我们需要其他的进程间通信方式。这些进程间通信方式可以分为两种:管道(PIPE)机制。在Linux文本流中,我们提到可以使用管道将一个进程的输出和另一个进程的输入连接起来,从而利用文件
2015-01-08 10:19:45 537
原创 读写锁
读写锁与互斥锁非常相似。r、RW lock有三种状态: 共享读取锁(shared-read), 互斥写入锁(exclusive-write lock), 打开(unlock)。后两种状态与之前的互斥锁两种状态完全相同。一个unlock的RW lock可以被某个线程获取R锁或者W锁。如果被一个线程获得R锁,RW lock可以被其它线程继续获得R锁,而不必等待该线程释放R锁。但是,
2015-01-08 10:16:00 461
原创 条件变量
条件变量是另一种常用的变量。它也常常被保存为全局变量,并和互斥锁合作。 假设这样一个状况: 有100个工人,每人负责装修一个房间。当有10个房间装修完成的时候,老板就通知相应的十个工人一起去喝啤酒。我们如何实现呢?老板让工人在装修好房间之后,去检查已经装修好的房间数。但多线程条件下,会有竞争条件的危险。也就是说,其他工人有可能会在该工人装修好房子和检查之间完成工作。采用下面
2015-01-08 10:14:27 401
原创 互斥锁
互斥锁是一个特殊的变量,它有锁上(lock)和打开(unlock)两个状态。互斥锁一般被设置成全局变量。打开的互斥锁可以由某个线程获得。一旦获得,这个互斥锁会锁上,此后只有该线程有权打开。其它想要获得互斥锁的线程,会等待直到互斥锁再次打开的时候。我们可以将互斥锁想像成为一个只能容纳一个人的洗手间,当某个人进入洗手间的时候,可以从里面将洗手间锁上。其它人只能在互斥锁外面等待那个人出来,才能进去。在外
2015-01-08 10:12:33 548
原创 理解多线程并发
比如说,我们有一个多线程火车售票系统,用全局变量i存储剩余的票数。多个线程不断地卖票(i = i - 1),直到剩余票数为0。所以每个都需要执行如下操作:while (1) { /*infinite loop*/if (i != 0) i = i -1else {printf("no more tickets");exit();}}如果只有一个线程执行上面的程序的时候(相当
2015-01-08 10:06:01 419
原创 Linux多线程与同步
典型的UNIX系统都支持一个进程创建多个线程(thread)。在Linux进程基础中提到,Linux以进程为单位组织操作,Linux中的线程也都基于进程。尽管实现方式有异于其它的UNIX系统,但Linux的多线程在逻辑和使用上与真正的多线程并没有差别。 多线程我们先来看一下什么是多线程。在Linux从程序到进程中,我们看到了一个程序在内存中的表示。这个程序的整个运行过程中,
2015-01-08 09:59:09 436
原创 Linux从程序到进程
计算机如何执行进程呢?这是计算机运行的核心问题。即使已经编写好程序,但程序是死的。只有活的进程才能产出。我们已经从Linux进程基础中了解了进程。现在我们看一下从程序到进程的漫漫征程。 一段程序下面是一个简单的C程序,假设该程序已经编译好,生成可执行文件vamei.exe。#include int glob=0;
2015-01-08 09:53:41 379
原创 Linux用户与“最小权限”原则
Linux的用户在登录(login)之后,就带有一个用户身份(user ID, UID)和一个组身份(group ID, GID)。在Linux文件管理背景知识中,我们又看到,每个文件又有九位的权限说明,用来指明该文件允许哪些用户执行哪些操作(读、写或者执行)。(参考Linux文件管理背景知识) 一般来说,Linux的用户信息保存在/etc/passwd中,组信息保存在/e
2015-01-08 09:43:31 527
原创 Linux进程关系
Linux的进程相互之间有一定的关系。比如说,在Linux进程基础中,我们看到,每个进程都有父进程,而所有的进程以init进程为根,形成一个树状结构。我们在这里讲解进程组和会话,以便以更加丰富的方式了管理进程。 进程组 (process group)每个进程都会属于一个进程组(process group),每个进程组中可以包含多个进程。进程组会有一个进程组领导进程 (pro
2015-01-08 09:42:06 417
原创 Linux信号基础
Linux进程基础一文中已经提到,Linux以进程为单位来执行程序。我们可以将计算机看作一个大楼,内核(kernel)是大楼的管理员,进程是大楼的房客。每个进程拥有一个独立的房间(属于进程的内存空间),而每个房间都是不允许该进程之外的人进入。这样,每个进程都只专注于自己干的事情,而不考虑其他进程,同时也不让别的进程看到自己的房间内部。这对于每个进程来说是一种保护机制。(想像一下几百个进程总是要干涉
2015-01-08 09:38:46 394
原创 Linux进程基础
计算机实际上可以做的事情实质上非常简单,比如计算两个数的和,再比如在内存中寻找到某个地址等等。这些最基础的计算机动作被称为指令(instruction)。所谓的程序(program),就是这样一系列指令的所构成的集合。通过程序,我们可以让计算机完成复杂的操作。程序大多数时候被存储为可执行的文件。这样一个可执行文件就像是一个菜谱,计算机可以按照菜谱作出可口的饭菜。那么,程序和进程(p
2015-01-08 09:37:53 357
原创 Linux架构
我以下图为基础,说明Linux的架构(architecture)。(该图参考《Advanced Programming in Unix Environment》) 最内层是硬件,最外层是用户常用的应用,比如说firefox浏览器,evolution查看邮件,一个计算流体模型等等。硬件是物质基础,而应用提供服务。但在两者之间,还要经过一番周折。还记得Lin
2015-01-08 09:37:52 379
原创 Linux文本流
文本流文件用于数据的存储,相当于一个个存储数据的房子。我们之前说,所谓的数据是0或者1的序列,但严格来说,Linux以字节(byte)来作为数据的单位,也就是说这个序列每八位(bit)为一个单位(八位二进制对应的十进制范围为0到255)。使用ASCII编码,可以将这样一个字节转换成为字符。所以,在Linux中,我们所说的数据,完全可以用字符表达出来,也就是说文本(text)的形式。
2015-01-08 09:37:23 353
原创 Linux文件管理相关命令
在了解了Linux文件管理背景知识之后, 我们可以学习一些命令来管理我们的文件。 文件操作相关有一些命令可以帮助我们"修剪"之前看到的文件树。$touch a.txt如果a.txt不存在,生成一个新的空文档a.txt。如果a.txt存在,那么只更改该文档的时间信息。(这个命令实际上用得并不广泛,但可以帮我们创建一个空文件来实验下面操作)$ls .
2015-01-08 09:36:11 437
原创 Linux命令行与命令
Linux的命令是很重要的工具,也往往是初学者最大的瓶颈。有朋友用了很长时间的Linux图形界面,基本不使用命令行输入命令执行,所以装的Linux最终成了摆设。这里总结一些命令行下常使用的命令,希望能有用。 什么是命令我们通常所说的Linux命令行是运行在终端(terminal)的shell (阅读Linux架构以了解什么是shell以及它在Linux系统中的位置)所谓的命令,
2015-01-08 09:35:51 386
原创 Linux文件管理
对于计算机来说,所谓的数据就是0和1的序列。这样的一个序列可以存储在内存中,但内存中的数据会随着关机而消失。为了将数据长久保存,我们把数据存储在光盘或者硬盘中。根据我们的需要,我们通常会将数据分开保存到文件这样一个个的小单位中(所谓的小,是相对于所有的数据而言)。但如果数据只能组织为文件的话,而不能分类的话,文件还是会杂乱无章。每次我们搜索某一个文件,就要一个文件又一个文件地检查,太过麻烦。文件系
2015-01-08 09:32:08 391
原创 Linux开机启动(bootstrap)
计算机开机是一个神秘的过程。我们只是按了开机键,就看到屏幕上的进度条或者一行行的输出,直到我们到达登录界面。然而,计算机开机又是个异常脆弱的过程,我们满心期望的登录界面可能并不会出现,而是一个命令行或者错误信息。了解计算机开机过程有助于我们修复开机可能出现的问题。 最初始阶段当我们打开计算机电源,计算机会自动从主板的BIOS(Basic Input/Output Syste
2015-01-08 09:30:25 322
转载 协议森林15 先生,要点单吗? (HTTP协议概览)
我在TCP流通信中说明了,TCP协议实现了数据流的传输。然而,人们更加习惯以文件为单位传输资源,比如文本文件,图像文件,超文本文档(hypertext document)。*** 超文本文档中包含有超链接,指向其他的资源。超文本文档是万维网(World Wide Web,即www)的基础。 HTTP协议解决文件传输的问题。HTTP是应用层协议,主要建立在TCP协议之上(
2015-01-08 09:23:19 443
转载 协议森林14 逆袭 (CIDR与NAT)
IPv4由于最初的设计原因,长度只有32位,所以只提供了大约40亿个地址。这造成了IPv4地址的耗尽危机。随后,IPv6被设计出来,并可以提供足够多的IP地址。但是IPv4与IPv6并不兼容,IPv4向IPv6的迁移并不容易。一些技术,比如说这里要说的CIDR和NAT,相继推广。这些技术可以缓解IPv4的稀缺状态,成就了IPv4一时的逆袭。 CIDRCIDR(Classle
2015-01-08 09:22:30 456
转载 协议森林13 9527 (DNS协议)
在周星驰的电影《唐伯虎点秋香》中,周星驰饰演的主角一进入华府,就被强制增加了一个代号9527。从此,华府的人开始称呼主角为9527,而不是他的姓名。域名(domain name)是IP地址的代号。域名通常是由字符构成的。对于人类来说,字符构成的域名,比如www.yahoo.com,要比纯粹数字构成的IP地址(106.10.170.118)容易记忆。域名解析系统(DNS, domai
2015-01-08 09:22:01 441
转载 协议森林12 天下为公 (TCP堵塞控制)
在TCP协议中,我们使用连接记录TCP两端的状态,使用编号和分段实现了TCP传输的有序,使用advertised window来实现了发送方和接收方处理能力的匹配,并使用重复发送来实现TCP传输的可靠性。我们只需要将TCP片段包装成IP包,扔到网络中就可以了。TCP协议的相关模块会帮我们处理各种可能出现的问题(比如排序,比如TCP片段丢失等等)。最初的TCP协议就是由上述的几大块构成的。
2015-01-08 09:22:00 426
pthread源代码
2015-05-15
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人