
Linux
文章平均质量分 77
风掣长空
这个作者很懒,什么都没留下…
展开
-
信号量和线程池
但对于长时间的任务,比如一个Telnet连接请求,线程池的优点就不明显了。况下,将产生大量线程,虽然理论上大部分操作系统线程数目最大值不是问题,短时间内产生大量线程可能使内存到达极限,出现错误.死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所占有的不会释放的资源而处于永久等待的一种状态。1. 需要大量的线程来完成任务,且完成任务的时间比较短。POSIX信号量,用与同步操作,达到无冲突的访问共享资源目的,POSIX信号量可以用于线程间同步。等待信号量,会将信号量的值-1。原创 2024-11-11 11:54:44 · 1376 阅读 · 0 评论 -
线程ID和线程库
在linux中,线程的运行可以用lwp来标识,只是操作系统的标识方法,lwp表示轻量级进程,在Linux中,进程和线程都可以用lwp来标识,而对于用户来说,也有对应的线程ID,原创 2024-11-04 23:22:29 · 330 阅读 · 0 评论 -
linux线程的认识
线程是一个进程内部的控制序列每个进程都至少有一个线程线程在进程内部运行,本质上是在进程地址空间运行通过进程虚拟地址空间可以看到进程的大部分资源,将进程资源合理的分配给每个执行流,就形成了线程执行流。原创 2024-11-02 23:11:29 · 645 阅读 · 0 评论 -
信号的保存和处理
我们先看看进程的虚拟地址空间,每个进程都会有一份pcb结构体,在linux在叫做task_struct,然后task_struct中储存着一个数组,叫做虚拟地址空间,虚拟地址空间中有用户空间和内核空间,用户空间通过页表与物理地址进行映射,而内核空间通过内核级页表与物理地址映射,内核级页表一般只需要维护一份就够了,其他进程的内核空间也可以通过这一份内核级页表进行映射,可以说,OS本身就在进程的地址空间中,但是我们访问内核空间需要受到一定限制,就是使用系统调用访问内核,进程从内核态返回到用户态的时候处理信号。原创 2024-10-30 22:15:19 · 916 阅读 · 0 评论 -
信号的理解
信号处理有三种:默认动作,忽略动作,自定义处理 大多数进程的默认动作是终止进程,但也有一些信号的处理是忽略,忽略动作就是对该信号忽略,自定义处理就是对于该信号,用户自己定义一个处理方式。这段代码,但我们执行ctrl+c时,相当于向进程发送了2号信号,然后通过signal函数,执行函数,get a sig: 2。自定义处理,就是利用signal函数,捕捉到信号发出,然后执行该信号所对应的动作,这个动作是用户自己设定的。从1号到31号是普通信号,剩下的都是实时信号,我们只考虑普通信号,剩下的不考虑,原创 2024-10-28 11:39:16 · 316 阅读 · 0 评论 -
命名管道和共享内存
system V 共享内存是一种进程间通信(IPC)机制,他允许多个进程共享一个给定的内存区域,这种通信方式非常高效,因为数据直接在进程间传递,无需数据复制,从而提高了数据传输的效率。管道应用的一个限制就是只能在具有共同祖先的进程间通信,如果我们想在不相关的进程之间交换数据,可以使用FIFO文件来做这项工作,它被称为命名管道,命名管道是一种特殊类型的文件。mkfifo函数可以创建明明管道,第一个参数是指定路径的文件名,第二个参数是创建管道文件的权限。命名函数由mkfifo函数创建,打开用open。原创 2024-10-27 10:44:04 · 320 阅读 · 0 评论 -
进程间通信——管道
我们可以使用pipe()系统来调用管道,一旦管道被创建,一个进程就可以在fd[1]上写数据,另一个进程在fd[0]上读数据,当我们打开一个文件时,会获得这个文件的fd,当我们以不同的方式打开同一个文件,我们会获得两个fd,但是都指向同一个文件。对于父进程,我们要关闭他的写进程,因为父进程只能读取数据,对于子进程,我们要关闭读进程,因为子进程只能写入数据。进程之间需要摸某种协同,协同的条件是通信,而通信也是有类别的,有通知就绪的,传递数据的,控制相关信息等等,这是一个简单的子进程写数据,父进程读数据,原创 2024-10-20 16:14:06 · 328 阅读 · 0 评论 -
软硬连接和动静态库
软连接和硬链接是两种不同的文件链接方式,他们提供了不同的方式来引用文件系统中的文件软连接:ln -s 要连接的文件路径+名称 链接文件名,类似于windows中的快捷方式link_mytest.txt就是一个链接文件,他存放的是指向文件的路径,如果我们把指向的文件删除,那么链接文件也就会失效了,硬链接:硬链接不是一个单独的文件,他本质是文件名和inode的一个映射,因为他的inode号和链接文件是一样的,当我们删除链接文件时,硬链接文件还可以使用,因为我们文件的inode号还在,还可以用。原创 2024-10-17 17:48:00 · 563 阅读 · 0 评论 -
文件系统理解
inode table:每个文件都有一个inode号,Linux中文件的属性是大小固定一个集合体,struct inode结构体用来储存文件属性,要找到一个文件,就要找到文件的inode号,inode号是以分区为单位的,也就是说,在一个分区中,inode号是唯一的,而inode table存放的就是文件的inode号,目录文件=属性+内容,我们知道,一个目录下不能有同名文件,查找文件的顺序是先有文件名,再找到inode号,所以是通过文件名来映射inode号,那么,我们inode编号是怎么来的呢?原创 2024-10-13 17:36:11 · 465 阅读 · 0 评论 -
stderr和磁盘理解
发现stdout打印到log.txt了,但是stderr还是打印到显示器上,因为我们重定向的是把文件标识符1给log.txt,而stderr的文件标识符是2,所以不影响,还是打印到显示器上,有了扇区对应的下标,我们就可以在磁盘中找到对应的文件了,对于操作系统来说,和磁盘交互时的基本单位是4KB,也就是8个连续的扇区,这8个连续的扇区称为块,磁盘,放在磁盘的文件就叫做磁盘文件,那么如何在磁盘中存储文件呢?磁盘读写的基本单位是扇区,大小一般是512字节,如何找到一个指定位置的扇区呢?原创 2024-10-13 17:35:35 · 540 阅读 · 0 评论 -
重定向的本质
会发现,本来应该打印到显示器上的内容,打印到文件"myfile"里面了,这是因为我们关闭了文件描述符1,然后打开一个文件,myfile的文件描述符就是1,所以,printf默认是向stdout输出的,但是stdout指向的文件描述符是1,所以就打印到myfile文件中了,这种现象叫做重定向输出。会发现fd是0或者2 ,可见文件描述符的分配规则是找到当前没有被使用的最小的一个下标,作为新的文件描述符,当我们打开一个文件,他的fd是3,因为0 1 2 已经被占用了,当我们关闭0 和 1 ,再看这段代码。原创 2024-09-29 13:01:24 · 336 阅读 · 0 评论 -
文件标识符fd
..:如果我们第二个参数使用了O_CREAT,那么第三个参数表示创建文件的权限,它通常与umask相结合来确定文件的最终权限,比如umask为0,第三个参数设置成0666,表示文件权限是rw-rw-rw-,我们用“w"的方式打开log.txt文件,如果这个文件不存在,就创建这个文件,如果文件存在,就把这个文件内容清空然后打开。我们理解了,每一个文件标识符标识一个文件,那么fd 0 1 2 的文件默认被打开了,是什么文件呢?打开文件的本质是进程打开文件,文件没有被打开时,在磁盘中。1:标准输出 显示器。原创 2024-09-17 18:08:52 · 1088 阅读 · 2 评论 -
编写myshell
shell的解释器本质就是一段代码,用来解释不同的指令,然后做做出相同的操作,下面我们自己编写一个简易的shell。原创 2024-09-16 19:18:52 · 192 阅读 · 0 评论 -
进程程序替换
可以看到,进程在运行到一半,最后一句的printf没有执行,这是为什么呢?因为程序被替换了exec*系列的函数,可以替换当前的程序,进程的程序替换,本质上还是那一个进程,进程不变,但是进程里的程序变了,要是把代码改成多进程版本,让子进程替换,那么父子共享的代码和数据,都要进行写时拷贝。原创 2024-09-16 19:17:47 · 626 阅读 · 0 评论 -
进程控制管理
进程出异常,本质上是操作系统给进程发出信号,一旦异常退出,退出码就没有意义了,要看操作系统给进程发出的退出信号,退出信号可以表示进程为什么异常退出,比如一个死循环的进程,我们可以用kill -9 进程pid 来向进程发出终止信号,那么进程就会异常退出,退出信号就是9,任何子进程,在退出时都要等待被父进程回收,子进程的代码和数据先释放,task_struct保留退出信息,等父进程回收,在这个过程中子进程处于Z状态,参数:输出型参数,获取子进程退出状态,如果不关心,可以设置成NULL,原创 2024-09-15 15:48:38 · 724 阅读 · 0 评论 -
程序地址空间
在操作系统内部,会有虚拟地址空间,通过页表的映射,访问物理内存空间,由于子进程拷贝的是父进程的数据,所以同一份代码,父子进程是共享的,当子进程要修改g_val的值时,又为了不影响父进程对g_val的使用,就有了写时拷贝,子进程会把父进程的很多数据结构都拷贝一份,包括虚拟地址空间,本质上虚拟地址空间也是一个结构体,当操作系统发现子进程的要更改的数据和父进程指向的数据冲突了,才会进行写时拷贝,在物理内存上开辟g_val的空间,子进程通过页表映射的物理内存地址也就和父进程页表映射的g_val的地址不一样了,原创 2024-09-15 15:47:37 · 939 阅读 · 0 评论 -
进程优先级和环境变量
命令行中启动的程序,都会变成进程,其实都是bash的子进程,父进程的数据,默认对于子进程是能看到并访问的,但是子进程的后续修改,对于父进程是看不到的,系统中的很多配置,在我们登录linux系统的时候,就已经被加载到bash进程中(内存),最开始的环境变量在配置文件中,然后被加载到bash中,nice的调整是有限制的,修改范围位[-20,19],而且每次调整优先级,PRI的值都是从80开始的,避免修改叠加。cpu资源分配的先后顺序,就是指进程的优先级,linux中进程的优先级数字越小,优先级越高;原创 2024-09-14 23:05:59 · 1404 阅读 · 0 评论 -
进程的基本概念
数据要在计算机结构进行传输,从一个设备到另一个设备,本质上是数据的拷贝,设备之间的拷贝效率决定了计算机的整体效率,当我们运算数据时,CPU直接从储存器读取数据,减少了数据从输入设备到CPU的传输时间,如果没有了储存器,直接从输入设备直接把数据传给CPU,那么CPU的运算效率远远大于输入设备的传输效率,这样计算机的整体效率就取决与数据传输的效率,就很慢了,所以这就是冯诺依曼的优秀之处。我们直接在命令行里启动的进程,他的父进程是bash,bash会自动回收结束的进程, 所以不会产生僵尸进程,原创 2024-09-14 23:04:44 · 1053 阅读 · 0 评论 -
git的使用和gdb工具
程序的发布模式有两种,debug和release,我们一般调试代码是用debug模式,由于gcc/g++编译出来的二进制文件默认是release模式,所以我们需要在后面加上-g选项,使其变成debug模式。gdb具有记忆功能,可以自动记忆上一个命令,点击回车可以执行下一个命令。disable/enable 断点编号:可以打开/关闭断点。list/l 行号/文件名:可以打印出代码在屏幕上。display 变量编号:可以把变量长显示在屏幕上。b 文件名/行号:在第几行打印断点。gdb 文件名:打开gdb工具。原创 2024-09-07 22:39:11 · 508 阅读 · 0 评论 -
linux编译器——gcc/g++
g++ -o mytest test.cpp 被执行,当我们再次make时,由于test.cpp是最新版本,所以他不会再执行了,因为有些函数是别人已经写好了,我们用的时候不用再重新写了,直接拿过来用就好了,这个写好的函数家就在库中放着,所以我们要链接库。make是一个命令,makefile是一个文件,make会根据makefile的内容,完成编译和清理工作,gcc --version 可以查看当前的版本 ,我们默认安装的是4.8.5的版本,比较低,-o指明生成文件的名字,可以自己命名,比如:my.exe。原创 2024-09-07 22:38:27 · 1086 阅读 · 0 评论 -
Linux编辑器——vim的使用
原理:vim并不是直接执行,执行前会读取一些文件,比如.vimrc 我们把需要配置的指令写在.vimrc文件中,然后vim执行时就会读取.vimrc文件,配置一些功能,比如行号,自动缩进,自动补齐,代码提示等等;n+shift+x:可以删除光标之前的一个字符,n:一次可以删除n个,在一行以内。n+x :可以删除光标后面的一个字符,n:一次可以删除n个,在一行以内。:控制光标的移动,字符的输入,删除,复制粘贴等等,有一些相关的指令;n+shift+g=nG:将光标定位到整个文本的任意一行,原创 2024-07-18 20:07:29 · 686 阅读 · 0 评论 -
Linux软件包管理器——yum
在linux下安装软件,一个通常的办法就是下载程序的源代码,编译,得到可执行程序,但是这样比较麻烦,就有人把一些常用的软件提前编译好,做成软件包,这样下载的时候,直接下载软件包,就可以使用的,类似于手机上的app;软件包管理器就类似于下载app的应用商店;yum是Linux下非常常用的一种软件包管理器,主要应用在Fedora,RedHat,Centos等发行版上;原创 2024-07-15 22:43:05 · 216 阅读 · 1 评论 -
Linux权限
Linux严格意义上来说是一个操作系统,我们称之为核心(kernel),但是我们用户一般不能直接使用kernel,而是通过kernel的外壳,也就是所谓的shell,来与kernel沟通,那么为什么不直接使用kernel呢?从技术角度,shell的最简单定义:命令行解释器主要包括:把使用者的命令传给kernel;将kernel处理后的结果返回给使用者;原创 2024-06-26 19:00:32 · 733 阅读 · 0 评论 -
Linux相关指令
在linux中,可以用echo向屏幕中输出字符串:这是向屏幕输出,我们也可以向文件中输出:我们写了一段话 "hello linux",写入log.txt文件中;原创 2024-05-19 21:17:48 · 689 阅读 · 0 评论