Linux操作系统练级干货
文章平均质量分 93
深情码农aron
细水长流,努力幸运共存
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Linux练级宝典->线程安全
我们打印时,是打印的一个内存的值,在我们判断ticket<0时可能当前线程的内存的值是够的,但是突然切换线程,那个线程减到为0后此时切换回原来的线程,此时线程不知道,但是还是进行了--,此时继续更新ticket为-1.别的已经进入判断的线程也不知道,所以出现了负数。对于234而言,认为1的整个操作过程是原子的。1.我们把每个线程的寄存器al的值全都置为0,然后因为此时mutex的值为1,此时交换(这条指令是一条指令所以是原子的),此时有一个线程获取到锁了,其他线程看到的mutex还为0.就继续等待。原创 2025-03-17 12:33:01 · 1260 阅读 · 0 评论 -
Linux练级->信号量
3.信号量:可以更细致的划分被锁划定的临界资源,就像在锁住的临界资源里不同的区域又被上了锁,如果不同执行流要访问不同的临界资源区域,此时使用信号量就不会出现数据不一致情况。我们唯一会出现线程不安全的情况就是,二者在同一个位置的时候。如果套圈,只有两种情况,生产者把容器生产满了,此时消费者还没进行消费,另一种就是消费者消费特别快,已经没有数据了,此时生产者还没生产。第一种情况,生产者生产满了,追到消费者,此时生产者就不能动了,必须等待消费者消费后才能生产,不然就会把之前生产的数据给覆盖了。原创 2025-03-16 13:06:15 · 710 阅读 · 0 评论 -
Linux练级宝典->生产者消费者模型
如上图: 我们生产者生成数据丢进容器中,而消费者之间从容器中拿就好了,就像一个超市,生产者就是批发商,超市进货后就丢在里面了,而消费者就是我们买东西的人了。1.两个条件变量,一个给消费者用一个给生产者用,满了生产者就等待消费者消费,空了消费者就等生产者生产,所以在push 和 pop中都会唤醒对应的进程。相反如果是消费者消费的比较快,那此时就是步调一致的,因为生产者生产的慢,此时queue中没有数据,所以消费者只能等生产者生产一个消费一个。1.当队列为空时,获取元素的操作会被阻塞,直到队列中有元素。原创 2025-03-16 13:05:52 · 644 阅读 · 0 评论 -
Linux练级宝典->多线程
在一个程序里的一个执行流叫做线程(thread),线程是“一个进程内部的控制序列”。一切进程都至少有一个线程线程在进程内部运行,本质是在进程地址空间中运行。在Linux系统中,CPU眼中,看到的PCB都要比传统的更轻量通过进程地址虚拟空间,可以看到进程的资源,这样通过虚拟地址就可以把每个进程资源合理的分给每个线程,形成线程执行流我们知道一个进程(PCB)都有进程控制块(task_struct),进程地址空间(mm_struct)以及页表的建立,虚拟地址和物理地址就是通过页表进行映射的。原创 2025-03-15 07:22:34 · 1165 阅读 · 0 评论 -
Linux练级宝典->进程信号
CPU有一堆寄存器,寄存器中一部分是用来计算的,就比如两个数的计算就是先用两个寄存器把两个数存起来,算出结果后写回寄存器中,除了用来计算外,CPU中还存在一个状态的寄存器,用来标记当前指令执行结果的状态信息,有无进位,有无溢出等等。因为MMU是一种硬件单元,所以就有对应的状态信息,当我们寻找的虚拟地址并没有对应的物理地址说明查找的不属于自己的地址(野指针),此时出现错误,将自己的错误写到自己的状态信息中,然后就可以被操作系统识别到,进而给相对应的进程发送SIGSEGV信号。下图是status的低16位。原创 2025-03-15 07:21:59 · 856 阅读 · 0 评论 -
Linux练级宝典->任务管理和守护进程
每个进程除了进程ID以外,还有一个进程组,进程组就是一个或多个进程的集合同一个进程组,代表着他们是共同作业的,可以接收同一个终端的各种信号,进程组也有其唯一的进程组号。还有一个组长进程,组长进程ID == 进程组ID。组长进程可以创建一个进程组,创建进程,然后终止。:进程组只要还有进程就会存在,和组长进程无关,组长会易主。原创 2025-03-13 14:56:16 · 1169 阅读 · 0 评论 -
Linux练级宝典->进程间通信
进程间通信简称IPC(interprocess communication),进程间通信就是在不同进程之间传播或交换信息。原创 2025-03-13 14:55:23 · 1203 阅读 · 0 评论 -
Linux练级宝典->动态库和静态库
我们知道可执行文件前的4步骤 预编译->编译->汇编->链接例如,我们上面用5个文件组合出了可执行文件。.0文件就是汇编后的文件。我们在最后一步的时候不链接,而是把这些.o文件打包,这样的一堆.o文件组合到一起就是一个库了。原创 2025-03-12 12:31:51 · 1357 阅读 · 0 评论 -
Linux练级宝典->基础IO
我们知道系统在传输数据时是有缓冲区的,这里我们write用的就是系统层面的缓冲区,而另外两个C语言的接口,用的就是C语言的应用层的接口,本来我们的数据打印到显示器采用的是行缓存的策略,然后我们要打印到log.txt就变成了全缓冲,此时就导致我们的数据就一直保存到缓冲区中,然后子进程也过来了,此时两个进程用的同一个缓冲区,在函数结束时,因为二者要改变缓冲区的数据(输出)此时就发生写时拷贝,所以子进程和父进程都打印了一份。可以发现我们屏幕先打印了标准错误的内容,之后在文件中的内容是标准输出的。原创 2025-03-12 12:29:57 · 735 阅读 · 0 评论 -
Linux练级宝典-> 软硬链接
第一排就是他的inode号,我们看到软连接和原文件并不是一个文件,因为inode号不同,而且文件大小也不同,可以看见我们软连接文件特别小只有9字节。对应硬链接来说,和软连接不同,软连接是图标,而硬链接就是原文件的别名,此时二者都代表了这个文件,我们之前软连接删除原文件后,软连接失效,我们可以看看硬链接的结果。就是windows上的快捷图标,这个图标也是一个文件,而且可以通过这个图标直接打开程序这里也是同理:我们生成一个可执行文件并给他生成一个软连接文件试试。1.软连接是一个独立的文件,就是一个图标的意思。原创 2025-03-11 10:37:58 · 335 阅读 · 0 评论 -
Linux练级宝典->进程控制详解(进程替换,fork函数)
WNOHANG:设置以后,本来就是子进程不退出,父进程就一直卡着不动,如果设置了子进程没返回,那就先返回0给父进程,此时给父进程在一个循环里持续获取子进程退出信息,再循环体里父进程就可以继续做自己的事情。我们子进程和父进程是共享一块空间的,为什么不直接给子进程创建新的空间,如果父子进程只有读操作,重新开辟空间copy一份父进程的变量给子进程不是浪费吗?pid,进程地址空间,页表都没变,只有代码和数据变了。当然,这里的整个 子进程的代码数据都变了,所以和父进程就发生了写时拷贝,此时就不会影响父进程的数据了。原创 2025-03-11 10:35:38 · 875 阅读 · 0 评论 -
Linux练级宝典->Linux进程概念介绍
这个分裂的进程,也会被创建出来,所以此时就是两个进程,那代码怎么执行的,当然就是共用一份代码,后面会有进程替换(exec),把子进程的执行逻辑脱离出去执行另一个程序,父进程依旧执行老代码。2.所以使用虚拟空间,实际就是在你时间片期间用多少就给你多少,并且通过映射的规则,我们在上层就不用担心,不同的进程的数据被修改了,因为这是操作系统进行维护的。什么是进程优先级,首先我们知道,我们假设了PCB的管理是一个链表,那除了按顺序取走进程外,如果有突发事件,或者优先级高的任务,此时就有了进程优先级的概念。原创 2025-03-10 16:10:15 · 1278 阅读 · 0 评论 -
Linux练级宝典->Linux环境变量 ,main函数参数的意义
1.环境变量就是可以让系统直接找到指定程序的一个变量。2.这个变量在整个系统就像是一个全局变量。方便每一个程序都能获取3.main函数的三个参数的含义:1.选项个数。2.具体选项的字符指针数组。3.环境变量的字符数组。原创 2025-03-10 16:11:21 · 1130 阅读 · 0 评论 -
Linux练级宝典->Linux进程状态详解,孤儿进程,僵尸进程
先看一张大图,可以看到我们在进入CPU之前,我们的进程是有很多状态的。这个代码是Linux进程状态的全部种类我们知道Linux的PCB进程控制块叫做task_struct.里面中就有一个变量就是存储这个状态的。要怎么查看呢?我们查看进程的详细信息是通过一个指令 ps + 选项的。ps auxps ajx都可以看到对应的进程状态,下面就对进程状态进行详细解释。原创 2025-02-23 13:00:42 · 1013 阅读 · 0 评论
分享