How&Why
「已注销」
程序员
展开
-
内存共享
1:能 copy 的地方都不要 share2:一份数据一个线程访问3:你的数据你自己 memcpy4:我的意思说, 数据永远只有一个读写者5:转交给别人前先 copy6:能传值的地方不要传引用我的意思是这样的问题,比如 struct { int a; int b; int c;} aa若一个时间片的时候,数据是这样的, aa.a =原创 2015-01-07 16:42:34 · 491 阅读 · 0 评论 -
多线程编程原则(待总结)
1:因为Linux无法保证,当你读的时候肯定没人写,读写锁,线程锁,临界区除外。2:多线程下,不能靠概率来掩盖问题吧3:线程在任何点上被挂起一个小时都是可能的原创 2015-01-07 17:33:41 · 481 阅读 · 0 评论 -
生产者/消费者模式
★简介 在实际的软件开发过程中,经常会碰到如下场景:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类、函数、线程、进程等)。产生数据的模块,就形象地称为生产者;而处理数据的模块,就称为消费者。 单单抽象出生产者和消费者,还够不上是生产者/消费者模式。该模式还需要有一个缓冲区处于生产者和消费者之间,作为一个中介。生产者把数据放入缓冲区,而原创 2015-01-13 10:04:07 · 507 阅读 · 0 评论 -
JIT(动态编译)和AOT(静态编译)编译技术比较
Java 应用程序的性能经常成为开发社区中的讨论热点。因为该语言的设计初衷是使用解释的方式支持应用程序的可移植性目标,早期 Java 运行时所提供的性能级别远低于 C 和 C++ 之类的编译语言。尽管这些语言可以提供更高的性能,但是生成的代码只能在有限的几种系统上执行。在过去的十年中,Java 运行时供应商开发了一些复杂的动态编译器,通常称作即时(Just-in-time,JIT)编译器。转载 2015-01-13 14:13:33 · 1205 阅读 · 0 评论 -
安全科普:密码学之碰撞攻击
转载自FreeBuf.COM]前言密码学贯穿于网络信息安全整个过程,在解决信息安全的机密性保护、可鉴别性、完整性保护和信息抗抵赖等方面发挥着极其重要的作用,可以毫不夸张地说“对密码学或密码技术一无所知的人是不可能从技术层面上完全理解信息安全的!”(摘自《应用密码学》= =)最近SSL中间人证书攻击根本停不下来,真正的数字证书伪造有多难?有人会提起当年引起世界轩然大波转载 2015-01-15 16:15:05 · 5623 阅读 · 0 评论 -
下层对上层透明是什么意思?
你会发现,有些词语很奇怪。在计算机网络中,你肯定听说过下层对上层透明,啥意思? 这里透明的意思不是看得见,而是看不见。写个程序,你就清楚了:[cpp] view plaincopy#include int main() { printf("%d\n", sizeof("abcdefg")); retu原创 2014-12-30 13:02:37 · 1643 阅读 · 1 评论 -
我的态度
如果你在写代码中没有收获任何乐趣,不用40岁,20来岁写代码就是一个悲剧。一个人被迫在做着他不喜欢的事情难道不悲剧么?更如果你写的都是一些为了交差的垃圾代码,无法收获任何成就感,那么更是悲剧中的悲剧.原创 2015-04-04 00:22:01 · 785 阅读 · 0 评论 -
闭包的理解(个人)
闭包只是在形式和表现上像函数,但并不等同于函数,我们都知道,函数就是一些可执行语句的组合体,这些代码语句在函数被定义后就确定了,并不会在执行时发生改变,所以函数只有一个实例,而闭包在运行时可以有多个实例,不同的引用环境和相同的函数组合可以产生不同的实例,就好比相同的类代码,可以创建不同的类实例一样。原创 2015-04-21 14:44:15 · 445 阅读 · 0 评论 -
进制->原理本质/加法乘法表(个人理解)
七进制加法/乘法表0,1,2,3,4,5,61+1 = 2 1+2 = 32+2 =4 1+3 = 42+3 = 5 3+3 = 6 1+4 = 52+4 = 63+4原创 2015-08-31 14:50:23 · 1084 阅读 · 0 评论 -
sizeof(void*)的大小到底由何决定?(个人理解)
由编译器产生的目标平台的指令集决定的。譬如说x86就是4,x64就是8.sizeof(void*)的含义就是获取一个指针的大小。指针的本质就是内存地址,因此指针的大小和内存空间有关。32位的机器内存空间是2G(windows系统),因此指针的大小必须是,凑个整数那就是32bit。因此本质上说,sizeof(void*)和编译器目标平台的内存空间有关。原创 2016-03-24 20:37:24 · 18223 阅读 · 1 评论 -
两种并发模型 的理解(个人理解)
并发模型有两种,一种是并行工作者模型,一种是流水线模型。一、所谓并行工作者模型,举个例子来说,就好比汽车厂里面的工人,每个工人专门负责一辆车子的生产,从头到尾负责所有的工作。就好像是线程,拿到了一个请求,后面这个请求的所有工作都由这个线程来处理,直到所有这个请求的所有工作都结束。nginx的workprocessor应该就是这种模型,某个linux进程拿到了用户请求,然后负责这个请求的处理原创 2016-04-13 11:10:08 · 2717 阅读 · 0 评论 -
关于知识、技能、能力的理解?(个人理解)
知识是懂,技能是做,能力是成。知识是懂得为什么,技能是知道如何做,能力是能够做成功。有知识,可以更高效灵活的掌握技能;多一项技能,就多一分能力;除了知识技能,能力还包括性格,体力,口才,天赋,是个综合指标。能力是面向结果的,想做的能成,想要的能有,就可以说是有能力。原创 2016-04-19 09:16:13 · 3174 阅读 · 0 评论 -
编程的宗派
出处:http://www.yinwang.org/blog-cn/2015/04/03/paradigms/总是有人喜欢争论这类问题,到底是“函数式编程”(FP)好,还是“面向对象编程”(OOP)好。既然现在出了两个帮派,就有人积极地做它们的帮众,互相唾骂和残杀。然后呢,又出了一个“好好先生帮”,这个帮的人喜欢说,管它什么范式呢,能解决问题的工具就是好工具!我个人其实不属转载 2015-05-08 13:34:08 · 514 阅读 · 0 评论 -
程序员素养
程序员是可以当作一生的职业。但首先,你需要热爱编程,而不是把它作为完成其他人生目标的工具,你要不断地反思自己在哪些方面的努力是更有效率的。我认为,无论在哪个子领域工作的程序员,都要在三个方面提高自己。第一,保持对未知领域的好奇心,尽力开阔视野。如果你只精通一门编程语言,那么就赶快去学习另一门,最好和之前那门语言的亲缘关系越远越好。这可以让你从不同的视角去看待过去的问题。如果你只专注于一转载 2015-04-15 17:53:32 · 484 阅读 · 0 评论 -
C/C++接口设计->总结
尽量不要设计用引用的接口, 显式的指针好的多;接口重要的是语义明确基本类型就没必要引用了。C的风格是用指针,C++风格是引用。C++ 只有在重载操作符的时候才用引用,其它时候都不建议使用让调用者清楚接口的作用和潜在的副作用是第一位的原创 2015-03-31 23:33:02 · 1478 阅读 · 0 评论 -
自勉
talk is cheap, show me the code原创 2015-03-09 09:06:13 · 448 阅读 · 0 评论 -
编程语言感悟
掌握一门语言并不容易,不是翻完一两本书即可了事,语言的细枝末节需要在平日不断的编程练习中加以熟练。原创 2015-03-20 10:07:39 · 592 阅读 · 0 评论 -
编程语言以及周边工具 Logo
LLVM :原创 2015-02-03 13:06:37 · 1012 阅读 · 0 评论 -
进制->原理本质(个人理解)
原理: 其实学计算机很简单,就是扳着手指头数,如果不是数出来,是算出来的都是错误的想法。数的本质是数出来的。总结:进制是由元素组成的,N进制就是有N个元素组成,逢N进一任何一种进制,他自身就是一个完美的体系结构,可以直接加减乘除开方。都是 查表解决下面我来给十进制下个定义:十进制是由 0、1、2、3、4、5、6、7、8原创 2015-08-31 10:42:33 · 2698 阅读 · 0 评论 -
Linux多线程与同步
典型的UNIX系统都支持一个进程创建多个线程(thread)。在Linux进程基础中提到,Linux以进程为单位组织操作,Linux中的线程也都基于进程。尽管实现方式有异于其它的UNIX系统,但Linux的多线程在逻辑和使用上与真正的多线程并没有差别。 多线程我们先来看一下什么是多线程。在Linux从程序到进程中,我们看到了一个程序在内存中的表示。这个程序的整个运行过程中,原创 2015-01-08 09:59:09 · 444 阅读 · 0 评论 -
互斥锁
互斥锁是一个特殊的变量,它有锁上(lock)和打开(unlock)两个状态。互斥锁一般被设置成全局变量。打开的互斥锁可以由某个线程获得。一旦获得,这个互斥锁会锁上,此后只有该线程有权打开。其它想要获得互斥锁的线程,会等待直到互斥锁再次打开的时候。我们可以将互斥锁想像成为一个只能容纳一个人的洗手间,当某个人进入洗手间的时候,可以从里面将洗手间锁上。其它人只能在互斥锁外面等待那个人出来,才能进去。在外原创 2015-01-08 10:12:33 · 560 阅读 · 0 评论 -
理解多线程并发
比如说,我们有一个多线程火车售票系统,用全局变量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 · 429 阅读 · 0 评论 -
条件变量
条件变量是另一种常用的变量。它也常常被保存为全局变量,并和互斥锁合作。 假设这样一个状况: 有100个工人,每人负责装修一个房间。当有10个房间装修完成的时候,老板就通知相应的十个工人一起去喝啤酒。我们如何实现呢?老板让工人在装修好房间之后,去检查已经装修好的房间数。但多线程条件下,会有竞争条件的危险。也就是说,其他工人有可能会在该工人装修好房子和检查之间完成工作。采用下面原创 2015-01-08 10:14:27 · 410 阅读 · 0 评论 -
读写锁
读写锁与互斥锁非常相似。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 · 467 阅读 · 0 评论 -
pthread的各种同步机制
简述pthread是POSIX标准的多线程库,UNIX、Linux上广泛使用,windows上也有对应的实现,所有的函数都是pthread打头,也就一百多个函数,不是很复杂。然而多线程编程被普遍认为复杂,主要是因为多线程给程序引入了一定的不可预知性,要控制这些不可预知性,就需要使用各种锁各种同步机制,不同的情况就应该使用不同的锁不同的机制。什么事情一旦放到多线程环境,要考虑的问转载 2015-05-15 13:06:26 · 834 阅读 · 0 评论 -
spurious wakeup虚假唤醒(待总结)
看过apue大家都知道互斥器用于排他性的访问共享数据而不是等待原语,如果需要等待某个条件发生需要用条件变量。而当用条件变量的时候需要检查某个布尔表达式是否为真,进行这项检查的时候需要互斥器来保护,所以此时互斥器和条件变量联合起来用于同步。互斥器和条件变量用法如下:pthread_mutex_lock(&lock);while (condition_is_fal原创 2015-07-17 16:44:39 · 1304 阅读 · 0 评论 -
地址空间的抽象理解(个人理解)
用户程序在运行时不希望介入到这些复杂的存储器管理过程中,作为普通的程序,它需要的是一个简单的执行环境,有一个单一的地址空间、有自己的CPU,好像整个程序占有整个计算机而不用关心其它的程序(当然程序间通信的部分除外,因为这是程序主动要求跟其它程序通信和联系)。 所谓的地址空间是个比较抽象的概念,你可以把它想象成一个很大的数组,每个数组的元素是一个字节,而这个数组大小由地址空间的原创 2016-03-24 20:34:57 · 1409 阅读 · 0 评论 -
对性能的看法
现在以及未来, 微观上的性能剖析没有过去那么重要, 一是因为 cpu 快了(不一定有意义), 复杂了(不能简单的看微观问题);二是因为多核的发展. 你的程序是很多执行序列并行的. 任何一点的微观提高都很有可能触碰不到那块短板, 这还不是找热点的问题; 在只有一个执行序列时,即使你优化的不是热点, 总的执行时间理论上还是减少了; 多执行序时, 理论上都没有减少中断正在原创 2015-03-11 14:32:12 · 448 阅读 · 0 评论