操作系统Lesson7 - 线程编程模型和进程间通信概述

文章目录


进程和线程的区别

一句话:进程资源独立,线程资源共享。


当系统内核不支持线程时,我们只能用用户空间来描述线程;而如果内核支持线程,我们可以在创建线程时指定是用户空间来描述还是内核空间来描述。

默认是内核线程。


进程调度是系统调用,属于操作系统的库函数,操作系统的编译器里自带了;而进程是需要第三方库,这两个实现方式不一样,一个系统调用,一个第三方库,所以进程号和线程号直接没有关系。

  • 比如说printf:这是一个标准C库函数,里面包含系统调用,虽然系统调用每个系统都不一样,也就是说每个系统的printf底层实现不一样,但是接口依然相同 ,而且每个操作系统对应的编译器里都有包含printf的库,所以不需要在编译的时候指定。
  • pthread_creat:这是一个线程调用函数属于第三方库,对于所有平台都一样,而编译器的库中没有,所以需要在编译的时候链接这个库,也就是-lpthread,寻找 libpthread.so

函数原型:

cpp 复制代码
int pthread_create (pthread_t *__restrict __newthread,
			   const pthread_attr_t *__restrict __attr,
			   void *(*__start_routine) (void *),
			   void *__restrict __arg)
  • 参数1:传一个pthread_t*类型的指针,用于标记线程;
  • 参数2:指定是内核线程还是用户空间线程,默认NULL;
  • 参数3:传入任务函数,线程执行此任务;
  • 参数4:任务函数的参数。

我可不可以直接传入task呢?

有人说:不行,必须强转为 void* 类型。

错,c可以,cpp不行。

在c中,void*指代任何类型。但是在cpp中,有严格格式要求,所以要强转。

强转为如下形式:


现代OS操作系统把进程当作资源管理单位,线程当作调度单位。

一个进程都含有一个线程。

  • pthread_join();:阻塞主线程
  • pthread_exit();:唤醒阻塞的主线程。

pthread_join有一个二级指针参数,用来接收子线程退出时的发出的数据,也就是void* retval

所以可知:二维指针用于更新一维指针空间


  • 同一进程的不同线程中,两个线程资源共享,栈指针不共享 ,你有你的栈指针,我有我的栈指针;
    • 两个栈的内存映射位置不一样,即使是同一形参,也分别存在各自的栈内。
  • 同一进程中的两个线程的栈中会被操作系统用结构隔开,方式越界访问。
  • 不过如果在 task2 中拿到了 task1 的地址,也是能更改 task1 的数据的。

线程非安全函数

执行完线程创建函数之后,本函数完结,局部变量 task1 的资源被回收,会发生危险。


时序问题

  • ++分为读、算、写三步。
  • 在执行 task2 的判断时二者不等,但是刚好时间片到了,回去执行 task1 ,正好算完 v2++ 时回来执行输出,发现相等。


进程间通信

需要三大挑战:

  • 机制(协议):规定数据按什么格式传输。
  • 同步与互斥:确保多个进程(或线程)在访问共享资源时不会相互干扰,从而避免数据竞争和不一致性。也就是进程执行的先后与资源访问的关系上。
  • 数据顺序与同步:第三个问题是关于数据处理的顺序性。

竞态条件

两个进程对同一份资源进行访问与操作,就构成竞态条件。

就如何对资源进行正确的访问与操作。

相关推荐
Moonnnn.14 分钟前
【单片机期末】串行口循环缓冲区发送
笔记·单片机·嵌入式硬件·学习
fen_fen1 小时前
学习笔记(26):线性代数-张量的降维求和,简单示例
笔记·学习·算法
FakeOccupational2 小时前
【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 & 定向转发机制
笔记·分布式·p2p
布伦鸽3 小时前
C# WPF 左右布局实现学习笔记(1)
笔记·学习·c#·wpf
love530love4 小时前
【笔记】旧版MSYS2 环境中 Rust 升级问题及解决过程
开发语言·人工智能·windows·笔记·python·rust·virtualenv
黑色的山岗在沉睡5 小时前
《视觉SLAM十四讲》自用笔记 第二讲:SLAM系统概述
笔记
HappyAcmen6 小时前
1.3 古典概型和几何概型
笔记·概率论·学习方法
普宁彭于晏7 小时前
CSS3相关知识点
前端·css·笔记·学习·css3
qq_336411757 小时前
【笔记】Chrome浏览器的性能调试(performance)工具使用和代码优化
前端·chrome·笔记
fen_fen7 小时前
学习笔记(25):线性代数,矩阵-矩阵乘法原理
笔记·学习·线性代数