程序员的自我修养 摘录 1 众人拾柴火焰高

2024-03-15 04:50

本文主要是介绍程序员的自我修养 摘录 1 众人拾柴火焰高,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

线程基础

现代软件系统中,线程也是一个十分重要的概念.特别是随着CPU频率增长开始出现停滞,而开始向多核方向发展.多线程,作为实现软件并发执行的一个重要的方法,也开始具有越来越重要的地位.

线程(Thread) 有时也被称为轻量级进程(Lighting Process,LWP),是程序执行流的最小单位.一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成.通常意义上,一个进程由一个到多个线程组成,各个线程之间共享程序的内存空间(包括代码段,数据段,堆等)及一些进程级的资源(如打开文件和信号).一个经典的线程与进程的关系图如下
在这里插入图片描述
多线程比单线程的优势在于

  • 某个操作可能会陷入长时间等待,等待的线程会进入睡眠状态,无法继续执行.多线程执行可以有效利用等待的时间.典型的例子是等待网络响应
  • 某个操作(常常是计算)会消耗大量的时间,如果只有一个线程,程序与用户间的交互就会中断.多线程可以让一个线程负责交互,另一个线程负责计算
  • 程序逻辑本身就要求并发操作,例如一个多端下载软件(如bittorrent)
  • 多CPU或多核计算机,本身具备同时执行多个线程的能力,因此单线程程序无法全面发挥出计算机的全部计算能力
  • 相对于多进程应用,多线程在数据共享方面效率高很多

线程的访问权限

线程的访问非常自由,它可以访问进程内存中的所有数据,甚至包括其他线程的堆栈,但实际上线程也拥有自己的私有存储空间,包括以下几方面

  • 栈(尽管并非完全无法被其他线程访问,但一般情况下仍然可认为是私有的数据)
  • 线程局部存储(Thread Local Storage,TLS).线程局部存储是某些操作系统为线程单独提供的私有空间,但通常只具有很有限的容量.
  • 寄存器(包括PC寄存器),寄存器是执行流的基本数据,因此为线程私有.

从C程序员视角看,数据在线程之间是否私有如下表
在这里插入图片描述

线程调度与优先级

无论是在多处理器的计算机上还是在单处理器的计算机上,线程总是’并发’的执行
当线程数量小于等于处理器数量时(并且操作系统支持多处理器),线程的并发是真正的并发,不同线程运行在不同的处理器上,彼此之间互不相干.但对于线程数量大于处理器数量的情况,线程的并发会受到一些阻碍.因为此时至少有一个处理器会运行多个线程.

而单处理器对应多线程的情况下,并发是一种模拟出来的状态.操作系统会让这些线程程序轮流执行,每次仅执行一小段时间(通常是几十到几百毫秒),这样看起来像是在同时执行
线程调度中,线程通常拥有至少三种状态

  • 运行
  • 就绪
  • 等待

当时间片用尽的时候,该进程进入就绪状态.如果在时间片用尽之前进程就开始等待某事件,那么它将进入等待状态.每当一个线程离开运行状态时,调度系统就会选择一个其他的就绪线程继续执行.在一个处于等待状态的线程所等待的事件发生之后,该线程就进入就绪态.可见下图

在这里插入图片描述
目前的调用方式

  • 优先级调度
  • 轮转法

windows可通过API设置线优先级
而Linux下则使用pthread库来实现

一般来说,CPU亲IO密集型的线程,因为它们占用很少的CPU时间,IO密集型线程总比CPU密集型线程容易得到优先级的提升.

windows中的进程和线程的实现如同教科书一般标准,windows内核由明确的线程和进程的概念.在windowsAPI中,可以使用明确的API创建进程和线程,但对于Linux中,线程并不是一个通用的概念

Linux对多线程的支持颇为贫乏,事实上,在Linux内核中并不存在真正意义上的线程概念.Linux将所有的执行实体(无论是线程还是进程)都称为任务(task),每一个任务概念上类似与一个单线程的进程,具有内存空间,执行实体,文件资源等.不过,在linux下不同的任务之间可以选择共享内存空间.因而实际意义上,共享了同一个内存空间的多个任务构成了一个进程,这些任务也就成了这个进程里的线程.
在这里插入图片描述
fork产生新任务的速度非常快,因为fork并不复制原任务的内存空间,而是和原任务一起共享一个写时复制(Copy on Write,COW)的内存空间.
所谓写时复制,指的是两个任务可以同时自由地读取内存,但任意一个任务试图对内存进行修改时,内存就会复制一份给修改方单独使用,以免影响其他的任务使用.
fork只能产生本任务的镜像,因此必须执行exec配合才能启动别的新任务需要exec来执行新的可执行文件.
而要产生新线程,可以使用clone,则可以使用clone
clone的函数原型如下
在这里插入图片描述

这篇关于程序员的自我修养 摘录 1 众人拾柴火焰高的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/810853

相关文章

读书摘录《控糖革命》

又到了每周推荐时间,这周末给大家推荐一本书《控糖革命》。身体是革命的本钱,只有保持健康的身体,才能保证持久的生产力,希望我的读者都可以身体健康,青春永驻。 推荐前,首先申明在《控糖革命》一书中,作者提出了一些颇具争议的观点,这些观点并没有经过系统的科学论证,但这并不妨碍我们从中获取一些有益的控糖建议。作者通过分享作者的个人经验和研究,为我们提供了一种全新的饮食理念,帮助我们更好地控制血糖峰值

LabVIEW程序员是怎样成长为大佬

成为一名LabVIEW编程领域的“大佬”需要时间、实践、学习和解决复杂问题的经验。尽管LabVIEW作为一种图形化编程语言在初期可能相对容易上手,但要真正成为精通者,需要在多个层面上深入理解。以下是LabVIEW程序员如何逐步成长为“大佬”的路径: 1. 打好基础 LabVIEW的大佬们通常在初期会打下非常坚实的基础,理解LabVIEW编程的核心概念,包括: 数据流编程模型:Lab

20151214 要点摘录2

算法: 四火的数据库算法10题 http://www.raychase.net/2810 leetCode解题报告 http://bookshadow.com/leetcode/ 学习算法之路(转) http://blog.csdn.net/sunboy_2050/article/details/5656823 10分钟没有思路的就找例子 http://blog.csdn

20151214 要点摘录1

eclipse用法 --- 涉及到的eclipse的使用 在接口名上按F4 可以看继承关系    按ctrl+T可以找实现类 ctrl+shift+r查找文件 MyBatis的设计主要是把对数据库的增删改查的sql语句和JavaWeb工程的POJO做绑定 1 配置sql语句的映射文件 2 在conf.xml中配置数据库连接并关联sql语句的映射文件 3 在dao中编写代码,加载con

程序员必备心理学——心流

心理学之心流 前言一、“心流”是什么?二、心流的好处二、如何进入心流心流状态的四个阶段第一个阶段:挣扎第二个阶段:放松第三个阶段:心流第四个阶段:巩固 进入心流的技巧 总结题外话 前言 你是否常常感觉自己明明学习了一整天,但是就是感觉没有太多的收获。这个时候除了你的学习方向等问题之外,也可能是你的学习方法太低效了。作者本人就经常有这种情况,好在偶然间在b站刷到一个大佬的这个心

程序员都在使用的画图工具

大家好,我是袁庭新。 程序员都在使用的画图工具,你一定没用过这款画图工具吧!我教程中的架构图都是用它来画的。 比如我编写的RDB工作原理图就是用draw.io绘制的,如下图所示: 再例如Redis集群故障恢复原理图我也是通过draw.io工具绘制的,如下图所示: 是不是觉得draw.io绘制的图形特别简洁、美观。它的官网是: https://www.drawio.com dra

自我提升社团成立啦,欢迎各位同学加入~

欢迎加入 大家好,我是马丁,我们的自我提升社团成立啦,欢迎有新的朋友加入!! 我们的社团主要目标是帮助每个人实现自我成长、自我提升,不论他是什么年龄、什么经验、什么专业,只要有一个好学和想进步的心,都可以加入。 为了提升帮助每个人实现自我成长,目前社团选择的是做一个智能客服系统,我们希望通过搭建一个企业级的智能客服系统来帮助每个人实现自我成长。后续,还会开发更多系统~ 目前群里大多是Jav

自我反省(一)

上个学期队友陈彤问我想和他一起做项目不,我想有项目当然答应了下来,这个项目是和信管院一起做的——哈尔滨日租房开发软件。我和陈彤负责技术,他们学院的人负责销售,一开始我们都信心满满,但是我和陈彤现在除了c/c++其它什么都不会,逼着自己学安卓开发,项目中间陈彤把浩然大神也加进来了,有他在我们都觉得这个项目一定可以完成。但是我们把事情想简单了,或许浩然大神做软件没问题,但由于我和陈彤是小白,什么都

GitHub:代码是程序员沟通最直接的手段

如果不是 Andreessen horowitz 的投资,估计 GitHub 很难被福布斯、CNN、纽约时报等传统媒体注意到。普通大众之前不了解这个工具,是因为它距离记者的世界太远了——GitHub 是一个程序员所使用的托管项目的服务。 但在一些程序员眼里,它不仅是托管项目的地方,还是“开源”项目的大本营,而且是提高程序员“技术水平”和“技术品味”的地方,更是一个程序员社交的地方。

黑马程序员---银行业务调度系统

模拟实现银行业务调度系统逻辑 需求分析: 银行内有6个业务窗口,1 - 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口。 有三种对应类型的客户:VIP客户,普通客户,快速客户(办理如交水电费、电话费之类业务的客户)。 异步随机生成各种类型的客户,生成各类型用户的概率比例为:         VIP客户 :普通客户 :快速客户 =  1:6:3。 客户办理业务所