当前位置:首页 > 内存 > 正文

多线程内存分配怎么避免冲突

  • 内存
  • 2024-08-15 13:24:04
  • 796

一、多线程可以共享什么内存?

同一进程下的线程可以共享以下内容:

1.处理代码段。

进程的代码段又称为文本段,是用来存储指令和运行代码的内存空间。该空间的大小在代码运行之前就已确定。它通常是只读的。一些架构的代码还允许以代码段的形式编写,还可能包含一些只读的常量变量,比如字符串常量等。

2.流程的公共数据。

指每个用户默认交互式卡片渲染首先使用的数据。

3.进程打开的文件描述符。

内核会在每个进程空间维护一个文件描述符表,所有打开的文件都会通过这个表中的文件描述符来引用。

4.信号处理器。

又称通道处理器,是处理信号的设备。

5.进程的当前目录。

它是环境变量的一部分,指的是进程的当前工作目录。

6.进程用户ID和进程组ID。

对于普通用户来说,seteuid和setuid函数的作用是一样的。对于超级用户,seteuid仅更改有效用户ID,setuid更改所有3个用户ID。组ID的情况与用户ID的情况类似。

进程和线程的区别:

进程是具有某些独立功能的程序。对于某个数据集合上的运行活动,进程是一个分配和调度资源的独立系统。单元。

线程是进程的一个实体,是CPU调度和分派的基本单位。它是比进程更小的、可以独立运行的基本单位。线程本身基本上不拥有系统资源,只拥有运行所必需的少数资源(例如程序计数器、一组寄存器和堆栈),但它可以与所属的其他线程共享进程拥有的所有资源到相同的过程。。

一个线程可以创建和销毁另一个线程;同一进程中的多个线程可以并发执行。

进程在执行时拥有独立的内存单元,进程的多个线程共享内存,从而大大提高了程序的运行效率。每个独立的线程都有一个程序执行的入口点、一个顺序执行序列和一个程序的出口点。但线程不能独立执行,必须存在于应用程序中,而应用程序提供了多线程执行控制。

从逻辑上看,多线程的含义是在一个应用程序中,可以同时执行多个执行部分。但操作系统并不将多个线程视为多个独立的应用程序来实现进程调度管理和资源分配。这是进程和线程之间的重要区别。


二、多线程共享内存时存在的问题count是共享变量,同时执行时所有线程处理相同的内存
count++不是原子操作该语句执行时会分解为三个原子操作
获取计数值
添加计数值1
给计数变量赋值
假设计数值为100,两个线程几乎同时输出计数值,加一,然后赋值给计数此时我们得到count变量中的值是101而不是预期的102。此时发生改变,其他线程看不到它,因为另一个线程执行完毕后,CPU需要改变当前线程的上下文并且只有其他线程从内存操作后才能获取数据状态。


三、多线程到底是怎么提速的?这主要是效率问题。
例如,线程A专门读写磁盘文件。与CPU的执行速度相比,CPU基本上可以在0.0001ns内执行一条指令,而读磁盘则需要数百秒。甚至几十ms,相当于数百万个CPU周期,甚至数亿个CPU周期。A读磁盘时,不需要CPU参与。
如果没有多线程,CPU在这里就无法工作。比如此时线程B可用,执行一个计算程序计算555x888=,因为这个程序不需要使用磁盘读取(使用了内存,但是不需要磁盘,只要不使用磁盘读取即可)),不会与A)冲突。现在B可以运行了。
此时A实际上正在执行,但是相对于CPU来说,A并没有使用CPU,CPU认为它没有运行。
效率提高。