标签 empty 下的文章

Git基本用法

一、实验说明

本文为 Git 入门介绍,可以了解如何创建和使用 git 仓库。

二、git的初始化

在使用git进行代码管理之前,我们首先要对git进行初始化。

1.Git 配置

使用Git的第一件事就是设置你的名字和email,这些就是你在提交commit时的签名,每次提交记录里都会包含这些信息。使用git config命令进行配置:

$ git config --global user.name "BeForever"
$ git config --global user.email "762538456@qq.com"

执行了上面的命令后,会在家目录(/home/shiyanlou)下建立一个叫.gitconfig 的文件(该文件为隐藏文件,需要使用ls -al查看到). 内容一般像下面这样,可以使用vim或cat查看文件内容:

$ cat ~/.gitconfig

[user]

    email = schacon@gmail.com
    name = Scott Chacon

上面的配置文件就是Git全局配置的文件,一般配置方法是git config --global <配置名称> <配置的值>。

如果你想使项目里的某个值与前面的全局设置有区别(例如把私人邮箱地址改为工作邮箱),你可以在项目中使用git config 命令不带 --global 选项来设置. 这会在你当前的项目目录下创建 .git/config,从而使用针对当前项目的配置。

- 阅读剩余部分 -

操作系统基础知识(三)--生产者消费者模型

生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题,主要解决的是两者速率不一致而产生的阻抗不匹配。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。
一、PV原语
1.一个生产者,一个消费者,一个缓冲区。

问题关键:只有生产了产品,消费者才能消费(同步)

其中包含的有2个同步条件:

只有当缓冲区是空的情况下,生产者才能往缓冲区写数据
只有当缓冲区是满的情况下,消费者才能往缓冲区读数据
所以要定义2个同步信号量: empty--表示缓冲区是否为空,初值为1.
full--表示缓冲区中是否为满,初值为0

生产者进程

while(true){
   produce();
   P(empty);
   toBuffer();
   V(full);
}

消费者进程

while(true){
    P(full);
    getBuffer();
    V(empty);
    consume();
}

2.一个生产者,一个消费者,N个环形缓冲区

定义2个同步信号量:
empty--表示缓冲区是否为空,初值为n
full--表示缓冲区是否为满,初值为0
设缓冲区的编号为1~n-1,定义2个指针in和out,分别是生产者进程和消费者进程使用的指针,指向下一个可用的缓冲区。

生产者进程

while(true){
  produce();
  P(empty);
  toBuffer(in);
  in = (in + 1) mod n;
  V(full);
}

消费者进程

while(true){
  P(full);
  getBuffer(out);
  out=(out+1) mode n;
  V(empty);
  consume();
}

3.一组生产者,一组消费者,N个环形缓冲区

问题关键:生产者生产了产品,消费者才能消费;生产者之间不能往同一个缓冲区写数据;消费者也不能从同一个缓冲区读数据;

同步关系

只有当缓冲区是空的情况下,生产者才能往缓冲区写数据
只有当缓冲区是满的情况下,消费者才能往缓冲区读数据
互斥关系:

生产者往一个缓冲区写数据了,另外一个生产者不能往该缓冲区写数据
消费者往一个缓冲区读数据了,另外一个生产者不能往该缓冲区读数据
所以定义4个信号量:(几种关系,几个信号量)

empty--表示缓冲区是否为空,初值为N
full--表示缓冲区是否为满,初值为0
mutex1--生产者之间的互斥信号量,初值为1
mutex2--消费者之间的互斥信号量,初值为1
该缓冲区的编号为1~n-1,定义两个指针in和out,分别是生产者进程和消费者进程使用的指针

生产者进程

while(true){
  produce();
  P(empty);
  P(mutex1);
  tobuffer(in);
  in = (in + 1) mod n;
  V(mutex1);
  V(full);
}

消费者进程

while(true){
  P(full);
  P(mutex2);
  getBuffer(out);
  out = (out + 1) mod n;
  V(mutex2);
  V(empty);
}

实际上互斥还是同步,虽然有以上2种方式实现,但其根本还是原语的原子性。

bst g22 jinniu lilai opebet orange88 vinbet xbet yuebo zunlong shijiebei bet007 hg0088 ju111 letiantang m88 mayaba qg777 qianyiguoji sbf777 tengbohui tlc ule weilianxier waiweitouzhu xingfayule xinhaotiandi yinheyule youfayule zhongying 2018shijiebei w88 18luck 188bet beplay manbet 12bet 95zz shenbo weide1946 ca88 88bifa aomenxinpujing betway bodog bt365 bwin tongbao vwin weinisiren 88jt fenghuangyule hongyunguoji 918botiantang huanyayule jianada28 jixiangfang libo long8 hongzuyishi zuqiutouzhu