操作系统
文章平均质量分 96
Tyler_Zx
只有足够的努力,才能让一切看起来都毫不费力!
展开
-
操作系统:程序的编译、链接、装入及地址转换
目录静态编译与动态编译程序链接装入时动态链接运行时动态链接程序装入静态地址重定位动态地址重地位基本分页存储管理的地址变换逻辑地址空间与物理地址空间前言在多道程序环境下,要使程序运行,必须先为之创建进程。而创建进程的第一件事,便是将程序和数据装入内存。将一个用户源程序变为一个可在内存中执行的程序,通常都要经过以下几个步骤:(1)编译,由编译程序(Compiler)将用户源代码编译成 CPU 可执行的目标代码,产生了若干个目标模块(Object Modul..原创 2020-09-09 09:24:42 · 4434 阅读 · 0 评论 -
I/O多路复用:select、poll和epoll详解
I/O多路复用I/O复用使得程序能同时监听多个文件描述符,这对提高程序的性能至关重要。通常,网络程序在下列情况下需要使用I/O复用技术:客户端程序要同事处理多个socket。比如将讨论的非阻塞connect技术。客户端程序要同时处理用户输入和网络连接。TCP服务器要同时处理监听socket和连接socket。这是I/O复用使用最多的场合。I/O复用虽然能同时监听多个文件描述...原创 2020-04-10 22:47:29 · 9773 阅读 · 1 评论 -
Linux gdb多进程、多线程调试
目录常用命令堆栈相关命令更为详细的断点调试gdb多进程调试gdb多线程调试前言gdb 是linux平台下进行程序调试的最常用的工具。简单的程序调试就是加断点,然后一步一步让程序运行,直到找到 bug 。一般的程序调试起来比较简单,但是在多进程或多线程情况下调试起来就比较麻烦。若 test.c 是你想要调试的程序,那么在编译时需要加 -g,即 gcc test.c -g -o test。完成编译后使用命令:gdb test。常用命令 命令 ...原创 2020-05-21 17:00:45 · 2588 阅读 · 0 评论 -
C++ std::thread 和 std::jthread 使用详解 (含C++20新特性)
在C++ 11之前,官方并没有支持线程库。在Linux下完成多线程编程时,多数情况下是使用#include <pthread.h>的函数。C++ 11通过标准库引入了对thread类的支持,大大方便了完成多线程开发的工作。在C++20中,引入的jthread类是thread自动合并和取消的实现版本。接下来将先从线程函数和thread类开始介绍,分析它们的不同,然后再介绍jthread。std::thread定义于头文件<thread>classt...原创 2020-06-16 11:35:54 · 11231 阅读 · 0 评论 -
mmap 内存映射详解
mmap基础概念mmap是一种内存映射的方法,这一功能可以用在文件的处理上,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。在编程时可以使某个磁盘文件的内容看起来像是内存中的一个数组。如果文件由记录组成,而这些记录又能够用结构体来描述的话,可以通过访问结构数组来更新文件的内容。实现这样的映射关系后,进程就可以采用指针的方式读写操...转载 2020-04-23 20:05:30 · 6645 阅读 · 0 评论 -
解决Linux因非正常关机或死机重启后进入 initramfs 问题
问题描述昨晚一直整理资料到1.30。然后就运行代码让它自己跑着,结果今天发现电脑死机了。只有鼠标能用,其他按键和终端完全没用。这种情况下我只能强制关机,重启后进入initramfs。Linux对这类非正常关机或死机导致的问题应该有解决的办法,当时搜了很多博客,不过他们遇到的大多是磁盘出错。我也尝试了修复磁盘,结果发现没有用。当时把我给吓的呀,这要是电脑坏了,里面所有的资料和论文就都没了。...原创 2020-04-16 14:57:12 · 3010 阅读 · 3 评论 -
进程间通信:消息队列概念及代码
前言接下讨论的IPC机制,它们最初由System V版本的Unix引入。由于这些机制都出现在同一个版本中并且有着相似的编程接口,所以它们被称为System V IPC机制。接下来的内容包括:信号量:用于管理对资源的访问。共享内存:用于在程序之间高效地共享数据。消息队列:在程序之间传递数据。消息队列消息队列与命名管道有许多相似之处,但少了在打开和关闭管道方面的复杂性。但...原创 2020-03-10 23:29:19 · 3711 阅读 · 0 评论 -
进程间通信:共享内存概念及代码
前言接下讨论的IPC机制,它们最初由System V版本的Unix引入。由于这些机制都出现在同一个版本中并且有着相似的编程接口,所以它们被称为System V IPC机制。接下来的内容包括:信号量:用于管理对资源的访问。共享内存:用于在程序之间高效地共享数据。消息队列:在程序之间传递数据。共享内存共享内存允许两个不相关的进程访问同一个逻辑内存。共享内存是在两个正在运行...原创 2020-03-10 15:46:15 · 5042 阅读 · 0 评论 -
进程间通信:信号量概念及代码
前言接下讨论的IPC机制,它们最初由System V版本的Unix引入。由于这些机制都出现在同一个版本中并且有着相似的编程接口,所以它们被称为System V IPC机制。接下来的内容包括:信号量:用于管理对资源的访问。共享内存:用于在程序之间高效地共享数据。消息队列:在程序之间传递数据。先从这个代码开始思考:#include <stdio.h>#in...原创 2020-03-09 23:12:55 · 5857 阅读 · 0 评论 -
进程间通信:管道和命名管道(FIFO)
目录概述IPC对象的持续性什么是管道读取外部程序的输出将输出送往popen传递更多的数据如何实现popenpipe调用跨越fork调用管道父进程和子进程管道关闭后的读操作把管道用作标准输入和标准输出命名管道:FIFO创建命名管道打开FIFO文件使用FIFO实现进程间通信使用FIFO的客户/服务器应用程序概述IPC(inte...原创 2020-03-08 23:58:55 · 3508 阅读 · 0 评论 -
进程及 fork() 系统调用详解
进程的概念及定义定义:进程是一个具有独立功能的程序关于某个数据集合的运行过程。它是系统进行资源分配和调度的独立单位,是一个活动的实体。注意:进程的定义不唯一,这个是我觉得最准确的定义。还有一点,在没有引入线程前,资源分配和调度的基本单位都是进程。有了线程后,进程仍然是资源分配的基本单位,而调度的最小单位是线程。在多道环境下,引入进程的概念,以便更好地描述和控制程序的并发执行,实现操作系...原创 2020-03-08 01:10:04 · 6709 阅读 · 1 评论 -
可重入锁(递归锁) & 互斥锁属性设置
前言:上一次刷博客的时候,看到了自旋锁,通过学习Linux内核,对自旋锁有了一定的了解。在学习的过程中看到这么一句话——自旋锁是不可递归的。自旋锁不可递归,难道有可以递归的锁?带着这个问题,我们来看看什么是可以递归的锁。回顾进程/线程同步方法最常见的进程/线程的同步方法有互斥锁(或称互斥量Mutex),读写锁(rdlock),条件变量(cond),信号量(Semophore)等。...原创 2018-10-10 19:21:51 · 4520 阅读 · 1 评论 -
自旋锁、互斥锁和信号量
自旋锁Linux内核中最常见的锁是自旋锁(spin lock)。自旋锁最多只能被一个可执行线程持有。如果一个执行线程试图获得一个被已经持有的自旋锁,那么该线程就会一直进行忙循环——旋转——等待锁重新可用。要是锁未被争用,请求锁的执行线程便能立刻得到它,继续执行。在任意时间,自旋锁都可以防止多于一个的执行线程同时进入临界区。同一个锁可以用在多个位置。例如,对于给定数据的所有访问都可以得到保护和同...原创 2018-10-09 11:26:29 · 2135 阅读 · 0 评论 -
操作系统中的同步和异步
操作系统中同步、异步性概念首先我们从操作系统的发展中学习什么是异步性。在操作系统发展的初期阶段,CPU处理的是作业,而且是单道批处理。什么意思呢?就是一个作业从提交到结束,程序员都不能干预,此时整台计算机就为这一个作业服务(可想有多少资源被"浪费"),这样有一点好处就是整个程序是"封闭的"。这样的操作表明人和机器是没有交互的。那我们怎么实现人机交互呢?这个答案是中断。中断的引入,使得工作人员能...原创 2018-07-12 11:23:38 · 25918 阅读 · 7 评论