自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 线程概念及线程控制

在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列”所有进程至少都有一个执行线程,线程是进程内部的一个执行流,进程是承担分配系统资源的基本实体线程在进程内部运行,本质是在进程地址空间内运行在Linux系统中,在CPU眼中,看到的PCB都要比传统的进程更加轻量化透过进程虚拟地址空间,可以看到进程的大部分资源,将进程- 资源合理分配给每个执行流,就形成了线程执行流线程是一个执行分支,执行粒度比进程更细,调度成本更低。

2023-10-26 19:27:44 58

原创 线程的互斥同步

比如现在a的值是减到了80,准备将a的值加载回内存,然后保护现场,退出让另一个线程执行,另一个线程看到a值为81,然后继续减,减到40,准备将a的值40加载到内存中,原先把a减到80的线程又回来了,然后它继续执行上次没有执行完的语句,然后a的值又变成了80。:互斥锁可以是公平的或非公平的。通过为每个线程分配独立的栈空间,可以确保线程之间的数据和函数调用不会相互干扰,从而实现线程的隔离性。因此,操作系统为每个线程分配独立的线程栈,用于存储线程的局部变量、函数调用信息和其他线程执行所需的上下文信息。

2023-10-26 19:27:14 63

原创 多线程-生产者消费者模型

它的基本思想是使用一个标志位来表示锁的状态,当线程尝试获取锁时,会不断地检查该标志位,直到标志位为未锁定状态时,线程将标志位设置为锁定状态,表示成功获取到了锁。其次,自旋锁不适用于长时间占用锁的情况,因为自旋等待会消耗CPU时间,对于其他需要执行的任务来说,这是一种浪费。当队列满时,往队列里存放元素的操作也会被阻塞,直到有元素被从队列中取出(以上的操作都是基于不同的线程来说的,线程在对阻塞队列进程操作时会被阻塞)如果信号量的值大于0,表示资源可用,线程或进程可以继续执行,并将信号量的值减1。

2023-10-26 19:26:57 210

原创 Linux下的信号

信号红绿灯,下课铃,闹钟等都是信号,我们是认识这些信号的,在没有收到这些信号之前,我们也知道如果收到了这些信号我们该怎么做进程也是,在没有收到信号的之前,就知道如何处理这些信号如何处理:1.有执行默认动作。2.执行自定义动作。3.忽略可能进程在运行的时候突然就收到了一个信号,所以进程要有记录信号的能力,要将信号记录下来进程可能一次要处理多个信号,所以对于信号,进程需要组织管理起来,就是先描述,在组织查询所有信号我们可以看到没有0信号,31信号之后直接就是34信号,1-31是普通信号,34-64是实时信号

2023-10-18 12:10:44 62 1

原创 进程间通信

shmgetshmatshmdtsemget进程间通信(Inter-Process Communication,IPC)是指不同的进程之间进行数据交换和通信的机制。在操作系统中,进程是独立运行的程序实例,通过IPC机制可以实现进程之间的数据共享、同步和通信,以实现协作和协调。

2023-10-15 10:51:50 48

原创 静态库和动态库

在我们的Linux的服务器下就配置了很多的动静态库,我们平时都在使用c/c++的库,只要包一下头文件就可以使用,头文件提供方法的说明,库提供方法的实现,头文件和库要组合在一起使用,当内存中进程用到的动态库通过页表映射到进程的共享区的时候,进程才能真正的确定库的起始地址,再加上链接得到的偏移量,就可以在进程的pcb的共享区找到库中对应的方法的实现。我们输入的内容有一些语法错误的时候,经常会看见编译器用红色的波浪号提醒,这是因为编译器会将我们的代码去编译,编译的时候就会有报错,然后编译器就返回给我们。

2023-10-15 09:47:29 105

原创 Linux中的文件

而我们重定向打印到文件中,write依旧是写给操作系统,fprintf写到c库的缓冲区中,刷新策略现在是全缓冲了,所以,我们写的内容完全不能将缓冲区写满,fork之前c库中的缓冲区还有内容,所以fork之后,父进程和子进程都会刷新缓冲区,然后父进程或者子进程先刷新,另一个发生写时拷贝,再刷新一次缓冲区,就会有两个fprintf打印了。它是在程序中管理和操作文件的重要概念。我们将标准输出关掉了,并且在它的位置放上了我们自己的文件,这样做,上层不知道,也不关心,上层只认文件描述符,不管文件描述符对应的是谁。

2023-10-15 09:36:41 32

原创 进程控制。

可以看到我们运行了许多次打印的都是0,因为我们第一次使用指令打印的是我们运行的可执行程序的退出码,只后每一次打印都是前一次的指令的退出码,因为指令也是一个可执行程序,这是我们之前讲过的。我们可以看到,这些退出码对应的含义,我们是认识见过一些的,比如说前几个大家想必很熟悉,经常见,系统里这些退出码对应的字符串可能不一样,但是基本都有这些字符串。子进程运行了5秒,这时候都是S状态,之后子进程退出变成Z状态,等了10秒,子进程被回收,只剩下了父进程,然后再等5秒,进程退出,ret就是子进程的pid。

2023-05-13 08:31:52 283

原创 程序地址空间

子进程的pcb是按照父进程来创建的,内容大部分都相同,子进程的mm_struct和父进程的mm_struct相同,都是指向同一个虚拟地址,然后找到同一个物理地址,所以子进程和父进程的数据会一样,然后我们想在子进程中修改数据,这时候操作系统会判定不能修改,所以会给子进程找另一块物理地址给子进程,让它去修改,而没有改变子进程的虚拟地址,就是子进程的页表和父进程的页表储存的kv是一样的,子进程改了物理地址,就是相当于改了k或v,而我们看到的虚拟地址就是没有被改那个k或v。那么我们说的数据区,堆区,栈区怎么理解?

2023-05-13 08:14:23 47

原创 Linux下的环境变量和进程优先级

那么我们还是想要将它变成环境变量,该怎么做呢?我们直接。

2023-05-13 08:03:27 638 1

原创 手写一个简易shell

我们使用库函数fgets获取用户输入的字符串,然后assert断言一下,为什么要强转,是因为release发布版本会删掉assert,编译器会因为没有使用str而发出警告,所以我们强转一下充当使用了。我们在运行cd命令的时候,可以发现我们的路径并没有被切换,这是因为我们使用cd命令时子进程在使用,而进程具有独立性,子进程切换了路径,不影响我们父进程bash。还应该去清楚一下获取的字符串的头和尾的空格,我们是写的简易版,这个我们就不实现了。我们在完善一下子进程的进程替换就写完了一个简易的shell。

2023-05-10 07:33:33 199

原创 磁盘和软硬连接

我们目前学习的都是被打开的文件,文件都在内存之中,那么没有被打开的文件在哪里呢?- - 在磁盘等外设中放着接下来我们来学习下磁盘中的文件的存储。

2023-05-07 18:32:37 204

原创 自己封装一个简单的FILE

我们学习了系统文件,我们可以对系统接口,模仿库,自己封装一个简单的文件接口,FILE。

2023-05-06 22:49:22 82

原创 进程的概念

在操作系统没有引入进程之前,CPU一次只能执行一个程序,所以多个程序只能按顺序执行,而CPU的速度很快,磁盘等IO的速度很慢,就会造成CPU用大量时间等待,这时CPU的利用率很低,为了解决CPU的利用率低的问题,操作系统引入了进程,让多个进程交替着被CPU调度,原先CPU在等待进程执行IO,等待资源的时候,将会换下一个进程调度,让CPU一直运行,提高CPU的利用率。我们的父进程有自己的pcb,代码和数据,而我们的子进程在创建的时候并不是把代码和数据在拷贝一份,而是在内核中再创建一个进程所对应的pcb。

2023-03-25 16:02:25 458

空空如也

空空如也

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

TA关注的人

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