随笔(2015.3)

来源:互联网 发布:联想win7还原软件 编辑:程序博客网 时间:2024/06/02 04:20
1. firdbird 系统表相关可以参考http://blog.csdn.net/paluo/article/details/6208126 , 想修改一个表字段的编码方式,直接用alter table device alter "device_name" varchar(1000) character set gbk;方式不可以,说什么有完整性约束,用下面这个方式就可以了:
</pre><p><pre name="code" class="cpp">update rdb$fields setrdb$field_type = 37,rdb$field_length = 1000,rdb$character_length = 1000,rdb$character_set_id = 67,rdb$collation_id = 0where (rdb$field_name  in (select a.rdb$field_sourcefrom rdb$relation_fields a, rdb$fields bwhere a.rdb$relation_name = 'device'and a.rdb$field_source = b.rdb$field_name and a.rdb$field_name='device_name'));

2.ios为什么比Android运行流畅? iOS的Objective-C,编译器gcc,而这个gcc编译出来的代码又被苹果专为iOS架构优化到了极致,运行过程中也不需要虚拟机在中间插手,执行效率自然很高--引自网络。这一段话应该是iOS系统本身运行程序的执行过程,而Android是通过JAVA虚拟机来执行,并且系统需要占用大量内存来换取执行速度,再加上不定期的内存自动回收机制,从而直接导致了卡顿现象的出现。

Objective-C的优势是效率高但比较“唯一”,而JAVA的优势则是跨平台不过运行效率相对偏低,其实这两个编程语言所带来的机制不同,就已经造成了各自系统之间的流畅性差异化。

但根据技术人员讲解,现代的JAVA虚拟机效率已经不再是最大的瓶颈,Android 4.0系统版本之后的卡顿现象明显得到了改善,所以这也是有用户并没有发现自己新买的Android手机出现太多卡顿现象的原因。


3. Route add 192.168.0.0 mask 255.255.0.0 192.168.1.1


4. 死锁的调试,程序在调用sdk时候出现死锁。看下死锁的几个条件:
互斥条件(Mutual exclusion):资源不能被共享,只能由一个进程使用。
请求与保持条件(Hold and wait):已经得到资源的进程可以再次申请新的资源。
非剥夺条件(No pre-emption):已经分配的资源不能从相应的进程中被强制地剥夺。
循环等待条件(Circular wait):系统中若干进程组成环路,改环路中每个进程都在等待相邻进程正占用的资源。


如果是两个进程,也最常见,那么还好调试,但是如果多个进程,多个资源,调试起来就费劲了。


调试后发现问题的原因,sdk中有回调方法和一些同步方法,但是sdk中的同步方法需要等待回调结束后执行。其实是sdk的问题,增加了一个隐形的假设,回调方法所在线程不能与同步调用方法所在线程有锁竞争,如果有锁竞争,那么可能会有死锁。解决方法,是在上层把可能的锁竞争消除,把锁的范围减小。


对于锁的问题,除了注意锁的范围,还要注意锁的“职责”,如果一个对象中有多个资源,而且有的资源是经常访问的,那么可以考虑给那些经常访问的资源单独配一个锁。


对锁的细分,尤其要注意,像有消息循环处理的线程中,消息队列通常分配 一个单独的锁!执行消息时候从消息队列中得到消息,然后释放消息队列的锁,这样在处理分发消息的时候就不会阻塞住消息的push了。


5.    
线程安全:
线程安全函数:在C语言中局部变量是在栈中分配的,任何未使用静态数据或其他共享资源的函数都是线程安全的。
使用全局变量的函数是非线程安全的。
使用静态数据或其他共享资源的函数,必须通过加锁的方式来使函数实现线程安全。


线程安全的(Thread-Safe):
如果一个函数在同一时刻可以被多个线程安全地调用,就称该函数是线程安全的。
线程安全函数解决多个线程调用函数时访问共享资源的冲突问题。


可重入(Reentrant):
函数可以由多于一个线程并发使用,而不必担心数据错误。可重入函数可以在任意时刻被中断,稍后再继续运行,不会丢失数据。可重入性解决函数运行结果的确定性和可重复性。


可重入函数编写规范为:


1、不在函数内部使用静态或全局数据 
2、不返回静态或全局数据,所有数据都由函数的调用者提供。 
3、使用本地数据,或者通过制作全局数据的本地拷贝来保护全局数据。
4、如果必须访问全局变量,利用互斥机制来保护全局变量。
5、不调用不可重入函数。


两者之间的关系:
1、一个函数对于多个线程是可重入的,则这个函数是线程安全的。
2、一个函数是线程安全的,但并不一定是可重入的。【使用互斥锁实现的线程安全】
3、可重入性要强于线程安全性。


注:这里有个容易混淆的概念,可重入锁,指的是锁对当前的线程是可重入的,多线程对同一个“可重入锁”是不可重入的。


6. 异步操作转成同步操作的一种方法:使用条件锁(Android源代码里面的一个例子)


mAlbumArtWorker = new Worker("album art worker");
mAlbumArtHandler = new AlbumArtHandler(mAlbumArtWorker.getLooper());
很明显这两句,是构建了一个子线程。并且这个子线程还是Looper的子线程,这里很牛逼的使用了 mAlbumArtWorker.getLooper()这个函数,因为我们知道,我们能够得到子线程的Looper的途径只有一个:就是在子线程中调用 Looper.myLooper (),并且这个函数还要在我们perpare之后调用才能得到正确的Looper,但是他这里用了一个这样的什么东东 getLooper,不知道它是如何实现的?
这里有一个大概的思路,我们在子线程的的prepare之后调用 myLooper ()这个方法,然后保存在一个成员变量中,这个getLooper就返回这个东西,但是这里会碰到多线程的一个很突出的问题,同步。我们在父线程中调用 mAlbumArtWorker.getLooper(),但是想要这个返回正确的looper就必须要求我们的子线程运行了prepare,但是这个东西实在子线程运行的,我们如何保证呢?
我们看Google是如何实现的?

private class Worker implements Runnable {        private final Object mLock = new Object();        private Looper mLooper;                /**         * Creates a worker thread with the given name. The thread         * then runs a [email=%7B@link]{@link[/email] android.os.Looper}.         * @param name A name for the new thread         */        Worker(String name) {            Thread t = new Thread(null, this, name);            t.setPriority(Thread.MIN_PRIORITY);            t.start();            synchronized (mLock) {                while (mLooper == null) {                    try {                        mLock.wait();                    } catch (InterruptedException ex) {                    }                }            }        }                public Looper getLooper() {            return mLooper;        }                public void run() {            synchronized (mLock) {                Looper.prepare();                mLooper = Looper.myLooper();                mLock.notifyAll();            }            Looper.loop();        }                public void quit() {            mLooper.quit();        }}


7. Pipeline Thread(流水线线程)模式 
http://www.cise.ufl.edu/research/ParallelPatterns/PatternLanguage/AlgorithmStructure/Pipeline.htm
http://mindtherobot.com/blog/159/android-guts-intro-to-loopers-and-handlers
http://blog.csdn.net/whinah/article/details/2315528
http://www.cnblogs.com/kaige/archive/2012/04/10/2439823.html
http://blog.csdn.net/yanghua_kobe/article/details/43908659


8. ThreadLocal解析 http://blog.csdn.net/qjyong/article/details/2158097


9. 一些容易重复犯的错误,1.return 前忽视异常情况处理,返回协议,释放资源。 2. list 用for来删除的时候,erase后需要给当前迭代器赋值。


10. 对于消息处理的中心线程,例如Android的activity中的主线程,在其中不能处理需要长时间操作的线程,这个主线程的任务是更新界面,接收用户发送的指令,发送给其他handle来处理,handle处理结束后,在把结果发送给activity中的线程。


对于类似框架的处理,在消息处理主线程中,最好不要有阻塞操作例如同步发送网络消息,对于sdk,最好也是开线程异步实现。因为sdk提供的方法一般是同步的。


11. Linux系统中的epoll机制为处理大批量句柄而作了改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著减少程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。 epoll是有前提的,如果绝大部分都是活跃的,那么用select,效率可能更高。


12. 多层的stl容器嵌套查找可能会非常消耗cup,使用map映射后,cpu从80%多下降到15%。从测试来看,锁竞争对于系统消耗不大,锁可能消耗性能的是锁的范围大,产生等待的情况。
在调用次数不多的情况下,每秒2万次调用的情况下,dynamic_cast操作符对于系统的影响不是很大。


13. 对于数据的写入,firebird每秒大概处理350个左右,5个字段,一个varchar50,一个time,三个double。没有外键、主键。可以改善的方法不多,可以从数据库配置入手,也可以一次写入多条数据,例如一个insert 插入多个数据。


提高MySQL数据库插入性能中心思想:尽量将数据一次性写入到Data File和减少数据库的checkpoint 操作。这次修改了下面四个配置项: 
1)将 innodb_flush_log_at_trx_commit 配置设定为0;按过往经验设定为0,插入速度会有很大提高。 
0: Write the log buffer to the log file and flush the log file every second, but do nothing at transaction commit. 
1:the log buffer is written out to the log file at each transaction commit and the flush to disk operation is performed on the log file 
2:the log buffer is written out to the file at each commit, but the flush to disk operation is not performed on it 


2)将 innodb_autoextend_increment 配置由于默认8M 调整到 128M 
此配置项作用主要是当tablespace 空间已经满了后,需要MySQL系统需要自动扩展多少空间,每次tablespace 扩展都会让各个SQL 处于等待状态。增加自动扩展Size可以减少tablespace自动扩展次数。 


3)将 innodb_log_buffer_size 配置由于默认1M 调整到 16M 
此配置项作用设定innodb 数据库引擎写日志缓存区;将此缓存段增大可以减少数据库写数据文件次数。 


4)将 innodb_log_file_size 配置由于默认 8M 调整到 128M 
此配置项作用设定innodb 数据库引擎UNDO日志的大小;从而减少数据库checkpoint操作。 


经过以上调整,系统插入速度由于原来10分钟几万条提升至1秒1W左右;注:以上参数调整,需要根据不同机器来进行实际调整。特别是 innodb_flush_log_at_trx_commit、innodb_log_buffer_size和 innodb_log_file_size 需要谨慎调整;因为涉及MySQL本身的容灾处理。 


14. Java中Native关键字 http://blog.csdn.net/luoshengyang/article/details/6817933


15. 大数据时代,对于数据的处理与以前“小数据时代”的主要变化:1)对数据的因果关系转移到相关关系,不在关心为什么,只关心结果。2)对数据的采样分析到对全数据的分析。3)对数据的精确性要求不高。
0 0
原创粉丝点击