
操作系统
文章平均质量分 70
TABE_
这个作者很懒,什么都没留下…
展开
-
磁盘调度算法
这里写目录标题FCFS 调度SSTF调度SCAN 调度C-SCAN 调度LOOK 调度FCFS 调度磁盘调度的最简单形式当然是先来先服务(FCFS)算法。虽然这种算法比较公平,但是它通常并不提供最快的服务。例如,考虑一个磁盘队列,其 I/O 请求块的柱面的顺序如下:98,183,37,122,14,124,65,67。如果磁头开始位于柱面 53,那么它首先从 53 移到 98,接着再到 183、37、122、14、124、65,最后到 67,磁头移动柱面的总数为 640。这种调度如下图所示:从原创 2022-03-18 20:09:18 · 1181 阅读 · 0 评论 -
零拷贝技术
这里写目录标题传统的文件传输零拷贝技术mmap + writesendfile传统的文件传输如果服务端要提供文件传输的功能,我们能想到的最简单的方式是:将磁盘上的文件读取出来,然后通过网络协议发送给客户端。传统 I/O 的工作方式是,数据读取和写入是从用户空间到内核空间来回复制,而内核空间的数据是通过操作系统层面的 I/O 接口从磁盘读取或写入。首先,期间共发生了 4 次用户态与内核态的上下文切换,因为发生了两次系统调用,一次是 read() ,一次是 write(),每次系统调用都得先从用户态切原创 2022-04-22 20:51:14 · 235 阅读 · 0 评论 -
磁盘数据读写流程(DMA)
这里写目录标题将数据写入磁盘的流程磁盘读取数据的流程页缓存将数据写入磁盘的流程用户程序将数据写入用户空间的缓冲区,然后调用write系统调用。CPU进入内核态,将数据写入拷贝到页缓存,写入成功,立即返回。用户进程调用系统调用fsync、fdatasync、sync等将页缓存中的脏页刷到磁盘;如果用户没有调用,操作系统后台线程也会间隔一段时间就刷盘。CPU执行刷盘指令,会向磁盘控制器(DMA模式)发送写指令,告诉磁盘控制器要刷盘的数据在主存的位置、要刷盘多少数据、要刷到磁盘什么位置等,然后返回干其原创 2022-03-08 21:29:45 · 7358 阅读 · 1 评论 -
延迟写与sync、fsync、fdatasync
这里写目录标题延迟写sync、fsync、fdatasync在linux操作系统上,怎样保证对文件的更新内容成功持久化到硬盘?延迟写在使用write函数向文件中写入数据的时候,并不是在调用了函数后数据就被写进了磁盘,操作系统在内核中设置了一块页缓冲区,数据会先被写入到内核的页缓冲区中,等到页缓冲区满了或者系统需要重新利用页缓冲区的时候才会将此缓冲区排入到写队列中去,待到达队首的时候,将数据真正写入到磁盘当中。这就是延迟写,延迟写会造成缓冲区中的数据和磁盘中的数据之间的不同步。sync、fsync、fd原创 2022-03-08 22:07:19 · 2194 阅读 · 0 评论 -
页面缓存(Page Cache)
这里写目录标题什么是页缓存页缓存的实现什么是页缓存我们知道文件一般存放在硬盘(机械硬盘或固态硬盘)中,CPU 并不能直接访问硬盘中的数据,而是需要先将硬盘中的数据读入到内存中,然后才能被 CPU 访问。由于读写硬盘的速度比读写内存要慢很多(DDR4 内存读写速度是机械硬盘500倍,是固态硬盘的200倍)。为了避免每次读写文件时,都需要对硬盘进行读写操作,Linux 内核会以页大小(4KB)为单位,将文件划分为多数据块,当用户对文件中的某个数据块进行读写操作时,内核首先会申请一个内存页(称为页缓存)与文原创 2022-03-08 21:52:27 · 3137 阅读 · 0 评论 -
惊群效应及其解决方法
这里写目录标题惊群效应的概念惊群效应的危害惊群效应的解决方法在accept之前加锁SO_REUSEPORT惊群效应的概念惊群现象就是多进程(多线程)在同时阻塞等待同一个事件的时候(休眠状态),如果等待的这个事件发生,那么他就会唤醒等待的所有进程(或者线程),但是最终却只可能有一个进程(线程)获得这个时间的“控制权”,对该事件进行处理,而其他进程(线程)获取“控制权”失败,只能重新进入休眠状态,这种现象和性能浪费就叫做惊群。惊群效应的危害系统对用户进程/线程频繁地做无效的调度,上下文切换系统性能大打原创 2022-05-17 20:39:03 · 2317 阅读 · 0 评论 -
I/O 多路复用之select()、poll()、epoll()详解
I/O 多路复用select==>时间复杂度O(n)poll==>时间复杂度O(n)epoll==>时间复杂度O(1)epoll的接口介绍epoll的工作模式epoll和select/poll的对比epoll的优点select,poll,epoll都是IO多路复用的机制。I/O多路复用就是通过一种机制,一个进程可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件原创 2021-06-04 21:32:30 · 3927 阅读 · 0 评论 -
阻塞IO和非阻塞IO(NIO)
首先我们来定义流的概念,不管是文件,还是套接字,还是管道,我们都可以把他们看作流。之后我们来讨论I/O的操作,通过read,我们可以从流中读入数据;通过write,我们可以往流写入数据。现在假定一个情形,我们需要从流中读数据, 但是流中还没有数据,(典型的例子为,客户端要从socket读如数据,但是服务器还没有把数据传回来),这时候该怎么办?根据不同的处理办法,可以把IO分为阻塞或者非阻塞的:阻塞:阻塞是个什么概念呢?比如某个时候你在等快递,但是你不知道快递什么时候过来,而且你没有别的事可以干(或者原创 2022-03-07 19:49:30 · 3146 阅读 · 0 评论 -
Linux I/O模型以及IO同步/异步/阻塞/非阻塞的区别
I/O模型阻塞 I/O(blocking IO)非阻塞 I/O(nonblocking IO)I/O 多路复用( IO multiplexing)信号驱动I/O( signal driven IO)异步 I/O(asynchronous IO)五种I/O模型对比阻塞和非阻塞的区别同步和异步的区别对比图对于一次IO访问(以read为例),数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间。所以说,当一个read操作发生时,会经历两个阶段:等待数据准备(Wait原创 2021-06-03 22:16:45 · 933 阅读 · 0 评论 -
文件在磁盘上的存放
这里写目录标题连续分配链接分配隐式链接分配显式链接分配索引分配混合索引分配方式由于磁盘具有可直接访问的特性,故当磁盘来存放文件时,具有很大的灵活性。文件的物理结构与磁盘分配方式有关,在采用连续分配方式时的文件物理结构是顺序式的文件结构,在采用链接分配方式将形成链接式文件结构,而索引分配方式将形成索引式文件结构。连续分配连续分配要求为每个文件分配一组相邻接的盘块,一组盘块地址定义了磁盘上的一段线性地址。这种分配方式保证了逻辑文件中的记录顺序与存储器中文件占用盘块的顺序的一致性。下图为连续分配方式(假设原创 2022-01-11 20:09:53 · 2743 阅读 · 0 评论 -
硬链接和软链接(符号链接)的区别
这里写目录标题硬链接(hard link)硬链接的概念硬链接的特点软链接(符号链接,soft link)软链接的概念软链接的特点硬链接(hard link)硬链接的概念A是B的硬链接(A和B都是文件名),则A的目录项中的inode节点号与B的目录项中的inode节点号相同,即一个inode节点对应两个不同的文件名,两个文件名指向同一个文件,A和B对文件系统来说是完全平等的。如果删除了其中一个,对另外一个没有影响。每增加一个文件名,inode节点上的链接数增加一,每删除一个对应的文件名,inode节点原创 2022-01-11 19:49:44 · 784 阅读 · 0 评论 -
文件系统详解
这里写目录标题文件系统文件类型文件操作文件系统如何存储数据inodeblock(块)superblock文件系统文件系统把计算机中的程序和数据组织成一系列文件,通过文件对这些程序和数据进行管理。文件系统可以把数据分为数据项、记录、文件。文件是指具有文件名的若干相关记录的集合。记录是一组有意义的数据项的集合。文件系统管理的对象有三个,分别是文件,目录,磁盘存储空间。各个对象的介绍如下:文件:作为文件管理的直接对象。目录:为了方便用户对文件的存取和检索,需要在文件系统中配置目录。每个目录项中,必须含原创 2022-01-11 19:43:23 · 3589 阅读 · 0 评论 -
程序死锁详解
这里写目录标题死锁的必要条件如何检测死锁如何解决死锁问题鸵鸟策略死锁预防死锁避免死锁恢复银行家算法死锁的必要条件产生死锁的四个必要条件:互斥(充要): 一个资源一次只能分配给一个进程使用。占有且等待(充要): 一个进程在等待其他进程释放资源的同时,继续占有已经拥有的资源。不可抢占(充要): 一个进程不能强行占有其他进程已占有的资源。循环等待(充分):若干进程由于等待其他进程释放资源,而形成相互等待的循环。如进程A等待进程B,进程B等待进程C,•••,进程X等待进程Y,进程Y等待进程A。如何原创 2022-01-10 21:07:12 · 1381 阅读 · 0 评论 -
Linux fork()/vfork()的区别
这里写目录标题fork函数介绍利用fork()创建父子进程vfork函数介绍利用vfork()创建父子进程fork()和vfork()的主要区别fork函数介绍在Linux系统内,创建子进程的方法是使用系统调用fork()函数。fork()函数是Linux系统内一个非常重要的函数,它与我们之前学过的函数有一个显著的区别:fork()函数调用一次却会得到两个返回值。所需头文件:#include<sys/types.h>#include<unistd.h>函数原型:pid_原创 2022-03-03 20:44:32 · 461 阅读 · 0 评论 -
Linux 进程控制块(PCB)/task_struct
PCB/task_struct进程状态(State)进程调度信息标识符(Identifiers)进程通信有关信息(IPC,Inter_Process Communication)进程链接信息(Links)时间和定时器信息(Times and Timers)文件系统信息(File System)虚拟内存信息(Virtual Memory)页面管理信息对称多处理机(SMP)信息和处理器相关的环境(上下文)信息(Processor Specific Context)其他成员说起进程的结构就不得不提起PCB(进程原创 2022-02-28 20:05:16 · 1777 阅读 · 0 评论 -
多线程有哪些锁
互斥锁是一种「独占锁」,比如当线程 A 加锁成功后,此时互斥锁已经被线程 A 独占了,只要线程 A 没有释放手中的锁,线程 B 加锁就会失败,于是就会释放 CPU 让给其他线程,既然线程 B 释放掉了 CPU,自然线程 B 加锁的代码就会被阻塞。自旋锁开销少,在多核系统下一般不会主动产生线程切换,但如果被锁住的代码执行时间过长,自旋的线程会长时间占用 CPU 资源,所以自旋的时间和被锁住的代码执行的时间是成「正比」的关系,我们需要清楚的知道这一点。互斥锁虽然简化了使用锁的难度,但是存在一定的性能开销,...原创 2022-08-26 11:16:15 · 2197 阅读 · 0 评论 -
IO密集型线程和CPU密集型线程
CPU密集任务只有在真正的多核CPU上才可能得到加速,而在单核CPU上,无论你开几个模拟的多线程该任务都不可能得到加速,因为CPU总的运算能力就只有这么多。CPU密集型也叫计算密集型,指的是系统的硬盘、内存性能相对CPU要好很多,此时,系统运作CPU读写IO(硬盘/内存)时,IO可以在很短的时间内完成,而CPU还有许多运算要处理,因此,CPU负载很高。IO密集型指的是系统的CPU性能相对硬盘、内存要好很多,此时,系统运作,大部分的状况是CPU在等IO (硬盘/内存) 的读写操作,因此,CPU负载并不高。原创 2022-09-06 21:56:47 · 3354 阅读 · 0 评论 -
用户级线程和内核级线程
据操作系统内核是否对线程可感知,可以把线程分为内核线程和用户线程。用户级线程由应用程序所支持的线程实现, 内核意识不到用户级线程的实现。内核级线程又称为内核支持的线程。原创 2022-08-17 21:28:40 · 3946 阅读 · 0 评论 -
为什么条件变量的wait函数需要传入一锁作为参数
要注意到,#1和#2两步已经不是原子操作了,那么就有可能有如此情景:在当前线程(A)执行完#1行代码后到执行#2代码前的时间间隔里,另一线程(B),获取到了锁,修改了条件使其满足,然后发送了信号condA。而此时线程A还未被加入到condA的等待队列中,造成线程A错过了通知一直阻塞,直至下一次通知,如果没有下一次通知,那么A将永远等待下去,比如B也需要A的相关条件变量通知才能再次发出condA的通知。此为,为保证“解锁”和“加入等待队列”两操作的原子性,条件变量的wait函数需要传入一锁作为参数。.....原创 2022-08-16 21:01:28 · 653 阅读 · 0 评论 -
线程间同步详解
进程(线程)间同步进程同步和进程间通信的区别进程/线程间同步机制临界区互斥量信号量管程三个经典的进程间同步问题(生产者消费者问题、读者写者问题、哲学家就餐问题)生产者消费者问题读者写者问题哲学家就餐问题进程同步和进程间通信的区别进程同步用于控制多个进程按照一定的顺序访问资源。进程通信用于进程间传输信息,进程同步是一种进程通信的表现形式,通过修改信号量,进程之间可相互协调运行和协同工作。但是信号量与PV操作只能传递信号,没有传递数据的能力,正因如此才有了各种进程间通信机制(IPC)。进程/线程间同步机原创 2022-01-10 20:18:45 · 2840 阅读 · 0 评论 -
线程间通信方法
这里写目录标题进程通信方法低级IPC常用于本机的IPC机制不同计算机上的IPC机制线程间通信方法进程通信方法低级IPC文件:进程间通信可以通过传送打开文件(fork,exec与文件系统)来实现,不同的进程通过一个或多个文件来传递信息,事实上,在很多应用系统里,都使用了这种方法。常用于本机的IPC机制管道(pipe):管道允许一个进程和另一个与它有共同祖先的进程之间进行通信。命名管道(FIFO):类似于管道,但是它可以用于任何两个进程之间的通信,命名管道在文件系统中有对应的文件名。命名管道通原创 2022-01-10 20:31:42 · 745 阅读 · 0 评论 -
进程间通信(IPC)的几种方式
常见的通信方式管道pipe:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。命名管道FIFO:有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。消息队列MessageQueue:消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。共享存储SharedMemory:共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进原创 2021-05-21 17:51:51 · 7814 阅读 · 1 评论 -
进程调度方法详细介绍
进程调度方法先来先服务(FCFS)调度算法(非抢占调度方式)短进程优先(SPF)调度算法(抢占调度方式)优先级调度算法(抢占调度方式)时间片轮转调度算法(抢占调度方式)多级反馈队列调度算法先来先服务(FCFS)调度算法(非抢占调度方式)先来先服务(FCFS)调度算法总是把处理机分配给最先进入就绪队列的进程,一个进程一旦分得处理机,便一直执行下去,直到该进程完成或阻塞时,才释放处理机。短进程优先(SPF)调度算法(抢占调度方式)短进程优先(SPF)调度算法是从就绪队列中选择一个估计运行时间最短的进程,原创 2022-01-10 19:55:23 · 725 阅读 · 0 评论 -
进程上下文切换的步骤
进程上下文切换的步骤如下:由中断、异常、系统调用等触发中断,将cpu切换为内核模式,将eip,esp,eflages压入内核堆栈。保存硬件未来得及保存的现场信息。调用中断服务程序。检查need_resched标志位,若有效则调用schedule()函数完成进程调度,schedule()会执行以下步骤:调用pick_next_task()根据相关调度算法得到下一个待运行的进程。调用context_switch()执行以下步骤:调用switch_mm()将虚拟内存地址映射到待运行进程,恢复内原创 2022-04-06 21:47:54 · 1713 阅读 · 0 评论 -
阻塞和挂起的区别和联系
阻塞和挂起是进程两种不同的状态,其描述如下:阻塞:正在执行的进程由于发生某时间(如I/O请求、申请缓冲区失败等)暂时无法继续执行。此时引起进程调度,OS把处理机分配给另一个就绪进程,而让受阻进程处于暂停状态,一般将这种状态称为阻塞状态。挂起:由于系统和用户的需要引入了挂起的操作,进程被挂起意味着该进程处于静止状态。如果进程正在执行,它将暂停执行,若原本处于就绪状态,则该进程此时暂不接受调度。共同点:都导致进程暂停执行。进程都释放CPU,即两个过程都会涉及上下文切换。不同点:对系统资源占用原创 2021-05-21 22:20:18 · 8359 阅读 · 1 评论 -
进程的状态
这里写目录标题进程的三态模型进程的五态模型进程的七态模型进程间状态切换(以进程的三态模型为基础)Linux进程状态进程的三态模型运行态:进程占有处理器正在运行的状态。在单处理机系统中,只有一个进程处于执行状态; 在多处理机系统中,则有多个进程处于执行状态。就绪态:进程具备运行条件,等待系统分配处理器以便运行的状态。在一个系统中处于就绪状态的进程可能有多个,通常将它们排成一个队列,称为就绪队列。阻塞态:指进程不具备运行条件,正在等待某个时间完成的状态,这时即使把处理机分配给进程也无法运行,故称该进程原创 2022-01-10 19:49:08 · 634 阅读 · 0 评论 -
程序装入的三种方法
这里写目录标题绝对装入优点缺点应用场景静态地址重定位优点缺点应用场景动态装入优点缺点应用场景在多道程序环境下,要使程序运行,必须先为之创建进程。而创建进程的第一件事,便是将目标模块(即程序和数据)装入内存。在将目标模块装入内存时,可以有绝对装入、静态地址重定位和动态地址重定位三种方式。绝对装入用户程序经过编译之后,将产生绝对地址(物理地址)的目标模块,即按照装入模块中的物理地址,将程序和数据装入内存。优点CPU执行目标代码快。缺点由于内存大小限制,能装入内存并发执行的进程数大大减少。应用场原创 2022-01-09 18:00:53 · 7359 阅读 · 1 评论 -
孤儿进程/僵尸进程/守护进程
这里写目录标题孤儿进程僵尸进程守护进程孤儿进程父进程如果不等待子进程退出,在子进程之前就结束了自己的“生命”此时的子进程叫做孤儿进程。init进程会收留孤儿进程,变成孤儿进程的父进程。init 进程负责子进程退出后的善后清理工作。僵尸进程一个进程使用fork创建子进程,如果子进程退出,而父进程没有设置忽略 SIGCHLD 且没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵尸进程,这时用ps命令就能看到僵尸进程的状态是“Z”。如果系统中原创 2022-03-16 20:19:49 · 1744 阅读 · 0 评论 -
操作系统协程详解
这里写目录标题控制传递机制协程是否为栈式(Stackful)构造协程是否作为语言的第一类(First-class)对象提供我们可以依照三个问题区分协程:控制传递(Control-transfer)机制协程是否为栈式(Stackful)构造协程是否作为语言的第一类(First-class)对象提供控制传递机制根据控制传递机制的不同区分出了对称协程和非对称协程。非对称协程知道它的调用者,其在挂起时转让控制权给它的调用者,然后调用者根据算法调用其他非对称协程进行工作。相比之下,所有的对称协程都是原创 2022-03-02 21:14:34 · 954 阅读 · 0 评论 -
进程、线程、协程和管程
这里写目录标题进程、线程、协程和管程的概念进程和线程区别进程与线程的联系线程和协程的区别进程、线程、协程和管程的概念进程是操作系统进行资源分配和调度的一个基本单位。每个进程都有自己的独立内存空间,不同进程通过进程间通信来通信。进程上下文进程间的切换开销(栈、寄存器、虚拟内存、文件句柄等)比较大,但相对比较稳定安全。线程是CPU调度和分派的基本单位,一个进程可以拥有多个线程。线程自己基本上不拥有系统资源,只拥有少部分的资源(如程序计数器,一组寄存器和栈)。线程间通信主要通过共享内存,上下文切换很快,资源原创 2022-01-10 19:39:02 · 2157 阅读 · 0 评论 -
页面置换与页面分配详解
这里写目录标题页面置换算法最佳置换算法(OPT,理想置换算法)先进先出置换算法(FIFO)最近最久未使用算法(LRU)时钟置换算法(CLOCK)实现一个LRU算法(LeetCode146)驻留集和工作集页面分配策略固定分配局部置换可变分配全局置换可变分配局部置换抖动(颠簸)现象页面置换算法将逻辑地址转换为物理地址的过程中,若在页面中发现所要访问的页面不在内存中,则产生缺页中断。当发生缺页中断时,如果操作系统内存中没有空闲页面,则操作系统必须在内存选择一个页面将其移出内存,以便为即将调入的页面让出空间。而原创 2022-01-09 20:46:38 · 2213 阅读 · 0 评论 -
局部性原理
这里写目录标题时间局部性空间局部性局部性原理的应用局部性的简单原则局部性通常有两种不同的形式:时间局部性和空间局部性。时间局部性在一个具有良好的时间局部性的程序中,被访问过一次的存储器位置很可能在不远的将来会被再次访问。空间局部性在一个具有良好空间局部性的程序中,如果一个存储器位置被访问了一次,那么程序很可能在不远的将来访问附近的一个存储器位置。局部性原理的应用硬件层引入高速缓存存储器,操作系统的虚拟地址空间的技术,以及缓存磁盘文件系统中最近被使用的磁盘块等都用到了局部性原理。局部性的简单原原创 2022-01-09 20:12:05 · 432 阅读 · 0 评论 -
Linux中进程虚拟内存的布局
操作系统虚拟内存的布局Linux虚拟内存空间布局总览预留段(.reserve)代码段(.text)数据段(.data)数据段(.bss)堆(.heap)栈(.stack)共享库(libc.so)Linux虚拟内存空间布局总览预留段(.reserve)一共占用128M,属于预留空间,进程是禁止访问的代码段(.text)可执行文件加载到内存中的只有数据和指令之分,而指令被存放在.text段中,一般是共享的,编译时确定,只读,不允许修改数据段(.data)存放在编译阶段(而非运行时)就能确定的数据原创 2022-05-04 21:41:02 · 679 阅读 · 0 评论 -
操作系统虚拟内存管理
这里写目录标题虚拟内存简介虚拟内存概念虚拟内存的容量虚拟内存的优点虚拟内存的缺点如何实现虚拟内存(请求分页、请求分段、请求段页式)请求分页存储管理方式页表机制缺页中断机构地址变换机构请求分页存储管理的整体流程图请求分段存储管理方式(虚拟内存的实现)段表机制缺段中断机构地址变换机构分段共享分段保护虚拟内存简介虚拟内存概念在操作系统的管理下,在用户看来似乎有一个比实际内存大得多的内存,这就是虚拟内存。虚拟内存是操作系统虚拟性的一个体现,实际的物理内存大小没有变,只是在逻辑上进行了扩充。基于局部性原理,在原创 2022-01-09 20:40:18 · 2787 阅读 · 0 评论 -
操作系统物理内存管理
这里写目录标题连续分配管理方式单一连续存储管理分区式存储管理固定分区动态分区伙伴系统内存紧缩(内存碎片化处理)覆盖技术交换技术覆盖与交换的比较外部碎片和内部碎片的区别内部碎片外部碎片非连续分配管理方式基本分页式存储管理基本分页存储的几个基本概念基本分页存储的地址转换机构基本分页存储的缺点快表多级页表基本分段式存储管理地址结构段表基本分段存储的地址转换机构基本分段存储管理中段的共享与保护(写时复制)基本段页式存储管理地址结构基本段页存储的地址转换机构操作系统物理内存管理主要包括程序装入、交换技术、连续分配管原创 2022-01-09 20:10:55 · 2173 阅读 · 0 评论 -
Linux分配虚拟内存(申请内存)的两种方式
这里写目录标题申请小于128k的内存申请大于128k的内存释放内存从操作系统角度来看,进程分配内存有两种方式,分别由两个系统调用完成:brk和mmap(不考虑共享内存)。brk是将数据段(.data)的最高地址指针_edata往高地址推。mmap是在进程的虚拟地址空间中(堆和栈中间,称为文件映射区域的地方)找一块空闲的虚拟内存。这两种方式分配的都是虚拟内存,没有分配物理内存。在第一次访问已分配的虚拟地址空间的时候,发生缺页中断,操作系统负责分配物理内存,然后建立虚拟内存和物理内存之间的映射关系。原创 2022-02-23 20:39:28 · 4135 阅读 · 0 评论 -
C++ malloc/free/new/delete详解(内存管理)
这里写目录标题malloc/free典型用法内存分配实现过程new/delete典型用法内存分配实现过程new/delete和malloc/free的区别malloc/free典型用法malloc()负责动态配置内存,大小由size决定,返回值成功时为任意类型指针,失败时为NULL。void * malloc(size_t size)free()负责释放动态申请的内存空间,调用free( )后ptr所指向的内存空间被收回,如果ptr指向未知地方或者指向的空间已被收回,则会发生不可预知的错误,如果原创 2021-12-27 20:21:33 · 10467 阅读 · 4 评论 -
并行与并发的区别
这里写目录标题并行并发并发与并行的区别并行并行(Parallel),当系统有一个以上CPU时,当一个CPU执行一个进程时,另一个CPU可以执行另一个进程,两个进程互不抢占CPU资源,可以同时进行,这种方式我们称之为并行(Parallel)。其实决定并行的因素不是CPU的数量,而是CPU的核心数量,比如一个CPU多个核也可以并行。并发并发(Concurrent),在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行。并发不是真正意义上的“同时原创 2022-02-10 15:41:48 · 181 阅读 · 0 评论 -
异常和中断的区别
这里写目录标题中断异常中断和异常的相同点中断和异常的区别中断中断是由硬件设备产生的,而它们从物理上说就是电信号,之后,它们通过中断控制器发送给CPU,接着CPU判断收到的中断来自于哪个硬件设备(这定义在内核中),最后,由CPU发送给内核,有内核处理中断。下面这张图显示了中断处理的流程:异常CPU处理程序的时候一旦程序不在内存中,会产生缺页异常;当运行除法程序时,当除数为0时,又会产生除0异常。所以,大家也需要记住的是,异常是由CPU产生的,同时,它会发送给内核,要求内核处理这些异常,下面这张图显原创 2022-01-09 17:35:42 · 8314 阅读 · 0 评论 -
CPU用户态和内核态
这里写目录标题内核态与用户态的区别用户态到内核态的切换操作系统需要两种CPU状态:内核态(Kernel Mode):运行操作系统程序,操作硬件用户态(User Mode):运行用户程序操作系统有三个特权级别:R0、R1、R2和R3。R0相当于内核态,R3相当于用户态,不同级别能够运行不同的指令集合。内核态与用户态的区别用户态的程序运行在3级特权级上,因为这是最低特权级,是普通的用户进程运行的特权级,大部分用户直接面对的程序都是运行在用户态。内核态的程序运行在0级特权级上。处于用户态执行时原创 2022-02-24 21:01:05 · 3184 阅读 · 0 评论