- 博客(18)
- 资源 (38)
- 收藏
- 关注
原创 操作系统之线程与进程回顾
1. 为什么需要进程2.什么是进程3.进程在主存中的进程状态在主存中进程是一段连续存储的空间,这个空间称之为进程控制块,它包含内容如下:标识符状态程序计数器内存指针上下文信息IO状态信息:记账信息把左边的归结后分为右边的四个种类3.进程控制块(PCB):进程与线程线程:下面第一句话你细细品(注意进程是系统调度的基本单位)进程:...
2021-03-27 18:07:55 115
原创 操作系统内存管理之伙伴系统
伙伴系统是连续存储分配的一种办法。它比较好地折中了分配和回收过程中分配块的位置碎片和合并的问题。伙伴系统地概念如下图:整个可分配分区大小为2的幂次方,当需要的内存空间大于当前块的一半的时候就将整个分区分配给进程,如果小于当前分区的一半,就将当前分区对半分开,将其中一半继续与需要的内存大小进行比较,递归进行下去,直到满足所需内存大小大于分区一半。可以看到这种分配方式内部碎片最大为分区大小的一半减一。...
2021-03-27 16:02:42 1706
原创 操作系统内存管理之换页与缺页异常
换页机制思想:该机制的基本思想是当物理内存容量不够的时候,操作系统应该把若干物理页的内容写到类似于磁盘这种容量更大更加便宜的存储设备中,然后就可以回收这些物理页供其他程序使用了。 举个例子,有一个程序A,其中A的一个物理页为P(对应于程序A虚拟内存中的虚拟页V)时,当操作系统希望从程序A那里回收P时,操作系统就需要将物理页P中的内容写到磁盘的一个位置,并且在程序A的页表中,去除虚拟页V的映射,同时记录该物理页被换
2021-03-27 12:22:14 3331
原创 操作系统内存管理之段式管理、页式管理、段业式管理回顾
操作系统是如何管理进程的空间呢?1.基础字是内存中的最小单位,这些是计算机组成原理的知识,不知道的可以自行百度。CPU中的重要部件内存管理单元(MMU),负责虚拟地址到物理地址的转换。MMU将虚拟地址翻译为物理地址的主要机制有两种:分段机制和分页机制。2. 段式存储管理段式管理时,虚拟地址由两部分组成,第一个部分表示段号,标识着该虚拟地址属于整个虚拟地址空间中的哪一段。第二部分表示段内地址,也称为段内偏移,及相对于该段起始地址的偏移量。因为段不仅有段号,还有长度,所以是二维的。总结:在
2021-03-25 23:32:45 393 1
原创 操作系统内存管理之内存的分配和回收
分配与回收的目的内存分配的过程单一连续分配(已经过时)固定分区分配动态分区分配动态分区空闲表数据结构:0-没有使用,1-使用了动态分区空闲链数据结构:连续的合并在一起,这样可以减少空闲链表的节点数。动态分区分配算法1. 首次适应算法第一个空闲区不满足则下一个,2,3为一个,满足需求。缺点:大材小用2. 最佳适应算法避免了大材小用的浪费3. 快速适应算法内存回收的过程回收区有四种情况第一种(回收区在空闲区的后面):这里的增大是空闲区1增大后包含回收区。
2021-03-25 17:13:24 3735
原创 网络协议-两个不同的局域网中的机器如何通讯
服务器 A 要访问服务器 B 首先,服务器 A 会思考,192.168.4.101 和我不是一个网段的,因而需要先发给网关。那网关是谁呢?已经静态配置好了,网关是 192.168.1.1。网关的 MAC 地址是多少呢?发送 ARP 获取网关的 MAC 地址,然后发送包。包的内容是这样的:源 MAC:服务器 A 的 MAC目标 MAC:192.168.1.1 这个网口的MAC源 IP:192.168.1.101目标 IP:192.168.4.101&
2021-03-24 17:40:55 1599
原创 MFC之CPtrList的使用
CPtrList类支持void指针列表。CPtrList类的成员函数类似于CObList类的成员函数。由于这种类似性,可以使用CObList参考文档作为成员函数的说明。接下来我就在MFC中把使用步骤列出来,然后关于源码可以自己下载结果:...
2021-03-24 15:34:09 1106
原创 MFC中的线程同步之关键代码段
多个线程访问临界区时,可以使用临界区对象。临界区对象是一个独占性共享资源,任一时刻只有一个线程可以拥有临界区。拥有临界区的线程可以访问被保护起来的资源或代码段,其他希望进入临界区的线程将被挂起等待,直到拥有临界区的线程放弃临界区时为止。CCriticalSection类的用法:(1)定义CCriticalSection类的一个全局对象(以使各个线程均能访问):CCriticalSectioncritical_section;(2)在访问临界区之前,调用CCriticalSection类的成员函数L
2021-03-24 13:59:38 192
原创 操作系统之内存管理
操作系统究竟是如何让不同的应用程序能够高效又安全的共同使用物理内存的?现代操作系统的一个普遍的做法是在应用程序与物理内存之间加入一个虚拟内存。 应用程序是面向虚拟内存编写的,而不是面向物理内存编写的;应用程序在运行时只能使用虚拟地址。 CPU负责将虚拟地址翻译为物理地址,操作系统负责设置虚拟地址与物理地址之间的映射。
2021-03-23 22:11:07 143
原创 网络协议-什么是网关,什么又是路由器
一旦配置了 IP 地址和网关,往往就能够指定目标地址进行访问了。由于在跨网关访问的时候,牵扯到 MAC 地址和 IP 地址的变化。下面看看MAC的细节. 在 MAC 头里面,先是目标 MAC 地址,然后是源 MAC 地址,然后有一个协议类型,用来说明里面是 IP 协议。关于IP协议的部分内容可以参考我的另一篇文章IP协议. 在任何一台机器上,当要访问另一个 IP
2021-03-23 17:46:13 473
原创 网络协议-MAC地址是唯一的,为啥还需要IP地址?
MAC 地址是一个很容易让人“误解”的地址。因为 MAC 地址号称全局唯一,不会有两个网卡有相同的 MAC 地址,而且网卡自生产出来,就带着这个地址。很多人看到这里就会想,既然这样,整个互联网的通信,全部用 MAC 地址好了,只要知道了对方的 MAC 地址,就可以把信息传过去。这样当然是不行的。 一个网络包要从一个地方传到另一个地方,除了要有确定的地址,还需要有定位功能。 MAC地址就好比一个人的身份证,有了身份
2021-03-23 14:46:49 1181
原创 网络协议-网络为什么要分层
理解计算机网络中的概念,一个很好的角度是,想象网络包就是一段 Buffer,或者一块内存,是有格式的。同时,想象自己是一个处理网络包的程序,而且这个程序可以跑在电脑上,可以跑在服务器上,可以跑在交换机上,也可以跑在路由器上。你想象自己有很多的网口,从某个口拿进一个网络包来,用自己的程序处理一下,再从另一个网口发送出去。 当然网络包的格式很复杂,这个程序也很复杂。复杂的程序都要分层,这是程序设计的要求。比如,复杂的
2021-03-23 13:33:37 563
原创 c++线程同步之‘互斥锁’回顾
互斥锁 在多任务操作系统中,同时运行的多个任务可能都需要使用同一种资源。这个过程有点类似于,公司部门里,我在使用着打印机打印东西的同时(还没有打印完),别人刚好也在此刻使用打印机打印东西,如果不做任何处理的话,打印出来的东西肯定是错乱的。 在线程里也有这么一把锁——互斥锁(mutex),互斥锁是一种简单的加锁的方法来控制对共享资源的访问,互斥锁只有两种状态,即上锁( lock )和解锁( unlock )。【互
2021-03-21 17:39:17 397
原创 c++线程同步之‘临界区’回顾
临界区(Critical Section)是一段独占对某些共享资源访问的代码,在任意时刻只允许一个线程对共享资源进行访问。如果有多个线程试图同时访问临界区,那么在有一个线程进入后其他所有试图访问此临界区的线程将被挂起,并一直持续到进入临界区的线程离开。临界区在被释放后,其他线程可以继续抢占,并以此达到用原子方式操作共享资源的目的。临界区包含两个操作原语:EnterCriticalSection() 进入临界区LeaveCriticalSection()
2021-03-21 13:42:37 380 4
原创 c++多线程同步之‘事件’回顾
1.事件 事件(Event)是WIN32提供的最灵活的线程间同步方式,事件可以处于激发状态(signaled or true)或未激发状态(unsignal or false)。根据状态变迁方式的不同,事件可分为两类:(1)手动设置:这种对象只可能用程序手动设置,在需要该事件或者事件发生时,采用SetEvent及ResetEvent来进行设置。(2)自动恢复:一旦事件发生并被处理后,自动恢复到没有事件状态,不需要再次设置。使用”事件”机制应注意以下事项:
2021-03-20 22:24:21 769
原创 关于WaitForSingleObject的理解
Windows提供了许多内核对象来实现线程的同步。对于线程同步而言,这些内核对象有两个非常重要的状态:“已通知”状态,“未通知”状态(也有翻译为:受信状态,未受信状态)。你可以通知一个内核对象,使之处于“已通知状态”,然后让其他等待在该内核对象上的线程继续执行。可以使用WaitForSingleObject函数来等待一个内核对象变为已通知状态: DWORD WaitForSingleObject(HANDLE hObject, //指明一个内核对象的句柄DWORD dwMilliseconds)
2021-03-20 17:20:29 2636
原创 C++配置文件读写工具封装
使用单例模式实现配置文件读写,且具有线程安全性。#include<iostream>#include <windows.h>#include<fstream>using namespace std;//Ty 使用单例模式实现配置文件的读写,具有线程安全的特性//2021.03.17class CIniFileTool{private: CIniFileTool() = default; ~CIniFileTool() = default;
2021-03-17 20:32:11 377 2
原创 c++之多线程如何初始化变量一次
在多线程的环境下,有时候我们不需要某函数被调用多次或者某些变量被初始化多次,它们仅仅只需要被调用一次或者初始化一次即可。很多时候我们为了初始化某些数据会写出如下代码,这些代码在单线程中是没有任何问题的,但是在多线程中就会出现不可预知的问题。bool initialized = false; // global flagif (!initialized) { // initialize if not initialized yet initialize (); initialize
2021-03-15 23:26:54 1037 1
mysql+connetcot.txt
2019-12-29
30岁的程序员如何防脱
2023-10-16
TA创建的收藏夹 TA关注的收藏夹
TA关注的人