放在前面的话
最近确实有些空闲,分配的功能从一开始的两眼一黑到现在的一上午就能完成,这何尝不是一种进步呢。
该说不说,海康的API问题相比较其他第三方的API还是蛮多的,而且10月份人工客服还会停运,不过到那个时候我也用不到了。
而这篇博客其实也就是汇聚一下笔试的相关知识点。
正文
macOS使用的是unix内核,它其实是unix的一条分支;
而linux其实也是基于unix开发的,也是unix的一条分支,因此macos和linux其实都是基于unix的分支。因此,不能说macos是基于linux开发的。
下面是基于linux开发的常见操作系统,用的较多的包括:红帽RedHat、CentOS、Ubuntu
进程调度的定义:进程调度的主要功能是按照一定的策略选择—个处于就绪状态的进程,使其获得处理机执行。
进程调度是操作系统的核心功能之一,简单来说,它就是合理安排各个程序运行的顺序和时间,使得系统能够高效运转。
局部变量和函数参数存放在栈上
全局变量和今天变量被分配到同一块全局静态区域中
常量存储在常量存储区 ,不允许修改
代码存放在 代码区,不允许修改,但是可以执行
C++中new一个对象是从堆上分配内存 。
希尔排序
希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序。
尔排序中对于增量序列的选择十分重要,直接影响到希尔排序的性能。
希尔排序并不稳定, 相同大小的元素很可能调换原始的先后次序
冒泡排序是两两比较,一轮找出一个最大的,所以叫冒泡。
选择是下标元素和其他未排序的元素比较,一轮找出最大或最小的那个。
软链接与硬链接
符号连接,在计算机领域通常指的是符号链接(Symbolic Link),也称为软链接。它是一类特殊的文件,其主要特点是包含了一条以绝对路径或者相对路径的形式指向其他文件或目录的引用。
- 如果删除的是软链接文件本身(即那个包含指向另一个文件路径的文本字符串的文件),那么软链接将不再存在于文件系统中。但请注意,这并不影响被软链接指向的文件,该文件仍然完好无损地存在于其原始位置。
- 如果删除的是软链接所指向的文件,那么软链接将变得无效。
硬链接是通过inode(索引节点)进行的链接。在Linux系统中,每个文件都有一个唯一的inode号,inode中存储了文件的元数据(如文件大小、创建和修改时间、权限等)和数据块位置信息。硬链接允许多个文件名指向同一个inode号,即多个文件名可以关联到同一个文件的内容。
- 删除一个硬链接并不会影响文件本身的内容,因为inode和文件数据块仍然存在,只要还有其他硬链接指向该inode。
- 只有当最后一个硬链接被删除时,inode和文件数据块才会被释放,文件才会被真正删除。
- 如果删除的是硬链接所指向的原文件(即该文件不是通过硬链接创建的,而是最初的文件),并且还有其他硬链接指向该文件,那么文件本身仍然是有效的,因为这些硬链接仍然指向同一个inode和文件数据块。
- 如果没有其他硬链接指向该文件,那么文件将被删除,所有硬链接都会失效。
在一个进程终止后,其所打开的文件通常不会被系统删除。文件的删除需要由用户或程序通过显式的删除操作来完成。
1 代码段:代码段是用来存放可执行文件的操作指令,也就是说是它是可执行程序在内存中的镜像。代码段需要防止在运行时被非法修改,所以只准许读取操作,而不允许写入(修改)操作
2 数据段:存放程序静态分配的变量和全局变量
3 BSS段:BSS段包含了程序中未初始化的全局变量,在内存中 bss段全部置零。
进程都有自己的虚拟地址空间,把虚拟地址转换为物理地址需要查找页表,页表查找是一个很慢的过程,因此通常使用Cache来缓存常用的地址映射,这样可以加速页表查找,这个Cache就是TLB(translation Lookaside Buffer,TLB本质上就是一个Cache,是用来加速页表查找的)。
由于每个进程都有自己的虚拟地址空间,那么显然每个进程都有自己的页表,那么当进程切换后页表也要进行切换,页表切换后TLB就失效了,Cache失效导致命中率降低,那么虚拟地址转换为物理地址就会变慢,表现出来的就是程序运行会变慢,而线程切换则不会导致TLB失效,因为线程无需切换地址空间,因此我们通常说线程切换要比较进程切换块,原因就在这里。
进程切换需要切换地址空间,而线程切换不需要,这主要是由于进程和线程在内存管理上的根本区别所导致的。
进程与地址空间
-
进程定义:进程是系统进行资源分配和调度的一个独立单元,是程序的一次动态执行过程。每个进程都有自己独立的虚拟地址空间,这个空间是进程运行所必需的,包括代码段、数据段、堆和栈等。
-
地址空间切换:当操作系统进行进程切换时,意味着从一个进程切换到另一个进程。由于每个进程都有自己独立的虚拟地址空间,因此切换进程时必须同时切换其对应的地址空间。这包括更新页表、刷新TLB(Translation Lookaside Buffer,快表)等操作,以确保新进程能够正确地访问其地址空间中的数据和代码。
线程与共享地址空间
-
线程定义:线程是进程中的一个实体,是CPU调度和分派的基本单位,它是比进程更小的独立运行的单位。线程是进程的一部分,因此它共享进程所拥有的全部资源,包括内存和地址空间。
-
无需切换地址空间:由于线程共享其所在进程的虚拟地址空间,因此在同一进程内的线程切换时,无需进行地址空间的切换。线程切换主要涉及的是线程上下文(如寄存器值、程序计数器等)的保存和恢复,以及线程调度相关的操作,这些操作相对于进程切换来说开销要小得多。
所以,进程切换需要切换地址空间是因为每个进程都有自己独立的虚拟地址空间;而线程切换不需要切换地址空间是因为线程共享其所在进程的虚拟地址空间。这种差异导致了进程切换和线程切换在开销和性能上的显著差异。在需要频繁切换执行单元的场景中,使用线程通常比使用进程更为高效。
补充,
在进程切换时,虚拟内存地址本身并不会改变,因为它们是进程代码和数据在逻辑上的表示。然而,由于不同进程拥有不同的虚拟地址空间,因此当从一个进程切换到另一个进程时,实际上是在访问不同进程的虚拟地址空间。
页表是操作系统用于将虚拟地址转换为物理地址的数据结构。每个进程都有自己的页表,它描述了该进程虚拟地址空间中的每个页面与物理内存中页面的映射关系。
在进程切换时,由于涉及到不同进程的虚拟地址空间,因此也需要切换到与该进程相关联的页表。这通常通过更新CPU中的页表基址寄存器(如x86架构中的CR3寄存器)来实现。
TLB是CPU中的一个高速缓存,用于存储虚拟地址到物理地址的映射关系。它的目的是减少CPU访问页表的次数,从而提高地址转换的效率。
当进程切换时,由于页表已经改变,TLB中缓存的旧进程的地址映射关系将不再有效。因此,为了确保新进程能够正确地访问其虚拟地址空间,通常需要刷新或清空TLB。这样,当新进程访问其虚拟地址时,CPU将重新从页表中查找对应的物理地址,并将其存储在TLB中以供后续快速访问。
简述,
- 虚拟内存地址(逻辑地址)在进程切换时保持不变,但它们指向的物理内存位置会随着页表的改变而改变。
- 页表在进程切换时需要更新,以反映新进程虚拟地址空间与物理内存的映射关系。
- TLB中的缓存项在进程切换时需要被清空或刷新,以确保新进程能够正确地访问其虚拟地址空间。