Linux之美
玩转Linux系统 #
会飞的代码UP
自强不息,厚德载物。
展开
-
【Kernel】内存管理
1、概述内存管理是内核最复杂同时也最重要的一部分,具体包括内存中的物理内存页的管理,分配大块内存的伙伴系统,分配较小块内存的slab、slub和slob分配器,分配非连续内存块的vmalloc机制,以及进程的地址空间。 内核一般将处理器的虚拟地址空间分为用户空间和内核空间,在两个用户进程之间切换时会切换它们的上下文,用户空间发生变化,但内核空间保持不变。 可用的物理内存奖映射到内核的地址空间中。原创 2018-02-23 09:22:44 · 808 阅读 · 0 评论 -
【Linux】深入解析Linux proc文件系统
在Linux上,proc是一个伪文件系统,提供了访问内核数据的方法,一般挂载在“/proc”目录,其中的大部分内容是只读的,挂载(mount)信息可能为:proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)proc文件系统支持如下挂载选项:hidepid=_ngid=_gid_n设置访问“/proc/[pid]”目录的权限,可以取值为0原创 2017-06-03 08:05:06 · 12066 阅读 · 0 评论 -
【IPC】Posix共享内存区与mmap内存映射
共享内存是一种IPC形式,与其它IPC机制如管道、消息队列等相比,数据不必在进程与内核间多次交换,进程间通信的速度更快。当共享内存区映射到共享它的进程的地址空间时,再加以一些同步控制,这些进程就可以进行数据传送了。mmap函数提供了内存映射功能,可以把一个文件或一个Posix共享内存区对象映射到调用进程的地址空间,下面首先介绍mmap的用法。1、mmapinclude <sys/mman.h>vo原创 2016-03-30 19:56:23 · 3266 阅读 · 0 评论 -
【IPC】Posix信号灯
信号灯semaphore是一种进程间或者线程间的同步原语,有以下三种形式——Posix有名信号灯:使用Posix IPC名字标识,相关函数为sem_open/sem_close/sem_unlink,可用于进程或线程间的同步。 Posix基于内存的信号灯:存放在共享内存区中,相关函数为sem_init/sem_destroy,可用于进程或线程间的同步。 System V信号灯:在内核中维护,可用原创 2016-03-23 18:33:29 · 1302 阅读 · 1 评论 -
【IPC】 记录锁
记录锁控制函数fcntl,可用于有亲缘关系或无亲缘关系的进程间共享某个文件的读与写,共享文件通过文件描述符来访问,这种类型的锁通常在内核中维护,其唯一标识即fcntl函数调用进程的pid。先以一个例子说明进程间文件共享的问题。// nolock.c#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.原创 2016-03-22 19:44:21 · 857 阅读 · 0 评论 -
【IPC】读写锁
读写锁是同步的又一种形式,与互斥锁不同,互斥锁同时只能被一个线程获取,而读写锁可以同时被多个线程获取读锁,这在一定程度上提高了程序的并发性,写锁也同样是只能被一个线程获取。读写锁的数据类型为pthread_rwlock_t,静态分配时可初始化为PTHREAD_RWLOCK_INITIALIZER,动态分配时调用函数pthread_rwlock_init完成。下面是获取与释放读写锁的几个函数。#inc原创 2016-03-21 18:03:18 · 1267 阅读 · 0 评论 -
【IPC】互斥锁与条件变量及生产者-消费者问题
在多线程或者多进程之间共享数据时,同步是必需的,一个可行的方法是使用互斥锁与条件变量,这是一种最基本的同步形式,下面介绍其用法及在经典同步问题“生产者-消费者问题”中的应用。1、生产者-消费者问题(一)生产者-消费者问题是个经典的同步问题,也称为有界缓冲区问题,生产者、消费者代表某个线程或进程,生产者负责生产数据,消费者则对这些数据进行处理,数据是共享的,当有多个生产者或消费者时,同步会显得非常重要原创 2016-03-17 20:26:31 · 3210 阅读 · 1 评论 -
【IPC】Posix消息队列
消息队列是一种IPC机制,有Posix消息队列和System V消息队列两种类型,它们有许多相似之处,但也有一些差别:对Posix消息队列的读总是返回优先级最高的最早的消息,而对System V消息队列的读则可以返回任意指定优先级的消息;当往空队列放置消息时,Posix消息队列允许产生一个信号或启动一个线程,而System V消息队列则不能提供类似的机制。消息队列可认为是一个消息链表,队列中的每个消原创 2016-03-11 19:53:52 · 1120 阅读 · 0 评论 -
【IPC】管道和FIFO
UNIX IPC有多种形式,最初使用的便是管道pipe,管道没有名字,又称匿名管道,一般用于有亲缘关系的进程间通信,后来出现了fifo这种管道,它是有名字的,又叫做有名管道,可用于无亲缘关系的进程间通信,这两种管道的数据传输都可以使用我们最熟悉的write、read函数来完成。1、管道pipe创建管道使用如下pipe函数:#include <unistd.h>int pipe(int pipefd原创 2016-03-04 21:27:29 · 1076 阅读 · 0 评论 -
【Linux】socket
socket套接字是一种网络IPC,既可以在计算机内通信,也可以在计算机间通信。socket接口可以采用许多不同的网络协议,如常见的TCP/IP协议。1、socket描述符类似于文件描述符,访问socket也有对应的socket描述符。要创建一个套接字,调用socket函数:#include <sys/socket.h> int socket(int domain, int type, int pr原创 2015-07-10 13:30:25 · 1582 阅读 · 0 评论 -
【Linux】进程间通信之消息队列、信号量和共享存储
消息队列、信号量、共享存储是IPC进程间通信的三种形式,它们功能不同,但有一些相似点,下面先介绍它们相类似的特征,然后再逐一说明。1、相似点每个内核中的IPC结构(消息队列、信号量、共享存储)都用一个非负整数的标识符加以引用,与文件描述符不同,当一个IPC结构被创建,以后又被删除时,与这种结构相关的标识符连续加1,直至达到一个整型数的最大正直,然后又回转到0。标识符是IPC对象的内部名,还有一个外部原创 2015-07-07 19:24:16 · 2051 阅读 · 0 评论 -
【Linux】进程间通信之管道pipe与FIFO
管道pipe是UNIX系统IPC进程间通信的最古老形式,并且所有UNIX系统都提供此种通信机制。管道有下面两种局限性: 1、历史上,管道是半双工管道,数据只能在一个方向上流动,某些系统则提供了全双工管道。 2、管道只能在具有公共祖先的进程之间使用。半双工管道虽然有自身的局限性,但仍是最常用的IPC形式。每当你在管道线中键入一个由shell执行的命令序列时,shell为每一条命令单独创建一进程,然原创 2015-07-06 10:53:49 · 1784 阅读 · 0 评论 -
【Linux】存储映射IO-mmap
mmap,munmap——#include <sys/mman.h>void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);int munmap(void *addr, size_t length);int mprotect(void *addr, siz原创 2015-07-02 19:43:24 · 1617 阅读 · 0 评论 -
【Linux】readv与writev
readv 和 writev 函数用于在一次函数调用中读、写多个非连续缓冲区。有时也将这两个函数称为散布读和聚集写。#include <sys/uio.h>ssize_t readv(int fd, const struct iovec *iov, int iovcnt);ssize_t writev(int fd, const struct iovec *iov, int iovcnt);这两个函原创 2015-07-02 20:21:48 · 7351 阅读 · 2 评论 -
【Linux】IO多路转接
IO多路转接的技术可以避免阻塞IO的弊端,因为我们有时候需要在多个描述符上读read、写write,如果使用阻塞IO,就有可能长时间阻塞在某个描述符上而影响其它描述符的使用。关于阻塞IO的处理办法,可以考虑一下几个方案:1、多进程。弊端是多个进程终止时的通信,增加了程序的复杂度。2、多线程。弊端是多个线程之间的同步,同样也增加了程序的复杂度。3、轮询polling。使用非阻塞IO读取数据,弊端是浪费原创 2015-07-03 10:25:40 · 2093 阅读 · 0 评论 -
【Linux】记录锁
记录锁的功能是:当一个进程正在读或修改文件的某个部分时,它可以阻止其它进程修改同一文件区。fcntl函数可以实现这一功能。#include <fcntl.h>int fcntl(int fd, int cmd, ... /* arg */ );对于记录锁,cmd是F_GETLK、F_SETLK或F_SETLKW,第三个参数是一个指向flock结构的指针:struct flock {原创 2015-07-02 16:40:55 · 1293 阅读 · 0 评论 -
【Linux】守护进程
守护进程daemon,是生存期较长的一种进程。它们常常在系统自举时启动,仅在系统关闭时才终止。因为它们没有控制终端,所以说它们是在后台运行的。UNIX系统有很多守护进程,它们执行日常事务活动。1、系统自举自举(bootstrapping)一词来自于人都是靠自身的“自举”机构站立起来的这一思想。计算机必须具备自举能力将自己所有的元件激活,以便能完成加载操作系统这一目的,然后再由操作系统承担起那些单靠自原创 2015-07-02 15:08:42 · 1238 阅读 · 0 评论 -
【Linux】多线程
一个程序至少有一个进程,一个进程至少有一个线程,进程拥有自己独立的存储空间,而线程可以看作是轻量级的进程,共享进程内的所有资源。可以把进程看作一个工厂,线程看作工厂内的各个车间,每个车间共享整个工厂内的所有资源。就像每个进程有一个进程ID一样,每个线程也有一个线程ID,进程ID在整个系统中是唯一的,但线程ID不同,线程ID只在它所属的进程环境中有效。线程ID的数据类型为pthread_t,通常是无符原创 2015-07-02 13:12:38 · 1264 阅读 · 0 评论 -
【Linux】进程相关知识总结
一、UNIX进程环境在学习UNIX进程工作原理时,我们应该先了解一下UNIX进程的基本环境是怎么样的,首先从main函数开始。1、main函数int main(int argc, char *argv[]);相信main函数是我们非常熟悉的一个函数,它是C程序执行的入口函数。其中,argc是命令行参数的数目,agrv是指向参数的各个指针所构成的数组,而ISO/C和POSIX.1都要求argv[arg原创 2015-06-30 12:32:34 · 1421 阅读 · 0 评论 -
【Linux】系统数据文件和信息
UNIX系统的正常运行需要使用大量与系统有关的数据文件,例如口令文件/etc/passwd、组文件/etc/group、网路服务/etc/services、协议信息/etc/protocols、网络信息/etc/networks、主机数据/etc/hosts等。下面主要说明一下口令文件。口令文件——UNIX系统的口令文件在Linux上可能有下面一行:root:x:0:0:root:/root:/bi原创 2015-06-23 13:29:40 · 1156 阅读 · 0 评论 -
【Linux】标准IO库
Linux系统的文件IO都是针对文件描述符的,而标准IO(ISO C)的操作则是围绕流进行的,一个最明显的区别是标准IO比Linux文件IO多了缓冲机制。为了使用流,需要用到文件指针即指向FILE结构的指针,在“libio.h”头文件中有FILE结构的详细说明。“stdio.h”头文件中定义了三个标准流,stdin、stdout和stderr,分别是标准输入、标准输出和标准出错。流可以分为非格式化I原创 2015-06-19 17:15:46 · 1661 阅读 · 0 评论 -
【Linux】文件和目录
文件结构stat——下面三个函数可以获取文件的状态信息:#include <sys/stat.h>int stat(const char *path, struct stat *buf);int fstat(int fd, struct stat *buf);int lstat(const char *path, struct stat *buf);stat函数指定文件路径,fstat指定文件原创 2015-06-19 10:33:51 · 1053 阅读 · 0 评论 -
【Linux】文件IO
Unix系统中的大多数文件IO只需用到5个函数:open、read、write、lseek以及close。这些函数是不带缓冲的IO,不带缓冲指的是每个read和write都调用内核中的一个系统调用,它们不是ISO/C的组成部分,而是POSIX和SUS的东西。文件描述符——对于内核而言,所有打开的文件都通过文件描述符引用。文件描述符是一个非负整数,按照惯例,文件描述符0、1、2分别表示的是标准输入、标原创 2015-06-18 12:30:32 · 1182 阅读 · 0 评论 -
【Linux】文件的编码语系转换与换行符转换
1、编码语系转换常见中文编码语系有gb2312、big5、utf8,有时出于某种目的,一个文件要在不同的编码语系间转换,用iconv命令即可。$ iconv -l-l列出支持的编码语系。$ iconv -f encoding -t encoding filename [-o file]-f表示原编码格式,-t表示目标编码格式,-o表示stdout到文件。还有一个好用的命令f原创 2015-04-23 10:43:44 · 2575 阅读 · 0 评论 -
【Linux】Linux常识28问
1、什么是计算机?计算机种类多种多样,常见的如台式机、笔记本、一体机、移动电话等,甚至如GPS导航、门禁系统等,都是一种计算机,简单来说,计算机就是用来接受用户输入的指令与数据,经由CPU中央处理器的算术逻辑单元运算处理后,以输出或存储一定的信息。2、计算机由哪些部分组成?计算机由五大单元组成,它们是输入单元、输出单元、算术逻辑单元、控制单元、主存储器,其中后三者又称为系统单元,常说的CPU由算术逻原创 2016-11-20 21:52:37 · 1351 阅读 · 0 评论