Linux系统编程
Linux系统编程之虚拟地址空间和文件描述符
原文链接
1.虚拟地址空间
虚拟地址空间是一个非常抽象的概念,先根据字面意思进行解释:
它可以用来加载程序数据(数据可能被加载到物理内存上,空间不够就加载到虚拟内存中)
它对应着一段连续的内存地址,起始位置为 0。
之所以说虚拟是因为这个起始的 0 地址是被虚拟出来的, 不是物理内存的 0 地址。
虚拟地址空间的大小也由操作系统决定,32位的操作系统虚拟地址空间的大小为 2^32^ 字节,也就是 4G,64 位的操作系统虚拟地址空间大小为 264 字节,这是一个非常大的数,感兴趣可以自己计算一下。当我们运行磁盘上一个可执行程序, 就会得到一个进程,内核会给每一个运行的进程创建一块属于自己的虚拟地址空间,并将应用程序数据装载到虚拟地址空间对应的地址上。
进程在运行过程中,程序内部所有的指令都是通过 CPU 处理完成的,CPU 只进行数据运算并不具备数据存储的能力,其处理的数据都加载自物理内存,那么进程中的数据是如何进出入到物理内存中的呢?其实是通过 CPU 中的内存管理单元 MMU(Memory Management Unit)从进程的虚拟地址空间中映射过去的。
1.1 存在的意 ...
Linux系统编程
Linux系统编程之进程
1.进程相关概念1.1 程序和进程程序:是指编译好的二进制文件,在磁盘上,不占用系统资源(cpu、内存、打开的文件、 设备、锁….),是一个静态的概念 。
进程:被执行之后的程序叫做进程,不占用磁盘空间,需要消耗系统的内存,CPU资源,每个运行的进程的都对应一个属于自己的虚拟地址空间,这是一个动态的概念。
程序 → 剧本(纸)
进程 → 戏(舞台、演员、灯光、道具…)
同一个剧本可以在多个舞台同时上演。同样,同一个程序也可以加载为不同的进程(彼此之间互不影响)如:同时开两个终端。各自都有一个 bash 但彼此 ID 不同。
1.2 并行和并发并发
并发的同时运行是一个假象, CPU 在某一个时间点只能为某一个个体来服务,因此不可能同时处理多任务,这是通过计算机CPU的时间片快速切换实现的。
并发是针对某一个硬件资源而言的,在某个时间段之内处理的任务的总量,量越大效率越高。
并行
并行的多进程同时运行是真实存在的,可以在同一时刻同时运行多个进程
并行需要依赖多个硬件资源,单个是无法实现的。
1.3 PCB进程控制块
PCB - 进程控制块(Processing Control ...
Linux系统编程
Linux系统编程之文件IO
1.linux man 1 2 3的作用1234567891、Standard commands (标准命令)2、System calls (系统调用)3、Library functions (库函数)4、Special devices (设备说明)5、File formats (文件格式)6、Games and toys (游戏和娱乐)7、Miscellaneous (杂项)8、Administrative Commands (管理员命令)9 其他(Linux特定的), 用来存放内核例行程序的文档。
说明:
系统调用 Linux内核提供的函数
库调用 c语言标准库函数和编译器特定库函数
例子:
man 1 cd
man 2 open
man 3 printf
一个小案例:
C 标准函数和系统函数调用关系。一个 helloworld 如何打印到屏幕。
2.open函数2.1函数原型manpage 第二卷(系统调用函数),输入==man 2 open==指令
open函数如下,有两个版本的
open是一个系统函数, 只能 ...
Json
Json详解
原文链接JSON(JavaScrip Object Notation) 是一种==轻量级的数据交换格式==。它基于 ECMAScript (欧洲计算机协会制定的 js 规范) 的一个子集,==采用完全独立于编程语言的文本格式来存储和表示数据==。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
关于上面的描述可以精简为一句话:==Json 是一种数据格式,和语言无关,在什么语言中都可以使用 Json==。基于这种通用的数据格式,一般处理两方面的任务:
组织数据(数据序列化),用于数据的网络传输组织数据(数据序列化),写磁盘文件实现数据的持久化存储(一般以 ==.json== 作为文件后缀)Json 中主要有两种数据格式:Json 数组和 Json 对象,并且这两种格式可以交叉嵌套使用,下面依次介绍下这两种数据格式:
1.Json 数组Json 数 ...
C++
C++命名空间详解
1. ::作用域运算符通常情况下,如果有两个同名变量,一个是全局变量,另一个是局部变量,那么局部变量在其作用域内具有较高的优先权,它将屏蔽全局变量。
12345678//全局变量int a = 10;void test(){ //局部变量 int a = 20; //全局a被隐藏 cout << "a:" << a << endl;}
程序的输出结果是a:20。在test函数的输出语句中,使用的变量a是test函数内定义的局部变量,因此输出的结果为局部变量a的值。
作用域运算符可以用来解决局部变量与全局变量的重名问题
12345678910//全局变量int a = 10;//1. 局部变量和全局变量同名void test(){ int a = 20; //打印局部变量a cout << "局部变量a:" << a << endl; //打印全局变量a cout << "全局变量a:" << ::a ...
C++
C++类型转换详解
类型转换(cast)是将一种数据类型转换成另一种数据类型。例如,如果将一个整型值赋给一个浮点类型的变量,编译器会暗地里将其转换成浮点类型。
转换是非常有用的,但是它也会带来一些问题,比如在转换指针时,我们很可能将其转换成一个比它更大的类型,但这可能会破坏其他的数据。
应该小心类型转换,因为转换也就相当于对编译器说:忘记类型检查,把它看做其他的类型。
一般情况下,尽量少的去使用类型转换,除非用来解决非常特殊的问题。 无论什么原因,任何一个程序如果使用很多类型转换都值得怀疑.
标准c++提供了一个显示的转换的语法,来替代旧的C风格的类型转换。
使用C风格的强制转换可以把想要的任何东西转换成我们需要的类型。那为什么还需要一个新的C++类型的强制转换呢?
新类型的强制转换可以提供更好的控制强制转换过程,允许控制各种不同种类的强制转换。C++风格的强制转换其他的好处是,它们能更清晰的表明它们要干什么。程序员只要扫一眼这样的代码,就能立即知道一个强制转换的目的。
1. 静态转换(static_cast) 用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换。
进行向上转换(把派 ...
Linux
gdb详解
一、调试前的准备用gcc编译源程序的时候,编译后的可执行文件不会包含源程序代码,如果您打算编译后的程序可以被调试,编译的时候要加-g的参数,例如:
1gcc -g -o book113 book113.c
在命令提示符下输入gdb book113就可以调试book113程序了。
1gdb book113
二、基本调试命令
命令
命令缩写
命令说明
list
l
列出源码,根据源码指定行号,设置断点
set args
设置主程序的参数。例如:./book119 /oracle/c/book1.c /tmp/book1.c设置参数的方法是:gdb book119(gdb) set args /oracle/c/book1.c /tmp/book1.c
break
b
设置断点,b 20 表示在第20行设置断点,可以设置多个断点。
run
r
开始运行程序, 程序运行到断点的位置会停下来,如果没有遇到断点,程序一直运行下去。
next
n
执行当前行语 ...
Linux
Vim/Vi常用命令总结
一、是什么VI 是Unix操作系统和类Unix操作系统中最通用的文本编辑器。
VIM编辑器是从 VI 发展出来的一个性能更强大的文本编辑器。可以主动的以字体颜色辨别语法的正确性,方便程序设计。VIM与VI 编辑器完全兼容。
二、创建/打开文件vim 文件名
打开一个文件,如果文件不存在,将会自动创建它。
示例:
vim book.c
三、vim的三种模式vim 有三种模式,命令行模式、插入模式和替换模式,在命令行模式下,任何键盘输入都是命令,在插入模式和替换模式下,键盘输入的才是字符。
插入模式和替换模式也合称为编辑模式。
四、vim的常用命令Esc 从编辑模式切换到命令行模式。
i 在光标所在位置前面开始插入。
a 在光标所在的位置后面开始插入。
o 在光标所在位置行的下面插入空白行。
O 在光标所在位置行的上面插入空白行。
I 在光标所在位置行的行首开始插入。
A 在光标所在位置行的行末开始插入。
k 类似方向键上。
j 类似方向键下。
h 类似方向键左。
l 类是方向键右。
Ctrl+u 向上翻半页。
Ctrl+d 向下翻页 ...
Python
pandas详解
视频教程
1.pandas的常用数据类型1.Series 一维,带标签数组
2.DataFrame 二维,Series容器
2.pandas之Series创建
3.pandas之Series切片和索引
4.pandas之Series的索引和值
5.pandas之读取外部数据我们的这组数据存在csv中,我们直接使用pd. read_csv即可
和我们想象的有些差别,我们以为他会是一个Series类型,但是他是一个DataFrame,那么接下来我们就来了解这种数据类型
==小示例:==
现在假设我们有一个组关于狗的名字的统计数据,那么为了观察这组数据的情况,我们应该怎么做呢?
123import pandas as pddf = pd.read_csv('./dogNames2.csv')print(df)
==效果展示==
6.pandas之DataFrame
DataFrame对象既有行索引,又有列索引
行索引,表明不同行,横向索引,叫index,0轴,axis=0
列索 ...
C++
const修饰指针的三种情况详解
今天突然脑袋发热,对const修饰指针有点模糊,特此记录,方便复习const修饰指针有三种情况
const修饰指针 — 常量指针const修饰常量 — 指针常量const即修饰指针,又修饰常量示例:
1234567891011121314151617181920212223242526int main() { int a = 10; int b = 10; //const修饰的是指针,指针指向可以改,指针指向的值不可以更改 const int * p1 = &a; p1 = &b; //正确 //*p1 = 100; 报错 a = 100; //a的值还是能修改 cout << *p1 << endl; //const修饰的是常量,指针指向不可以改,指针指向的值可以更改 int * const p2 = &a; //p2 = &b; //错误 *p2 = 100; //正确 //const既修饰指针又修饰常量 const int * const p3 = &a; //p3 ...