
操作系统
文章平均质量分 68
lliuhao--
贵在坚持
展开
-
C++ malloc/free/new/delete详解(内存管理)
new是动态分配内存的运算符,自动计算需要分配的空间,在C++中,它属于重载运算符,可以对多种数据类型形式进行分配内存空间,比如int型、char型、结构体型和类等的动态申请的内存分配,分配类的内存空间时,同时调用类的构造函数,对内存空间进行初始化,即完成类的初始化工作。delete与new通常配对使用,与new的功能相反,可以对多种数据类型形式的内存进行撤销,包括类,撤销类的内存空间时,它要调用其析构函数,完成相应的清理工作,收回相应的内存资源。这告诉我们,可以认为new就是malloc的封装。原创 2023-08-21 23:59:25 · 1376 阅读 · 0 评论 -
阻塞和挂起的区别和联系
正在执行的进程由于发生某时间(如I/O请求、申请缓冲区失败等)暂时无法继续执行。此时引起进程调度,OS把处理机分配给另一个就绪进程,而让受阻进程处于暂停状态,一般将这种状态称为阻塞状态。:由于系统和用户的需要引入了挂起的操作,进程被挂起意味着该进程处于静止状态。如果进程正在执行,它将暂停执行,若原本处于就绪状态,则该进程此时暂不接受调度。原创 2023-08-21 23:37:15 · 1362 阅读 · 0 评论 -
进程间通信(IPC)的几种方式
进程间通信可以通过传送打开文件(fork,exec与文件系统)来实现,不同的进程通过一个或多个文件来传递信息,事实上,在很多应用系统里,都使用了这种方法。但一般说来,进程间通信不包括这种似乎比较低级的通信方法。特点:无名管道是半双工的(即数据只能在一个方向上流动),具有固定的读端和写端。因为没有名字,因此无名管道只能用于具有亲缘关系的进程之间的通信(也是父子进程或者兄弟进程之间)。无名管道只存在于内存中,其实质是一个内核缓冲区。进程以先进先出的方式从缓冲区存取数据:管道一端的进程顺序地将进程数据写入缓冲区原创 2023-08-11 22:11:48 · 892 阅读 · 0 评论 -
堆和栈的区别
操作系统有一个记录空闲内存地址的链表,当系统收到malloc申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,代码中的delete语句才能正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。存放在栈中的数据只在当前函数及下一层函数中有效,一旦函数返回了,这些数据也就自动释放了。原创 2023-08-02 22:42:52 · 203 阅读 · 0 评论 -
异常和中断的区别
中断是由硬件设备产生的,而它们从物理上说就是电信号,之后,它们通过中断控制器发送给CPU,接着CPU判断收到的中断来自于哪个硬件设备(这定义在内核中),最后,由CPU发送给内核,有内核处理中断。异常包括很多方面,有。原创 2023-08-02 22:38:43 · 307 阅读 · 0 评论 -
并行与并发的区别
并行(Parallel),当系统有一个以上CPU时,当一个CPU执行一个进程时,另一个CPU可以执行另一个进程,两个进程互不抢占CPU资源,可以同时进行,这种方式我们称之为并行(Parallel)。其实决定并行的因素不是CPU的数量,而是CPU的核心数量,比如一个CPU多个核也可以并行。原创 2023-07-31 19:29:22 · 217 阅读 · 0 评论 -
CPU用户态和内核态
这3种方式是系统在运行时由用户态转到内核态的最主要方式,其中系统调用可以认为是用户进程主动发起的,异常和外围设备中断则是被动的。操作系统有三个特权级别:R0(Ring0)、R1(Ring1)、R2(Ring2)和R3(Ring3)。,不同级别能够运行不同的指令集合。原创 2023-07-30 22:00:53 · 784 阅读 · 0 评论 -
计算机中存储器的层次结构
有一些比较好的CPU上面则会有第三级的缓存,也就是L3,L3的用途是补充L2用的。L1,L2,L3层的缓存完全由内置在缓存中的硬件逻辑来管理。在一个虚拟存储器系统中,DRAM主存作为存储在磁盘上的数据块缓存。对于一个具有像afs这样的分布式文件系统的机器来说,本地磁盘作为缓存它是由运行在本地机器上的afs客户端进程管理。在最高层(L0)是少量快速的CPU寄存器,CPU可以在一个时钟周期内访问他们。下一层包含了所要的数据,当前层从下一层提取数据。从下一层取出数据以及与数据相近的数据,放入当前层并读取。原创 2023-07-30 21:39:05 · 785 阅读 · 0 评论 -
计算机的大小端模式
没有,字节序是指byte的排序,string里面都是char,一个char就是1字节,只要出现索引的地方,一定是索引越大地址越大。计算机硬件有两种储存数据的方式:大端字节序(big endian)和小端字节序(little endian)。h表示host,指小端,n表示network指大端,l表示32位长整数,s表示16位短整数。举例来说,数值0x2211使用两个字节储存:高位字节是0x22,低位字节是0x11。计算机电路先处理低位字节,效率比较高,因为计算都是从低位开始的。所以,除了计算机的内部处理,原创 2023-07-30 21:35:04 · 461 阅读 · 0 评论 -
从源程序到可执行文件的四个过程
比如当一个浮点型的表达式赋值给一个整型的表达式时,其中隐含一个从浮点型到整型的转换,而语义分析就需要完成这个转换,再比如,将一个浮点型的表达式赋值给一个指针,这肯定是不行的,语义分析的时候就会发现两者类型不匹配,编译器就会报错。比如说两个整数做除法,语法上没问题,类型也匹配,听着好像没毛病,但是,如果除数是0的话,这就有问题了,而这个问题事先是不知道的,只有在运行的时候才能发现他是有问题的,这就是动态语义。语法分析器根据用户给定的语法规则,将词法分析产生的记号序列进行解析,然后将它们构成一棵语法树。原创 2023-07-30 21:26:03 · 894 阅读 · 0 评论 -
使用信号量实现生产者消费者
假设有一个或多个生产者线程和一个或多个消费者线程。生产者把生成的数据项放入缓冲区;消费者从缓冲区取走数据项,以某种方式消费。很多实际的系统中都会有这种场景。例如,在多线程的网络服务器中,一个生产者将HTTP 请求放入工作队列(即有界缓冲区),消费线程从队列中取走请求并处理。因为有界缓冲区是共享资源,所以我们必须通过同步机制来访问它,以免产生竞态条件。原创 2023-03-26 14:26:54 · 521 阅读 · 0 评论 -
使用锁和条件变量实现生产者消费者
假设有一个或多个生产者线程和一个或多个消费者线程。生产者把生成的数据项放入缓冲区;消费者从缓冲区取走数据项,以某种方式消费。很多实际的系统中都会有这种场景。例如,在多线程的网络服务器中,一个生产者将HTTP 请求放入工作队列(即有界缓冲区),消费线程从队列中取走请求并处理。因为有界缓冲区是共享资源,所以我们必须通过同步机制来访问它,以免产生竞态条件。原创 2023-03-25 15:40:52 · 115 阅读 · 0 评论 -
多线程编程函数的使用
头文件。原创 2023-03-24 11:39:12 · 103 阅读 · 0 评论