关闭

多线程基础之六:Pthread Win32实现的非阻塞请求机制的Semaphore

前面看到Windows API直接提供的Semaphore并没有为其配备等待队列,从而无法实现非阻塞请求机制以实现操作加速,对于临界区耗时的情况下,显然是存在实现非阻塞请求机制的Semaphore的。Linux下的Pthread库实现了这样的增加版Semaphore,幸运地是有Pthread的Win32版本。前面讲解到其实Semaphore的完整结构体内容应该如下typedef struct{...
阅读(8) 评论(0)

多线程基础之五:Windows API提供的mutex和semaphore性能比较

Windows系统提供HANDLE WINAPI CreateSemaphore(xxx)和HANDLE WINAPI CreateMutex(xxx)直接提供Mutex和Semaphore两种内核对象供程序员使用在临界区互斥操作。在前面的多线程基础之一提到过Semaphore存在Binary和Counting两种,其中Binary Semaphore等同于Mutex,而Counting Semap...
阅读(5) 评论(0)

多线程基础之四:Linux提供的原子锁类型atomic_t

在x86体系下,任何处理器平台下都会有一些原子性操作,在单处理器情况下,单步指令的原子性容易实现。但是在SMP多处理器情况下,只有那些单字的读(将变量读进寄存器)或写(从寄存器写入到变量地址)才是原子性的。故而在SMP下,要保证特定指令集合的原子性即不被中断,x86提供lock前缀用来在执行被lock修饰的指令期间锁住总线,从而实现了“禁止中断”的效果。事实上,Linux操作系统便根据这种针对特殊数...
阅读(4) 评论(0)

多线程基础之三:使用event, mutex, semaphore实现多进程间互斥

前面文章介绍了使用mutex和semaphore在多线程场景中实现线程互斥。事实上,因为mutex, semaphore是内核对象,虽然是在某一个进程中创建的,但是由于进程间可以共享内核模块,故而使用mutex, semaphore在进程间作为互斥标识量也是可以的。 0. 使用mutex实现多进程间互斥race_process_mutex_1.cpp#include #in...
阅读(11) 评论(0)

多线程基础之二:mutex和semaphore使用方法

mutex和semaphore都是内核对象,是用来实现多进程间或多线程锁机制的基础。本文将要介绍两者的使用方式。 0. 多线程锁机制涉及的Windows API创建mutex内核对象,用来作为线程间或进程间通信的API接口如下HANDLE WINAPI CreateMutex( __in_opt LPSECURITY_ATTRIBUTES lpMutexAttributes, __in BO...
阅读(10) 评论(0)

多线程基础之一:进程间同步问题的来源和解决方案

同步问题诞生的最本质的原因:In fact, a process may be interrupted at any point in its instruction stream, and processing core may be assigned to execute instructions of another process.总之一句话,关于共享对象的更改操作并非原子操作,如假设两个进...
阅读(8) 评论(0)

程序员的自我修养:MiniCRT++运行库部分实现C++特性

前面的文章展示了如何通过自制的运行库实现堆初始化和IO初始化,以及标准输入输出功能,这些都是标准的C功能实现。而对于C++而言,则拥有更多的复杂特性,如new/delete、STL、异常处理、流等,这些特性显然是语言层的,故而需要GCC库提供相应的实现。对于C++而言,其毕竟是在C的基础上衍生而来的,故而C++运行库显然只需要实现这些C++特有的特性,而其他和C共享的功能如基本文件操作、堆管理等都可...
阅读(6) 评论(0)

#include指令加载外部库的两种用法

C中可以通过#include 和#include "header.h"来加载文件,两者的区别主要是在include加载的搜索路径上存在不同。区别是: 采用#include ,链接器会按照系统指定目录(如Windows下给INCLUDE环境变量指定的路径顺序)去查找头文件。采用#include "header.h"方式,链接器会先到当前目录...
阅读(13) 评论(0)

缓冲技术

缓冲技术某种程度上而言也是符合银弹理论,增加了一层抽象层–缓冲区,用于解决上下游机器介质速度不匹配导致的程序速度缓慢的问题。缓冲器是一个存储器,它可以是硬件级的,即独立于内存外设置的专门硬件缓冲器(内存页表起始地址寄存器),也可以是软件级的,即由软件在内存中开辟一块缓冲区域(buffer,cache)。硬件要花钱,所以一般用在关键的地方。1. 引入缓冲技术的原因 1.Cache缓存,减少读块设备的...
阅读(17) 评论(0)

Linux内核:IO设备的抽象管理方式

I/O设备是人们使用计算机的途径,无意相当于计算机的五官,不同的使用方式需要配备不同的设备,如输入文字一般用键盘,但在某些应用场合,需要扫描仪,输入声音需要话筒,打印信息需要打印机,实时控制RT领域需要传感器。 摘自《操作系统原理及应用》一书关于IO设备从不同角度的分类 使用目的 1.存储设备:alias外存、辅助存储器 2.输入/输出设备 按传输速率分类 1.低速设备:几~几百Bytes...
阅读(12) 评论(0)

Linux内核:IO设备通信的控制方式

IO设备与主机(CPU、内存)之间的通信不是直接的,而是通过设备控制器,设备控制器是IO设备和主机之间的中介。IO设备和进程之间的数据传送方式主要有4种:1.程序控制方式:又被称为“忙等”模式,即当要在内存和IO设备之间进行信息传输时,由CPU向相应的设备发出命令,由设备控制器控制IO设备进行实际操作。在IO设备工作时,CPU执行一段循环测试程序,不断测试IO设备的完成状况,根据完成状况决定下一步操...
阅读(15) 评论(0)

程序员的自我修养:MiniCRT自制C语言运行库

程序员的自我修养一书中,在最后一章专门介绍一款小型的C语言运行库,并给出了详细的代码实现。阅读该代码实现,可以对C语言运行库提供的语言抽象层得到更深的理解。Talk is cheap, show code!minicrt.h: MiniCRT的文件头#ifndef __MINI_CRT_H__ #define __MINI_CRT_H__ #endif/*定义C++相关的函数,以使得函数的兼容性得到...
阅读(13) 评论(0)

Windows系统:解析文件句柄Handle的详细机制

1. 用户程序和运行库层面的文件”句柄” FILE*IO初始化时讨论了在运行库层面的文件句柄管理机制,工作流程如下FILE *file ->ininfo* pioinfo\[\]\[\] -> ioinfo 1.在程序中提供给IO函数的文件句柄是封装在FILE*指针里面的; 2.FILE结构体总共包括两方面内容:a.该文件配备的缓冲大小、地址等信息;b.该文件在进程打开文件列表中的下标_file;...
阅读(98) 评论(0)

出于数据保护的结构体指针强制转换和字段截断

/*人为地在更改结构体指针的类型,从而手动地实现结构体指针在读取第一个字段之后便被截断,可以用来隐藏不想暴露的其他信息*/ #include #include #include void foo(){ printf("inSide foo function\n"); }typedef void (* Func)();typedef...
阅读(18) 评论(0)

C语言:宏定义的#和##用法

在查看学习操作系统的过程,会经常遇到各种宏定义,其中有两种宏参数的定义方式较为特殊,分贝是#和##。 其中#为将宏参数按照符号名直接解析成字符串;##为参数连接符号。#include #include #include #define STRCPY(a,b) strcpy(a##_p, #b) //把第一参数后边加上字符_p,把第二个参...
阅读(396) 评论(0)
33条 共3页1 2 3 下一页 尾页
    个人资料
    • 访问:1668次
    • 积分:329
    • 等级:
    • 排名:千里之外
    • 原创:32篇
    • 转载:1篇
    • 译文:0篇
    • 评论:1条
    最新评论