- 博客(21)
- 资源 (21)
- 收藏
- 关注
原创 共享内存与信号量集结合使用的案例
前面说了共享内存有一些缺陷,无法达到进程同步的效果,然而将共享内存和信号量集结合使用,再加上锁的概念,就可以达到同步的结果。具体实现如下:头文件:shmfifo.h#ifndef __SHMFIFO_H__#define __SHMFIFO_H__typedef struct shm_head{ int rd_idx; // 读位置 int wr_idx; // 写位置 int b...
2018-04-27 13:41:05 754
原创 共享内存的实现详解
共享内存:共享内存是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据。共享内存示意图:共享内存数据结构:struct shmid_ds { struct ipc_perm shm_perm; /* Ownership and permissions */...
2018-04-26 10:43:48 12384
原创 软件体系结构之单例模式
一、单例模式的定义:单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免...
2018-04-25 10:57:51 633
原创 多个客户端与服务器端发送消息案例
案例:用消息队列实现许多客户端和服务器端的通信,要求是,许多客户端都可以向服务器端发送消息,服务器端在接受这些消息之后,再将消息回发给对应的客户端。解决思路:所有客户端都往1号通道上发送消息,并且在发送的内容的最前面放上自己进程的进程号,那么当服务器端收到中众多客户端发来的消息之后,通过解析主要内容的最前面内容,拿出对应客户端进程号,将其作为发送通道发送给对应的客户端,那么客户端接受的消息就来自以...
2018-04-23 19:48:30 1622
原创 linux下命名管道详解
1. 命名管道创建命名管道创建方式:函数:mkfifo(“my.p”,0644)命令:mkfifo my.p命名管道作用:在内核中建一块缓冲区,并命名,使得2个没有亲缘关系的进程能够实现通信,通过open这块缓冲区往里面写东西,读东西。一旦这2个进程能够找到了这块共有的缓冲区,可以删除my.p这个文件,删除之后并不影响2个进程的通信。需要注意的是:当只有进程往这块缓存写东西时(
2018-04-23 19:46:30 860
原创 linux下消息队列详解
消息队列提供了从一个进程向另外一个进程发送一块数据的方法,每个数据块认为有一个类型(通俗说法是一个通道),但是接受通道与发送通道必须一致才能实现通信。消息队列的不足之处在于每个消息最大长度有限度,每个消息队列总字节数有限制,系统的消息队列有限制。命令:cat /proc/sys/kernel/msgmax :查看一条信息最大有多大cat /proc/sys/kernel/msgmnb
2018-04-23 19:45:04 1900
原创 linux下静态库以及动态库的使用过程
在linux下经常会将一些.o文件打包成一个库,分为静态库和动态库。静态库主要是任何一个程序需要这个库, 就会将这个静态库的内容拷贝一份到程序中,进行执行。但是这样会出现一个问题, 当很多程序都要用这一个库的时候, 这个库就会被拷贝多份,然后造成代码冗余,占用内存空间, 这时就出现了动态库, 动态库只在系统中保存一份,哪一个程序使用它就去拿一份,不进行拷贝,这样大大节省了内存空间消耗。举一个例子进...
2018-04-15 11:06:51 148
原创 popen/system和fork的区别
一、system和popen1. system()和popen()简介在linux中我们可以通过system()来执行一个shell命令,popen()也是执行shell命令并且通过管道和shell命令进行通信。 system()、popen()给我们处理了fork、exec、waitpid等一系列的处理流程,让我们只需要关注最后的返回结果(函数的返回值)即可。2. system(
2018-04-15 10:20:21 338
原创 封装fork/wait等操作, 编写函数 process_create(pid_t* pid, void* func, void* arg)
封装fork/wait等操作, 编写函数 process_create(pid_t* pid, void* func, void* arg), func回调函数就是子进程执行的入口函数, arg是传递给func回调函数的参数#include<stdio.h>#include<stdlib.h>#include<unistd.h>int process_c...
2018-04-15 10:17:26 193
原创 自主实现一个shell
我实现的shell具有以下功能:1. 支持ls,touch,wc 等外部命令2. 支持输入输出重定向符3. 支持管道命令4 .支持后台作业5. 支持cd,jobs,kill,exit等内部命令(自己还写了一个about 命令 ^ _ ^)6. 支持对ctrl+c 和ctrl +z 信号的处理接下来我们按照编写的步骤一一来分析:(一)命令的解析输入命令的解析在本程序中占到了很大的比重,虽然像这种解析...
2018-04-15 10:10:55 439
原创 CUDA编程四(评估CUDA程序的好坏)
计算核函数运行时间clock函数评估程序在GPU上的运行时间我们需要使用CUDA提供的一个Clock函数,这个函数将会返回GPU执行单元的频率(timestamp),这十分适合用来判断一段程序执行所花费的时间。我们首先来看一下之前写好的CUDA程序骨架,然后我们的任务就是加上计算程序运行时间的功能:#include #include //CUDA RunTime API#
2018-04-09 11:07:13 452
原创 pyhon中Dijkstra算法的实现
算法一,Dijkstra算法Dijskstra算法解决的是带权重的有向图上单源最短路径问题,该算法要求所有边的权重都为非负值。单源最短路给定起点 start, 求到任意点的最短路 Dijkstra 算法,前提不能有负权边和孤立点:贪心算法:每次找最近的点,局部最优等于全局最优,数学归纳法可证维护起点 start 到每个点的距离时间复杂度 O(n^2)附加空间复杂度 O(n)
2018-04-09 11:00:57 269
原创 linux下rpm和yum的介绍及区别
1 Linux软件安装概述安装程序的方式:通用二进制格式:直接解压压缩文件,就可以使用。但一定要注意安装平台。软件包管理器:如RPM。软件包管理器的前端工具:如YUM。源代码编译。1.1 软件包概述软件包的组成部分:二进制程序,位于 /bin, /sbin, /usr/bin, /usr/sbin, /usr/local/bin, /usr/local/sbin 等目录中。库文件,位于 /lib,...
2018-04-06 09:10:50 314
原创 linux下实现一个彩色进度条
一、简介我们在Linux下安装文件都会有一个进度条来提示我们安装的进度,它里面会动态增长的一个图像表示进度,同时还有百分数表示安装百分比等等信息。 实现一个进度条我们首先需要知道如下的知识我们才能完全的写出这个小程序。二、缓冲区一般C库函数写入文件是全缓冲方式,而写入显示器是行缓冲方式,printf、fwrite库函数会自带缓冲区,而我们只要达到了一种缓冲方式我们就可以刷新缓冲区,一般情况下我们有...
2018-04-06 09:07:49 212
原创 调试时在编译选项中添加-g以及readelf命令的用法
用gdb进行调试纠错前必须要在编译选项中添加“-g”,“-g”标志是对程序进行调试性编译时常用的选项。我们需要给每一个需要调试的源文件都加上这个选项。它将使用特殊版本的C语言标准库完成编译和链接操作,给库函数加上程序调试方面的支持。编译器会把这些标志自动传给链接器。readelf命令用来显示一个...
2018-04-04 20:48:38 905
原创 常见的编译器
现在我们用的开发工具,多是集成好的,即IDE。常见的IDE有Microsoft Visual Studio,Dev-C++,C++Builder,Emacs + GCC,Eclipse+CDT。IDE环境,集编辑、编译、调试于一身,还有很多相应的拓展工具,这是为了开发人员使用上能够很方便,以至于他们把更多的精力放在项目本身的技术实现上。可是对于一个入门的开发人员,一下子就面对那么复杂的IDE,有时...
2018-04-04 20:37:09 1627
原创 linux中vim配置大全
vim是linux最常用的一种编辑器,但是需要配置其一些特性,更方便的为我们编程服务。set nocompatible "不要使用vi的键盘模式,而是vim自己的set syntax=on " 语法高亮set noeb or noerrorbells "关闭错误信息响铃setconfirm " 在处理未保存或只读文件的时候,弹出确认setautoindent 自动缩进...
2018-04-04 20:34:47 1551 1
原创 linux常用编辑器及其介绍
1 、VimVim是从 vi 发展出来的一个文本编辑器。代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。和Emacs并列成为类Unix系统用户最喜欢的编辑器。2 、EclipseEclipse是一款很酷的开源代码编辑器,同时它也是最受程序员亲睐的代码编辑器之一,它拥有代码高亮和智能提示等强大的功能。在Eclipse中,你可以完全胜任以下编程语言的工作——Python, R,...
2018-04-04 20:30:07 177
原创 cuda编程三(核函数)
CUDA核函数:要写在显示芯片上执行的程序。在 CUDA 中,在函数前面加上__global__ 表示这个函式是要在显示芯片上执行的,所以我们只要在正常函数之前加上一个__global__就行了:// __global__ 函数 (GPU上执行) 计算立方和__global__ static void sumOfSquares(int *num, int* result){ i
2018-04-04 20:27:38 1448
原创 CUDA编程二(CUDA初始化)
CUDA初始化与核函数CUDA初始化CUDA安装成功之后,新建一个工程还是十分简单的,直接在新建项目的时候选择NVIDIA CUDA项目就可以了,我们先新建一个cuda工程,删掉自带的示例kernel.cu,然后新建项,新建一个CUDA C/C++ File ,我们首先看一下如何初始化CUDA,因此我命名为initcuda.cu1.首先我们要使用CUDA的RunTime A
2018-04-04 17:11:21 1729
原创 CUDA编程一(基础)
CUDA是什么?CUDA(Compute Unified Device Architecture),是显卡厂商NVIDIA推出的运算平台。是一种通用并行计算架构,该架构使GPU能够解决复杂的计算问题。说白了就是我们可以使用GPU来并行完成像神经网络、图像处理算法这些在CPU上跑起来比较吃力的程序。通过GPU和高并行,我们可以大大提高这些算法的运行速度。有的同学可能知道,在CPU和GPU上跑同一个神...
2018-04-04 16:35:49 1079
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人