当前位置: 首页 > news >正文

网站规划管理系统wordpress阅读量没改

网站规划管理系统,wordpress阅读量没改,陕西做网站的公司电话,私人彩票网站做几年牢文章目录 1.前导知识1.1 虚拟地址空间的堆区1.2 缺页中断1.3ELF文件格式1.4页/页框/页帧/页表/MMU1.5虚拟地址到物理地址 2.初识Linux线程2.1之前所学的进程2.2线程的引入2.3如何理解线程2.4如何理解轻量级进程 3.创建线程3.1pthread_create()函数3.2程序测试3.3Makefile怎么写… 文章目录 1.前导知识1.1 虚拟地址空间的堆区1.2 缺页中断1.3ELF文件格式1.4页/页框/页帧/页表/MMU1.5虚拟地址到物理地址 2.初识Linux线程2.1之前所学的进程2.2线程的引入2.3如何理解线程2.4如何理解轻量级进程 3.创建线程3.1pthread_create()函数3.2程序测试3.3Makefile怎么写 4. 总结线程4.1如何理解线程共享进程的资源4.2线程的优缺点4.3线程的异常 1.前导知识 1.1 虚拟地址空间的堆区 在Linux内核中struct vm_area_struct通常简称为vma是一个核心的数据结构用于表示进程的虚拟内存区域Virtual Memory Area。它描述了进程地址空间中的一个连续区间并包含了与该区间相关的所有信息如该区间的起始和结束地址、访问权限、所关联的页表项等。 struct vm_area_struct的定义位于Linux内核源代码的mm/mmap.h文件中。其字段可能因内核版本的不同而有所变化但通常包含以下一些关键信息 Linux内核源代码 struct vm_area_struct {struct mm_struct *vm_mm; /* 关联的mm_struct */unsigned long vm_start; /* 起始地址 */unsigned long vm_end; /* 结束地址 */unsigned long vm_flags; /* 该VMA的标志例如可读写、可执行等*/struct rb_node vm_rb; /* 红黑树节点 */struct list_head vm_list; /* mm中的VMA双向链表 */struct vm_area_struct* vm_next, * vm_prev; /*双向链表中的前驱、后继节点*/pgprot_t vm_page_prot; /* 页面保护标志 */struct vm_operations_struct *vm_ops; /* VMA操作用于处理堆区的操作*/unsigned long vm_pgoff; /* 文件/设备内的偏移量 */struct file *vm_file; /* 关联的文件 */void *vm_private_data; /* VMA的私有数据 */ };vm_start 和 vm_end表示该虚拟内存区域的起始和结束地址。 vm_flags一个位掩码表示该区域的属性如是否可读、可写、可执行是否私有等。 vm_page_prot表示该区域中页面的保护权限。 vm_mm指向该vma所属的mm_struct的指针mm_struct表示进程的虚拟地址空间。 vm_next 和 vm_prev用于将多个vma链接成一个双向链表这样内核可以遍历进程的整个地址空间。 vm_file如果该区域与一个文件相关联例如通过mmap系统调用映射的文件则此字段指向该文件的file结构。 vm_pgoff如果与文件关联此字段表示文件内的偏移量即该vma在文件中的起始位置。 vm_area_ops指向一个操作集合的指针该集合包含了用于操作该vma的函数指针。 此外还有许多其他字段用于处理更复杂的场景如共享内存、匿名内存等。 在Linux内核中虚拟内存管理是一个复杂的主题涉及到许多不同的数据结构和机制。struct vm_area_struct是这些机制中的一个关键组成部分它使得内核能够高效地管理进程的地址空间并处理与内存相关的各种操作。 vm_area_struct(VMA)是Linux内核中的一个数据结构表示进程虚拟地址空间中堆区的一个内存区域。用于跟踪关于堆区内存区域的各种属性和信息如起始和结束地址、权限、标志以及关联的文件或设备。在进程的虚拟内存空间中堆区通常是一个连续的内存区域但可能会被分成多个vm_area_struct(VMA)结构来管理。 堆空间被划分成多个VMA结构进行管理和使用。 当进程使用malloc()等函数分配内存时内核会根据需要创建一个或多个vm_area_struct结构来管理这些分配的内存区域。每个vm_area_struct结构对应于堆区中的一个内存段它包含了该内存段的起始地址、结束地址、标志等信息。 这种分割堆区的方式可以提高内存管理的灵活性和效率。例如当进程释放部分内存时可以通过修改VMA结构中的vm_start和vm_end字段来缩小内存段的范围以反映释放后的内存空间而不需要重新映射整个堆区。如果释放的内存块与内存段的边界对齐可能会合并相邻的VMA结构以减少内存碎片。 通过vm_area_struct结构内核可以有效地管理进程的堆区包括分配和释放内存、保护内存区域、处理内存映射等操作。 当创建一个新的vm_area_struct结构时内核会将其插入到mm_rb红黑树中以便可以通过起始地址快速查找和访问对应的VMA。同时内核还会将其插入到mmap双向链表的末尾以保持VMA的创建顺序。 图解堆区的管理 OS对进程进行了更细粒度的资源划分 1.2 缺页中断 缺页中断是Linux操作系统中内存管理的一个重要机制。下面是对缺页中断的详细介绍 在Linux中虚拟内存技术被广泛应用使得程序的地址空间可以远大于实际的物理内存。当程序试图访问一个尚未加载到物理内存中的页面时就会发生缺页中断。这是Linux内核为了处理虚拟内存和物理内存之间的差异而引入的一种机制。 具体来说当程序启动时Linux内核会检查CPU的缓存和物理内存看所需的数据是否已存在。如果数据已经存在于内存中那么内核就会直接使用该数据。但如果所需的数据不在物理内存中内核就会触发一个缺页中断。 缺页中断的处理过程包括 中断触发当程序试图访问一个不在物理内存中的页面时CPU会发出一个中断信号给内核。 查找页面内核接收到中断后会开始在硬盘上查找缺失的页面。这通常涉及到文件系统的操作因为页面数据通常存储在硬盘上的某个文件中。 加载页面一旦找到缺失的页面内核会将其从硬盘加载到物理内存中。加载的过程可能涉及将其他页面从内存中移出以便为新的页面腾出空间。 恢复执行页面加载完成后内核会恢复程序的执行并将缺失的页面映射到程序的虚拟地址空间中。 缺页中断的作用在于实现了物理内存的按需分配即只有在真正需要时页面才会被加载到物理内存中。这种机制大大提高了内存的利用率使得Linux能够支持运行比物理内存更大的程序。 此外缺页中断还可以分为主缺页中断和次缺页中断。主缺页中断是指需要从磁盘读取数据而产生的中断而次缺页中断则是当数据已经被读入内存并被缓存起来后从内存缓存区而不是直接从硬盘中读取数据而产生的中断。这种分类有助于更精确地分析和管理内存访问的性能。 总之缺页中断是Linux内存管理中的一个重要机制它使得程序能够在有限的物理内存条件下运行大型程序或处理大量数据并通过优化数据交换和缓存来提高性能。 缺页中断是Linux中内存管理的一个重要机制特别是在处理虚拟内存和物理内存之间的关系时。下面是对缺页中断的介绍包括其重要原理和功能 原理 虚拟内存技术Linux通过虚拟内存技术极大地扩展了程序的地址空间。即使程序的体积超过了物理内存的实际容量它仍然可以运行因为Linux会在内存和硬盘之间进行数据的交换。 数据检查与缓存当程序启动时Linux内核首先会检查CPU的缓存和物理内存看所需的数据是否已存在。如果数据已经存在于内存中那么内核就会忽略它。 缺页的产生但如果所需的数据不在物理内存中那么就会触发一个缺页中断。这意味着内核需要在硬盘上找到这个缺失的页面或称为“页”然后将其加载到物理内存中。 功能 内存管理优化缺页中断允许Linux更有效地管理内存。它确保只有真正需要的数据才会被加载到物理内存中从而提高了内存的利用率。 扩大程序地址空间通过缺页中断和虚拟内存的结合程序可以拥有比实际物理内存更大的地址空间。这使得大型程序或需要处理大量数据的程序能够在有限的物理内存条件下运行。 数据交换与缓存当发生缺页中断时内核不仅会从硬盘读取缺失的页面还会将其缓存到物理内存中。这样在将来需要这些数据时就可以直接从内存中获取而不需要再次从硬盘读取从而提高了数据访问的速度。 此外缺页中断还可以进一步分为主缺页中断和次缺页中断。主缺页中断是指从磁盘读取数据而产生的中断而次缺页中断则是当数据已经被读入内存并被缓存起来后从内存缓存区而不是直接从硬盘中读取数据而产生的中断。这种分类有助于更精确地了解和管理内存访问的性能和效率。 总之缺页中断是Linux内存管理中的一个关键机制它使得程序能够在有限的物理内存条件下运行大型程序或处理大量数据并通过优化数据交换和缓存来提高性能。 1.3ELF文件格式 ELFExecutable and Linkable Format是一种用于应用程序、库和操作系统的二进制文件格式。它是目前主流的可执行文件格式在大多数现代操作系统中广泛使用特别是Linux平台。Windows平台则采用PE/COFF格式。ELF文件格式定义了二进制文件的组织结构和加载方式使得操作系统能够正确加载和运行程序。 ELF文件格式包含了程序的代码、数据、符号表、重定位表等信息。它主要用于存储编译后的程序以便在运行时由操作系统加载执行。ELF文件可以是可执行文件、可重定位文件如.o文件、共享目标文件如.so文件或核心转储文件等。 结构上ELF文件格式可以分为三个部分ELF头部、程序头部表和节头部表。这些部分共同定义了文件的整体结构以及各部分的具体内容。 在编译过程中链接阶段会用到ELF格式的文件。编译生成的中间文件如库文件、可执行文件以及编译中间文件如.a、.o、.s文件等都是ELF格式的文件。在Android应用运行时ELF文件的大部分内容会被映射到内存中以供操作系统加载执行。 总的来说ELF文件格式为操作系统提供了一种标准化的方式来加载和运行编译后的程序使得不同的编译器和链接器可以生成兼容的二进制文件。 可执行程序本身就是按照逻辑地址的方式进行编译的。最终形成的ELF文件将可执行文件分为多个段segment包括代码段、数据段、符号表等。每个段都有自己的属性和对应的内存区域。 运行程序时将代码和数据加载到内存实际加载的就是ELF文件。 ELFExecutable and Linkable Format是一种用于可执行文件、目标代码、共享库和核心转储core dump的标准文件格式常用于类Unix系统如Linux和Mac OS X等。ELF格式具有高度的灵活性和可扩展性并且支持跨平台使用。它支持不同的字节序和地址范围因此不会不兼容某一特定的CPU或指令架构。这使得ELF格式能够被运行于众多不同平台的各种操作系统所广泛采纳。 ELF文件通常分为三种类型 可重定位目标文件这类文件保存着代码和适当的数据用于和其他目标文件一起创建可执行文件或共享目标文件。例如编译的中间产物.o文件就属于此类。 可执行目标文件这是一个可直接执行的文件它规定了exec如何创建一个程序的进程映像。 共享目标文件这类文件保存着代码和合适的数据用于被链接编辑器和动态链接器链接。例如Linux下的.so文件就是共享库文件。 ELF文件的格式和结构非常复杂包含了多种节section和段segment每个节和段都有其特定的用途和含义。这些节和段共同构成了ELF文件的基本框架使得操作系统能够正确地加载和执行其中的代码和数据。 在文化层面ELF格式作为计算机科学和软件工程领域的一部分体现了人们对于软件可移植性、可维护性和可扩展性的追求。通过采用标准化的文件格式ELF使得不同平台上的软件能够更容易地实现互操作性从而推动了软件技术的发展和普及。 请注意对于ELF格式的深入学习和理解通常需要具备计算机科学、软件工程或相关领域的专业知识。如果你对这方面感兴趣建议查阅相关的技术文档、书籍或在线教程以获取更详细和准确的信息。 1.4页/页框/页帧/页表/MMU 在Linux操作系统中页、页框、页帧、页表和MMU内存管理单元是内存管理中的核心概念。以下是对这些概念的简述以及它们之间的联系 页Page 概念页是内存管理的基本单位。在Linux中物理内存被划分为固定大小的连续内存块每个块称为一个页。这种分页机制有助于实现虚拟内存使得操作系统能够更有效地管理和分配内存资源。常见的页大小是4KB、8KB或者更大。物理内存被划分为一系列的页每个页都有一个唯一的物理地址。 struct Page{ } 在Linux内核中struct page是用来描述物理页框的数据结构。每个物理页框都对应一个struct page对象用于管理和跟踪该页框的状态和属性。包括页框是否被占用、页框的引用计数、页框所属的地址空间等。struct page是物理内存的元数据结构。 struct page中的struct list_head lru字段用于将页框链接到LRULeast Recently Used链表中以实现页面置换算法。通过lru字段可以将页框链接到活跃链表或非活跃链表中。 在Linux内核中struct page是用于管理物理内存页的数据结构。Linux内核将整个物理内存按照页对齐方式划分成成千上万个页进行管理而struct page就是为了描述和跟踪这些页的状态及其他属性而存在的。 每个物理页都会对应一个struct page结构体。这些结构体也会占用实际的物理内存因此内核会采用一些优化手段如使用联合体union来减少内存的使用。struct page结构体中包含了大量的字段用于表示页的各种属性如页是否空闲、页是否被锁定、页的类型、页所在的物理地址等。 由于struct page是内存管理的基本单位很多与内存管理相关的操作都是以页为单位进行的比如内存中的page in/page out、swap in/swap out、reclaim和mapping等操作。因此struct page是Linux内核内存管理中使用频率非常高的结构体。 总的来说struct page在Linux内核中起到了至关重要的作用它使得内核能够有效地管理和使用物理内存资源。 页框Page Frame 概念页框通常与页的概念相似它指的是物理内存中的一个固定大小的块。页框是物理内存的划分单位用于存储页的内容在Linux内存管理中页框是用来表示物理内存页的数据结构。整个物理内存的页框通常由mem_map数组表示。 页帧Page Frame 实际上“页帧”和“页框”在大多数上下文中是可以互换使用的术语它们都指的是物理内存中的一个固定大小的块。在某些文档或讨论中可能会根据上下文或特定目的使用其中一个术语但它们在功能上是相同的。可执行程序存储空间磁盘空间的划分单位与页的大小相同。其实就是文件系统中一个数据块的大小(block)操作系统和磁盘进行IO操作的基本单位是4KB。 源代码在编译的时候就会以特定的格式(elf)被编译成以4KB为单位的二进制可执行程序。 页表Page Table 概念页表是一种数据结构用于存储虚拟地址和物理地址之间的映射关系。每个进程都有自己的页表这样操作系统可以将进程的虚拟地址转换为物理地址从而实现对物理内存的访问。页表的存在使得虚拟内存管理成为可能允许程序在有限的物理内存空间中运行较大的程序。页表并不是直接记录虚拟地址和物理地址的一一映射关系而是通过多级页表记录虚拟地址和物理页的映射关系最终需要通过虚拟地址中的页内偏移定位到物理地址。 MMU内存管理单元 概念MMU是一种硬件组件负责在程序运行时执行虚拟地址到物理地址的转换。它是计算机体系结构中的关键部分通常位于中央处理器CPU内部。当程序尝试访问一个虚拟地址时MMU会查找页表找到对应的物理地址并将其传递给系统总线从而实现虚拟内存的透明访问。MMU是内存管理单元Memory Management Unit的缩写是计算机系统中的一个硬件组件。MMU负责虚拟地址到物理地址的转换以及内存访问权限的控制。 MMU通常集成在CPU或者独立的芯片中它是操作系统进行内存管理的重要组成部分。MMU的主要功能包括 地址转换MMU根据虚拟地址的高位部分页表索引查找页表将虚拟地址转换为物理地址。这个过程通常包括页表的查找和页内偏移的计算。 内存保护MMU根据页表中的权限位对访问的虚拟地址进行权限检查。如果访问权限不符合要求MMU会产生一个异常中断程序的执行。 缺页处理当程序访问的虚拟页不在物理内存中时MMU会产生一个缺页异常。操作系统会根据异常处理程序将缺失的页从磁盘读取到物理内存中并更新页表的映射关系。 页面置换当物理内存不足时MMU会根据页面置换算法如LRU将部分页从物理内存置换到磁盘上以释放内存空间。 MMU的存在使得操作系统可以将虚拟地址空间映射到物理内存提供了更大的地址空间和更高的灵活性。同时MMU也起到了保护内存的作用防止程序越界访问或者非法访问内存。 联系 页和页框页帧是物理内存的基本单位用于表示和管理内存资源。 页表则是建立虚拟地址和物理地址之间映射关系的数据结构使得操作系统和程序能够透明地访问内存。 MMU则是实现虚拟地址到物理地址转换的硬件机制它依赖于页表来执行这一转换。 综上所述这些概念在Linux内存管理中是相互关联、相互依存的。它们共同构成了Linux虚拟内存管理的基础使得系统能够更有效地管理和使用内存资源。 1.5虚拟地址到物理地址 虚拟地址到物理内存的映射是由操作系统的内存管理单元MMU完成的。MMU负责将虚拟地址转换为物理地址。虚拟地址到物理地址的转换过程通常由硬件和操作系统共同完成。下面是一个常见的转换过程 进程访问虚拟地址当一个进程需要访问内存时它使用的是虚拟地址。这个虚拟地址包括两部分高位部分是页表号低位部分是偏移量。页表号用于找到对应的页表项而偏移量表示在该页表项指向的页中的偏移位置。 页表查找当进程访问虚拟地址时硬件通过页表查找来确定对应的物理页框。操作系统维护了每个进程的页表其中记录了虚拟页号与物理页框的映射关系。 物理地址计算通过页表查找找到对应的页表项后可以得到物理页框号。然后将物理页框号与偏移量组合起来得到真正的物理地址。 访问物理地址通过得到的物理地址进程可以直接访问对应的物理内存。 需要注意的是虚拟地址的页表查找是一个相对耗时的操作为了提高访问速度通常会采用高速缓存如TLBTranslation Lookaside Buffer来加速地址转换过程。 这个转换过程确保了不同的程序最终访问的内存地址位于不同的区域彼此没有重叠从而实现了内存地址空间的隔离。这是现代操作系统实现多任务处理和内存保护的关键机制之一。 虚拟地址到物理地址的映射过程 当程序访问虚拟地址时CPU将虚拟地址发送给MMU。MMU根据虚拟地址的高位部分页表索引查找页表page table。页表中存储了虚拟页号到物理页框号的映射关系。MMU根据虚拟页号找到对应的物理页框号。MMU将物理页框号与虚拟地址的低位部分页内偏移组合得到物理地址。MMU将物理地址发送给内存控制器从物理内存中读取或写入数据。 虚拟地址空间可以大于物理内存空间吗 可以这种情况下会使用页面置换算法如LRU将部分虚拟页置换到磁盘上以释放物理内存空间。当程序访问被置换到磁盘上的虚拟页时会触发缺页异常操作系统会将该虚拟页从磁盘读取到物理内存中并更新页表的映射关系。 为什么这么设计 提示虚拟地址的低位部分页内偏移刚好是12位2^12 4KB页内偏移码刚好能够覆盖整个页框。 看到这儿是否对计算机的设计人员产生了敬佩而我只能说一句握草 2.初识Linux线程 2.1之前所学的进程 2.2线程的引入 进程是操作系统进行资源分配的基本单位每个进程都有自己的地址空间、内存、文件描述符等资源线程是进程中的一个执行流 它们共享进程的资源线程是操作系统调度(CPU执行)的基本单位每一个task struct可以称之为线程 ⇒ Linux特有的方案!通过一定的技术手段将当前进程的”资源“以一定的方式划分给不同的task struct用户视角内核数据结构 该进程对应的代码和数据内核视角进程是承担分配系统资源的基本实体!线程在进程内部执行 ⇒ 线程在进程的地址空间内运行线程是OS调度的基本单位 ⇒ CPU其实不关心执行流是进程还是线程只关心PCB我们之前理解的“进程”是单线程进程即内部只有一个执行流的进程。现在我们要学的是多线程进程即内部具有多个执行流的进程。在Linux中线程是进程的一部分被称为轻量级进程LWPLightweight Process。Linux使用了一种称为多线程共享同一进程地址空间的模型即多个线程共享同一个进程的资源如内存、文件描述符等。 进程vs线程 之前学习的单进程 ⇒ 具有一个线程执行流的进程 进程是资源分配的基本单位线程是调度的基本单位 进程是指计算机中正在运行的程序的实例。每个进程都有自己的地址空间、内存块、文件描述符等资源内核数据结构内存块同时还包括所有的线程。进程是操作系统进行资源分配的基本单位。进程之间相互独立通过进程间通信IPC机制来进行数据交换和协作。 线程是进程中的一个执行流或执行单元是进程中的实际工作单位。一个进程至少要有一个线程也可以包含多个线程它们共享进程的资源如内存、文件等。线程是操作系统调度CPU执行的基本单位。线程之间可以并发执行提高了程序的并发性和响应性。线程之间通过共享内存来进行通信和同步。 进程和线程的区别主要有以下几点 **资源开销**进程之间的切换开销较大需要保存和恢复整个进程的上下文信息而线程之间的切换开销较小只需要保存和恢复线程的上下文信息。 **独立性**进程是独立的执行实体拥有独立的地址空间和资源而线程是进程的子集共享进程的资源。 **通信和同步**进程之间通信和同步需要使用进程间通信IPC机制如管道、消息队列、共享内存等而线程之间通信和同步可以直接通过共享内存来实现更加方便和高效。 **创建和管理**在用户空间进程和线程可以通过不同的API如fork()和pthread_create()来创建和管理。 2.3如何理解线程 在Linux系统中进程和线程的结构是相同的。在内核中进程和线程都是通过task_struct结构体来表示。 task_struct结构体包含了进程或线程的各种属性和状态信息如进程IDPID、父进程IDPPID、进程状态、进程优先级、进程的地址空间、文件描述符表、进程的线程组、进程的信号处理结构等。它还包含了一些指针用于连接进程或线程的相关数据结构如进程的子进程链表、进程的线程链表等。 在Linux中线程是进程的一部分多个线程共享同一个进程的资源包括地址空间、文件描述符等。同时从内核的角度来看进程和线程的结构是相同的都是通过task_struct结构体来表示。所以Linux系统中的线程也被称为轻量级进程(LWP)。 在Linux系统中线程和进程之间的区别相对较小所以Linux并不直接给我们提供线程相关的系统调用而是统一提供轻量级进程的接口。但是为了降低用户的使用学习难度Linux在用户层封装了一套多线程方案以库的形式提供给用户进行使用。【windows有自己真正的“线程”他对于线程又单独搞了一套数据结构来描述和组织在Windows系统中进程和线程是两个不同的概念并且在结构上也有一些区别。每个进程都有一个独立的进程控制块Process Control BlockPCB每个线程也有一个独立的线程控制块Thread Control BlockTCB】 所以Linux下的PCB 其他OS的PCB 。Linux没有真正意义上的线程结构Linux是用进程pcb模拟线程。Linux并不能直接给我们提供线程相关的接口只能提供轻量级进程的接口 在Linux中线程的创建和管理可以使用pthread库又叫POSIX线程库、原生线程库。 总结 在一个程序里的一个执行路线就叫做线程thread。更准确的定义是线程是“一个进程内部的控制序列”一切进程至少都有一个执行线程线程在进程内部运行本质是在进程地址空间内运行在Linux系统中在CPU眼中看到的PCB都要比传统的进程更加轻量化透过进程虚拟地址空间可以看到进程的大部分资源将进程资源合理分配给每个执行流就形成了线程执行流 2.4如何理解轻量级进程 创建时轻量化 线程创建时只需要创建task_struct结构即可。不需要创建地址空间、页表、文件描述符表等内核数据结构也不需要加载内存块。进程资源的创建和申请是在进程创建时进行的多线程共享进程的资源。 调度时轻量化 线程切换的成本较低是因为线程共享同一个进程的资源包括地址空间、页表等。相比于进程切换线程切换不需要切换地址空间和页表等资源的上下文寄存器因此开销较小。 线程切换的成本较低的另一个重要原因在程序运行期间CPU会根据局部性原理将内存中的代码和数据预读到CPU高速缓存(L1~L3 catch)。如果是进程切换CPU高速缓存就会立即失效需要重新缓存热点数据。而如果是线程切换则高速缓存的命中率更高不需要重新缓存数据。 删除时轻量化 线程在删除时也只需要删除其task_struct结构不需要释放进程的资源。进程资源的释放和回收是在进程退出时进行的。 3.创建线程 3.1pthread_create()函数 #include pthread.h int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);pthread_create 是 POSIX 线程也称为 Pthreads库中的一个函数用于在程序中创建新的线程。以下是 pthread_create 函数的参数和返回值的详细解释 参数 pthread_t *thread 这是一个指向 pthread_t 类型变量的指针用于存储新创建线程的线程标识符。在函数成功返回后这个变量会被设置为新线程的标识符。 const pthread_attr_t *attr 这是一个指向 pthread_attr_t 类型变量的指针用于指定新线程的属性。这些属性可以包括线程的调度策略、优先级、栈大小等。如果此参数为 NULL则使用默认属性创建线程。 void *(*start_routine) (void *) 这是一个函数指针指向新线程开始执行时调用的函数。这个函数通常被称为线程的启动例程start routine。它接受一个 void * 类型的参数并返回一个 void * 类型的值。 void *arg 这是传递给线程启动例程的参数。它可以是任何类型的指针并在启动例程中转换为适当的类型。 返回值 如果函数成功则返回 0。 如果函数失败则返回一个错误码。 工作原理 当调用 pthread_create 时它会请求操作系统为新线程分配所需的资源如栈空间。如果请求成功新线程会开始执行传递给 start_routine 的函数并带有 arg 指定的参数。 在调用 pthread_create 之后原始线程即调用 pthread_create 的线程和新线程会并发执行。这意味着它们可以几乎同时执行并且执行顺序是不确定的。 注意事项 线程的属性通过 attr 参数指定可以影响线程的行为和性能。例如通过调整线程的栈大小可以优化内存使用或处理特定的应用需求。 线程启动例程start_routine应该是一个返回 void * 并接受 void * 参数的函数。这允许启动例程接收任何类型的参数并返回任何类型的值通过转换为 void *。 线程标识符thread是一个用于识别和操作线程的值。它可以用于函数如 pthread_join 或 pthread_detach以等待线程结束或释放线程的资源。 总之pthread_create 函数是 POSIX 线程库中用于创建新线程的关键函数它允许程序员在程序中实现并发执行。 3.2程序测试 #include iostream #include string #include cstdio #include unistd.h #include pthread.husing namespace std;int x 100;void show(const string threadName) {cout threadName , pid: getpid() global var x x endl endl; }void *threadRun(void *args) {const string threadName (char *)args;while (true){show(threadName);sleep(1);} } #define THREADNUM 5 int main() {// typedef unsigned long int pthread_t;pthread_t tid[THREADNUM];char threadName[64];for (int i 0; i THREADNUM; i){snprintf(threadName, sizeof threadName, %s%d, thread, i 1);pthread_create(tid i, nullptr, threadRun, (void *)threadName);sleep(1); // 缓解传参的bug}while (true){cout main thread, pid: getpid() endl;sleep(3);} }主线程和新线程的PID相同证明线程是进程的一部分是进程的一个执行流执行单元。进程监视窗口(ps axj)只出现一个mythread进程证明这6个线程属于同一个进程。轻量级进程监视窗口(ps -aL)出现了一共6个线程1个主线程PID和LWP相同5个新线程PID和LWP不同。向进程发送9号信号所有的线程都终止了。进程是正在运行的程序的实例是OS进行资源分配的基本单位。所有线程共享进程的资源。所以进程退出线程必须退出。 3.3Makefile怎么写 不加-lpthread 查看进程/线程状态 查看线程库 4. 总结线程 4.1如何理解线程共享进程的资源 各线程共享进程的地址空间 代码区数据定义一个函数在各线程中都可以调用静态区数据定义一个全局变量在各线程中都可以访问堆区数据堆空间的指针可以在各线程间传递也可以选择私有堆空间共享区数据动态库和共享内存通信 命令行参数和环境变量 各线程还共享进程的资源和环境 文件描述符表信号的处理方式(SIG_ IGN、SIG_ DFL或者自定义的信号处理函数)当前工作目录 用户id和组id 线程也拥有独属于自己的一部分数据 线程ID线程属性结构独立栈结构线程属性结构线程独立执行的重要依据errno错误码线程局部变量线程属性结构线程上下文一组寄存器PCB数据线程独立调度的重要依据信号屏蔽字PCB数据调度优先级PCB数据 两项重要的私有数据线程上下文数据线程调度和栈结构数据调用函数开辟栈帧空间存储临时数据体现了线程的动态属性。 4.2线程的优缺点 线程的优点 创建一个新线程的代价要比创建一个新进程小得多与进程之间的切换相比线程之间的切换需要操作系统做的工作要少很多线程占用的资源要比进程少很多能充分利用多处理器的可并行数量一般进程创建的线程数量和CPU的核数相同。在等待慢速I/O操作结束的同时程序可执行其他的计算任务计算密集型应用为了能在多处理器系统上运行将计算分解到多个线程中实现I/O密集型应用为了提高性能将I/O操作重叠。线程可以同时等待不同的I/O操作。 【不同冲击下选择更好的方案并不是线程越多越好如果只有单一的工作你创建了很多线程本来单一的工作循环去做不会花费太多时间此时由于你交给了很多线程此时花费时间的是线程的来回切换】合理的使用多线程能提高计算密集型程序的执行效率能提高IO密集型程序的用户体验例如边下边播功能就是多线程运行的一种表现 线程的缺点 **性能损失**一个很少被外部事件阻塞的计算密集型线程往往无法与其他线程共享同一个处理器。如果计算密集型线程的数量比可用的处理器多那么可能会有较大的性能损失这里的性能损失指的是增加了额外的同步和调度开销而可用的资源不变。 **健壮性降低**编写多线程程序需要更全面更深入的考虑在一个多线程程序里因时间分配上的细微偏差或者因共享了不该共享的变量而造成不良影响的可能性是很大的换句话说线程之间是缺乏保护的。 **缺乏访问控制**在多线程编程中存在访问控制的挑战。由于多个线程可以同时访问共享的数据和资源因此需要采取适当的措施来确保线程之间的安全访问。 **编程难度提高**编写与调试一个多线程程序比单线程程序困难得多 实际上线程的缺点大部分是可以被避免的只要程序员能力到位上述缺点大都可以避免毕竟设计者创造“线程”这一概念的初衷是为了提高整机效率 4.3线程的异常 单个线程如果出现除零野指针问题导致线程崩溃进程也会随着崩溃线程是进程的执行分支线程出异常就类似进程出异常进而触发信号机制终止进程进程终止该进程内的所有线程也就随即退出
http://www.zqtcl.cn/news/725974/

相关文章:

  • 网站备案无前置审批文件南宁市建设厅网站
  • 百度网站体检手机网页小游戏
  • 大型购物网站建设费用广告设计与制作软件有哪些
  • 郑州建设工程交易中心网站汉寿做网站的公司
  • 青岛企业做网站startuply中文版wordpress主题
  • 商标设计网站猪八戒网站建设与设计教程
  • 网站建设积分wordpress添加右侧菜单
  • 网站策划资料方案天津优化公司
  • 做网站推广哪家公司好成都最正规的装修公司
  • 菜鸟建网站如何制作推广网站
  • 无锡企业建站系统广州品牌网站建设
  • 什么网站能免费做公众号封面wordpress主题打不开
  • 扬州外贸网站建设制作广告的软件
  • 一个主机怎么做两个网站百度上的网站怎么做
  • 济南建设工程业绩公示的网站wordpress载入等待
  • seo公司名字太原百度seo排名软件
  • 安徽省城乡建设厅网站拼多多关键词排名在哪里看
  • 素材下载网站开发wordpress微信付款插件
  • 网站有什么用河北廊坊建筑模板厂家
  • 永康住房和城乡建设部网站做网站 万户
  • 可信赖的常州网站建设做直播券的网站有多少
  • 网络营销案例分析pptseo策略是什么意思
  • 论坛网站建设视频青岛网站设计软件
  • 租用网站服务器价格清远医院网站建设方案
  • 房地产网站建设方案书福田所有车型
  • 网站功能描述高清视频网络服务器免费
  • 天台做网站微博推广效果怎么样
  • 苏州专门网站网站站长统计怎么做
  • 社交网站开发注意事项call_user_func_array() wordpress
  • 泉州企业免费建站个人网站设计与开发