Computer Systems
文章平均质量分 91
计算机系统基础知识
AlexanderGan
Focus on VM & Compiler Now.
展开
-
操作系统__锁(Lock)的几种简单实现方式
操作系统__锁(Lock)的几种简单实现方式(1)无锁访问共享资源带来的问题阅读上面的代码可以预计,g_count的预期输出结果是2000,下面我们看看实际的结果:实际运行结果中间出现了1057, 说明对于共享资源的并发访问会导致结果与预期不一致,这是为什么呢? 实际上g_count = g_count + 1 这个操作并不是原子操作。上图解释了为什么会出现这种情况,两个线程都各自执行完了一次循环,我们设想g_count的值会加2,但是实际上只加了1,所以会导致我们看到./lockTest的执原创 2021-05-22 14:35:53 · 3741 阅读 · 0 评论 -
字符编码笔记:ASCII,Unicode 和 UTF-8
转载: 作者: 阮一峰 日期: 2007年10月28日一、ASCII 码我们知道,计算机内部,所有信息最终都是一个二进制值。每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte)。也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从00000000到11111111。上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为 ASCII 码,一直沿用至今。A转载 2020-07-21 11:55:31 · 226 阅读 · 0 评论 -
apue学习之使用setitimer实现alarm函数
apue学习之使用setitimer实现alarm函数1 alarm函数#include<unistd.h>unsigned int alarm(unsigned int seconds);//返回值:0或以前设置的闹钟时间的余留秒数 参数seconds是需要设置的时钟秒数,当时间到达后,内核会产生SIGALRM信号,如果不捕捉或忽略这个信号,系统默认动作是终止调用该alarm函数的进程。 每个进程只能有一个闹钟时间。如果在调用alarm时,之前该进程已经调用过alarm函原创 2020-06-18 15:47:31 · 259 阅读 · 0 评论 -
apue学习之fork函数基础
apue学习之fork函数详解1 函数接口#include<unistd.h>pid_t fork(void);返回值:子进程返回0,父进程返回子进程ID;若出错,返回-1。fork()创建的新进程被称为子进程,fork()调用一次但是返回2次。...原创 2020-06-08 15:18:37 · 299 阅读 · 0 评论 -
SGI STL中的空间配置器(Allocator)图文详解
SGI STL中的空间配置器图文详解1 为什么需要内存配置器?1)在STL中,为了实现各种容器,需要分配内存,这个过程中如果直接在堆上开辟空间,可能会造成内存外碎片化。1.内碎片化是指因为内存对齐、或者是按照其他的分配方式导致的已经分配的内存无法得到充分利用,比如需要5个字节,实际分到了8个字节的情况。2.外碎片化是指,内存中有足够的空间,但是这些空间都是不连续的零散空间,无法分配给申请内...原创 2020-04-28 17:42:59 · 708 阅读 · 0 评论 -
深入理解Linux中的内存映射
啊转载 2020-04-24 22:44:43 · 731 阅读 · 0 评论 -
Linux系统调用概述与实例分析
Linux系统调用概述与性能分析1.什么是系统调用?系统调用是操作系统提供给用户程序的一组特殊接口,用户程序可以利用这组接口来调用系统服务,例如磁盘I/O会用到的open,write,read等服务。系统调用可以看作内核与用户空间程序交互的接口,把用户进程的请求传递给内核,待内核把请求处理完毕后再将处理结果送回给用户空间。2.为什么需要系统调用?1)将用户与底层硬件隔离,用户不需要了解...原创 2020-04-15 11:14:14 · 1236 阅读 · 0 评论 -
系统基础_从栈的角度深入剖析函数调用过程
1、寄存器的简单介绍 要了解系统是如何使用栈来实现函数调用,必须要先对X86的寄存器有一定了解。下图是X86寄存器表: 在函数调用过程中,主要涉及到的是通用寄存器,X86中有8个通用寄存器。8个通用寄存器:EAX、EBX、ECX、EDX、ESI、EDI、ESP、EBP。 EAX:累加器(Accumulator), 它的低16位即是AX,而AX又可分为高8位AH和低8位AL。EAX...原创 2020-03-11 19:57:08 · 980 阅读 · 0 评论