多进程和多线程

多进程和多线程—锁机制
博主是初学者,以下属于个人见解,多多指教

1、进程和线程
1)进程是操作系统资源分配的最小单元,线程是cpu执行调度的最小单位;
2)一个进程可以有一个或者多个线程,线程数量取决于进程的虚拟内存空间上限;
3)进程的上下文切换会导致内核和用户态的切换,线程的上下文切换是进程用户态的切换,因此,进程的上下文切换的时间开销是远大于线程的上下文时间的开销;
线程的属性:(POSIX标准)分离状态(决定线程退出时资源是否自动释放)、调度策略和参数(线程调用管理)、作用域、栈尺寸(线程的大小不能超过栈内存)、栈地址、优先级(判断系统是实时或非实时的)
进程有没有属性呢?
4)进程有自己的地址空间,因此数据是具有隔离性的,一个进程挂掉不会导致整个程序crash,多线程是共享进程的地址空间
5)进程开多了,消耗资源较大,因此进程数会有限制,线程数量是取决于进程的虚拟内存空间上限
6)两者最主要的不同点是两者关于内存数据的共享程度是不一样的,多进程的内存空间是相互独立的,多线程的内存空间是共享的

2、锁机制原理

多线程通信方式:
3、锁的种类和使用场景
读写锁:
出现原因:线程a获取读锁,线程b需要获取读锁时,需要等待线程a释放锁,但线程a和b不存在竞争,不修改变量的值,因此需要符合这类场景的线程同步机制
线程获取读锁后,其它线程依然可以对共享资源进行读的操作,此时想获取写锁的线程处于阻塞状态,需要等待所有读锁解锁后才能写;线程获取写锁后,其它想要获取读锁的线程都处于阻塞状态,需要等待写锁解锁后,才能进行读;
适用场景:读远大于写

自旋锁:阻塞状态下,不切换到用户态,一直忙于等待,只能同一个线程加锁和解锁
使用场景:锁持有时间较短,如果持有时间较长,比较影响性能;不想在重新调度上花费太多的时间

互斥锁:线程间的互斥,获取锁的线程,操作资源,其它线程不能对资源进行操作
线程同步机制,多线程一次仅允许一个线程访问共享资源(临界资源)
出现原因:多线程不加锁,串行运行时,输出结果与预期不同,因为线程之间会相互切换运行
使用场景:
pthread_cond_wait() 函数一进入wait状态就会自动release mutex。当其他线程通过 pthread_cond_signal() 或pthread_cond_broadcast ,把该线程唤醒,使 pthread_cond_wait()通过(返回)时,该线程又自动获得该mutex。
pthread_cond_signal 函数的作用是发送一个信号给另外一个正在处于阻塞等待状态的线程,使其脱离阻塞状态,继续执行.如果没有线程处在阻塞等待状态,pthread_cond_signal也会成功返回。

条件变量:线程a的执行,需要依赖线程b的变量状态改变
使用场景:

信号量:线程间的同步,可以不同线程间加锁和解锁
使用场景:
原子操作:在多进程(线程)访问资源时,能够确保所有其他的进程(线程)都不在同一时间内访问相同的资源,来自 https://blog.csdn.net/u010887744/article/details/50275471
4、优缺点比较
互斥锁比较纯粹,简单的线程间同步机制,但解决不了读写锁的出现原因场景,因此有了读写锁,
条件变量适用多线程之间存在依赖变量状态的场景。

多进程通信方式
1、信号
出现原因:
适用场景:
signal(信号,信号关联的动作)函数
sigaction(信号,信号处理函数结构体, 原来对信号的处理方式)函数

2、管道
出现原因:
适用场景:
int pipe(int fd[2]);
开辟缓冲区,通过系统调用read()或者write()进行缓冲区读或写
读从缓冲区起始读,写从缓冲区最后写

3、消息队列
出现原因:
使用场景:
int msgget(键值,创建或访问消息队列的具体方式)

4、优缺点分析

多协程

1、多协程在单个线程内拆分控制流,并且控制流的切换是由应用程序控制,不由操作系统决定。优点是避免了多线程、多进程交互信息时的各种锁处理;代价是需要应用程序完成控制流切换的控制逻辑(主流开发语言均有现成的协程库)

线程池的基本原理
类1:CTask
执行任务的类,设置任务数据并执行
类2:CThereadPool
线程池管理类
任务列表、同步锁(互斥)、条件变量、线程回调函数、移动去空闲线程函数、移动到忙碌线程函数、任务添加到队列函数、线程池所有函数退出、获取当前任务队列的任务数

同步或异步

1、异步本质就是多线程吗?
答,错,两个概念,多线程只是异步编程的一种实现形式。
异步、同步是实际问题时,看待问题的不同角度。
多进程,多线程,多协程是将程序控制流拆分的不同抽象方法,然后通过控制流的并非、切换达到多个控制流并非的目的
实现这两种模式时,往往需要处理资源竞争、死锁、共享资源和回调事件等问题。

2、

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值