Linux文件系统基础

前面 本文在摘录了一些基本概念 文件描述符 文件描述符是一些小值整数,用于文件系统在处理文件的时候,标识被处理文件. 因此文件描述符的总数也就是系统可以打开的文件的最大数量 当Linux系统开始运行的时候,有三个文件描述符已经被使用: 标准输入:0 标准输出:1 标准错误:2 其他文件的文件描述符,在调用open函数时返回.文件描述符有操作系统分配,每次分配最小的. 库函数 系统调用实际上就是指最底层的一个调用,在linux程序设计里面就是底层调用的意思。面向的是硬件。而库函数调用则面向的是应用开发的,相当于应用程序的api,采用这样的方式有很多种原因: 双缓冲技术的实现。 可移植性。(系统调用是操作系统相关的,因此一般没有跨操作系统的可移植性。) 底层调用本身的一些性能方面的缺陷。 让api也可以有了级别和专门的工作面向。 函数库调用 系统调用 在所有的ANSI C编译器版本中,C库函数是相同的…

Read More

java锁机制介绍

java锁 乐观锁与悲观锁 乐观锁与悲观锁都是一种锁机制。用于实现线程同步机制。 悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。适用于数据频繁修改的场景。 乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量。 java中的锁机制 synchronized 在java5之前,使用关键字synchronized修饰一个方法或者代码块对临界资源的保护实现多线程并发同步。有四种不同的同步块: 实例方法 静态方法 实例方法中的同步块 静态方法中的同步块 synchronized(lockObject) { //需要访问的临界资源 }…

Read More

java实现move操作

java实现move操作 这类操作与文件所在的文件系统息息相关. File的renameTo一般只用于同级目录修改文件名。 想要多级目录移动文件还得用Files.move方法。 同一个文件系统下会进行move操作 不同文件系统,则通过拷贝-删除的方式实现move。 package io.move; import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardCopyOption;…

Read More

LIBRARY_PATH和LD_LIBRARY_PATH

LIBRARY_PATH和LD_LIBRARY_PATH是Linux下的两个环境变量,二者的含义和作用分别如下: LIBRARY_PATH环境变量用于在程序编译期间查找动态链接库时指定查找共享库的路径,例如,指定gcc编译需要用到的动态链接库的目录。设置方法如下(其中,LIBDIR1和LIBDIR2为两个库目录): export LIBRARY_PATH=LIBDIR1:LIBDIR2:$LIBRARY_PATH LD_LIBRARY_PATH环境变量用于在程序加载运行期间查找动态链接库时指定除了系统默认路径之外的其他路径,注意,LD_LIBRARY_PATH中指定的路径会在系统默认路径之前进行查找。设置方法如下(其中,LIBDIR1和LIBDIR2为两个库目录): export LD_LIBRARY_PATH=LIBDIR1:LIBDIR2:$LD_LIBRARY_PATH 来自:LIBRARY_PATH和LD_LIBRARY_PATH环境变量的区别

kmp匹配字符串

  kmp算法常用于优化字符串匹配,例如下面的问题: 有一个字符串a = “BBC ABCDAB ABCDABCDABDE”,我想知道,里面是否包含另一个字符串b = “ABCDABD” 一般的做法是循环比较。 func contain(a string, b string) bool { for i :=…

Read More