
操作系统
Michael_Good
脚踏实地,不负时光!
展开
-
【C/C++】Linux\Windows为什么频繁使用size_t
在32位系统上,size_t 通常是 unsigned int,而在64位系统上,它通常是 unsigned long 或 unsigned long long。例如,malloc 和 calloc 函数返回 void* 类型的指针,而它们的参数类型是 size_t,这允许函数接受任何大小的整数值作为参数,而无需担心类型不匹配。例如,strlen 函数返回一个 size_t 类型的值,表示字符串的长度;由于它是无符号的,因此在进行算术运算时,不会出现负数结果,这有助于避免一些常见的错误,如数组越界。原创 2024-09-06 11:47:00 · 365 阅读 · 0 评论 -
【python】Windows使用python建立HTTP服务器
【代码】【python】Windows使用python建立HTTP服务器。原创 2024-06-24 10:09:01 · 412 阅读 · 0 评论 -
【C/C++】C++类的六个特殊成员函数,附亲测实例
这些特殊成员函数对于类的正确使用至关重要,因为它们确保了类的资源管理(如内存分配和释放)能够正确执行。在设计类时,应该根据类的需要来决定是否需要自定义这些特殊成员函数。如果类中包含动态分配的资源(如指针、文件句柄等),通常需要自定义析构函数来释放这些资源,以避免内存泄漏。同样,如果类需要支持复制或移动操作,也应该提供相应的特殊成员函数。在C++中,类的特殊成员函数是指那些由编译器自动生成的函数,它们在特定情况下会被调用,以支持类的某些操作。原创 2024-06-02 18:43:08 · 680 阅读 · 0 评论 -
【操作系统】Windows平台捕获崩溃现场底层原理,附代码亲测MiniDumpWriteDump
库,用于生成程序崩溃时的内存转储文件(MiniDump)。这个函数是Windows平台下用于捕获程序崩溃时的内存状态的常用方法之一。函数是Windows平台上进行程序崩溃分析的重要工具,它允许开发者在程序崩溃时捕获到程序的完整状态,从而进行深入的调试和问题定位。这个文件就是最终生成的MiniDump文件,它包含了崩溃时的内存快照、寄存器状态、线程信息等。生成的MiniDump文件可以被开发者使用调试工具(如WinDbg)打开和分析,以帮助诊断程序崩溃的原因。参数的设置,决定哪些内存区域需要被转储。原创 2024-06-02 17:04:27 · 602 阅读 · 0 评论 -
【操作系统】Linux、Windows各平台CoreDump机制实现详解
在Windows操作系统中,CoreDump机制被称为“Dump文件”或“转储文件”,它是一种在程序崩溃时捕获程序状态的机制。:CoreDump文件包含了程序在异常终止时的内存信息,包括程序的内存映像、寄存器状态、程序的堆栈信息等。此外,生成的Dump文件可以使用WinDbg等工具进行分析,以帮助开发者调试和修复程序中的问题。在处理过程中,如果信号是CoreDump信号(即可以触发CoreDump的信号),内核会执行一系列操作来生成CoreDump文件。:生成的CoreDump文件可以被调试工具如。原创 2024-06-02 16:55:04 · 1318 阅读 · 0 评论 -
【操作系统】32进制小数转16进制
需要注意的是,转换为16进制时,10进制数的整数部分和小数部分分别进行转换。整数部分的转换与常规的10进制转16进制相同,小数部分的转换可以将小数不断乘以16,将整数部分转换为对应的16进制字符。可以将10进制数不断除以16,将余数转换为对应的16进制字符,直到商为0为止。将32进制小数转换为10进制。可以使用上述提到的方法,将32进制小数转换为对应的10进制数。使用上述提到的方法,将32进制小数"1A.2B"转换为对应的10进制数。因此,32进制小数"1A.2B"对应的16进制数为"1A.6B"。原创 2023-10-23 10:02:37 · 797 阅读 · 0 评论 -
【操作系统】32进制小数转10进制
将每一位的结果相加:1 * 32^(-1) + 10 * 32^(-2) + 2 * 32^(-3) + 11 * 32^(-4)。需要注意的是,如果32进制小数中包含字母,需要将其转换为对应的数字。例如,"A"对应10,"B"对应11,依此类推。将第一步中计算得到的结果相加,即可得到32进制小数对应的10进制数。计算最终结果,即将第二步中的结果相加,得到32进制小数"1A.2B"对应的10进制数。(-2),第三位的权重为32^(-3),依此类推。假设要将32进制小数"1A.2B"转换为10进制。原创 2023-10-23 10:01:29 · 1049 阅读 · 0 评论 -
【操作系统】【技巧篇】十进制算术表达式:3*512+7*64+4*8+5的运算结果,用二进制表示
算式不复杂,但是换种玩法,会让你眼前一亮!原创 2023-10-20 16:31:10 · 845 阅读 · 0 评论 -
【操作系统】十六进制小数转换为十进制
所以,十六进制数FFF.CH转换为十进制数为4360.75。原创 2023-10-20 11:47:10 · 2061 阅读 · 0 评论 -
【操作系统】自旋锁实现&&自旋锁原理(亲测可用)
自旋锁是一种基于忙等待的锁,它在等待锁的过程中不会阻塞线程,而是通过循环不断地检查锁的状态,直到获取到锁为止。自旋锁适用于锁的持有时间很短的情况,因为在等待锁的过程中,线程会一直占用CPU资源,如果锁的持有时间很长,那么自旋锁会浪费大量的CPU资源。原创 2023-09-07 17:24:54 · 276 阅读 · 0 评论 -
【操作系统】读写锁实现&&读写锁原理(亲测可用)
当一个线程请求写锁时,如果当前有读锁或者写锁,该线程会被阻塞,直到读锁和写锁都被释放。读锁和写锁的释放都会唤醒等待的线程。读锁的获取:当一个线程请求读锁时,如果当前没有写锁或者写锁的持有者和请求读锁的线程是同一个线程,那么该线程可以获得读锁,否则该线程会被阻塞,直到写锁被释放。写锁的获取:当一个线程请求写锁时,如果当前没有读锁或者写锁,那么该线程可以获得写锁,否则该线程会被阻塞,直到读锁和写锁都被释放。读锁的释放:当一个线程释放读锁时,如果没有其他线程持有写锁,那么该线程释放读锁,否则该线程继续持有读锁。原创 2023-09-07 16:13:47 · 461 阅读 · 0 评论 -
【操作系统】睡眠锁与自旋锁异同
【代码】【操作系统】睡眠锁与自旋锁异同。原创 2023-09-07 11:10:32 · 488 阅读 · 0 评论 -
【操作系统】一级页表与三级页表优劣对比
【代码】【操作系统】一级页表与三级页表优劣对比。原创 2023-09-06 17:08:49 · 632 阅读 · 0 评论 -
【操作系统】各平台定时器粒度
在 Windows 操作系统中,定时器的精度取决于系统时钟的精度。在 Linux 中,可以使用不同的定时器实现,如基于系统调用的定时器(如 setitimer)、基于 POSIX 标准的定时器(如 timer_create)、基于定时器文件描述符的定时器(如 timerfd_create)等。需要注意的是,在使用定时器时,定时器的精度可能会受到其他系统资源的影响,如 CPU 占用率、I/O 操作等,因此在实际应用中需要进行充分的测试和优化。原创 2023-08-28 11:32:44 · 671 阅读 · 0 评论 -
【OS】虚拟地址是如何转换为物理地址?
假设当前系统使用4KB大小的页面,则页号为 0X12345(20位,十六进制 0X12345678 这个数据,第三个字节为 0X56, 转换为二进制为 0B 01010110,所以第三个字节高位为:0X0101, 低位为:0X0110,所以可以直接将0X56分割为0X5,0X6)。需要注意的是,Process Explorer 工具只能查看当前正在运行的进程的页表信息,无法查看已经结束的进程的页表信息。此外,由于页表信息非常庞大,因此在查看大型进程的页表信息时,可能需要等待一段时间才能显示完整的信息。原创 2023-08-14 11:16:06 · 1660 阅读 · 0 评论 -
【OS】请问,一个需要运行内存10GB的游戏,可以运行在32位物理内存为64GB的电脑上吗?
如果,电脑开启了虚拟内存,则该款10GB运存的游戏是不可能开启的。期望开启这款游戏的做法是,在这个物理内存为64GB的电脑上关闭虚拟内存机制,开启游戏即可。在“虚拟内存”对话框中,取消选中“自动管理所有驱动器的分页文件大小”,然后选择“无分页文件”。在“性能选项”对话框中,选择“高级”选项卡,然后在“虚拟内存”部分中选择“更改”。在“系统属性”对话框中,选择“高级”选项卡,然后在“性能”部分中选择“设置”。打开“控制面板”,选择“系统和安全”,然后选择“系统”。点击“设置”按钮,然后点击“确定”按钮。原创 2023-08-10 20:51:24 · 1320 阅读 · 0 评论 -
【OS】操作系统中,页框/页帧见解
较小的页框可以提高内存利用率,但会增加内存碎片和页表的大小,从而降低系统性能。在现代计算机系统中,页框的大小通常是固定的,通常为4KB或者8KB。需要注意的是,不同的操作系统和硬件架构可能会有不同的页框大小。因此,在选择页框大小时,需要考虑具体的操作系统和硬件架构,并进行测试和评估,以确定最适合的页框大小。需要注意的是,不同的操作系统和硬件架构可能会有不同的页框大小。因此,在编写程序时,应该避免依赖特定的页框大小,而应该使用操作系统提供的API来管理内存。例如,Linux操作系统默认使用4KB的页框大小。原创 2023-08-10 20:16:43 · 2098 阅读 · 0 评论 -
【操作系统】原语操作详解
在计算机科学中,原语是一种基本的操作,它是不可分割的,要么全部执行成功,要么全部执行失败,不会出现中间状态。原子操作:原子操作是一种不可被中断的操作,它要么完全执行,要么完全不执行,不会出现部分执行的情况。原子操作是一种不可被中断的操作,要么完全执行,要么完全不执行,不会出现部分执行的情况。原子操作(atomic operation):原子操作是一种不可被中断的操作,要么完全执行,要么完全不执行,不会出现部分执行的情况。操作系统会在执行原语操作时,禁止其他进程或线程的干扰,以确保原语操作的不可分割性。原创 2023-04-20 10:15:27 · 7379 阅读 · 0 评论 -
【操作系统】屏障同步机制详解
需要注意的是,进程和线程中的屏障同步机制虽然使用的是相同的类型和函数,但在使用时需要注意区分。例如,在进程中使用屏障同步机制时,需要使用共享内存来传递屏障对象,而在线程中使用屏障同步机制时,可以直接使用线程间共享的变量来传递屏障对象。需要注意的是,屏障同步机制需要等待所有线程或进程到达屏障点后才能继续执行,因此,线程或进程数量越多,等待的时间就越长,从而影响程序的性能。需要注意的是,屏障同步机制需要等待所有线程到达屏障点后才能继续执行,因此,线程数量越多,等待的时间就越长,从而影响程序的性能。原创 2023-04-19 18:19:10 · 1296 阅读 · 0 评论 -
【操作系统】预防死锁有效方法技巧
使用超时机制:在加锁的时候,可以设置一个超时时间,如果在规定时间内无法获取锁,就放弃锁并释放已经占用的锁,避免死锁的发生。避免持有锁的同时等待其他锁:如果一个线程已经持有了一个锁,那么就不应该再去等待其他锁,否则容易导致死锁的发生。统一加锁顺序:如果必须使用多个锁,那么就要保证所有线程都按照相同的顺序加锁,这样可以避免死锁的发生。尽量减小锁的粒度:如果可能的话,尽量将锁的粒度减小,这样可以减少锁的竞争,从而降低死锁的概率。以上是预防死锁的一些常用方法,具体的应用需要根据实际情况进行选择。原创 2023-04-19 17:38:34 · 1379 阅读 · 0 评论 -
【操作系统】GDB 精确定位死锁位置技巧
需要注意的是,如果程序中有多个线程同时等待同一个互斥锁,那么通过查看调用栈可能无法确定当前线程正在等待哪个互斥锁。此时,可以通过查看互斥锁的地址,以及在其他线程中调用。命令查看当前进程中所有线程的信息,包括线程 ID、状态、调用栈等信息。通过查看线程的调用栈,可以得知当前线程正在等待哪个互斥锁。找到当前正在运行的线程,并查看其调用栈。如果有,可以查看其参数,即可得知当前线程正在等待哪个互斥锁。函数的调用,可以查看其参数,即可得知当前线程正在等待哪个互斥锁。命令查看当前进程中所有线程的信息。原创 2023-04-19 17:21:18 · 1980 阅读 · 0 评论 -
【操作系统】互斥锁 mutex 结构解析
在上面的代码中,首先使用 pthread_mutex_lock 函数获取锁,然后获取 __owner 字段的值,最后使用 pthread_mutex_unlock 函数释放锁。如果 __owner 字段的值不为 0,则表示该锁当前被某个线程持有,您可以通过该值来确定是哪一个线程持有了该锁。:锁的类型,包括 PTHREAD_MUTEX_NORMAL(普通锁)、PTHREAD_MUTEX_RECURSIVE(递归锁)和 PTHREAD_MUTEX_ERRORCHECK(检错锁)。:锁的计数器,用于支持递归锁。原创 2023-04-19 16:51:40 · 3100 阅读 · 0 评论 -
【操作系统】常见线程同步对象的初始化宏定义
自旋锁(pthread_spinlock_t):PTHREAD_SPINLOCK_INITIALIZER。屏障(pthread_barrier_t):PTHREAD_BARRIER_INITIALIZER。读写锁(pthread_rwlock_t):PTHREAD_RWLOCK_INITIALIZER。互斥锁(pthread_mutex_t):PTHREAD_MUTEX_INITIALIZER。条件变量(pthread_cond_t):PTHREAD_COND_INITIALIZER。原创 2023-04-19 15:47:16 · 185 阅读 · 0 评论 -
【操作系统】【进程管理】孤儿进程与僵尸进程
当一个子进程结束时,它会向父进程发送SIGCHLD信号,父进程可以通过wait()或waitpid()函数来回收子进程的状态信息,从而消除僵尸进程。程序设计问题:如果程序设计存在问题,如没有及时回收子进程的状态信息,就可能导致产生大量的僵尸进程,从而导致init进程无法回收所有的僵尸进程。僵尸进程不会占用CPU资源,但会占用系统的进程表项,如果大量的僵尸进程积累,就会导致系统进程表满,从而影响系统的正常运行。如果僵尸进程的父进程在短时间内退出了,那么僵尸进程的父进程ID会被设置为1,即init进程。原创 2023-04-14 17:10:42 · 1252 阅读 · 0 评论 -
【操作系统】【进程管理】PCB概念
进程控制块(Process Control Block,PCB)是操作系统中用于管理进程的数据结构,它包含了进程的所有状态信息。PCB的大小取决于操作系统的实现和支持的功能,不同的操作系统和不同的进程可能有不同的PCB大小。在实际应用中,PCB的大小可能会更大,因为操作系统可能需要记录更多的信息来支持更多的功能,如线程、进程间通信、文件系统等。原创 2023-04-14 17:03:49 · 3598 阅读 · 0 评论 -
【OS-内存空间】栈空间分布位置原因
在函数调用时,需要将函数的参数和返回地址等信息压入栈中,然后执行函数体。将栈空间放置于高地址区可以使函数的参数和返回地址等信息存储在内存的高地址区,从而方便函数调用时的栈操作。将栈空间放置于高地址区可以使每个线程的栈空间相互独立,从而避免不同线程之间的栈空间发生冲突。栈空间的增长方向是向下的,即栈顶地址会不断减小。将栈空间放置于高地址区可以使其与堆空间分离,从而避免栈空间和堆空间发生冲突。总之,将栈空间放置于内存高地址区可以提高程序的稳定性和安全性,避免栈空间和堆空间发生冲突,并方便函数调用和多线程编程。原创 2023-04-12 15:08:06 · 160 阅读 · 0 评论 -
【操作系统 - 内存分布】内核空间分布原理深究
在现代计算机系统中,硬件设备的寄存器通常被映射到I/O地址空间中,这是一种特殊的地址空间,用于访问硬件设备的寄存器。当CPU需要访问硬件设备的寄存器时,它会向I/O地址空间中的特定地址发送读写请求,这些请求会被传递给硬件设备的控制器,从而实现对硬件设备的控制和管理。内核空间需要频繁访问硬件设备,而这些设备的寄存器通常被映射到物理内存的高地址区域,因此将内核空间放置在高地址区可以更快地访问这些设备。总之,硬件设备的寄存器种类繁多,不同的设备可能会有不同的寄存器,这些寄存器的作用也各不相同。原创 2023-04-12 14:58:09 · 1521 阅读 · 0 评论