Linux学习笔记

来源:互联网 发布:淘宝宝贝价格下调 编辑:程序博客网 时间:2024/06/04 19:23

学习Linux过程中的知识点笔记,欢迎大家指正错误,谢谢!

1、linux内存分配 

      Linux程序员可以分配的最大堆空间,可以再/proc/meminfo文件中看到,MemTotal是表示所有内存,MemFree表示可以分配的空间。Proc文件主要存放的是内核的状态信息。32位的不超过3GB,因为要有1GB分配给内核使用

2、linux新内核版本的三种新的描述符 

  1.  signalfd:传统的处理信号的方式是注册信号处理函数;由于信号是异步发生的,要解决数据的并发访问,可重入问题。signalfd可以将信号抽象为一个文件描述符,当有信号发生时可以对其read,这样可以将信号的监听放到select、poll、epoll等监听队列中。
  2. timerfd:可以实现定时器的功能,将定时器抽象为文件描述符,当定时器到期时可以对其read,这样也可以放到监听队列的主循环中。  
  3. eventfd:实现了线程之间事件通知的方式,eventfd的缓冲区大小是sizeof(uint64_t);向其write可以递增这个计数器,read操作可以读取,并进行清零;eventfd也可以放到监听队列中,当计数器不是0时,有可读事件发生,可以进行读取。

3、父进程和子进程

父子进程共享共享正文段,打开的文件描述符,文件偏移量(共同读取一个文件同步策略:1、父进程等待子进程完成;2、父子进程各自执行不同的程序段)
  1. 进程获得父进程的数据空间、堆和栈的副本(相互不影响)
  2. 父进程的大部分属性也被继承
  3. 父进程的锁子进程不继承,子进程的未决信号集设为空集

4、__thread 变量(每个线程一份)

  1. __thread是GCC内置的线程局部存储设施,存取效率可以和全局变量相比。__thread变量每一个线程有一份独立实体,各个线程的值互不干扰。可以用来修饰那些带有全局性且值可能变,但是又不值得用全局变量保护的变量。
  2.  __thread使用规则:只能修饰POD类型(类似整型指针的标量,不带自定义的构造、拷贝、赋值、析构的类型,二进制内容可以任意复制memset,memcpy,且内容可以复原),不能修饰class类型,因为无法自动调用构造函数和析构函数,可以用于修饰全局变量,函数内的静态变量,不能修饰函数的局部变量或者class的普通成员变量,且__thread变量值只能初始化为编译器常量(值在编译器就可以确定const int i=5,运行期常量是运行初始化后不再改变const int i=rand())

5、进程间通信(IPC : Inter-process communication)

1、 管道 

    • 局限性:1.半双工;2.只能在具有公共祖先的进程之间
    • 使用: int pipe(int filedes[2] filedes[0]代表读, filedes[1]代表写;
    • 一般的使用是父进程调用pipe,然后fork,如果关闭父进程的filedes[0],关闭子进程的filedes[1],就是父进程向子进程写,反之相反
    • Popen可以执行shell程序
  2、 FIFO(命名管道)
    • 一种特殊的文件,操作类似于普通文件的操作,但是机制类似于普通管道
    • 一个进程先创建FIFO文件,然后向FIFO写数据(阻塞或非阻塞),另一个进程以读的方式打开FIFO文件即可进行通信。(如果有多个写进程写FIFO,需要将写操作变成原子操作(每次写入的数据不超过FIFO_BUF即可,就可以保证每次写都是原子的
    • 读写进程分别打开同一个管道文件,使用mkfifo(char* filename,int mode)来创建管道文件
    • 示例在链接:
3、 消息队列
    • 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法,通过2个进程打开相同的一个键值的消息队列
    • Msgget()创建或得打,msgctl()改变模式,msgsnd()把消息加入队列尾,msgrcv()从队列中取消息
    • 队列可以通过指定msgrcv()中的type,不按照先进先出的顺序
    • 在新的应用程序中不应当在使用它们,outTime

4、 消息队列和命名管道的区别

消息队列跟命名管道有不少的相同之处,通过与命名管道一样,消息队列进行通信的进程可以是不相关的进程,同
它们都是通过发送和接收的方式来传递数据的。在命名管道中,发送数据用write,接收数据用read,则在消息队列中,
发送数据用msgsnd,接收数据用msgrcv。而且它们对每个数据都有一个最大长度的限制。

与命名管道相比,消息队列的优势在于:
1、消息队列也可以独立于发送和接收进程而存在,从而消除了在同步命名管道的打开和关闭时可能产生的困难。
2、同时通过发送消息还可以避免命名管道的同步和阻塞问题,不需要由进程自己来提供同步方法。
3、接收程序可以通过消息类型有选择地接收数据,而不是像命名管道中那样,只能默认地接收。

5、信号量(semaphore)
    • 它是一个计数器,用于多进程对共享数据对象的访问
    • 通过semget()得到信号量,semctl()设置信号量,semop()操作信号量
    • 信号量为0,或1,为0时不可读取,进程陷入休眠,直到信号量恢复为1,感觉类似于线程间的同步
      (互斥锁,读写锁,条件变量)
    • 信号量通常被用来实现对共享存储访问的同步
6、 共享存储
    • 允许两个或更多进程共享一给定的存储区,因为不需要复制数据,这是最快的IPC
    • 关键是控制多个进程的同步访问,通常用信号量来控制同步
    • 先创建指定大小的共享存储段(shmget()),然后进程调用shmat()将其连接到它的地址空间中(推荐由内核自动分配第一个可用地址上)。
7、 最后三种同步操作都需要使用唯一的key值,通过 key_t ftok(const char *path,int id);
缺点:1、 IPC结构是在系统范围内起作用的,没有访问计数。如果进程创建了几则消息,然后删除他,但是其中的内容还在,直到消息被读取或被删除。
2、IPC结构在文件系统中没有名字,不能使用通用的命令和函数,只能使用各自的函数。
3、IPC不使用文件描述符,不能通过select或poll检测。

0 0
原创粉丝点击