自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(25)
  • 收藏
  • 关注

原创 Linux信号

sigi <= 31;信号相关的数据字段都是在进程PCB内部-------->>这是属于内核范畴-------->>操作系统处理信号,肯定是执行操作系统的代码------------->>此时处于内核态。CR3寄存器----->>>它里面的某些bite位存储的运行态(其实它是一块空间嘛)-------->>表示当前CPU的执行状态,1内核3用户态(便于理解,1和3)

2023-05-27 21:54:19 99

原创 Linux信号

cout << "父进程:" << getpid() << " 子进程:" << id << \ " exit sig: " << (status & 0x7F) << " is core: " << ((status >> 7) & 1) << endl;void catchSig(int signum) { //cout << "进程捕捉到了一个信号,正在处理中: " << signum << " Pid: " << getpid() << endl;

2023-05-27 21:52:21 109

原创 软硬链接-动静态库

而动态库的话,就相当于原来的代码正常运行,然后呢需要库的的时候,把它加载到堆栈的共享区,在这个过程中,我们的的动态库当然也加载到内存中了。如果我们生成了一个库,势必要编译到到我们的可执行程序中去,可是我们的可执行程序是有自己的地址空间的,那么在这过程中,我们的库只能加载到地址空间的特定位置上,而我们动态库不需要加载到特定的地址空间,每一个动态库被加载到内存,映射到进程的地址空间,映射的位置可能是不一样的但是因为库里面是相对地址,每一个函数定位采用的是偏移量的方式找的。是因为:自己目录名;

2023-05-27 21:52:08 128

原创 进程间通信

匿名管道进程间通信的必要性单进程的,那么也就无法使用并发能力,更加无法实现多进程协同传输数据,同步执行流,消息通知等,不是目的,而是手段,企图实现多进程协同。进程间通信目的数据传输:一个进程需要将它的数据发送给另一个进程资源共享:多个进程之间共享同样的资源。通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止 时要通知父进程)。进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另 一个进程的所

2023-05-27 21:51:35 91

原创 C++缓冲区

什么是缓冲区?就是一段内存空间(有的是语言级别的缓冲区,有的是os级别的缓冲区)缓冲区的刷新策略是一般+特殊:普通:1.立即刷新2.行刷新(行缓冲)\n3.满刷新(全缓冲)特殊:1.用户强制刷新(fflush)2.进程退出缓冲区的目的:提高整机效率,为了提高用户的响应速度。顺丰快递写透模式:WF。成本高,速度慢。(即时刷新)写回模式:WB。成本低,快速(缓冲区)一般而言:行缓冲的设备文件--显示器全缓冲的设备文件--磁盘文件(效率考量)所有的设

2023-05-27 21:50:24 386

原创 C++文件

记录的信息主要有:bolck 和 inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。GDT:块组描述符,这个块 组多大,已经使用了多少了,有多少个inode,已经行用了多少个,还剩多少,一共有多少个block,使用了多少....寻找文件,首先通过inode编号---->>> 找到分区特定的块组(block group)---->>inode---->属性---->内容。

2023-05-27 21:49:49 49

原创 C++/IO

19 //mems 20 //memset(line,size) 21 // fgets -> C -> s(string) -> 会自动在字符结尾添加\0 22 while(fgets(line, sizeof(line), fp)!如果语言不提供对文件的系统接口的封装,所有的访问文件的操作,都必须直接使用OS的接口。导致了不同的语言,有不同的语言级别的文件访问接口(都不一样),但是,都封装的是系统接口。普通文件->fopen/fread -〉你的进程的内部(内存)->fwrite -〉文件中。

2023-05-27 21:48:43 42

原创 shell

首先我们明白的一点是环境变量是一个指针数据,而并不是把我们要增加的那个环境变量的字符串添加到那个字符串中,那在这个程序中我们的环境变量指针其实是指在cmd_line 里的那个环境变量字符串,当第一轮进程export 环境变量之后,我们的输入缓冲区会进行一次刷新,导致原来的那个指针变为空。在环境变量这里,我们发现父进程可以获取到环境变量,但是呢,子进程(替换程序)却无法拿到环境变量?环境变量,是写在配置文件中的,shell启动的时候,通过读取配置文件获得的起始环境变量。. shell执行的命令通常有两种。

2023-05-27 21:47:03 42

原创 进程等待-

/以非阻塞方式等待 // if(res > 0) // { // //等待成功 && 子进程退出 // printf("等待子进程退出成功, 退出码: %d\n", WEXITSTATUS(status));// } // else if( res == 0 ) // { // //等待成功 && 但子进程并未退出 // printf("子进程还在运行中,暂时还没有退出,父进程可以在等一等, 处理一下其他事情?

2023-05-27 21:45:04 49

原创 进程程序替换

程序替换,是通过特定的接口,加载磁盘上的一个权限程序(代码和数据),加载到调用进程的地址空间中!!用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行。调用exec并不创建新进程,所以调用exec前后该进程的id并未改变。exec* 函数本质就是如何加载程序的函数!!(功能就是加载器的底层接口)#include <unistd.h>

2023-05-27 21:44:22 43

原创 负载均衡式在线OJ

OJ_server会负载均衡地去选择后端的编译服务,让我们能够以集群处理能力的方式去对外输出我们的在线OJ服务。当然由于我们系统的需要,我们这些文件必定是临时的,当我们本次代码的相关操作完成之后,我们就需要清理掉相关的文件,这些方法在我们的Comm文件中util提供了相关的方法。其次面对大量的编译运行请求时,我们的后端不可避免会产生大量的文件,那么如何避免产生重复的文件名,我们采用 通过毫秒级别的时间戳和一个自增的id(原子的)来生成唯一文件名。html/css/js/jquery/ajax(了解)

2023-05-26 09:19:46 244

原创 进程创建-

可是一般而言,我们没有加载的过程,也就是说,子进程没有自己的代码和数据!),就要要求CPU必须随时记录下,当前进程执行的位置,所以,CPU内有对应的寄存器数据,用来记录当前进程的执行位置!答案是不需要的,因为有可能子进程就不会用到数据空间,又有可能子进程就只是对数据进行读取操作,不会修改数据,所以创建子进程,不需要将不会被访问的,或者之只会读取的数据,拷贝一份。fork之后,父子进程代码共享,是所有的代码共享,并不是after之后的!回过来,我们就数据而言,在进程创建的时候,我们就需要进行数据的分离吗?

2023-05-25 22:58:42 37

原创 虚拟地址空间

即编译器编译代码的时候,就已经给我们形成了各个区域 代码区 ,数据区...........并且采用的是和Linux 内核中一样的编址方式,给每个变量,每个代码都进行了编址,故在程序编译的时候,每个字段已经具有了一个虚拟地址。本质上,因为有地址空间的存在,所以上层申请空间,其实是在地址空间上申请的,物理内存甚至可以一个字节都不给你!历史上,我们曾经直接访问过物理内存,但是这种方式(直接使用物理内存,物理地址),特别的不安全,因为内存本身是可以随时被读写的!很显然,同一个地址,同时读取的时候,出现了不同的值!

2023-05-25 22:56:51 50

原创 零碎知识点

makefile中的伪对象表示对象名称并不代表真正的文件名,与实际存在的同名文件没有相互关系,因此伪对象不管同名目标文件是否存在都会执行对应的生成指令。根据makefile的功能理解,A选项是正确的。make的执行规则是,只生成所有目标对象中的第一个,当然make会根据语法规则,递归生成第一个目标对象的所有依赖对象后再回头生成第一个目标对象,生成后退出。死代码删除是编译最优化技术,指的是移除根本执行不到的代码,或者对程序运行结果没有影响的代码,而并不是删除被注释的代码。使用shell时,环境变量文件读取。

2023-05-25 22:55:53 54

原创 进程优先级-环境变量

/ } // // if(strcmp("-a", argv[1]) == 0) // { // printf("这个是功能一\n");如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但 是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。如果进程A正在被cpu运行,cpu里的寄存器里面保存着A进程的临时数据!需要强调一点的是,进程的nice值不是进程的优先级,他们不是一个概念,但是进程nice值会影响到进 程的优先级变化。

2023-05-25 22:55:22 61 1

原创 进程状态-僵尸进程-孤儿进程

(大型游戏/登录界面)------------>>>>甚至在最极端的情况下,甚至只有内核数据结构被创建处理来了。------------------>>>那这就是 新建状态。挂起:硬盘中有一个SWAP分区,作用是当内存快不足的时候,操作系统将(长时间的)阻塞状态的进程的代码置换到SWAP分区,为系统腾出一定的内存。---------->>>>当这个进程不再被执行了,如堵塞了,进程和代码被换出了,就叫做挂起了。这里需要注意的一点是:页表映射的时候,可不仅仅映射的是内存,磁盘中的位置,也是可以映射的!

2023-05-25 22:54:44 54

原创 管理-操作系统-PCB-进程

对于内存来讲,加载到内存中的那部分东西,其实就是原来程序(代码和数据)的一个拷贝,cpu并不能进行一个为之有效的管理,故需要一个PCB结构体进行描述,再通过某种数据结构进行管理。系统调用在使用上,功能比较基础,对用户的要求相对也比较高,所以,有心的开发者可以对部分统调用进行适度封装,从而形成库,有了库,就很有利于更上层用户或者开发者进行二次开发。在开发角度,操作系统对外会表现为一个整体,但是会暴露自己的部分接口,供上层开发使用,这部分由操作系统提供的接口,叫做系统调用。PID是当前进程的id。

2023-05-25 22:53:55 273

原创 gdb-冯诺依曼

gcc && g++ 默认形成的可执行程序是release的!list/l 行号:显示binFile源代码,接着上次的位置往下列,每次列10行。print(p):打印表达式的值,通过表达式可以修改变量的值或者调用函数。info(或i) breakpoints:参看当前设置了哪些断点。display 变量名:跟踪查看一个变量,每次停下来都显示它的值。delete breakpoints n:删除序号为n的断点。info(i) locals:查看当前栈帧局部变量的值。

2023-05-25 22:52:56 45

原创 Linux配置-yum-git

yum工具在每次安装指定软件包的时候,都会检测源服务器上的软件包信息,为了便捷不用每次都去搜索软件包信息,因此使用 yum makecache将软件包信息缓存到本地,使用 yum clean all 清理老旧的缓存信息。"el7" 表示操作系统发行版的版本. "el7" 表示的是 centos7/redhat7. "el6" 表示 centos6/redhat6.否则执行step3)否则整个安装过程完成)------------我是分隔符------------------------

2023-05-25 22:51:02 122

原创 gcc-makefile-缓存区

a :最近一次打开时间(由于数据存储在磁盘中,频繁的调用就意味着频繁的修改文件,很消耗时间 的,故它有可能会积累到一定的时间进行修改)动态链接 将库中我所需要的方法(函数)的地址,填入到我的可执行程序中去,建立关联!显示器设备,一般的刷新策略是行刷新,碰到\n,就把\n 之前的所有字符都显示出来!C语言是会给我们提供缓冲区的,根据特定的刷新策略来进行刷新!

2023-05-25 22:50:22 121

原创 权限-vim

(注意,并不是通过减法来实现的,而是通过 起始权限 & ~ umask 实现的 )并且自己删除自己的,而不能删除别人的(w 可以互删的 ,但是不满足条件)我们是如何访问操作系统的呢?esc进入命令模式,ctrl v进入视图模式,hjkl移动选中,I 进入insert模式,输入//,然后esc。写(w/2):Write对文件而言,具有修改文件内容的权限;esc进入命令模式,ctrl v进入视图模式,hjkl移动选中,d,然后esc。gcc是Linux 环境下的一个软件,但是 gcc == Linux?

2023-05-25 22:49:20 70

原创 Linux命令

我们是用来查看我们当前网络链接的。cp指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到此目录中。2. 当第二个参数类型是文件时,mv命令完成文件重命名,此时,源文件只能有一个(也可以是源目录名),它将所给的源文件或目录重命名为给定的目标文件名。(转储特定的文件或者目录到其他的路径下,对一个文件或目录进行重命名)3. 当第二个参数是已存在的目录名称时,源文件或目录参数可以有多个,mv命令将各参数指定的源文件均移至目标目录中。

2023-05-17 21:37:39 107

原创 初始C语言位操作符以及应用分析

作为一位刚刚入门的小菜狗,我经常好奇位操作符有些什么用呢??通过一段时间的学习,我发现在一些问题上如果采用位操作符,处理问题的能力可以得到大幅提升。下面是我小小总结的,希望可以帮助大家更好的理解这些操作符,如果大家对于文章有更好的建议的话,也欢迎提出。这是位操作运算符的基本定义,那我接下来给大家带来我的理解。希望对大家的理解有所帮助。(需要注意的是,这些操作符都是在二进制的形式下进行的)操作符 &它的功能是 1 &1 =1,1& 0 = 0,0 & 1 = 0

2022-04-24 13:30:42 1188

原创 字符串函数多种方式模拟及缺点浅析

各种类型的字符串函数# 求字符串长度## strlen# 长度不受限制的字符串函数## strcpy## strcat## strcmp# 长度受限制的字符串函数介绍## strncpy## strncat## strncmp# 字符串查找## strstr## strtok# 错误信息报告## strerror strlen 字符串已经 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不...

2022-03-26 12:17:28 146

原创 初步认识qsort函数以及利用冒泡排序进行初步模拟

首先初步认识一下qsort 是一个库函数,包含在头文件stdlib.h中作用:基于快速排序算法实现的一个排序函数接下来认识这个函数所需要的参数有四个。接下来分别进行分析。我们发现我们自己需要定义一个比较函数,参数类型为两个指针变量,返回类型为int 。但是为什么这里的指针类型需要定义为void* 类型呢???这里就需要我们明白指针类型的意义。指针类型其实决定了,对指针解引用的时候有多大的权限(能操作几个字节)。void* 可以接受任意类型的指针,但是确定也比...

2022-03-19 20:57:06 1499

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除