Linux
文章平均质量分 95
梦想很美
记录知识点
展开
-
Linux线程
一级页表中每个条目存放的是不同二级页表的起始地址,找到对应的二级页表后,在通过11-20位找到它在二级页表中对应的位置,二级页表中每个条目存放的是它在物理内存中对应的起始地址即找到对应的页框,而物理内存中每个页框大小为4KB,我们再通过21-32位,计算出虚拟地址在该页框中的偏移量。如果进程切换就要重新加载数据(页表和虚拟内存等),且CPU中通过cache来存储缓存的数据,如果是进程间的切换就要重新缓存,并将数据由冷变热,而线程之间的切换,数据基本是不变的,因此不用再重新热数据。不让相同的数据加载两份呢?原创 2023-12-22 17:01:14 · 1011 阅读 · 0 评论 -
Linux进程信号
它的参数act是一个s指向用户区的sigaction结构体(函数名和结构体名允许同名),该结构体存储的是我们在处理该信号时要怎么做的数据,其中成员sa_handler指向处理动作函数,成员sa_mask是一个阻塞信号集,当接收到sigaction第一个参数对应的信号时,sigaction函数就会把用户区的sigaction结构体数据添加到系统内核,接收到的这个信号会自动添加到阻塞信号集,我们要是想阻塞其它信号就直接将对应的信号添加到成员sa_mask信号集即可。原创 2023-12-03 18:30:24 · 142 阅读 · 1 评论 -
Linux进程通信之共享内存
key是一个数字,这个值是随机的,关键是这个随机数在内核中具有唯一性,可以让他对不同的进程拥有唯一的标识,第一个进程创建出key之后,后面的进程只要有了这个key,就可以拿着这个key去和其它进程进行共享内存了。但是此时会有一个问题,就是共享内存对于不同进程而言不是同步的,即写进程还没写,读进程就从共享内存中读,此时读到的为空,或者上次的,就一直在那打印,因此我们要让进程同步,等写进程写入了,读进程才开始读,这里举个例子,我们可以通过管道来实现进程同步,因为read函数,如果没有读取到就会一直等待。原创 2023-11-23 19:22:25 · 71 阅读 · 0 评论 -
Linux进程间通信之匿名管道
我们知道当一个进程要执行一个事情时,一般它会创建一个子进程,并把这件事交给该进程让它去完成,现在我们有若干个任务要去让这个进程去完成,因此该进程就要去创建多个子进程,让他们分别去完成这些事,但是像这种每一次都要创建子进程的过程是很浪费时间的,操作系统是不会允许这种影响效率的事情发生的,那么我们要怎么提高效率呢?管道共享更确切的说应该是缓冲区共享,我们先来理解一下fork函数,一个进程fork出了子进程,两个进程之间的代码是共享的,数据是独有的,当其中一个进程的数据发生改变时,就会发生写时拷贝。原创 2023-11-19 13:28:58 · 83 阅读 · 0 评论 -
Linux动静态库
动静态库其实在使用上基本类似,不同点是静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。原创 2023-11-16 15:55:03 · 72 阅读 · 0 评论 -
Linux文件系统
我们经常听说分区,那么什么是分区呢?其中block[num]数组索引是分级的,比如当num等于15的时候,前12个存放的是一级索引,也就是存的数据块的编号里面放的就是数据,后面两个是二级索引,意思就是他存的数据块编号里面存的不是数据,仍然是多个数据块编号,最后一个放三级索引,就是二级索引里面存的也是多个数据块编号而不是数据,这样做的目的就是为了能够存储更多的数据,而不被写死导致最多只能存放15个块数据。},结构体里面存的是inode编号对应文件的属性,比如修改时间,所属组,权限,文件类型,引用计数,原创 2023-11-10 15:01:22 · 173 阅读 · 0 评论 -
Linux重定向和缓冲区
缓冲区分为内核缓冲区和应用层缓冲区,对于库函数会先把数据写入到应用层缓冲区,而系统调用一般是直接写到内核缓冲区,当写到应用层缓冲区又会分三种情况:直接刷新,行刷新,全缓冲。直接刷新就是不在应用层缓冲区等待,只要是有数据就直接刷新到内核缓冲区,对于行刷新就是只要遇到\n就向内核缓冲区进行刷新,全缓冲就是等缓冲区写满了才向内和缓冲区进行刷新。对于向屏幕打印时采用的是行缓冲,向文件写入时采用的是全缓冲对于fflush函数就是直接刷新向内核缓冲去写入,因此我们可以断定,该函数一定在底层会调用write函数。原创 2023-11-09 14:26:42 · 132 阅读 · 1 评论 -
深入理解IO底层
mode有模式的意思,用于设置要被创建的这个文件的权限,如果要被写入的文件已经有了,则这个参数就不没用了,上述代码中我们也用到了权限掩码umask,它默认是0002,我们在创建时给的参数是0446,如果想要结果就是0446,那么就需要把这个掩码改为0000,我们有两种做法,一种是改变整个环境的掩码,另一种就是改变该进程中的掩码,上面函数中设置的umask(0)就是只在这个进程中有效。传递的参数fd,其实就是文件描述符,而文件描述符中0,1,2分别对应的就是标准输入,标准输出,标准错误。原创 2023-11-06 10:22:26 · 63 阅读 · 0 评论 -
Linux进程等待
在进程回收等待的过程中,有两种方式,一种是阻塞式等待一种是非阻塞式等待,阻塞式等待,如果该进程未执行完退出,就等到该进程退出,非阻塞式等待,如果该进程还在运行,就不再等待该进程完成。进程在退出时,会返回退出码,而这个退出码一般是交给父进程,让关心它的父进程知道他办的事情怎么样了,在上述过程中我们一直都是使用echo $?当终止信号为0时,则表示正常终止,此时查看退出状态信息,这里的退出状态信息时可信的,当终止信号不为0时,说明是异常退出,此时就8-15位的退出状态就是不可信的。剩下的部分并没有被使用。原创 2023-11-03 14:25:17 · 55 阅读 · 0 评论 -
Linux进程程序替换
1、函数名中带l,就是要我们以参数列表的形式传递命令行参数2、函数名中带v,就是要我们以指针数组的形式把参数传过去3、函数中带p,说明它会继承父进程的环境变量,因此可只需指明要去替换的可执行程序的文件名即可,函数会自己去找到该文件4、函数名中带e的,需要我们自己自定义设置环境变量,可以自己添加环境变量指针数组传过去,但这会覆盖继承的环境变量,如果想保留继承的环境变量,那么在当前进程putenv()对应的环境变量添加到当前进程的上下文(不会添加到父进程),再用全局变量environ传递过去即可。原创 2023-10-31 16:16:40 · 53 阅读 · 0 评论 -
Linux进程地址空间
2.页表也有一种权限管理,当你对数据区进行映射时,数据区是可以读写的,相应的在页表映射关系就是可读可写的,但是当你对代码区和字符常量区进行映射时,因为这两个区域只是可读的,相应的在也表中的映射关系中的权限就是可读的,如果你对这个区域进行了写,通过页表中的权限管理,操作系统就会直接将这个进程杀掉。上述代码,返回值有两个,因为分别为父子进程的返回值,且父子进程共用同一份代码和数据,这个我们在之前就了解过了,没什么问题,再来看下面的代码,稍加改动。此时可能你还会有些疑问,为什么要有虚拟地址?原创 2023-10-29 11:43:38 · 70 阅读 · 0 评论 -
Linux进程
操作系统是怎么管理进行进程管理的呢?很简单,先把进程描述起来,再把进程组织起来,也就是六个字,原创 2023-10-24 17:30:41 · 133 阅读 · 3 评论 -
Linux基本工具
按[i]切换进入插入模式,按“i”进入插入模式后是从光标当前位置开始输入文件按[a]进入插入模式之后,是从目前光标所在位置的下一个位置开始输入文字按[o]进入插入模式之后,是从当前光标所在行后插入新的一行,然后从行首开始输入文字按[O]进入插入模式之后,是从当前光标所在行前插入新的一行,然后从行首开始输入文字完成到预处理阶段就停下来加选项-E生成的对应文件后缀为.i完成到编译阶段就停下来加选项-S生成的对应文件后缀为.s完成到汇编阶段就停下来加选项-c生成的对应文件后缀为.o。原创 2023-06-13 19:00:33 · 618 阅读 · 3 评论 -
Linux权限
此时我们会发现一个问题,Linux2不仅能够访问Linux1在根目录中创建的共享文件,而且还能删除它,因为它对shared目录有写权限,所以可以删除目录下的文件,即使这个文件是对其用户没有读权限的,因为是否能删除这个文件并不由文件本身决定而是由它所处的目录的写权限决定。第一个字符表示的是文件类型,上面的-和d是两种常见的文件类型,-代表的是普通文件,d代表的是目录文件,除此之外还有管道文件,字符设备文件(例如屏幕等串口设备),软链接(类似Windows的快捷方式),等文件类型。原创 2023-05-20 21:31:57 · 611 阅读 · 0 评论