![](https://img-blog.csdnimg.cn/20190918140012416.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
OS / 理论
文章平均质量分 70
介绍 OS 相关理论。
Ruo_Xiao
己所不欲,勿施于人。
展开
-
cpu / CS 和 IP
注在CPU向内存读取内容之前(这里的内容是指令),会通过控制总线发出内存读取命令,“告诉”内存,我要开始读内容了,请你(内存)准备好。下面是8086CPU读取、执行一条指令的过程(下面图中控制输入输出电路到控制器不存在数据线,我画错啦)CS和IP是8086CPU中两个关键的寄存器,它们指示了CPU当前要读取指令的地址。1、CPU从CSIP指向的地址读取指令,读取的指令进入到指令缓冲器中;2、IP=IP+所读取的指令长度,从而指向下一条指令;......转载 2022-07-29 13:47:27 · 2365 阅读 · 0 评论 -
ROM 和 RAM
----------------------------------------------- 时间:2018-10-29-- 创建人:Ruo_Xiao-- 邮箱:xclsoftware@163.com---------------------------------------------一、ROM1、英文:Read-Only Memory。2、定义:一旦...原创 2018-10-29 22:34:05 · 148 阅读 · 0 评论 -
寄存器、cache、内存、硬盘之间的千丝万缕
零、前言首先看一下计算机的存储体系(Memory hierarchy)金字塔。其次我们看看一个计算机的存储体系。一、Register寄存器是 CPU 的内部组成单元,是 CPU 运算时取指令和数据的地方,速度很快,寄存器可以用来暂存指令、数据和地址。在CPU中,通常有通用寄存器,如指令寄存器IR;特殊功能寄存器,如程序计数器PC、sp 等。二、Cache缓存即就是用于暂时存放内存中的数据,若果寄存器要取内存中的一部分数据时,可直接从缓存中取到,这样可以调高速度。高速缓存是内存转载 2021-04-29 09:36:54 · 979 阅读 · 0 评论 -
CPU 的 ring0、ring1、ring2、ring3
Intel 的 CPU 将特权级别分为 4 个级别:RING0、RING1、RING2、RING3。Windows 只使用其中的两个级别 RING0 和 RING3,RING0 只给操作系统用,RING3 谁都能用。如果普通应用程序企图执行RING0 指令,则 Windows 会显示“非法指令”错误信息。ring0 是指 CPU 的运行级别,ring0 是最高级别,ring1 次之,ring2 更次之…… 拿 Linux + x86 来说, 操作系统(内核)的代码运行在最高运行级别 ring0 上,..转载 2021-05-19 08:23:37 · 3529 阅读 · 0 评论 -
Linux桌面环境介绍以及优缺点分析
1. KDE 桌面系统KDE 是 K Desktop Environment 的缩写,中文译为“K桌面环境”。KDE 是基于大名鼎鼎的 Qt 的,最初于 1996 年作为开源项目公布,并在 1998 年发布了第一个版本,现在 KDE 几乎是排名第一的桌面环境了。许多流行的 Linux 发行版都提供了 KDE 桌面环境,比如 Ubuntu、Linux Mint、OpenSUSE、Fedora、Kubuntu、PC Linux OS 等。KDE 和 Windows 比较类似,各位初学者相信都是 Win转载 2022-02-16 09:48:17 · 1587 阅读 · 0 评论 -
搞懂函数调用前后堆栈恢复的过程
零、基本概念1、ESP栈指针寄存器(extendedstackpointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的栈顶。2、EBP基址指针寄存器(extendedbasepointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的底部。一、栗子以下摘自网上一篇文章: 明白了吗?主要是用来保存 / 恢复堆栈,以便传递参数给函数。 在 MASM 里面,有一条更方便的语句,就是 invoke,使用它后,你就不用自己做这些事情了。 总...转载 2021-09-06 07:59:26 · 1302 阅读 · 0 评论 -
LF 和 CRLF 区别
一、LF 和 CRLF 是什么?二、LF和CRLF区别CRLF: "\r\n", windows系统环境下的换行方式LF: "\n", Linux系统环境下的换行方式原创 2021-06-04 14:35:10 · 8128 阅读 · 0 评论 -
多进程/多线程同时向一个文件中写入日志如何避免冲突?
写入文件时都会调用函数 write,由于所有的系统调用都是原子的,所以该函数可以保证进程或者线程写入数据的过程中不会被其他进程或者线程打扰,即:数据中间插入别的进程的数据。另外一个问题,由于 write 之前需要指定写入位置,即:lseek 函数,同样,该函数也是原子的。整体来说,在一个写入数据的操作如下:lseek(fd, 0, SEEK_END); // seek to the end of the filewrite(fd, "log message", len); // perfo原创 2021-04-10 10:09:23 · 3968 阅读 · 0 评论 -
OS / CPU是如何访问内存的?
我们先来看一张图:从图中可以清晰地看出,CPU、MMU、DDR 这三部分在硬件上是如何分布的。首先 CPU 在访问内存的时候都需要通过 MMU 把虚拟地址转化为物理地址,然后通过总线访问内存。MMU 开启后 CPU 看到的所有地址都是虚拟地址,CPU 把这个虚拟地址发给 MMU 后,MMU 会通过页表在页表里查出这个虚拟地址对应的物理地址是什么,从而去访问外面的 DDR(内存条)。所以搞懂了 MMU 如何把虚拟地址转化为物理地址也就明白了 CPU 是如何通过 MMU 来访问内存的。MMU 是转载 2021-04-07 20:39:03 · 254 阅读 · 0 评论 -
OS / 进程启动过程
一、流程操作系统创建进程,把控制权交给程序的入口(往往是运行库中的某个入口函数) 入口函数对运行库和程序运行环境进行初始化(包括堆、I/O、线程、全局变量构造等等)。 入口函数初始化后,调用 main 函数,正式开始执行程序主体部分。 main 函数执行完毕后,返回到入口函数进行清理工作(包括全局变量析构、堆销毁、关闭I/O等),然后进行系统调用结束进程。二、glibc 入口_start -> __libc_start_main -> exit -> _exit其中转载 2021-04-07 11:18:30 · 494 阅读 · 0 评论 -
OS / 5 种 IO 模型
从TCP发送数据的流程说起要深入的理解各种IO模型,那么必须先了解下产生各种IO的原因是什么,要知道这其中的本质问题那么我们就必须要知一条消息是如何从过一个人发送到另外一个人的;以两个应用程序通讯为例,我们来了解一下当“A”向"B" 发送一条消息,简单来说会经过如下流程:第一步:应用A把消息发送到 TCP发送缓冲区。第二步: TCP发送缓冲区再把消息发送出去,经过网络传递后,消息会发送到B服务器的TCP接收缓冲区。第三步:B 再从TCP接收缓冲区去读取属于自己的数据。根据上图我们转载 2021-02-18 18:28:42 · 274 阅读 · 0 评论 -
OS / 线程的 3 种实现方式(内核级,用户级 和 混合型)
1 、线程的 3 种实现方式在传统的操作系统中,拥有资源和独立调度的基本单位都是进程。在引入线程的操作系统中,线程是独立调度的基本单位,进程是资源拥有的基本单位。在同一进程中,线程的切换不会引起进程切换。在不同进程中进行线程切换,如从一个进程内的线程切换到另一个进程中的线程时,会引起进程切换。根据操作系统内核是否对线程可感知,可以把线程分为内核线程和用户线程在多线程操作系统中,各个系统的实现方式并不相同,在有的系统中实现了用户级线程,有的系统中实现了内核级线程有些情况下,也把..转载 2021-02-18 11:24:24 · 763 阅读 · 0 评论 -
OS / 进程和线程的区别和联系
一、理论讲解进程是资源分配的最小单位,线程是CPU调度的最小单位。二、通粗讲解作者:人民邮电出版社链接:https://www.zhihu.com/question/25532384/answer/1598653960来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。1、什么是线程呢?网上一般是这样定义的:线程(thread)是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。这么说,你听懂了吗?我觉得这样的定义纯粹是自原创 2021-02-17 18:39:54 · 285 阅读 · 0 评论 -
OS / 几个常用的操作系统进程调度算法
在操作系统中存在多种调度算法,其中有的调度算法适用于作业调度,有的调度算法适用于进程调度,有的调度算法两者都适用。下面介绍几种常用的调度算法。一、先来先服务(FCFS)调度算法FCFS 调度算法是一种最简单的调度算法,该调度算法既可以用于作业调度也可以用于进程调度。在作业调度中,算法每次从后备作业队列中选择最先进入该队列的一个或几个作业,将它们调入内存,分配必要的资源,创建进程并放入就绪队列。在进程调度中,FCFS 调度算法每次从就绪队列中选择最先进入该队列的进程,将处理机分配给它,使之投入转载 2021-02-17 18:15:14 · 1258 阅读 · 0 评论 -
OS / 总线锁和缓存一致性
随着多核时代的到来,并发操作已经成了很正常的现象,操作系统必须要有一些机制和原语,以保证某些基本操作的原子性,比如处理器需要保证读一个字节或写一个字节是原子的,那么它是如何实现的呢?有两种机制:总线锁定和缓存一致性。我们知道,CPU和物理内存之间的通信速度远慢于CPU的处理速度,所以CPU有自己的内部缓存,根据一些规则将内存中的数据读取到内部缓存中来,以加快频繁读取的速度。我们假设在一台PC上只有一个CPU和一份内部缓存,那么所有进程和线程看到的数都是缓存里的数,不会存在问题;但现在服务器通常是多 C.转载 2021-02-16 18:26:32 · 425 阅读 · 0 评论 -
编码方式 / Base 64
一、基本信息1、一种编码方式。2、使用场景:(1)某些老的路由器不支持 UTF-8,当中文字符的二进制流到路由器中时,路由器可能按照自己支持的编码方式,例如:ascii 码来解读,可能解析出不可见字符,例如:回车、tab。容易导致路由器异常从而传输失败。(2)避免在 http 中传输二进制数据,因为不同的设备对二进制解读是不同的。同样,一些老的软件、网络协议也有类似的问题。(3)网页请求中,若网页中存在图片,一般浏览器的操作是获取到基本的网页数据之后,再次进行请求获取里面图片的数据,这样原创 2020-11-13 17:23:34 · 572 阅读 · 0 评论 -
OS / 理论 / 什么是原子操作?
英文:atomic operation 。 定义:一组不会被线程调度机制打断的操作,即:一旦该操作开始,就一直运行到结束,中间不会有任何上下文切换到另一个线程。 拓展:++i 和 i++ 是否是原子操作?答案:不是。汇编代码如下:步骤如下:(1)变量 i 值由内存拷贝到寄存器 eax 中。(2)寄存器 eax 自增 1 。(3)将寄存器 eax 中的值写入内存中。所以...原创 2020-02-10 21:02:14 · 698 阅读 · 0 评论 -
OS / 进程中某个线程崩溃,是否会对其他线程造成影响?
理论上讲,线程挂掉只是触发了 segment fault ,该信号在系统中默认的处理方式是终结该线程所在的进程,如果对该信号进行屏蔽也是可以的。但是,重点来了,触发 segment fault 的位置如果是 stack,那么只要进程屏蔽了该信号,那么对其他的线程是没有影响;如果触发 segment fault 的位置如果是 heap、全局变量等线程共享的部分,那么就算屏蔽了该信号,那么其他线程...原创 2020-03-20 08:19:29 · 6813 阅读 · 3 评论 -
OS / 线程哪些内容是私有的和共享的?
一、私有栈(局部变量,函数的参数)。 线程局部存储(Thread Local Storage,TLS),有限的容量。 寄存器 (执行流的基本数据)。TLS的用法很简单,如果要定义一个全局变量为 TLS 类型,只需在它定义前加上相应的关键字即可。_thread int number; // gcc_declspec(thread) int number; /...转载 2020-03-20 08:05:11 · 1075 阅读 · 0 评论 -
malloc 两种实现方式:brk 和 mmap
答案从操作系统角度来看,进程分配内存有两种方式,分别由两个系统调用完成:brk 和 mmap(不考虑共享内存)。brk 的实现方式是将 Data Segment 的最高地址指针 _edata 往高地址推(分配的内存小于 128k )。 mmap 的实现方式是在 Memory Mapping Segment 找一块空闲的虚拟内存(分配的内存大于 128k )。(Data segment ...转载 2020-03-01 14:14:54 · 2041 阅读 · 1 评论 -
编码方式 / ASCII、UNICODE、UTF-8、ANSI
一、ASCII全称:American Standard Code for Information Interchange。 占用一个字节。 共可以表示128个字符,因为最前面那一位始终为0。 程序员必背: 字符 ASCII码 ‘0’ 48 ‘A’ 65 'a' 97 二、UNICODE (Universal Code)Uni...原创 2020-02-27 07:59:09 · 483 阅读 · 0 评论 -
32 位和 64 位 OS 下的各种数据类型的大小
(SAW:Game Over!)原创 2020-02-23 07:34:07 · 165 阅读 · 0 评论 -
内存碎片的定义、种类、产生原因以及解决办法
定义内存碎片就是碎片的内存,描述一个系统中所有不可用的空闲内存。内存是空闲的但是不可用,是因为负责动态分配内存的分配算法使得这些空闲的内存无法使用,原因在于这些个空闲内存比较小并且不连续,无法满足内存管理算法中的申请需求。种类及产生原因内部碎片:因为所有的内存分配必须起始于可被4、8或16整除(内存对齐,视处理器体系结构而定)的地址或者因为MMU的分页机制的限制,决定内存分配算法仅能把...原创 2020-02-20 21:44:46 · 4534 阅读 · 0 评论 -
如何判断一个类是否是线程安全(可重入)的?
答案:若一个类对外提供的接口的是原子的,或者说多线程编程时不用对该类的接口考虑同步问题,那么该类就是线程安全的类。栗子:#include <iostream>#include <string.h>#include <atomic>#include <pthread.h>#include <unistd.h>class...原创 2020-02-13 14:22:49 · 1624 阅读 · 0 评论 -
编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。
#include <stdio.h>#include <process.h>#include <windows.h>//线程个数const int THREAD_NUM = 3;//循环次数const int LOOP = 10;//子线程同步事件HANDLE g_hThreadEvent[THREAD_NUM];//主线程与子线程同步...原创 2019-03-22 14:40:13 · 1421 阅读 · 0 评论 -
标准库函数、系统调用的区别
标准库函数是对系统调用的封装,以方便移值。人们在长期编程中发现使用系统调用有个重大的缺点,那就程序的移植性,比如说:linux 系统提供的系统调用的函数和windows 就不一样,二者不单单是实现的方式不同,提供给用户的函数名,参数都不同,这个可以理解。因此一个实现好的程序,利用了 linux 的系统调用譬如说 wait4 函数,那么他在 windows 上编译是通不过的。于是人们想了个办法,...原创 2020-01-20 15:25:55 · 333 阅读 · 0 评论 -
什么是死锁,产生的原因,防止死锁的办法
什么是死锁?操作系统中有若干进程并发执行,它们不断申请、使用、释放系统资源,虽然系统的进程协调、通信机构会对它们进行控制,但也可能出现若干进程都相互等待对方释放资源才能继续运行,否则就阻塞的情况。此时,若不借助外界因素,谁也不能释放资源,都会原地等待永远不会发生的条件,系统处于停滞状态,这就是死锁。产生的原因因为系统资源不足。 进程运行推进的顺序不合适。 资源分配不当等。产生死锁...原创 2020-01-20 14:21:05 · 211 阅读 · 0 评论 -
阻塞、非阻塞与同步、异步的区别
一、同步和异步二者关注的是消息通信机制 。所谓同步,就是在发出一个“调用”时,在没有得到结果之前,该*调用*就不返回,但是一旦调用返回,就得到返回值了。 异步则是相反,“调用”在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在“调用”发出后,“被调用者”通过状态、通知来通知调用者,或通过回调函数处理这个调用。二、阻塞和...原创 2019-10-31 06:41:53 · 158 阅读 · 0 评论 -
int、unsigned int、float、double 和 char 在内存中存储方式
2017-12-28 创建人:Ruo_Xiao实验环境:vs2010、Intel邮箱:xclsoftware@163.com2018-01-16 修改人:Ruo_Xiao添加对移位存储的说明。零、基础知识原码、反码和补码是计算机存储数字的编码方式(表示方法)。 拓展:ASCII码、utf-8和utf-16是计算机存储字符的编码方式。原码:符号位+数值的绝对值。 (1原创 2017-12-27 18:03:14 · 20505 阅读 · 8 评论 -
嵌入式中断服务函数的一些特点
----------------------------------------------- 时间:2019-02-20-- 创建人:Ruo_Xiao-- 邮箱:xclsoftware@163.com--------------------------------------------- 中断是嵌入式系统中重要的组成部分,但是在标准C中不包含中断。许多编译开发商在...转载 2019-02-20 10:32:44 · 1386 阅读 · 4 评论 -
HEX、DEC、OCT和BIN的解释
----------------------------------------------- 时间:2019-03-09-- 创建人:Ruo_Xiao-- 邮箱:xclsoftware@163.com---------------------------------------------1、HEX,Hexadecimal ,十六进制。2、DEC,Decimal,十进...原创 2019-03-09 08:29:42 · 34527 阅读 · 0 评论 -
同步中断和异步中断区别
中断有两种,一种是CPU本身在执行程序的过程中产生的,一种是由CPU外部产生的。外部中断,就是通常所讲的“中断”(interrupt)。对于执行程序来说,这种“中断”的发生完全是异步的,因为不知道什么时候会发生。CPU对其的响应也完全是被动的,可以通过“关中断”指令关闭对其的响应。由软件产生的中断一般是由专设的指令,如X86中的“INT n”在程序中有意产生的,是主动的,同步的。只要C...转载 2019-02-27 17:02:21 · 3794 阅读 · 0 评论 -
堆栈向下增长和向上增长的理解
----------------------------------------------- 时间:2019-01-31-- 创建人:Ruo_Xiao-- 邮箱:xclsoftware@163.com---------------------------------------------假设堆栈为数组Taskstkunsigned int Taskstk[255];堆栈...原创 2019-01-31 11:06:04 · 6214 阅读 · 3 评论 -
32位十六进制浮点数转换为十进制浮点数的方法
----------------------------------------------- 时间:2019-01-11-- 创建人:Ruo_Xiao-- 邮箱:xclsoftware@163.com--------------------------------------------- 这两天在处理TCP发送数据的问题,对方发来4个字节的浮点数的16进制,当时脑袋...原创 2019-01-11 15:16:28 · 27010 阅读 · 5 评论 -
L、TEXT()、_TEXT()和_T()的区别
2018-01-14 创建人:Ruo_Xiao一、L()L'a' //将ANSI字符'a'转化为UNICODE字符。L"a" //将ANSI字符串"a"转化为UNICODE字符串。二、TEXT()、_TEXT()和_T()1、三者都是根据编译器的环境进行ANSI/UNICODE变换的。 2、TEXT()和_TEXT(),windows风格,定义于头文件“W原创 2018-01-14 20:46:09 · 2930 阅读 · 1 评论 -
delete释放基本数据类型和对象数组的方法的区别和原因
2018-03-23 创建人:Ruo_Xiao开发环境:VS2010邮箱:xclsoftware@163.com一、释放C++ 基本数据类型#include&amp;lt;iostream&amp;gt;using namespace std;struct SData{ int i; }; int main() { SData *pD=new SData...原创 2018-05-15 14:10:40 · 1002 阅读 · 0 评论 -
结构体字节大小计算方法
2018-06-26 创建人:Ruo_Xiao邮箱:xclsoftware@163.com两个原则: (1)任何K字节基本数据类型对象的地址必须是K的倍数。 (2)结构体的总的大小必须是结构体内部最大的基本数据类型所占字节数的倍数。栗子:表格 第1列是各个元素首地址; 第2列是结构体总的字节数; 第3列是结构体对齐字节数。针对P5的字节大小,最重要的原则是在数据对齐...原创 2018-06-26 08:37:04 · 1132 阅读 · 0 评论