`
M_ittrue
  • 浏览: 75216 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论
文章列表
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #include <sys/socket.h> #define LINE_LEN 25 //配置文件存储结构 struct httppd{ char Port[10]; char Directory[20]; ...

自旋锁

   自旋锁是专为防止多处理器并发而引入的一种锁,它在内核中大量应用于中断处理等部分(对于单处理器来说,防止中断处理中的并发可简单采用关闭中断的方式,即在标志寄存器中关闭/打开中断标志位,不需要自旋锁,在单处理器且不可抢占的情况下同样不需要自旋锁)。   自旋锁同样是为了保护共享资源而得出来的一种锁,它与互斥锁所起到的作用类似。当资源申请者对共享资源进行访问时必需取得这个锁才能继续执行,直接持有者把锁释放,下一个当资源申请者才会取得该锁进而对资源访问。但在等待已被占有锁的资源上,互斥锁与自旋锁会有一些不同。当资源申请者所请求资源锁已被持有,则进入休眠,直到锁被释放再由内核对资源申请者进行唤醒, ...
本来打算用一个形象的生活情况来比喻条件互斥的,但想了再想实在没有想到比较科学贴切的比喻. 那还是开门见山来说吧. Condition Variable无论在C/C++还是C#,JAVA语言里,都会搭配一个Mutex来用. 我们知道Mutex的普通意义上是维持一个互斥变量,从而保证一个或一组操作的原子性. 同样,简单的说Mutex加在Condition Variable上也是为了保证它的原子性了. Condition Variable,有条件的唤醒机制.最经典不过的就是生产--消息者模型了. 但有一个细节,消费者需要有"产品"才能继续它的消费行为,因此当消费者发现& ...

线程间同步

    前面专门找了一些资料去了解函数的可重入性以及线程安全同步,我们知道在多线程并发访问共享数据时候往往会出现数据冲突,这跟之前的函数可重入性是一样的.比如两个线程要对一个全局变量加1.但这个过程在x86平台上并非原子操作,它可能会经过以下三步才能完成: 1:从内存中读取变量到寄存器中 2:寄存器加1 3:将寄存器的值写回内存   这一个非原子操作可想而知,如果有多线程并发执行,那么这三步有可能就在线程间交叉执行.如: #include <stdio.h> #include <stdlib.h> #include <pthread.h> ...
  可重入 & 信号安全  可重入性函数( Reentrant Function) 可重入与线程安全是两个独立的概念, 都与函数处理资源的方式有关。 首先,可重入和线程安全是两个并不等同的概念,一个函数可以是可重入的,也可以是线 ...
redis 主从复制       redis主从复制配置和使用都非常简单。通过主从复制可以允许多个slave server拥有和master server相同的数据库副本。下面是关于redis主从复制的一些特点1.master可以有多个slave2.除了多个slave连到相同的master ...
转自:搜索技术博客-淘宝 Redis内存存储结构分析 1 Redis 内存存储结构 本文是基于 Redis-v2.2.4 版本进行分析. 1.1 Redis 内存存储总体结构 Redis 是支持多key-value数据库(表)的,并用 RedisDb 来表示一个key-value数据库(表). redisServer 中有一个 redisDb *db; 成员变量, RedisServer 在初始化时,会根据配置文件的 db 数量来创建一个 redisDb 数组. 客户端在连接后,通过 SELECT 指令来选择一个 reidsDb,如果不指定,则缺省是redisDb数组的第1个(即下 ...
  转自:http://www.searchdatabase.com.cn/showcontent_62166.htm 概述   Redis通过定义一个 struct redisServer 类型的全局变量server 来保存服务器的相关信息(比如:配置信息,统计信息,服务器状态等等)。启动时通过读取配置文件里边的信息对server进行初始化(如果没有指定配置文件,将使用默认值对sever进行初始化),初始化的内容有:起监听端口,绑定有新连接时的回调函数,绑定服务器的定时函数,虚拟内存初始化,log初始化等等。   启动   初始化服务器配置   先来看看redis 的main函数的 ...
  分享 应用程序 公共主页 人人生活 人人小组 同名同姓 校园
进程有独立的用户内存地址, 进程的全局变量对其它进程透明, 需通过内核缓冲内共享数据,通信 管道: 声明在unistd.h头文件中 原型 int pipe(int filedes[2]);  filedes[0]表示输入管道,filedes[1]表示输出管道. 返回值:0表示创建管道成功,-1为失败/ 代码测试:   #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> int main(int argc,char ...
上代码: #! /bin/sh is_directory() { DIR_NAME=$1 echo "开始测试目录$DIR_NAME" if [ -d $DIR_NAME ];then echo "$DIR_NAME 已存在" return 1 else echo "创建文件目录-$DIR_NAME" return 0 fi } for var_dir in "$@";do if ! is_directory "$var_dir" ...
  Linux自定义系统调用   如果用户在Linux中添加新的系统调用,应该遵循几个步骤才能添加成功,下面几个步骤详细说明了添加系统调用的相关内容。 2.1添加源代码 第一个任务是编写加到内核中的源程序,即将要加到一个内 ...

linux系统调用

目录: 1. Linux系统调用原理 2. 系统调用的实现 3. Linux系统调用分类及列表 4.系统调用、用户编程接口(API)、系统命令和内核函数的关系 5. Linux系统调用实例 1.系统调用原理   系统调用,顾名思义,说的是操作系统提供给用户程序调用的一组“特殊”接口。用户程序可以通过这组“特殊”接口来获得操作系统内核提供的服务,比如用户可以通过文件系统相关的调用请求系统打开文件、关闭文件或读写文件,可以通过时钟相关的系统调用获得系统时间或设置定时器等。 从逻辑上来说,系统调用可被看成是一个内核与用户空间程序交互的接口——它好比一个中间人,把用户进程的请 ...
  strace实现原理   引子:1.在Linux系统中,进程状态除了我们所熟知的TASK_RUNNING,TASK_INTERRUPTIBLE,TASK_STOPPED等,还有一个TASK_TRACED。这表明这个进程处于什么状态?2.strace可以方便的帮助我们记录进程所执行的系统调用,它 ...
上代码:   /* upper.c */ #include <stdio.h> int main(void) { int ch; while((ch = getchar()) != EOF) { putchar(toupper(ch)); } return 0; }   终端输入: upper的默认输出是终端, gcc -g upper.c -o upper ./upper 便可以任意输入,以ctr c退出 文件管道输入; touch file.txt 可以对file.txt输入任意字符串 终端输入./upper < file. ...
Global site tag (gtag.js) - Google Analytics