操作系统(3) 多处理器编程:从入门到放弃

入门:理解多线程

三个放弃:原子性、有序性、可见性

并发:介绍

进程与线程的区别:

  • 进程:正在运行的程序,系统分配资源和调度的基本单位,内存中可以同时加载多个进程,每个进程都有自己独立的地址空间,互相不会干扰。每个一段时间,进程间会发生上下文切换,进程发生切换,信息会保存再进程控制块(PCB)中
  • 线程:线程是操作系统能够进行运算调度的最小单位。它被包含在线程中,是线程中的实际运作单位。一个进程内可以有多个线程,每个线程共享内存,但有独立的堆栈。多个线程之间也会发生上下文切换,但地址空间保持不变。

线程的创建:

#include <stdio.h>
#include <assert.h>
#include <pthread.h>void *mythread(void *arg){printf("%s\n", (char*)arg);return NULL;
}int main(int argc, char* argv[]){pthread_t p1, p2;int rc;printf("main:begin\n");rc = pthread_create(&p1, NULL, mythread, "A");assert(rc == 0);rc = pthread_create(&p2, NULL, mythread, "B");assert(rc == 0);rc = pthread_join(p1, NULL);assert(rc == 0);rc = pthread_join(p2, NULL);assert(rc == 0);printf("main:end\n");
}

运行结果:

可以看到,线程创建后,可能立即执行,也可能处于就绪状态,这导致了不同的结果。这也反映出线程的指令之间执行顺序是不确定的。

  • 共享内存带来的影响(示例):
#include <stdio.h>
#include <pthread.h>static volatile int counter = 0;void *mythread(void* arg){printf("%s: begin\n", (char*)arg);int i;for(i = 0; i < 100000; i++){counter = counter + 1;}printf("%s:done\n", (char*)arg);return NULL;
}
int main(){pthread_t p1, p2;printf("main:begin(counter =  %d)\n", counter);pthread_create(&p1, NULL, mythread, "A");pthread_create(&p2, NULL, mythread, "B");pthread_join(p1, NULL);pthread_join(p2, NULL);printf("main: done with both (counter = %d)\n", counter);return 0;
}

运行结果:

可以看到三个结果都不相同。这就是共享内存带来的麻烦。

并发的三大特性

  • 原子性:一个或多个操作归为一个原子操作,这个原子操作要么全做,要么全不做。

  • 有序性:指令的执行顺序是按照代码的顺序去执行的。

  • 可见性:指多个线程访问同一个变量时,一个线程修改了这个变量的值,这对其他变量是可见的。

    例子:

    //线程1执行的代码
    int i = 0;
    i = 10;

    //线程2执行的代码
    j = i;

    如果执行线程1的是CPU1,执行线程2的是CPU2。由上面的分析可知,当线程1执行 i = 10这句时,会先把i的初始值加载到CPU1的高速缓存中,然后赋值为10,那么在CPU1的高速缓存当中i的值变为10了,却没有立即写入到主存当中。此时线程2执行 j = i,它会先去主存读取i的值并加载到CPU2的缓存当中,注意此时内存当中i的值还是0,那么就会使得j的值为0,而不是10。这就是可见性问题,线程1对变量i修改了之后,线程2没有立即看到线程1修改的值。

    参考资料: 《操作系统导论》博客:https://blog.csdn.net/yj_android_develop/article/details/82728468

操作系统(3) 多处理器编程:从入门到放弃相关推荐

  1. Python的函数式编程--从入门到⎡放弃⎦

    很早以前就听说过了函数式编程,印象中是一种很晦涩难懂的编程模式,但却一直没有去进行了解. 恰好这周组内的周会轮到我主持,一时也没想到要分享什么.灵光一闪,就选定函数式编程这个主题吧,反正组里的同事都没 ...

  2. 如何避免编程从入门到放弃?

    写代码不是什么太需要创造力的劳动,现在的代码从业者本质上与工业时代的纺织工人没什么差异.大多数人写代码也并不是真的有兴趣,只不过金钱的诱惑使然,这没什么不好,也十分正确. 但对于零基础转行编程的人来说 ...

  3. 网友自曝:编程从入门到放弃!方法比选择更重要!

    许多人觉得 Python 功能强大.就业范围范围广还上手轻松,得来全部费功夫.但是一旦推开 Python 的大门你会发现,Python 入门容易但精通很难.看似语法掌握熟练,但一面试或者做项目就会被打 ...

  4. Python编程从入门到放弃-边学边更笔记

    目录 第1章 起步 第2章 变量和简单数据类型 第3章 列表简介 第4章 操作列表 第5章 if语句 第6章 字典 第7章 用户输入和while循环 第8章 函数 第9章 类 第10章 文件和异常 第 ...

  5. Python编程从入门到放弃 - Part 1基础知识习题解析

    目录 第1章 起步 第2章 变量和简单数据类型 第3章 列表简介 第4章 操作列表 第5章 if语句 第6章 字典 第7章 用户输入和while循环 第8章 函数 第9章 类 第10章 文件和异常 第 ...

  6. Python编程从入门到放弃 - 边学边更Part 2项目笔记

    准备工作 官网下载python3.8 + anaconda + pycharm anaconda 打开anaconda中jupyter notebook点击launch,无法弹出页面,在cmd中输入j ...

  7. Python 函数式编程,从入门到放弃

    很早以前就听说过了函数式编程,印象中是一种很晦涩难懂的编程模式,但却一直没有去进行了解. 恰好这周组内的周会轮到我主持,一时也没想到要分享什么.灵光一闪,就选定函数式编程这个主题吧,反正组里的同事都没 ...

  8. python如何编程-如何入门Python编程

    Python目前已经成为受欢迎的编程语言之一,吸引了一大批粉丝,但是很多人在要跨入的时候犹豫了,原因竟然是觉得学习Python太难了,真的是这样吗?入门Python编程学习有什么好的技巧吗? Pyth ...

  9. CYQ.Data 从入门到放弃ORM系列:开篇:自动化框架编程思维

    前言: 随着CYQ.Data 开始回归免费使用之后,发现用户的情绪越来越激动,为了保持这持续的激动性,让我有了开源的念头. 同时,由于框架经过这5-6年来的不断演进,以前发的早期教程已经太落后了,包括 ...

最新文章

  1. cocos2d 0.99.5版本屏幕默认是横屏,怎么修改为竖屏呢?
  2. bootstrap-datetimepicker时间控件添加清除按钮
  3. 收藏/一文弄清楚强弱电机房位置大小及布置如何选择?
  4. SPU解析优化:模块设计与实现,SKU优化
  5. Python的numpy,1.15.0和1.14.5,函数结果可能存在差异
  6. (HDRP)全局光照技术初探(一)-光照模式与阴影技术
  7. 网络文学格局已定?未必
  8. php毕设周记_(完整版)毕设周记
  9. 网络拓扑图:网络拓扑图介绍及在线制作
  10. 网络带宽测试工具iperf3(arm<->PC)
  11. photoshop CS6 安装 coolorus色环
  12. 如何利用任意波形发生器创建你想要的波形并输出
  13. 输出全靠画html5在线玩4399,输出全靠画
  14. 深度学习目前主要有哪些研究方向?
  15. mysql 1146错误
  16. JAVA数组自动排序
  17. 亲子关系-《亲子关系全面技巧》书中的精髓:学会正确处理亲子关系的技巧,与孩子建立良好的关系。
  18. EA001-186-2220-蓝豪杰
  19. bat 文件夹内文件批量重命名
  20. win10安装MatlabR2016试用版

热门文章

  1. Python中的split()和rsplit()的使用
  2. RandomAccessFile读写txt文件中文乱码
  3. CentOS7出现“FirewallD is not running”
  4. 大学计算机学情分析,大学生学情分析
  5. java try catch 接口_如何优雅的实现 try/catch 异常块?
  6. 动态改变类名_反调试之检测类名与标题名
  7. mysql主从io为no_mysql主从同步错误解决和Slave_IO_Running: NO
  8. u8 api开发报类型不匹配错误_小程序云开发入门学习,小程序支付功能常见错误汇总及解决方案...
  9. opencv 无法使用 dll 动态链接库 UnsatisfiedLinkError java.library.path Can‘t find dependent libraries
  10. Java 读取某个目录下所有文件、文件夹