首页 > 编程语言 >多线程程序是如何执行代码的?

多线程程序是如何执行代码的?

时间:2023-10-27 14:55:21浏览次数:40  
标签:执行 代码 程序 互斥 线程 进程 多线程 CPU

进程与线程概念、区别、以及线程间的通信

概念

  • 进程是对程序运行时的封装,是操作系统分配资源的基本单位,实现操作系统的并发。
  • 线程是进程的子单位,是CPU调度和分派的基本单位,实现进程内部的并发。是OS识别的最小执行与调度单位,每个线程独占一个虚拟处理器,每个线程完成不同的任务,但共相一个地址空间。

区别

  1. 进程在执行过程中拥有独立的内存单元,而多个线程共享进程的内存。(每个线程拥有自己的栈段,来保存所有局部变量和零时变量)
  2. 进程是资源分配的最小单位,线程是CPU调度的最小单位;

进程间的通信

进程间通信主要包括管道、系统IPC(包括消息队列、信号量、信号、共享内存等)、以及套接字socket。

  1. 管道
    匿名和命名两种,用于父子进程通信,命名管道还允许不同进程间的通信。
    =>匿名管道:半双工,只允许数据往一个方向流动,只能用于父子进程之间的通信,
    命名管道FIFO:可在无关的通道间交换数据
  2. 系统IPC
    2.1 消息队列,
    2.2 信号量,它是一个计数器,用来控制多个进程对共享资源的访问,信号量用于进程间的互斥与同步,不储存进程间的通讯数据。
    而信号是用于通知接收进程某个时间已经发生。
    2.3 共享内存
    它使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据得更新。这种方式需要依靠某种同步操作,如互斥锁和信号量等
    特点:
    共享内存是最快的一种IPC,因为进程是直接对内存进行存取
    因为多个进程可以同时操作,所以需要进行同步
    信号量+共享内存通常结合在一起使用,信号量用来同步对共享内存的访问
    3.套接字SOCKET:
    socket也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同主机之间的进程通信。

线程间的通讯方式

临界区:通过多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问;
互斥量Synchronized/Lock:采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有一个,所以可以保证公共资源不会被多个线程同时访问
信号量Semphare:为控制具有有限数量的用户资源而设计的,它允许多个线程在同一时刻去访问同一个资源,但一般需要限制同一时刻访问此资源的最大线程数目。
事件(信号),Wait/Notify:通过通知操作的方式来保持多线程同步,还可以方便的实现多线程优先级的比较操作进程间通信的方式:

理解多线程程序是如何执行代码

只有理解多线程程序是如何执行代码的,才能处理如何保证互斥、保证同步和死锁问题,记住线程就是轻量级进程

一个CPU两个线程,怎么执行

  1. 每个线程是独占CPU资源进行运算和执行,从两个线程来看,是交替运行。两个线程并发运行,独占CPU一小会。
  2. 两个线程是被操作系统使用 调度算法 进行调度,获取到CPU。例如现在的时间片轮转,之前的先来先服务、短作业优先,优先级优先等等
  3. 两个线程是抢占式执行的,谁先执行谁后执行是说不清楚的。有可能是主线程后续先执行,也有可能是工作线程先执行。

两个CPU两个线程,怎么执行

  1. 各自占一个CPU,两个线程同行运行,并行运行

2个CPU4个线程,怎么执行(接近现实计算机执行情况)
1.CPU少于线程数,操作系统必须使用 调度算法,让每一个线程都获取到CPU资源,得以让线程都能向下推进,执行各自的代码
2.在当前这种情况下,存在并行(多个CPU执行多个线程,同时间运行)也存在并发(一个CPU执行多个线程,交替执行)。
4.对于程序猿而言,针对多线程程序,一定要有 “并行”思维。 这样才能学好多线程
3.现在的操作系统就是这种情况,进程/线程数量远远大于CPU的核数,所以,需要操作系统调度。那么就形成了并行或者并发

线程是如何切换的

线程的结构:

当线程要切换时,线程的task_struct里面的 PC指针会(程序计数器)保存 这个线程的汇编程序中将要执行的下一条指令
那么恢复的时候又是从哪里恢复的:线程的task_struct中上下文信息中恢复,保CPU存寄存器当中的值。

标签:执行,代码,程序,互斥,线程,进程,多线程,CPU
From: https://www.cnblogs.com/joiln/p/17775387.html

相关文章

  • pytorch(11.2) Transformer 代码
         ......
  • 易语言农业银行模拟器电子回执单生成器,分享源码和程序
    比如朋友之间的装逼娱乐,这个工具挺有用的,我自己学易语言很多年了,要开发这么一个工具轻而易举,而且整个开发下来要不了200行代码,我下面开发的这个工具是农业银行的电子回执单生成器,就是可以生成一个回执单图,里面的参数都可以通过程序修改,开发工具用的是易语言。先看下界面吧: 软......
  • 第三方平台 之代开发小程序
    一、服务商代开发小程序文档:https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/product/how_to_dev.html二、extAppid的开发调试文档:https://developers.weixin.qq.com/miniprogram/dev/devtools/ext.htmlext.json文件{"extEnable":true,"ext......
  • e4a开发了银行回执单生成器app,电子版都可以,分享源码和程序
    闲着没事,朋友之间装逼娱乐经常能用到,还好之前我还学了半年的e4a开发,虽然现在e4a已经被专卖了,但是软件正常可以用,但是启动的时候会有版权,然后这个APP也是用e4a进行开发的,就是内置了很多回执单图片,然后前台设置了很多编辑框,你只需要输入参数它会自动数据指定内容的回执单,我先把设计......
  • 百度Comate代码助手全新上线SaaS服务,适配百种开发语言,编码效率10倍提升!
    1024程序员节来临之际,百度智能云宣布百度Comate智能代码助手正式上线SaaS版本,可提供10余项编码功能,适配100种开发语言,面向广大企业和开发者提供更便捷、更灵活的智能编码工具,助力企业提升研发效率。即日起企业和开发者可前往百度Comate官网体验。百度Comate是百度智能云基于文心大......
  • 易语言开发微信流水生成器,分享源代码
    那么其实我是做技术开发的,今天就用易语言开发这么一款软件,就当是学习研究用的把,用的是精易模块奥,必须要用这个,具体怎么下载你可以百度就行了。源码分享:.版本2.支持库spec.程序集窗口程序集_启动窗口.子程序_按钮1_被单击置剪辑板文本(编辑框1.内容)_启动窗口.标......
  • c语言代码练习40
    问:实现两个字符串的比较#define_CRT_SECURE_NO_WARNINGS1#include<stdio.h>#include<assert.h>#include<string.h>intmain(){char*p1="abcdefg";char*p2="abcder";intret=strcmp(p1,p2);if(ret==0......
  • 使用 AppDomain.CurrentDomain.GetAssemblies() 始终读取不到某一个程序集
     AppDomain.CurrentDomain.GetAssemblies() 只会获取到已加载到当前域的程序集。可以先将所有程序集加载之后再进行读取:DependencyContext.Default.RuntimeLibraries.Where(o=>o.Name.StartsWith("Yuji.")).Select(o=>Assembly.Load(newAssemblyName(o.Name))).ToArray()......
  • c语言代码练习39
    问:实现两个字符串的追加#define_CRT_SECURE_NO_WARNINGS1#include<stdio.h>#include<assert.h>#include<string.h>intmain(){chararr1[20]="abcdef";chararr2[]="yue";strcat(arr1,arr2);printf("......
  • c语言代码练习38
    问:实现字符串的拷贝#define_CRT_SECURE_NO_WARNINGS1#include<stdio.h>#include<assert.h>#include<string.h>intmain(){chararr1[]="abcdef";chararr2[]="bit";strcpy(arr1,arr2);printf("%s&q......