当前位置:网站首页>EA&UML日拱一卒-多任务编程超入门-(2)进程和线程
EA&UML日拱一卒-多任务编程超入门-(2)进程和线程
2022-07-29 23:41:00 【51CTO】
作为多任务编程的基本概念,进程和线程的概念是无论如何回避不了的。很多公司面试时也会问倒二者的区别。如果到互联网上随便搜一下,就能找到关于进程和线程的文章,但是相信读过之后,懂得人会点头,不懂的还是不懂。所以本文采用另外一种方式来说明。
单任务系统的情况
在这种情况下,所有的系统资源都交给程序使用,编程者只需要考虑处理的流程和逻辑即可。这里的资源包括:CPU时间,内存(堆,栈),全局变量,硬件设备(显示器,键盘,通讯接口,音频设备)等。
多任务操作系统的情况
进程
对于编程者来说,最理想的情况就是,根本不用意识自己是多任务操作系统环境中编写程序。
也就是说,至少看起来所有的系统资源都交给程序使用,编程者只需要考虑处理的流程和逻辑即可。这里的资源包括:CPU时间, 内存(堆,栈,全局变量),硬件设备(显示器,键盘,通讯接口,音频设备)等。
但问题是,物理内存,设备只有一份,多个程序同时执行时必然发生竞争。这个问题当然不用我们考虑,因为多任务操作系统已经解决了:
- 为每个程序提供一定的CPU时间,保证程序可以按照某种间隔被执行。这种执行是二进制机器码层面的。
- 为每个程序提供了独立的,虚拟的内存空间,程序对虚拟内存进行的操作会映射到实际的物理内存上。
- 对于显示部分,提供了窗口机制,将程序的输出导向特定的窗口。同时系统将键盘,鼠标的输出导向当前活动的窗口。
- 有一些硬件,比如音频输入设备,串口等实在无法在程序之间共享。这样的硬件就采用了独占的方式,如果某个程序占用了某个设备,其他程序就不能使用。
这些都做到以后,可以说基本上实现了我们的理想:编程者不用意识自己是在为多任务操作系统编写程序。每个任务作为单独的程序来设计和实现,任务之间的调度利用操作系统的功能来实现。
这样的程序执行过程就是进程。基本上进程就相当于多任务操作系统中的应用程序。(许多规模较大的应用也可以包含多个进程)
进程的好处是最大限度保持程序执行过程之间的独立性,使增加任务或者调整任务内容变得简单。但同时也可以看到操作系统要为每个进程分配资源,映射内存操作,控制各种输入输出。所有这些都需要相当的系统开销。所以多任务操作系统也是随着硬件性能的提高而逐渐发展起来的。
线程
理解了进程的优缺点以后,再理解线程就容易了。很多时候在一个进程内部还是需要多任务处理,比如视频时软件在视频解码时还要接受用户操作。对于这种情况下就需要在进程内部提供多任务处理机制:线程。
线程之间CPU时间的分配和进程类似,但是共同使用进程的资源,操作系统不必为每个线程提供另外的映射机制,这样做的结果:
- 多个线程共用一个资源时,需要编程者利用操作系统提供的接口主动的进行访问控制和同步。
- 由于使用共同的内存空间,堆,栈等,所以不需要另外的地址映射等处理,可以实现比较快速的数据交换。
总结
就好像没法回答夏天和冬天那个更好一样,也没有办法回答进程和线程那个更好,我们应该做的就是在适当的场合使用适当的技术。
写在文章的最后
阅读更多更新文章,请扫描下面二维码,关注微信公众号【面向对象思考】
边栏推荐
猜你喜欢
High Numbers|Calculation of Triple Integral 3|Uncle High Numbers|Handwritten Notes
论文精读——YOLOv3: An Incremental Improvement
EA&UML日拱一卒-多任务编程超入门-(7)关于mutex,你必须知道的
线上无序的
devops学习(七) sonarqube 代码质检工具
Gao Shu Xia|Triple Integral Exercises|Uncle Gao Shu|Handwritten Notes
【无标题】清空吗
软件测试拿8k以上有多简单,掌握这些随随便便拿8k以上...
shell编写规范和变量
Install PyCharm on Raspberry Pi
随机推荐
环形链表(LeetCode 141、142)
High - level - the rest - the client determine whether indexes exist
Huawei 14 Days - (3) Kernel Development
devops学习(四) Jenkins CI 持续集成
Raspberry pie wiringPi 2.6 installed on solving gpio readall command mistakes
【云原生Kubernetes】二进制搭建Kubernetes集群(中)——部署node节点
Redis系列:高可用之Sentinel(哨兵模式)
管理区解耦架构见过吗?能帮客户解决大难题的
logback过期日志文件自动删除
关于MySQL索引的一些个人理解(部分参考MySQL45讲)
学会使用MySQL的Explain执行计划,SQL性能调优从此不再困难
多商户商城系统功能拆解18讲-平台端商家售后
Tkinter:功能按钮Button
Elementary C language - first understanding of C language
ApplicationContext的三大实现
「大厂必备」系列之Redis主从、持久化、哨兵
单片机开发之拓展并行I/O口
2022年最新甘肃建筑施工焊工(建筑特种作业)模拟题库及答案解析
Install PyCharm on Raspberry Pi
接口性能测试方案设计方法有哪些?要怎么去写?