install
转载于CSDN
软件安装Linux 下软件的安装主要有两种不同的形式。第一种安装文件名为 xxx.tar.gz;另一种安装文件名为 xxx.i386.rpm。以第一种方式发行的软件多以源码形式发行的;第二种方式则是以二进制形式发行的。
二进制安装
解压1tar -zxvf xxx.tar.gz
configureconfigure 作用: 是源码安装软件时配置环境用的。他根据你的配置选项和你的系统情况生成 makefile最常用的参数:./configure –prefix不指定 prefix,则可执行文件默认放在 /usr/local/bin,库文件默认放在 /usr/local/lib,配置文件默认放在 /usr/local/etc,其他的资源文件放在 /usr/local/share。1./configure
make:编译1make
install:安装1make install
clean:清除临时文件1make clean
rpm 安装1rpm -i filename.i386.rpm
rpm 将自动将安装文件解包,并将软件安装到缺省的目录下。并将软件的安装信息注册到 rp ...
makefile
转载于陈皓大神一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,makefile 定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,因为 makefile 就像一个 shell 脚本一样,其中也可以执行操作系统的命令。
Makefile 介绍make 命令执行时,需要一个 Makefile 文件,以告诉 make 命令需要怎么样的去编译和链接程序。
Makefile 的规则123taget...: prerequisites ...command...
target也就是一个目标文件,可以是 Object File,也可以是执行文件。prerequisites就是要生成哪个 target 所需要的文件或目标command就是 make 需要执行的命令。(任意的 shell 命令)这是一个文件的依赖关系,也就是说,target 这一个或多个的目标文件依赖于 prerequisites 中的文件,其生成规则定义在 command 中。
一个实例123456789101112131415161718192021222324edit : ...
编译与调试
编译目标代码文件、可执行文件和库C 编程的基本策略是使用程序将源代码文件转换为可执行文件,此文件包含可以运行的机器语言代码。C 分两步完成这一工作:编译和链接。编译器将源代码转换为中间代码,链接器将此中间代码与其他代码相结合来生成可执行文件。编译器将源代码转换成机器语言代码,将结果放置在一个目标代码文件中。虽然目标文件包含机器语言代码,但是该文件还不能运行。目标代码文件中所缺少的第一个元素是一种叫做启动代码(start-up code)的东西,此代码相当于您的程序和操作系统之间的接口;所缺少的第二个元素是库例程的代码。几乎所有 C 程序都利用标准 C 库中所包含的例程(称为函数)。目标代码文件不包含这一函数的代码,它包含声明使用 printf() 函数的指令。实际代码存储在另一个称为“库”的文件中。库文件中包含许多函数的目标代码。链接器的作用是将这 3 个元素(目标代码,系统的标准启动代码,库代码)结合在一起,并将它们存放在单个文件,及可执行文件中。
Linux 编译123456#include <stdio.h>int main(void){ printf(&q ...
文件闲谈
谈谈我为什么有文件这几篇文章的(自己的作死之路)-_-
0 最开始是写 Go 语言 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 func OpenFile(name string, flag int, perm FileMode) (*File, error)name: 文件路径flag: 控制文件的打开方式perm: 控制文件模式可用的打开方式: O_RDONLY: 只读 O_WRONLY: 只写 O_RDWR: 可读可写 O_APPEND: 追加内容 O_CREATE: 创建文件,如果文件不存在 O_EXCL: 与创建文件一同使用,文件必须存在 O_SYNC: 打开一个同步的文件流 O_TRUNC: 打开时截断常规可写文件打开模式:// The defined file mode bits are the most significant bits of the FileMode.// The nine lea ...
磁盘,分区,文件系统
转载于CSDN
磁盘基础知识Linux 下磁盘命名和分区硬盘 = 磁盘主引导记 MBR + 分区1 + 分区2 + 分区3 + …主引导记录:磁盘的 0 柱面,0 磁头,1 扇区称为主引导扇区,FDISK 程序写到该扇区的内容称为主引导记录。该记录占用 512 个字节,它用于磁盘启动时将系统控制权交给用户指定的,并在分区表中登记了某个操作系统区。注:分区对应于所有的系统都是一样的
磁盘命名在 Linux 下对 SCSI 和 STATA 设备是以 sd(串行硬盘)命名的。IDE 接口设备使用 hd(并行口)命名的。
分区命名分区是用设备名称加数字命名的。例如 had1 代表 hda 这个硬盘设备上的第一个分区。每个硬盘最多有四个分区。
分区步骤1234567891011121314151617181920212223242526272829303132333435Command (m for help): m //看各个命令都有介绍Command action a toggle a bootable flag //激活为启动标志 ...
文件系统
0文件在硬盘看来就是一堆二进制数据而已你准备把这些文件存储在硬盘上,并在需要的时候读取出来。要设计怎样的软件,才能更方便地在硬盘中读写这些文件呢?
1首先我不想和复杂的扇区,设备驱动等细节打交道,因此我先实现了一个简单的功能,把硬盘按逻辑分成了一个个的块,并可以以块为单位进行读写。每个块就定义为两个物理扇区的大小,即 1024 字节,就是 1KB。硬盘有 1024 个块,即 1MB。准备一个文件,随便选个块放进去
2再存一个文件!发现问题了,万一这个文件也存到了 3 号块,不是把原来的文件覆盖了吗?得有一个地方记录,哪些块可用,哪些块不可用?位图!我们给块 0 起个名字,叫块位图,之后这个块 0 就专门用来记录所有块的使用情况,不再用来存具体文件了。当我们再存入一个新文件时,只需要在块位图中找到第一个为 0 的位,就可以找到第一个还未被使用的块,将文件存入。
3下面,我们尝试读取刚刚的文件。怎么找到刚刚的文件?根据块号吗?这也太蠢了,就像你去书店找书,店员让你提供书的编号,显然不合理。因此我们给每个文件起一个名字,叫文件名,通过它来寻找这个文件。那必然就要有一个地方,记录文件名与块号的 ...
文件描述符fd
转载于 奇伢云存储
fd 是什么fd 是 File descriptor 的缩写,中文名叫做:文件描述符。文件描述符是一个非负整数,本质上是一个索引值。
什么时候拿到的 fd?当打开一个文件时,内核向进程返回一个文件描述符(open系统调用),后续 read、write 这个文件时,则只需要用这个文件描述符来标识该文件,将其作为参数传入 read、write。
fd 的值范围是什么?在 POSIX 语义中,0,1,2 这三个 fd 值已经被赋予特殊含义,分贝时标准输入(STDIN_FILENO),标准输出(STDOUT_FILENO),标准错误(STDERR_FIFENO)。文件描述符是有一个范围的:0 ~ OPEN_MAX - 1,最早期的 UNIX 系统中的范围很小,现在的主流系统单就这个值来说,变化范围是几乎不受限制的,只收到系统硬件配置和系统管理员配置的约束。
12查看当前系统的配置ulimit -n
窥探 Linux 内核stask_struct进程的抽象是基于 struct task_struct 结构体,只提取需要理解的字段
12345struct task_struct ...
内部锁升级
转载于 阿里技术 - 谈谈JVM内部锁升级过程
为什么讲这个?
对象在内存中的内存布局是什么样的?
描述 synchronized 和 ReentrantLock 的底层实现和重入的底层原理。
谈谈 AQS,为什么 AQS 底层是 CAS + volatile?
描述下锁的四种状态和锁升级过程?
Object o = new Object() 在内存中占用多少字节?
自旋锁是不是一定比重量级锁效率高?
打开偏向锁是否效率一定会提升?
重量级锁到底重在哪里?
重量级锁什么时候比轻量级锁效率高,同样反之呢?
加锁发生了什么?要弄清加锁之后到底发生了什么,需要看一下对象创建之后在内存中的布局是个什么样的?一个对象在 new 出来之后在内存中主要分为 4 个部分:
markword 这部分其实是加锁的核心,同时还包括的对象的一些声明信息,例如是否 GC,经过了几次 Young GC 还存活。
klass pointer 记录了对象的 class 文件指针。
instance data 记录了对象里面的变量数据。
padding 作为对齐使用。
借助第三方包 JOL ...
加一操作
转载于 低并发编程
问题多个线程,一个共享变量,不断 +1
思路一存在线程安全问题
123456789public class AtomicTest { private int count; public void add() { count++; }}
思路二加锁实现,但效率太低
123456789public class AtomicTest { private int count; public synchronized void add() { count++; }}
思路三无锁算法
123456789public class AtomicTest { private AtomicInteger i = new AtomicInteger(); public void increment() { i.incrementAndGet(); }}
更高级的 ...
LRU
LRU 缓存设计和构建一个“最近最少使用”缓存,该缓存会删除最近最少使用的项目。缓存应该从键映射到值(允许你插入和检索特定键对应的值), 并在初始化时指定最大容量。当缓存被填满时,它应该删除最近最少使用的项目。
思路哈希表 + 双向链表
LRU 缓存机制可以通过哈希表辅以双向链表实现,我们用一个哈希表和一个双向链表维护所有在缓存中的键值对。
双向链表按照被使用的顺序存储了这些键值对,靠近头部的键值对是最近使用的,而靠近尾部的键值对是最久未使用的。
哈希表即为普通的哈希映射,通过缓存数据的键映射到其在双向链表中的位置。
这样一来,我们首先使用哈希表进行定位,找出缓存项在双向链表中的位置,随后将其移动到双向链表的头部,即可在 O(1) 的时间内完成 get 或 put 操作。
get 操作
如果 key 不存在,则返回 -1
如果 key 存在,则 key 对应的节点是最近被使用的节点。通过哈希表定位到该节点在双向链表中的位置,并将其移动到双向链表的头部,最后返回该节点的值。
put 操作
key 不存在,使用 key 和 value 创建一个新的节点,在双向链表的头部添加该节点 ...