Linux
文章平均质量分 80
分享Linux相关知识
多米诺骨牌㊫
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Linux多线程(线程池与单例模式)
有一个生产任务的线程将任务传入任务队列中,线程池中的线程从任务队列中拿到任务,并进行处理。当一个线程进入GetInstance函数时,要创建变量,但是被切走了,此时其他线程进入,就会导致线程安全的问题,因此需要进行加锁的操作。单例模式即只让对象在内存中存在一份,即一个类之定义一个对象,对于线程池来说只有一个线程池就够了。因此线程池的定义可以使用单例模式。首先我们需要定义一个静态的线程池变量以及静态的线程池方法,我们使用懒汉模式来实现。因此我们可以类比处线程池的概念,即提前创建一批线程,以便于随时处理任务。原创 2024-11-15 16:54:25 · 730 阅读 · 0 评论 -
Linux多线程(信号量与环形队列)
当生产者和消费者指向同一个位置的时候,队列可能为空也可能为满,因此当队列不为空,不为满的时候生产者和消费者指向的不是同一个位置。使用信号量和环形队列的好处在于,可以让消费者和生产者可以不同时访问同一块临界资源,因此不需要加锁。2.可以定义一个计数器,每放一次就++,每拿一次就--,根据计数器的值来判断队列是否已满。当队列为空时,生产者执行,队列未满时,消费者执行,这也体现了局部上的同步特性。生产者关心的是环形队列中空的位置,消费者关心的是环形队列总的数据。即销毁信号量,参数为要销毁的信号量。原创 2024-11-15 08:58:42 · 1031 阅读 · 0 评论 -
Linux多线程(线程同步与条件变量)
生产者和消费者两个线程并行执行,当消费者要消费数据的时候要访问临界资源,需要先加锁,在访问临界资源时,发现目前还没有数据,此时在full的条件下等待。pthread_cond_wait是线程等待函数,它的第一个参数是一个条件变量类型,类型为pthread_cond_t.它的第二个参数是一个锁的类型。此时五个线程都在条件变量cond处等待,当master线程调用pthread_cond_signal信号,唤醒在cond处挂起等待的一个线程的时候,该线程开始执行,由于是while循环,因此再挂起等待。原创 2024-11-12 21:43:21 · 684 阅读 · 0 评论 -
Linux多线程(线程互斥与线程锁)
它的寄存器al的数据现在是0,执行交换操作,将内存中mutex的值交换个A的寄存器al中,此时线程A的al值为1,内存中mutex的置为0。当线程A被切换走时(是带着上下文数据1一起被切走的),线程B到来,它的al寄存器中的值为0(线程设置的是自己的上下文数据,互相不冲突),进行交换mutex的值和al寄存器的值(0和0交换),最终B拿到的值是0,发生挂起等待。过了一会,A线程带着它的临时数据1000回来了,它认为tickets的值还是原来的1000,执行减减操作,将值变成了999,此时写回了内存中。原创 2024-11-11 19:32:43 · 786 阅读 · 0 评论 -
Linux多线程(线程的创建,等待,终止,分离)
在OS书籍中,线程的概念通常是这样的:线程是在进程内部运行的一个执行分支(执行流),属于进程的一部分,粒度比进程更加细,更加轻量化。通过这段话我们知道,线程与进程的比是n:1的,在其他的操作系统中,由于线程的数量较多,OS需要对线程管理起来,就会存在先描述,后组织这一方式来管理线程。但是在Linux系统下,并不是这样管理线程的。原创 2024-11-08 21:38:17 · 708 阅读 · 0 评论 -
Linux进程信号的处理
信号的内容有很多,总结起来可以分为三个大方向:信号产生前,信号产生中,信号产生后。信号的产生共有四种方式,分别是由键盘产生,进程崩溃产生,系统调用产生,和软件条件产生。信号产生中要记住三张表以及它们代表的含义。以及处理三张表的各种接口。信号产生后需要了解用户态和内核态,以及进程对信号的检测和处理的"合适时间"所指。以及两个可以修改信号的函数。最后补充了三个概念,分别是可重入函数,volatile关键字以及SIGCHLD信号。原创 2024-10-29 19:53:22 · 1045 阅读 · 0 评论 -
进程通信(SystemV通信方式:共享内存,消息队列,信号量)
1.没有调用read/write等系统调用接口,所以共享内存一旦被创建就会映射到自己进程地址空间,shmat的使用方法就如同malloc的使用方法。不需要任何系统调用接口。2.当client没有启动或者没有进行写入,或者已经写入结束的时候,server还是对共享内存的内容进行读取,读取和写入两者之间并互不相干扰,所以共享内存也是进程通信的方式中最快的。3.共享内存不提供任何同步或者互斥的机制,而是需要程序员自行保证数据的安全。本节主要学习了SystemV的三种通信方式,其中重点学习了共享内存。原创 2024-10-21 10:27:57 · 984 阅读 · 0 评论 -
进程间的通信(管道通信)
进程之间的通信必要的前提是两个进程需要看到同一块资源,并且这块资源不属于任何一个进程而是由操作系统来提供的。当使用管道来进行通信的时候,这块资源表现为一个文件,可以是匿名文件(匿名管道通信),也可以是命名文件(命名管道通信),该文件的特点是在其中的数据不会被刷新到磁盘上。原创 2024-08-26 20:30:15 · 1649 阅读 · 0 评论 -
动态库和静态库(.so/dll,.a/lib)
本文主要讲了关于动静态库的两部分内容,即动静态库的使用与制作。对于动静态库的使用指的是拿到别人写好的动静态库如何加入到自己的项目中来。关于动静态库的制作分为三个步骤:首先将自己所有的源文件编译成.o文件,然后将所有的.o文件进行打包,静态库使用ar -rc来进行打包,动态库使用gcc shared来进行打包。最后将.a和.so文件和头文件包含在一起最后形成一个完整的动静态库。原创 2024-08-26 08:53:28 · 814 阅读 · 0 评论 -
文件操作的底层原理(文件描述符和缓冲区)
我们对文件进行操作就需要打开文件,而打开文件是由某一个进程来完成的,打开文件的本质是将文件信息加载到内存中,而一个进程可以打开很多个文件,如果有很多进程,那么内存中就存在很多的已经打开的文件的信息。此时我们将stdin的文件关闭,打开了一个新文件log.txt,它的文件描述符按顺序被设置为0,fgets函数看似是将stdin的内容拿过去,实际上默认将文件描述符为0的文件内容拿到了line中,最终打印的内容就是log.txt 的内容。用户缓冲区的数据最终刷新到系统中,系统缓冲区的数据最终刷新到硬件上。原创 2024-08-25 16:03:10 · 909 阅读 · 0 评论 -
文件操作的底层原理(inode与软硬链接,文件的时间属性)
建立文件,首先操作系统在InodeBitmap和BlockBitmap分别找到不为1的数字,将其下标作为该文件的Inode和block的编号。并将之置为1,其中Inode只有一个,block可以有多个。原创 2024-08-25 20:15:40 · 718 阅读 · 0 评论 -
vim操作手册
n+shift+x=X:删除光标之前的一个字符,可以一次删除n个 一行内。n+p:粘贴,当前光标的下一行 n:表示把指定内容粘贴n次。ctrl+v,hjkl区域选择,j,shift+i=I //esc*2。n+x:删除光标后续的一个字符,可以一次删除n个 一行内。n+r:对光标指定的位置,进行一个字符的替换,可以一次替换多个。n+yy:复制当前行 n:连续复制n行。n+shift+g=nG:将光标定位到整个文本的任意一行。原创 2024-05-26 09:26:39 · 436 阅读 · 0 评论 -
gdb调试常见指令
until/ until 指定行号:跳转至指定行。不带行号和next差不多,如果当前处于循环函数之中,则运行到循环函数为止;display:a &a 使用一次print命令只会打印一次变量的值,使用一次display会多次打印该变量的值。continue:c 当程序在某一断点处停止后,用该指令可以据徐执行,直至遇到断点或者程序结束为止。disable/enable 断电编号:使能(关闭,打开)断点。list/l:l 文件名:行号/函数名,l 行号/函数名。b:b 文件名:行号/函数名,b 行号/函数名。原创 2024-06-03 20:49:00 · 371 阅读 · 0 评论 -
Linux进程管理---进程的状态(R,S,D,T,t,X,Z)
因此进程还需要等待,此时操作系统发现这个进程在等待,如果将其干掉,显然是不合适的,因为,磁盘需要将读写成功与否的信息返回给该进程。运行后我们发现处于S+状态,这是因为printf是对外设--显示器进行打印的,而显示器比较慢,等待其就绪是需要时间的,因此test大部分时间处于S+状态,只有少部分时间处于R状态。千万不要以为进程只会等待CPU的资源,进程有可能因为运行需要,可能会在不同的队列中,在不同的队列所处的状态是不同的。CPU在处理run_queue的时候,所有在排队的进程,都处于R状态的。原创 2024-08-11 21:52:04 · 1770 阅读 · 0 评论 -
Linux进程管理---进程优先级,环境变量与命令行参数
环境变量一般是指操作系统中用来指定操作系统运行环境的一些参数,比如,我们在编写C程序的时候,在链接时,从来不知道我们的所了解的动静态库在哪里,但是仍然可以连接成功,生成可执行程序,原因就是相关环境变量帮助编译器进行查找。这是因为优先级是一个相对的概念,操作系统设定优先级的目的是让进程合理的享受到CPU的资源,如果将进程优先级设得过小或过大,就会出现又进程无法享受到CPU资源的问题,造成“进程饥饿”。当我们使用不同的用户登录系统时,会发现我们的初始目录是该用户的根目录,这是因为HOME环境变量来决定的。原创 2024-08-16 15:38:54 · 1059 阅读 · 0 评论 -
Linux进程替换
进程运行起来时,它的代码和数据是要被加载到内存中的,是通过exec系列的函数来完成加载的。exec系列函数一共有七个,我们可以通过man手册来进行查询:通过观察这几个函数我们发现它们都是在exec后面加入了几种后缀名。可以通过后缀名的含义来进行区分记忆。l:表示参数采用列表(以列表的方式一个一个传入进去)。v:参数用数组。p:有p自动搜索环境变量PATH(只要说名字就可以了,不用指明路径)。e(env):表示自己维护的环境变量。(不用默认的环境变量)。原创 2024-08-18 07:13:56 · 955 阅读 · 0 评论 -
Linux进程管理---进程地址空间
上文中提到了,页表中除了会有虚拟内存和物理内存的对应关系,还会有权限管理,当我们写C语言程序的时候,定义的字符串常量是只读的,当我们要对其进行写操作的时候会发生报错。我们知道在进程创建出来的时候,页表也会随之被创建,每一个虚拟地址对应的内存空间是限定死的,所以无论怎么对虚拟内存进行操作,它也不会更改其他进程的代码和数据。我们惊奇地发现,在没修改g_val的值之前,代码一切正常,但是修改之后g_val的地址是没有变化的,但是它的值在两个进程中却是不一样的。有人会说了,直接让进程对物理内存进行操作不香吗?原创 2024-08-16 17:39:24 · 731 阅读 · 0 评论 -
linux基本指令
"..":用来表示上级路径,(可以方便我们进行路径的回退,毕竟,不光能要进去,也要能出来)".":用来表示 当前路径,(可以方便我们找到当前目录下的一个文件(可执行文件)两个路径分隔符之间一定是一个文件夹,在最后一个分割符的末尾一定是一个文件。mkdir+空格:在当前路径下,创建一个新的文件夹。touch:在当前目录下,创建一个新的普通文件。在linux中以“.”开头的文件叫做隐藏文件。linux 的任何目录下都有两个隐藏目录。/:linux的路径分割符。ls:查找当前路径下的文件。pwd:查找当前路径。原创 2024-04-24 15:01:24 · 134 阅读 · 0 评论 -
Linux基本知识(1)
目录:src直接拷贝到这个目录下了,拷贝目录要加-rf。1.指令本质都是程序 --- 指令、程序、可执行程序都是一回事 指令就是程序。(1).mv:将指定的目录下的文件或者目录,"剪切"到指定的目录下。cat code.c #本质是显示文件内容,上面是显示文件属性。4.alias 也是一个Linux命令,给其他命令起一个别名!(2).不仅仅要剪切,还要在剪切的同时,顺便进行一下重命名。3.任何一个用户,首次登陆,所处的路径都是自己的家目录。(3).在指定目录下,对一个文件或者目录进行重命名。原创 2024-04-30 08:34:58 · 184 阅读 · 1 评论 -
Linux系统进程退出与等待
这段代码的目的是:先让子进程运行5s,父进程休眠10s,这就导致了子进程在前5s是运行态,在后5s是僵尸状态(父进程在休眠,无法进行资源的回收)。首先我们要明确,status是反映子进程退出时的状态的,而进程退出有三种情况:正常退出,结果正确;C语言提供了退出码与退出原因对应函数:sterror(i),其中i表示退出码,sterror返回的是i所对应的错误的字符串。注意,我们研究的退出码的范围是第一种和第二种情况,即程序进行正常的退出,当程序由于崩溃而退出时,退出码没有意义。来获得各个进程的退出码。原创 2024-08-17 16:06:29 · 1078 阅读 · 0 评论 -
Linux 基本知识(2)
4.创建一个空文件 >file &&清空一个文件 >file。2.本来应该显示到显示器上的数据,显示到文件中。command >> filename:追加重定向。command > filename:输出重定向。command < filename:输入重定向。">>"(追加重定向):不是在开始时写入。cat 默认是输出从键盘文件中输出文件。">"(输出重定向):1.创建文件。echo:向显示器文件进行写入。|(管道):管道可以集连多条命令。tail:提取文件的尾部。head:提取文件的头部。原创 2024-04-30 21:18:31 · 196 阅读 · 1 评论 -
Linux进程管理--进程概念
进程是一个执行的实例,即正在被执行的程序。我们可以打开win下的进程管理器,里面的内容给就是一个个的进程。由于可能存在大量的进程,操作系统需要对进程来进行管理,管理的方式就是:先描述,再组织。原创 2024-08-09 17:25:46 · 1065 阅读 · 0 评论 -
Linux进程管理--用代码创建进程(fork函数)
通过观察进程编码,我们可以知道下面一个是子进程,上面的是父进程,因为子进程的ppid就是父进程的pid。当父进程有一个数据是100的时候,子进程希望重写这个数据为50,此时操作系统回为其重新开辟一段空间是父进程用原空间100,子进程使用新空间50,通过刚才的man手册,我们知道了fork创建进程的返回值pid_t类型,我们可以暂时理解成int,那么它的值有什么意义呢?当id为0时,表示为子进程,当id>0时,表示父进程,并执行相应的条件语句。注意,子进程的其他数据内容使用的还是和父进程一样的空间。原创 2024-08-09 20:18:07 · 556 阅读 · 0 评论
分享